UID 5585
精华
积分 131
威望 点
宅币 个
贡献 次
宅之契约 份
最后登录 1970-1-1
在线时间 小时
本帖最后由 smitest 于 2020-2-18 21:29 编辑
最近做一个进程内存共享的项目,出于VB访问数据方便,想到了VB变量与内存绑定的问题,花了大约一周的时间学习了VB的数据类型结构,通过多方比较,最后采用了variant类型作为指针,实际使用起来更加方便。
直接上代码和说明:
特点:1 一个指针,随时可以改变指向数据的类型 2 具备指针增量可任意指定特性,对于内存不对齐的数据搜索很有用,比如一个4字节内存(1234),可以映射成3个Integer(12 23 34)
需要进一步探讨,可联系QQ 347895961.
主文件,没啥好解释的。
.686p
.model flat, stdcall
option casemap :none
.mmx
.XMM
include windows.inc
include MyFun.asm
.const
.data
.data?
hInstance dd ?
.CODE
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.if reason == DLL_PROCESS_ATTACH
mov eax,hInstDLL
mov hInstance,eax
mov eax,TRUE
ret
.endif
ret
LibMain Endp
End LibMain 复制代码
DEF文件,Aogo的IDE用的很舒服,可惜不更新了
LIBRARY VB6Ex
DESCRIPTION This DLL by MASMPlus
EXPORTS
int3
stBindVar
stUnBindAll
stUnBind 复制代码
处理代码
int3 proto ;调试VB程序用的,对这个主题没啥意义
stBindVar proto pVar:DWORD,pMem:DWORD,nSize:DWORD,nType:DWORD,nStep:DWORD
stUnBindAll proto
stUnBind proto pVar:DWORD
;以下的暂时写的支持的VB数据类型,该常数对应于VB的VBVARTYPE枚举结构
vbInteger equ 2
vbLong equ 3
vbSingle equ 4
vbDouble equ 5
vbCurrency equ 6
vbBoolean equ 11
vbByte equ 17
;以上变量对应的内存字节数据
vbIntegerSize equ 2
vbLongSize equ 4
vbSingleSize equ 4
vbDoubleSize equ 8
vbCurrencySize equ 8
vbBooleanSize equ 2
vbByteSize equ 1
;安全数组结构
SafeArray1D struct
cDims dw 0
fFeatures dw 0
cbStep dd 0
cLocks dd 0
pvData dd 0
Elements dd 0
Lbound dd 0
reserved0 dd 0
reserved1 dd 0
SafeArray1D ends
;Variant数据类型
Variant struct
vType db 0
vArray db 0
reserved1 dw 0
BindID dd 0
pSafeArray dd 0
reserved2 dd 0
Variant ends
;最大指针数目
MaxSize equ 16
.DATA
align 16
Varptr dd MaxSize dup(0)
align 16
VarStruct Variant MaxSize dup (<>)
align 16
VarSA SafeArray1D MaxSize dup(<>)
.code
;指针绑定内存数据 参数分别为:要绑定的指针,内存地址,内存大小,指针类型,指针增量
stBindVar proc uses edx ecx esi edi pVar:DWORD,pMem:DWORD,nSize:DWORD,nType:DWORD,nStep:DWORD
local mType,mStep,mElements
mov eax,nType
.if eax==vbByte
mov mStep,vbByteSize
.elseif eax==vbInteger
mov mStep,vbIntegerSize
.elseif eax==vbLong
mov mStep,vbLongSize
.elseif eax==vbSingle
mov mStep,vbSingleSize
.elseif eax==vbDouble
mov mStep,vbDoubleSize
.elseif eax==vbBoolean
mov mStep,vbBooleanSize
.elseif eax==vbCurrency
mov mStep,vbCurrencySize
.else
mov mStep,vbByteSize
mov nType,vbByte
.endif
.if nStep!=0
mov eax,nStep
mov mStep,eax
.endif
xor edx,edx
mov eax,nSize
div mStep
.if edx!=0
inc eax
.endif
mov mElements,eax
mov eax,pVar
mov edi,offset Varptr
mov ecx,MaxSize
cld
repnz scasd
.if !Zero?
xor eax,eax
mov edi,offset Varptr
mov ecx,MaxSize
repnz scasd
.if !Zero?
mov eax,-1
ret
.endif
mov eax,pVar
.endif
sub ecx,MaxSize
not ecx
mov [Varptr+ecx*4],eax
pxor xmm0,xmm0
mov edi,pVar
movupd [edi],xmm0
shl ecx,4
lea esi,[VarSA+ecx*2]
assume esi:ptr SafeArray1D
mov WORD ptr [esi].cDims,1
mov WORD ptr [esi].fFeatures,92h
mov eax,mStep
mov [esi].cbStep,eax
mov [esi].cLocks,0
mov eax,pMem
mov [esi].pvData,eax
mov eax,mElements
mov [esi].Elements,eax
mov [esi].Lbound,0
lea esi,[VarStruct+ecx]
assume esi:ptr Variant
mov eax,nType
mov BYTE ptr [esi].vType,al
mov BYTE ptr [esi].vArray,32
mov [esi].reserved1,0
mov [esi].BindID,'xEBV'
mov [esi].reserved2,'TSyb'
lea eax,[VarSA+ecx*2]
mov [esi].pSafeArray,eax
assume esi:nothing
movupd xmm0,[esi]
movupd [edi],xmm0
fclex
ret
stBindVar endp
;解除绑定
stUnBindAll proc uses edi ecx
mov edi,offset Varptr
xor ecx,ecx
pxor xmm0,xmm0
@@:
mov eax,[edi+ecx*4]
.if eax!=0
movupd [eax],xmm0
mov DWORD ptr [edi+ecx*4],0
.endif
inc ecx
cmp ecx,MaxSize
jb @B
ret
stUnBindAll endp
;解除单个变量的绑定
stUnBind proc uses edi ecx pVar:DWORD
mov eax,pVar
mov edi,offset Varptr
mov ecx,MaxSize
cld
repnz scasd
.if Zero?
pxor xmm0,xmm0
mov eax,[edi-4]
movupd [eax],xmm0
mov DWORD ptr [edi-4],0
xor eax,eax
.endif
ret
stUnBind endp
;调试VB程序用,研究VB数据存储访问结构就这个发挥了巨大作用
int3 proc
int 3
ret
int3 endp
复制代码