Author | Message | Time |
---|---|---|
TheMinistered | I got tired of trying to implement bitwise operations into visual basic using only visual basic. Thus, this is a result of my frustration! This will only work in visual basic 6.0 -- have fun! [code] 'Class: CBitwise Option Explicit Private Type TPROC Memory As Long Pointer As Long End Type Private Proc() As TPROC Private Sub Class_Initialize() Dim a As Long, b As Long ShiftLeft VarPtr(a), VarPtr(b) ShiftRight VarPtr(a), VarPtr(b) RotateLeft VarPtr(a), VarPtr(b) End Sub Public Function ShiftLeft(ByVal Value As Long, ByVal Shift As Long) As Long ExecuteMe "8B5C2408 8B44240C 8B542410 8B1B 8A08 D3E3 891A 31C0 C20A00" End Function Public Function ShiftRight(ByVal Value As Long, ByVal Shift As Long) As Long ExecuteMe "8B5C24088B44240C8B5424108B1B8A08D3EB891A31C0C20A00" End Function Public Function RotateLeft(ByVal Value As Long, ByVal Shift As Long) As Long ExecuteMe "8B5C2408 8B44240C 8B542410 8B1B 8A08 D3C3 891A 31C0 C20A00" End Function Private Sub ExecuteMe(ByVal YourCode As String) Dim i As Long, size As Long, b() As Byte YourCode = Replace$(YourCode, " ", "") size = LenB(YourCode) ReDim Preserve b(1 To size) For i = 1 To size b(i) = Val("&H" & Mid$(YourCode, i * 2 - 1, 2)) Next Static p As Long ReDim Preserve Proc(p) Dim Mem As Long, Ptr As Long Mem = GlobalAlloc(0, size) Ptr = GlobalLock(Mem) RtlMoveMemory ByVal Ptr, b(1), size GlobalUnlock Mem Proc(p).Memory = Mem Proc(p).Pointer = VirtualTable(p) VirtualTable(p) = Ptr p = p + 1 End Sub Private Property Let VirtualTable(ByVal Index As Long, ByVal ProcPtr As Long) Dim i As Long Index = &H1C + Index * 4 RtlMoveMemory i, ByVal ObjPtr(Me), 4 RtlMoveMemory ByVal i + Index, ProcPtr, 4 End Property Private Property Get VirtualTable(ByVal Index As Long) As Long Dim i As Long Index = &H1C + Index * 4 RtlMoveMemory i, ByVal ObjPtr(Me), 4 RtlMoveMemory VirtualTable, ByVal i + Index, 4 End Property Private Sub Class_Terminate() On Error GoTo Error Dim i As Long For i = 0 To UBound(Proc) VirtualTable(i) = Proc(i).Pointer GlobalFree Proc(i).Memory Next Error: End Sub [/code] [code] mov ebx, dword [esp+08h] ; value mov eax, dword [esp+0Ch] ; shift mov edx, dword [esp+10h] ; hresult mov ebx, [ebx] mov cl, byte [eax] rol ebx, cl mov dword [edx], ebx xor eax, eax ret 10 [/code] [code] mov ebx, dword [esp+08h] ; value mov eax, dword [esp+0Ch] ; shift mov edx, dword [esp+10h] ; hresult mov ebx, [ebx] mov cl, byte [eax] shl ebx, cl mov dword [edx], ebx xor eax, eax ret 10 [/code] [code] mov ebx, dword [esp+08h] ; value mov eax, dword [esp+0Ch] ; shift mov edx, dword [esp+10h] ; hresult mov ebx, [ebx] mov cl, byte [eax] shr ebx, cl mov dword [edx], ebx xor eax, eax ret 10 [/code] The above three snippets are using nasm! have fun, and don't forget you need the following declares in a module! 'Memory allocation functions Public Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long Public Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long Public Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Public Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long 'Memory copy and move functions Public Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal Length As Long) | May 14, 2003, 4:16 AM |
TheMinistered | I implemented a version of CalcHashBuf using the aid of the bitwise functions above, I will post it sometime in the future (hopefully). | May 14, 2003, 4:23 AM |
Yoni | You are writing VB code in the same style I wrote VB code just before I switched to VC++. (i.e. highly exaggerated low level stuff beyond the power of VB) Switch to VC++. | May 14, 2003, 1:49 PM |
iago | That's what I was going to say. Clearly you've pretty much grown beyond the scope of what you can do with vb and move on to something more powerful :-) | May 14, 2003, 4:22 PM |
Dumb_Canadian | Sounds like you're ready for VB.NET, TheMinistered:) | May 15, 2003, 3:42 PM |
St0rm.iD | He intended to get BEYOND VB6, not lower himself farther. | May 16, 2003, 12:08 AM |