Inline Asm w VB6Author: Dave Date: 02.04.10 - 6:07am Just a quick post for documentation sake of using inline asm with VB6 (or at least as close as we can get to it without an external c dll. In terms of development of the asm to put in. You can use your C Compiler to generate it for you..here are the tips.
Full example here: http://sandsprite.com/CodeStuff/vb_cdecl.zip Note: All single quotes for comments are stripped by my blog script same as default CallWindowProc except param 1 is now "ByRef lpBytes As Any" or you can use the default like this: CallWindowProc( Varptr( asmBytes(0) ) , Private Declare Function CallAsm Lib "user32" Alias "CallWindowProcA" _ (ByRef lpBytes As Any, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Function Shl(x As Long) As Long 8B45 0C MOV EAX,DWORD PTR SS:[EBP+12] D1E0 SHL EAX,1 C2 10 00 RETN 10h Dim o() As Byte Const sl As String = "8B 45 0C D1 E0 C2 10 00" o() = toBytes(sl) Shl = CallAsm(o(0), x, 0, 0, 0) End Function Function Shr(x As Long) As Long 8B45 0C MOV EAX,DWORD PTR SS:[EBP+12] D1E8 SHR EAX,1 C2 10 00 RETN 10h Dim o() As Byte Const sr As String = "8B 45 0C D1 E8 C2 10 00" o() = toBytes(sr) Shr = CallAsm(o(0), x, 0, 0, 0) End Function Private Function ShlX(x As Long, shift As Byte) As Long 8B45 0C MOV EAX,DWORD PTR SS:[EBP+12] C1E0 12 SHL EAX,12 C2 10 00 RETN 10h Dim o() As Byte Const sl As String = "8B 45 0C C1 E0 __ C2 10 00" o() = toBytes(Replace(sl, "__", Hex(shift))) Shl = CallAsm(o(0), x, 0, 0, 0) End Function Private Function ShrX(x As Long, shift As Byte) As Long 8B45 0C MOV EAX,DWORD PTR SS:[EBP+12] C1E8 12 SHR EAX,12 C2 10 00 RETN 10h Dim o() As Byte Const sr As String = "8B 45 0C C1 E8 __ C2 10 00" o() = toBytes(Replace(sr, "__", Hex(shift))) ShrX = CallAsm(o(0), x, 0, 0, 0) End Function Function getESP() As Long Dim C As Currency 8 bytes, initially all 0s his isnt a naked function, so the esp is actually local to this function frame, but since we only use it for relative size differences etween before and after and there are no stack mods in vb after prolog ormally, this is fine as a standalone function 8BC4 MOV EAX,ESP C2 10 00 retn 10h CopyMemory C, &H10C2C48B, 4 getESP = CallAsm(C, 0, 0, 0, 0) End Function Function toBytes(x As String) As Byte() Dim tmp() As String Dim fx() As Byte Dim i As Long tmp = Split(x, " ") ReDim fx(UBound(tmp)) For i = 0 To UBound(tmp) fx(i) = CInt("&h" & tmp(i)) Next toBytes = fx() End Function Comments: (3)On 09.04.11 - 4:17pm gheo wrote:
On 01.31.20 - 5:12pm Dave wrote:
On 02.05.20 - 7:45am Dave wrote:
|
About Me More Blogs Main Site |
|||