VB程序逆向常用的函数
1) 数据类型转换:
a) __vbaI2Str 将一个字符串转为8 位(1个字节)的数值形式(范围在 0 至 255 之间) 或2 个字节的数值形式(范围在 -32,768 到 32,767 之间)。 b)__vbaI4Str 将一个字符串转为长整型(4个字节)的数值形式(范围从-2,147,483,6482,147,483,647) c)__vbar4Str 将一个字符串转为单精度单精度浮点型(4个字节)的数值形式 d)__vbar8Str 将一个字符串转为双精度单精度浮点型(8个字节)的数值形式 e) VarCyFromStr (仅VB6库. 要调试,则在WINICE.DAT里必须有 OLEAUT32.DLL)字符串到变比型数据类型 f) VarBstrFromI2 (仅VB6库. 要调试,则在WINICE.DAT里必须有 OLEAUT32.DLL)整型数据到字符串:
2) 数据移动:
a) __vbaStrCopy 将一个字符串拷贝到内存,类似于 Windows API HMEMCPY b) __vbaVarCopy 将一个变量值串拷贝到内存 c) __vbaVarMove 变量在内存中移动,或将一个变量值串拷贝到内存
3) 数学运算:
a) __vbavaradd 两个变量值相加 b) __vbavarsub 第一个变量减去第二个变量 c) __vbavarmul 两个变量值相乘 d) __vbavaridiv 第一个变量除以第二个变量,得到一个整数商 e) __vbavarxor 两个变量值做异或运算
4) 程序设计杂项:
a) __vbavarfornext 这是VB程序里的循环结构, For... Next... (Loop) b) __vbafreestr 释放出字符串所占的内存,也就是把内存某个位置的字符串给抹掉 c) __vbafreeobj 释放出VB一个对象(一个窗口,一个对话框)所占的内存,也就是把内存某个位置的一个窗口,一个对话框抹掉 d) __vbastrvarval 从字符串特点位置上获取其值 e) multibytetowidechar 将数据转换为宽字符格式,VB在处理数据之都要这样做,在TRW2000显示为7.8.7.8.7.8.7.8 f) rtcMsgBox 调用一个消息框,类似于WINDOWS里的messagebox/a/exa,此之前一定有个PUSH命令将要在消息框中显示的数据压入椎栈 g) __vbavarcat 将两个变量值相连,如果是两个字符串,就连在一起 h) __vbafreevar 释放出变量所占的内存,也就是把内存某个位置的变量给抹掉 i) __vbaobjset j) __vbaLenBstr 获得一个字符串的长度,注:VB中一个汉字的长度也为1 k) rtcInputBox 显示一个VB标准的输入窗口,类似window's API getwindowtext/a, GetDlgItemtext/a l) __vbaNew 调用显示一个对话框,类似 Windows' API Dialogbox m) __vbaNew2 调用显示一个对话框,类似 Windows' API Dialogboxparam/a n) rtcTrimBstr 将字串左右两边的空格去掉
5) 比较函数
a) __vbastrcomp 比较两个字符串,类似于 Window's API lstrcmp b) __vbastrcmp 比较两个字符串,类似于 Window's API lstrcmp c) __vbavartsteq 比较两个变量值是否相等 d)__vbaFpCmpCy - Compares Floating point to currency. sp; Compares Floating point to currency
6) 在动态跟踪,分析算法时,尤其要注意的函数:
rtcMidCharVar 从字符串中取相应字符,VB中的MID函数,用法MID("字符串","开始的位置","取几个字符") rtcLeftCharVar 从字符串左边取相应字符,VB中的用法:left("字符串","从左边开始取几个字符") rtcRightCharVar 从字符串右边取相应字符,VB中的用法:Right("字符串","从右边开始取几个字符") __vbaStrCat 用字符串的操作,就是将两个字符串合起来,在VB中只有一个&或+ __vbaStrCmp 字符串比较,在VB中只有一个=或<> ASC()函数 取一个字符的ASC值,在反汇编时,还是有的movsx 操作数
7) 在函数中的缩写:
bool 布尔型数据(TRUE 或 FALSE) str 字符串型数据 STRING i2 字节型数据或双字节整型数据 BYTE or Integer ui2 无符号双字节整型数据 i4 长整型数据(4字节) Long r4 单精度浮点型数据(4字节) Single r8 双精度浮点型数据(8字节) Double cy (8 个字节)整型的数值形式 Currency var 变量 Variant fp 浮点数据类型 Float Point cmp 比较 compare comp 比较 compare Btw: __vbavartsteq系列的还有__vbavartstne 不等于 __vbavartstGe,__vbavartstGt,__vbavartstLe,__vbavartstLt等,比较大于或小于
--------------
Variant 变量的内部表示:
_______________________________________________________________符号常量 值 内部表示 字节数
V_EMPTY 0 Empty V_NULL 1 Null V_INTEGER 2 Interger 2 V_LONG 3 Long 4 V_SINGLE 4 Single 4 V_DOUBLE 5 Double 8 V_CURRENCY 6 Currency 8 V_DATE 7 Date 8 V_STRING 8 String V_OLE 9 OLE Automation Object V_ERROR 10 Error V_BOOLEAN 11 Boolean 2 V_VARIANT 12 Variant(仅用于变体数组) 16(22) V_OBJECT 13 Object(非OLE自动化对象) 4 V_BYTE 17 Byte 1 V_ARRAY 8192 Array __________________________________________________________________vbaVarMove ;变体变量赋值(一般用于数值变量)
lea edx,var1 ;变量1的地址放到edx
lea ecx,var2 ;变量2的地址放到ecx call __vbaVarMove ;把变量1赋值给变量2 ;------------------------------------------------- __vbaVarCopy ;变体变量赋值(一般用于字符串变量)lea edx,var1 ;变量1的地址放到edx
lea ecx,var2 ;变量2的地址放到ecx call __vbaVarMove ;把变量1赋值给变量2 ;-------------------------------------------------__vbaVarAdd ;变体变量相加 +
lea eax,var1
push eax ;加数1 lea ecx,var2 push ecx ;加数2 lea edx,var3 push edx ;结果 call __vbaVarAdd ;变量相加,在eax中返回 ;-------------------------------------------------__vbaVarSub ;变体变量相减 -
lea eax,var1
push eax ;被减数 lea ecx,var2 push ecx ;减数 lea edx,var3 push edx ;结果 call __vbaVarSub ;变量相减,在eax中返回 ;-------------------------------------------------__vbaVarMul ;变体变量相乘 *
lea eax,var1
push eax ;被乘数 lea ecx,var2 push ecx ;乘数 lea edx,var3 push edx ;结果 call __vbaVarMul ;变量相乘,在eax中返回 ;-------------------------------------------------__vbaVarDiv ;变体变量相除(浮点除法)/
lea eax,var1
push eax ;被除数 lea ecx,var2 push ecx ;除数 lea edx,var3 push edx ;结果 call __vbaVarDiv ;变量相除,在eax中返回 ;------------------------------------------------__vbaVarIdiv ;变体变量相除(整数除法)\
lea eax,var1
push eax ;被除数 lea ecx,var2 push ecx ;除数 lea edx,var3 push edx ;结果 call __vbaVarIdiv ;变量相除,在eax中返回 ;------------------------------------------------ __vbaVarMod ;变体变量取模运算 Modlea eax,var1
push eax ;被除数 lea ecx,var2 push ecx ;除数 lea edx,var3 push edx ;结果 call __vbaVarMod ;变量去模,在eax中返回 ;------------------------------------------------ __vbaVarNeg ;变体变量前加负号 -lea eax,var1
push eax ;变量 lea ecx,var2 push ecx ;结果 call __vbaVarNeg ;对变量取补 ;------------------------------------------------ __vbaVarPow ;变体变量求幂 ^lea eax,var1
push eax ;底数 lea ecx,var2 push ecx ;指数 lea edx,var3 push edx ;结果 call __vbaVarPow ;求幂,在eax中返回 ;------------------------------------------------ __vbaVarTstGt ;关系运算 >lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstGt ;if var1 > var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarTstGe ;关系运算 >=lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstGe ;if var1 >= var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarTstEq ;关系运算 =lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstEq ;if var1 = var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarTstNe ;关系运算 <>lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstNe ;if var1 <> var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarTstLt ;关系运算 <lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstLt ;if var1 < var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarTstLe ;关系运算 <=lea eax,var1
push eax ;变量1 lea eax,var2 push eax ;变量2 call __vbaVarTstLe ;if var1 <= var2 then ax = &Hffff ;else ax = 0 ;end if ;------------------------------------------------ __vbaVarAnd ;逻辑运算 Andlea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;变量2 lea edx,var3 push edx ;结果 call __vbaVarAnd ;逻辑运算,在eax中返回 ;------------------------------------------------ __vbaVarOr ;逻辑运算 Orlea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;变量2 lea edx,var3 push edx ;结果 call __vbaVarOr ;逻辑运算,在eax中返回 ;------------------------------------------------ __vbaVarXor ;逻辑运算 Xorlea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;变量2 lea edx,var3 push edx ;结果 call __vbaVarXor ;逻辑运算,在eax中返回 ;------------------------------------------------ __vbaVarEqv ;逻辑运算 Eqvlea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;变量2 lea edx,var3 push edx ;结果 call __vbaVarEqv ;逻辑运算,在eax中返回 ;------------------------------------------------ __vbaVarImp ;逻辑运算 Implea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;变量2 lea edx,var3 push edx ;结果 call __vbaVarImp ;逻辑运算,在eax中返回 ;------------------------------------------------ __vbaVarNot ;逻辑运算 Notlea eax,var1
push eax ;变量1 lea ecx,var2 push ecx ;结果 call __vbaVarNot ;逻辑运算,在eax中返回 ;------------------------------------------------ ;------------------------------------------------下面是函数 lea eax,var1 ;函数 Abs(num) push eax ;参数1 数值型 lea ecx,var2 push ecx ;结果 call __vbaVarAbs ;在eax中返回 结果 ;------------------------------------------------ rtcAnsiValueBstr ;函数 Asc(string)lea eax,var1
push eax ;参数1 字符串型 call rtcAnsiValueBstr ;结果在eax中返回 interger ;------------------------------------------------ MSVBVM60.#585 ;函数 Atn(num)push ecx ;参数 浮点数,用8个字节
push ecx CALL MSVBVM60.#585 ;结果在浮点栈中返回 ;------------------------------------------------ rtcVarBstrFromAnsi ;函数 Chr(interger)push eax ;参数1 整型
call rtcVarBstrFromAnsi ;结果在eax中返回 string ;------------------------------------------------ rtcCommandVar ;函数 Command() #670push eax ;参数1 字符串
call rtcCommandVar ;结果在eax中返回 string ;------------------------------------------------ rtcCos ;函数 Cos(num) #583call rtcCos ;输入参数在当前栈顶,8个字节,注意是浮点型
fstp st ;结果在浮点栈顶 ;------------------------------------------------ rtcCurrentDir ;函数 curdir(string) #647lea eax,var1 ;参数1 字符串
push eax lea edx,var2 ;结果 push edx call rtcCurrentDir ;结果在eax中返回 ;------------------------------------------------- rtcGetDateVar ;函数 Date #610lea edx,var1 ;结果
push edx call rtcGetDateVar ;结果在eax中返回,日期型(Date) ;------------------------------------------------- rtcDateAdd ;函数 DateAdd(string,double,date) #661push date ;8字节日期date
push double ;8字节浮点数double push string ;1字节字符的ASCII码,这里是地址 push var1 ;结果,日期型(date) call rtcDateAdd ;结果在eax中返回,日期型(Date) ;-------------------------------------------------- rtcDateDiff ;函数 DateDiff(string,date1,date2,...,...) #662push 1 ;默认值
push 1 ;默认值 lea eax,var1 ;日期2 push eax lea ecx,var2 ;日期1 push ecx lea edx,var3 ;字符串 push edx lea eax,var4 ;结果 push eax call rtcDateDiff ;结果在eax中返回,长整型(long) ;--------------------------------------------------- rtcDatePart ;函数 DatePart(string,date,...,...) #663push 1 ;默认值
push 1 ;默认值 lea eax,var1 ;日期 push eax lea ecx,var2 ;字符串 push ecx lea edx,var3 ;结果 push edx call rtcDatePart ;结果在eax中返回 ;---------------------------------------------------- rtcPackDate ;函数 DateSerial(integer,integer,integer) #538lea eax,var1 ;日
push eax lea ecx,var2 ;月 push ecx lea edx,var3 ;年 push edx lea eax,var4 ;结果 push eax call rtcPackDate ;结果在eax中返回,日期型(Date) ;----------------------------------------------------- rtcGetDateValue ;函数 DateValue(string)lea eax,var1 ;字符串
push eax lea edx,var2 ;结果 push edx call rtcGetDateValue ;结果在eax中返回,日期型(Date) ;----------------------------------------------------- rtcGetDayOfMonth ;函数 Day(date) #542lea eax,var1 ;日期
push eax lea ecx,var2 ;结果 push ecx call rtcGetDayOfMonth ;结果在eax中返回,整型 ;----------------------------------------------------- rtcDir ;函数 Dir #645lea eax, var1 ;属性
push eax lea ecx,var2 ;路径 push ecx call rtcDir ;结果在eax中返回,字符串型(string) ;----------------------------------------------------- rtcExp ;函数 exp #586LEA EDX,DWORD PTR SS:[EBP-24] ;参数
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var>] ;转换成浮点数,结果在浮点寄存器里 SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;压入堆栈 CALL DWORD PTR DS:[<&MSVBVM60.#586>] ;rtcExp FSTP QWORD PTR SS:[EBP-2C] ;结果存入堆栈 ;----------------------------------------------------- rtcFileDateTime ;函数 FileDateTime #577LEA EDX,DWORD PTR SS:[EBP-34]
PUSH 工程1.004016B0 ;文件名 PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#577>] ;rtcFileDateTime ;调用后结果同时在eax中 ;------------------------------------------------------ rtcFileLen ;函数 FileLen #578PUSH 工程1.004016B0 ;文件名
CALL DWORD PTR DS:[<&MSVBVM60.#578>] ;rtcFileLen ;结果在eax中 ;------------------------------------------------------ __vbaVarFix ;函数Fix(参数1)LEA EDX,DWORD PTR SS:[EBP-24]
LEA EAX,DWORD PTR SS:[EBP-54] PUSH EDX ;参数1 PUSH EAX ;返回的结果 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarFix>] MOV EDX,EAX ;------------------------------------------------------ rtcHexVarFromVar ;函数 Hex(num)lea eax,var1
push eax ;参数1 数值型 lea ecx,var2 push ecx ;存放结果的参数 call rtcHexVarFromVar ;在eax中返回string ;------------------------------------------------------ rtcGetHourOfDay ;函数 Hour #543LEA EAX,DWORD PTR SS:[EBP-34] ;时间日期型参数
LEA ECX,DWORD PTR SS:[EBP-44] ;存放结果的参数 PUSH EAX PUSH ECX CALL DWORD PTR DS:[<&MSVBVM60.#543>] ;Hour ;结果同时在eax中返回 ;------------------------------------------------------ rtcImmediateIf iif(参数1,参数2,参数3)LEA EDX,DWORD PTR SS:[EBP-54] ;参数3
LEA EAX,DWORD PTR SS:[EBP-44] ;参数2 PUSH EDX LEA ECX,DWORD PTR SS:[EBP-34] ;参数1,即表达式 PUSH EAX LEA EDX,DWORD PTR SS:[EBP-64] ;存放结果的参数 PUSH ECX PUSH EDX MOV DWORD PTR SS:[EBP-2C],-1 MOV DWORD PTR SS:[EBP-34],0B CALL DWORD PTR DS:[<&MSVBVM60.#681>] ;iif ;结果同时在eax中返回 ;------------------------------------------------------ __vbaInStrVar ;函数 InStr(起始位置,源字符串,目标字符串,比较方式)LEA EDX,DWORD PTR SS:[EBP-24]
PUSH 1 ;起始位置,从1开始 LEA EAX,DWORD PTR SS:[EBP-34] PUSH EDX ;被搜索的字符串 PUSH EAX ;要搜的字符串 LEA ECX,DWORD PTR SS:[EBP-54] PUSH 1 ;比较方式 PUSH ECX ;返回的结果 CALL DWORD PTR DS:[<&MSVBVM60.__vbaInStrVar>] MOV EDX,EAX ;结果同时在eax中返回 ;------------------------------------------------------ rtcInStrRev ;函数 InStrRev(源字符串,目标字符串,起始位置,比较方式) #709XOR ESI,ESI
PUSH ESI ;比较方式 PUSH -1 ;起始位置 LEA EAX,DWORD PTR SS:[EBP-4C] LEA ECX,DWORD PTR SS:[EBP-24] PUSH EAX ;目标字符串 LEA EDX,DWORD PTR SS:[EBP-48] PUSH ECX ;源字符串 PUSH EDX ;返回的结果 CALL DWORD PTR DS:[<&MSVBVM60.#709>] ;rtcInStrRev ;结果同时在eax中返回 ;结果同时在eax中返回 ;------------------------------------------------------ __vbaVarInt ;函数 Int(参数1)LEA ECX,DWORD PTR SS:[EBP-24]
LEA EDX,DWORD PTR SS:[EBP-54] PUSH ECX ;参数1 PUSH EDX ;返回的结果 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarInt>] MOV EDX,EAX ;结果同时在eax中返回 ;------------------------------------------------------ rtcIsArray ;函数 IsArray #556 LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针 PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#556>] ; MSVBVM60.rtcIsArray ;结果在eax中返回 ;------------------------------------------------------ rtcIsDate ;函数 IsDate #557LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#557>]; MSVBVM60.rtcIsDate ;结果在eax中返回 ;------------------------------------------------------ rtcIsEmpty ;函数 IsEmpty #558LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#558>] ; MSVBVM60.rtcIsEmpty ;结果在eax中返回 ;------------------------------------------------------ rtcIsError ;函数 IsError #559LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#559>] ; MSVBVM60.rtcIsError ;结果在eax中返回 ;------------------------------------------------------ rtcIsMissing ;函数 IsMissing #592LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#592>] ; MSVBVM60.rtcIsMissing ;结果在eax中返回 ;------------------------------------------------------ rtcIsNull ;函数 IsNull #560LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这是指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#560>] ;MSVBVM60.rtcIsNull ;结果在eax中返回 ;------------------------------------------------------ rtcIsNumeric ;函数 IsNumeric #561LEA EAX,DWORD PTR SS:[EBP-2C] ;参数1 **这里指针
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#561>];MSVBVM60.rtcIsNumeric ;结果在eax中返回 ;------------------------------------------------------ rtcIsObject ;函数 IsObject #562LEA EAX,DWORD PTR SS:[EBP-2C]
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#562>] ;MSVBVM60.rtcIsObject ;结果在eax中返回 ;------------------------------------------------------ __vbaLbound ;函数 LboundLEA EAX,DWORD PTR SS:[EBP-2C] ;参数1,数组
PUSH EAX PUSH 1 ;参数2,数组维数 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLboun>; MSVBVM60.__vbaLbound ;结果在eax中返回 ;------------------------------------------------------ rtcLowerCaseVar ;函数 Lcase #518LEA EDX,DWORD PTR SS:[EBP-24] ;参数1
LEA EAX,DWORD PTR SS:[EBP-48] ;结果 PUSH EDX PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#518>] ;MSVBVM60.rtcLowerCaseVar ;结果在eax中返回 ;------------------------------------------------------ rtcLeftCharVar ;函数 Left #617LEA EDX,DWORD PTR SS:[EBP-24] ;参数1
PUSH 3 ;参数2 LEA EAX,DWORD PTR SS:[EBP-48] ;结果 PUSH EDX PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#617>];MSVBVM60.rtcLeftCharVar ;结果在eax中返回 ;------------------------------------------------------ __vbaLenBstr ;函数 LenMOV EDX,DWORD PTR SS:[EBP-18] ;参数1
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; MSVBVM60.__vbaLenBstr ;结果在eax中返回 ;------------------------------------------------------ __vbaLenBstrB ;函数 LenBMOV EAX,DWORD PTR SS:[EBP-18] ;参数1
PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; MSVBVM60.__vbaLenBstrB ;结果在eax中返回 ;------------------------------------------------------ rtcLog ;函数 Log #587LEA EDX,DWORD PTR SS:[EBP-38] ;要作为参数的变量
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var> ;转换成实数,结果在浮点栈中 SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;参数入栈 CALL DWORD PTR DS:[<&MSVBVM60.#587>] ; MSVBVM60.rtcLog ;结果在浮点栈中 ;------------------------------------------------------ rtcLeftTrimVar ;函数 Ltrim #522LEA ECX,DWORD PTR SS:[EBP-68] ;参数1
LEA EDX,DWORD PTR SS:[EBP-58] ;结果 PUSH ECX PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#522>] ; MSVBVM60.rtcLeftTrimVar ;结果在eax中返回 ;------------------------------------------------------ rtcMidCharVar ;函数 MidPUSH EAX ;参数3
LEA ECX,DWORD PTR SS:[EBP-58] PUSH 3 ;参数2 LEA EDX,DWORD PTR SS:[EBP-48] PUSH ECX ;参数1 PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#632>];MSVBVM60.rtcMidCharVar ;结果在eax中返回 ;------------------------------------------------------ rtcGetMinuteOfHour ;函数 Minute #544LEA EAX,DWORD PTR SS:[EBP-24] ;参数1
LEA ECX,DWORD PTR SS:[EBP-64] ;结果 PUSH EAX PUSH ECX CALL DWORD PTR DS:[<&MSVBVM60.#544>] ;MSVBVM60.rtcGetMinuteOfHour ;结果在eax中返回 ;------------------------------------------------------ rtcGetMonthOfYear ;函数 Month #545LEA EDX,DWORD PTR SS:[EBP-24] ;参数1
LEA EAX,DWORD PTR SS:[EBP-64] ;结果 PUSH EDX PUSH EAX CALL DWORD PTR DS:[<&MSVBVM60.#545>] ;MSVBVM60.rtcGetMonthOfYear ;结果在eax中返回 ;------------------------------------------------------ rtcMonthName ;函数 MonthName #707PUSH EAX ;参数1
CALL DWORD PTR DS:[<&MSVBVM60.#707>] ;MSVBVM60.rtcMonthName ;结果在eax中返回 ;------------------------------------------------------ rtcMsgBox ;函数 MsgBoxLEA EAX,DWORD PTR SS:[EBP-64]
LEA ECX,DWORD PTR SS:[EBP-54] PUSH EAX ;参数5 LEA EDX,DWORD PTR SS:[EBP-34] PUSH ECX ;参数4 PUSH EDX ;参数3 LEA EAX,DWORD PTR SS:[EBP-24] PUSH ESI ;参数2 PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#595>]; MSVBVM60.rtcMsgBox ;结果在eax中返回 ;------------------------------------------------------ rtcGetPresentDate ;函数 Now #546LEA EDX,DWORD PTR SS:[EBP-34] ;存放结果的参数
PUSH EDX ; CALL DWORD PTR DS:[<&MSVBVM60.#546>] ;Now ;结果同时在eax中返回 ;------------------------------------------------------ rtcOctVarFromVar ;函数 Oct(num)lea eax,var1
push eax ;参数1 数值型 lea ecx,var2 push ecx ;结果 call rtcOctVarFromVar ;在eax中返回string ;------------------------------------------------------ rtcReplace ;函数 Replace #712PUSH ESI ;参数6
PUSH -1 ;参数5 PUSH 1 ;参数4 LEA EAX,DWORD PTR SS:[EBP-60] PUSH EAX ;参数3 LEA EDX,DWORD PTR SS:[EBP-5C] PUSH EDX ;参数2 LEA EAX,DWORD PTR SS:[EBP-24] PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#712>]; MSVBVM60.rtcReplace ;结果在eax中返回 ;----------------------------------------------------- rtcRgb ;函数 #588PUSH 28 ;参数3
PUSH 1E ;参数2 PUSH 14 ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#588>]; MSVBVM60.rtcRgb ;结果在eax中返回 ;----------------------------------------------------- rtcRightCharVar ;函数Right #619LEA EDX,DWORD PTR SS:[EBP-24]
PUSH 3 ;参数2 LEA EAX,DWORD PTR SS:[EBP-44] PUSH EDX ;参数1 PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#619>];MSVBVM60.rtcRightCharVar ;结果在eax中返回 ;----------------------------------------------------- rtcRound ;函数 Round #714LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDI ;参数2 LEA EAX,DWORD PTR SS:[EBP-44] PUSH EDX ;参数1 PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#714>] ;MSVBVM60.rtcRound ;结果在eax中返回 ;----------------------------------------------------- rtcRandomize ;函数 Randomize #594LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#594>] ; MSVBVM60.rtcRandomize ;----------------------------------------------------- rtcRandomNext ;函数 Rnd #593LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#593>] ; MSVBVM60.rtcRandomNext ;结果在浮点栈中 ;----------------------------------------------------- rtcRightTrimVar ;函数 Rtrim #524LEA ECX,DWORD PTR SS:[EBP-68] ;参数1
LEA EDX,DWORD PTR SS:[EBP-58] ;结果 PUSH ECX PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#524>] ; MSVBVM60.rtcRightTrimVar ;结果在eax中返回 ;----------------------------------------------------- rtcGetSecondOfMinute ;函数 Sound #547LEA EAX,DWORD PTR SS:[EBP-24] ;参数1
LEA ECX,DWORD PTR SS:[EBP-44] ;结果 PUSH EAX PUSH ECX CALL DWORD PTR DS:[<&MSVBVM60.#547>];MSVBVM60.rtcGetSecondOfMinute ;结果在eax中返回 ;----------------------------------------------------- __vbaR8Sgn ;函数 SgnPUSH EDX
CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var>;MSVBVM60.__vbaR8Var SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Sgn>;MSVBVM60.__vbaR8Sgn ;结果在ax中返回 ;----------------------------------------------------- rtcShell ;函数 Shell #600PUSH 1 ;参数2
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#600>];MSVBVM60.rtcShell ;结果在浮点栈中 ;----------------------------------------------------- rtcSin ;函数 Sin #582LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var>;MSVBVM60.__vbaR8Var SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#582>] ;MSVBVM60.rtcSin ;结果在浮点栈中 ;----------------------------------------------------- rtcSpaceVar ;函数 Space #526PUSH 5 ;参数1
LEA EDX,DWORD PTR SS:[EBP-34] PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#526>]; MSVBVM60.rtcSpaceVar ;结果在eax中返回 ;----------------------------------------------------- rtcSplit ;函数 Split #711PUSH ESI ;参数4
LEA EDX,DWORD PTR SS:[EBP-48] PUSH -1 ;参数3 LEA EAX,DWORD PTR SS:[EBP-24] PUSH EDX ;参数2 LEA ECX,DWORD PTR SS:[EBP-38] LEA EDX,DWORD PTR SS:[EBP-58] PUSH EAX ;参数1 PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#711>] ;MSVBVM60.rtcSplit ;结果在eax中返回 ;----------------------------------------------------- rtcSqr ;函数 rtcSqr #614LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var>;MSVBVM60.__vbaR8Var SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#614>] ;MSVBVM60.rtcSqr ;结果在浮点栈中 ;----------------------------------------------------- rtcVarStrFromVar ;函数 Str #613LEA EDX,DWORD PTR SS:[EBP-24]
LEA EAX,DWORD PTR SS:[EBP-44] PUSH EDX ;参数1 PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#613>] ;MSVBVM60.rtcVarStrFromVar ;结果在eax中返回 ;----------------------------------------------------- __vbaStrCompVar ;函数 StrCompLEA EDX,DWORD PTR SS:[EBP-24]
LEA EAX,DWORD PTR SS:[EBP-34] PUSH EDX ;参数1 PUSH EAX ;参数2 LEA ECX,DWORD PTR SS:[EBP-54] PUSH EDI ;参数3 PUSH ECX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrCo>;MSVBVM60.__vbaStrCompVar ;结果在eax中返回 ;----------------------------------------------------- rtcStrConvVar2 ;函数 Strconv #717PUSH EDI ;参数3
LEA EDX,DWORD PTR SS:[EBP-24] PUSH 1 ;参数2 LEA EAX,DWORD PTR SS:[EBP-44] PUSH EDX ;参数1 PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#717>]; MSVBVM60.rtcStrConvVar2 ;结果在eax中返回 ;----------------------------------------------------- rtcStringVar ;函数 StringLEA EDX,DWORD PTR SS:[EBP-24]
LEA EAX,DWORD PTR SS:[EBP-44] PUSH EDX ;参数2 PUSH 5 ;参数1 PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#607>];MSVBVM60.rtcStringVar ;结果在eax中返回 ;----------------------------------------------------- rtcStrReverse ;函数 StrReverse #713LEA EAX,DWORD PTR SS:[EBP-38]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#713>] ;MSVBVM60.rtcStrReverse ;结果在eax中返回 ;----------------------------------------------------- rtcTan ;函数 Tan #584LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Var>;MSVBVM60.__vbaR8Var SUB ESP,8 FSTP QWORD PTR SS:[ESP] ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#584>] ;MSVBVM60.rtcTan ;结果在浮点栈中返回 ;----------------------------------------------------- rtcGetTimeVar ;函数 Time #612LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#612>];MSVBVM60.rtcGetTimeVar ;结果在eax中返回 ------------------------------------------------------- rtcGetTimer ;函数 Timer #535CALL DWORD PTR DS:[<&MSVBVM60.#535>] ; MSVBVM60.rtcGetTimer
;结果在浮点栈中返回 ;----------------------------------------------------- rtcPackTime ;函数 TimeSerial #539LEA EDX,DWORD PTR SS:[EBP-44]
PUSH EDX ;参数3 LEA EAX,DWORD PTR SS:[EBP-34] PUSH EAX ;参数2 LEA ECX,DWORD PTR SS:[EBP-24] PUSH ECX ;参数1 LEA EDX,DWORD PTR SS:[EBP-64] PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#539>] ;MSVBVM60.rtcPackTime ;结果在eax中返回 ------------------------------------------------------- rtcGetTimeValue ;函数 TimeValue #541LEA EAX,DWORD PTR SS:[EBP-38]
LEA ECX,DWORD PTR SS:[EBP-48] PUSH EAX ;参数1 PUSH ECX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#541>] ;MSVBVM60.rtcGetTimeValue ;结果在eax中返回 ------------------------------------------------------- rtcTrimVar ;函数 Trim #520LEA ECX,DWORD PTR SS:[EBP-68] ;参数1
LEA EDX,DWORD PTR SS:[EBP-58] ;结果 PUSH ECX PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#520>] ; MSVBVM60.rtcTrimVar ;结果在eax中返回 ------------------------------------------------------- rtcTypeName ;函数 TypeName #591LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#591>];MSVBVM60.rtcTypeName ;结果在eax中返回 ------------------------------------------------------- __vbaUbound ;函数 UboundLEA ECX,DWORD PTR SS:[EBP-2C] ;参数1,数组
PUSH ECX PUSH 1 ;参数2,数组维数 CALL DWORD PTR DS:[<&MSVBVM60.__vbaUboun>;MSVBVM60.__vbaUbound ;结果在eax中返回 ;------------------------------------------------------ rtcUpperCaseVar ;函数 UcaseLEA ECX,DWORD PTR SS:[EBP-24] ;参数1
LEA EDX,DWORD PTR SS:[EBP-48] ;结果 PUSH ECX PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#528>] ;MSVBVM60.rtcUpperCaseVar ;结果在eax中返回 ;------------------------------------------------------ rtcR8ValFromBstr ;函数 Val #581LEA EAX,DWORD PTR SS:[EBP-38]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#581>];MSVBVM60.rtcR8ValFromBstr ;结果在浮点栈中 ;----------------------------------------------------- rtcVarType ;函数 VarType #563LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.#563>];MSVBVM60.rtcVarType ;结果在eax中 ;----------------------------------------------------- rtcWeekdayName ;函数 WeekdayName #706PUSH EDI
LEA EDX,DWORD PTR SS:[EBP-24] PUSH EDI PUSH EDX CALL DWORD PTR DS:[<&MSVBVM60.#706>];MSVBVM60.rtcWeekdayName ;结果在eax中 ;----------------------------------------------------- rtcGetYear ;函数 Year #553LEA EAX,DWORD PTR SS:[EBP-24]
LEA ECX,DWORD PTR SS:[EBP-44] PUSH EAX ;参数1 PUSH ECX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#553>];MSVBVM60.rtcGetYear ;结果在eax中 ;----------------------------------------------------- __vbaBoolErrVar ;函数 CBoolLEA EDX,DWORD PTR SS:[EBP-74]
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaBoolE>; MSVBVM60.__vbaBoolErrVar ;结果在ax中 ;----------------------------------------------------- __vbaUI1ErrVar ;函数 CbyteLEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaUI1Er>; MSVBVM60.__vbaUI1ErrVar ;结果在al中 ;----------------------------------------------------- __vbaCyErrVar ;函数 CcurLEA ECX,DWORD PTR SS:[EBP-74]
PUSH ECX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaCyErr>; MSVBVM60.__vbaCyErrVar ;结果在eax中 ;----------------------------------------------------- __vbaDateVar ;函数 CdateLEA EDX,DWORD PTR SS:[EBP-74]
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaDateV>; MSVBVM60.__vbaDateVar SUB ESP,8 FSTP QWORD PTR SS:[ESP] CALL DWORD PTR DS:[<&MSVBVM60.__vbaDateR>; MSVBVM60.__vbaDateR8 ;结果在浮点栈中 ;----------------------------------------------------- __vbaR8ErrVar ;函数 CdblLEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Err>; MSVBVM60.__vbaR8ErrVar ;结果在浮点栈中 ;----------------------------------------------------- rtDecFromVar ;函数 Cdec #564LEA ECX,DWORD PTR SS:[EBP-F4]
LEA EDX,DWORD PTR SS:[EBP-74] PUSH ECX ;参数1 PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#564>] ; MSVBVM60.rtDecFromVar ;结果在eax中 ;----------------------------------------------------- __vbaI2ErrVar ;函数 CintLEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2Err>; MSVBVM60.__vbaI2ErrVar ;结果在ax中 ;----------------------------------------------------- __vbaI4ErrVar ;函数 ClngLEA ECX,DWORD PTR SS:[EBP-74]
PUSH ECX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaI4Err>; MSVBVM60.__vbaI4ErrVar ;结果在eax中 ;----------------------------------------------------- __vbaR4ErrVar ;函数 CsngLEA EDX,DWORD PTR SS:[EBP-74]
PUSH EDX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaR4Err>; MSVBVM60.__vbaR4ErrVar ;结果在浮点栈中 ;----------------------------------------------------- __vbaStrErrVarCopy ;函数 CstrLEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;参数1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrEr>; MSVBVM60.__vbaStrErrVarCopy ;结果在eax中 ;----------------------------------------------------- __vbaVarCopy ;函数 CvarLEA EDX,DWORD PTR SS:[EBP-74] ;参数1
LEA ECX,DWORD PTR SS:[EBP-54] ;结果 CALL DWORD PTR DS:[<&MSVBVM60.__vbaVarCo>; MSVBVM60.__vbaVarCopy ;结果在eax中 ;----------------------------------------------------- __vbaFileOpen ;Open语句PUSH 工程1.004014C0 ;文件名
PUSH 1 ;文件号 PUSH 1 ;len PUSH 320 ;for,access,lock CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileO>; MSVBVM60.__vbaFileOpen ;------------------------------------------------------ __vbaFileClose ;Close语句PUSH 1 ;文件号
CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileC>; MSVBVM60.__vbaFileClose ;------------------------------------------------------ rtcFreeFile ;函数 FreeFileLEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#648>]; MSVBVM60.rtcFreeFile ;结果在ax中 ;------------------------------------------------------ rtcFileLength ;函数 LOF #570LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;文件号 CALL DWORD PTR DS:[<&MSVBVM60.#570>]; MSVBVM60.rtcFileLength ;结果在eax中 ;------------------------------------------------------ rtcFileLocation ;函数 loc #569LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;文件号 CALL DWORD PTR DS:[<&MSVBVM60.#569>]; MSVBVM60.rtcFileLocation ;结果在eax中 ;------------------------------------------------------ rtcFileAttributes ;函数 FileAttr #555LEA ECX,DWORD PTR SS:[EBP-34]
PUSH 1 ;属性 PUSH ECX ;文件号 CALL DWORD PTR DS:[<&MSVBVM60.#555>]; MSVBVM60.rtcFileAttributes ;结果在eax中 ;------------------------------------------------------ __vbaPrintFile ;Print #文件号,变量 (顺序文件操作)LEA EAX,DWORD PTR SS:[EBP-24]
LEA ECX,DWORD PTR SS:[EBP-34] PUSH ECX ;变量 PUSH EAX ;文件号 PUSH 工程1.00401948 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPrint>;MSVBVM60.__vbaPrintFile ;----------------------------------------------------- __vbaWriteFile ;write #文件号,变量 (顺序文件操作)LEA EDX,DWORD PTR SS:[EBP-24]
LEA EAX,DWORD PTR SS:[EBP-34] PUSH EDX ;变量 PUSH EAX ;文件号 PUSH 工程1.00401948 CALL DWORD PTR DS:[<&MSVBVM60.__vbaWrite>;MSVBVM60.__vbaWriteFile ;----------------------------------------------------- __vbaInputFile ;input #文件号,变量 (顺序文件操作)LEA EAX,DWORD PTR SS:[EBP-24]
LEA ECX,DWORD PTR SS:[EBP-34] PUSH EAX ;变量 PUSH ECX ;文件号 PUSH 工程1.00401938 CALL DWORD PTR DS:[<&MSVBVM60.__vbaInput>; MSVBVM60.__vbaInputFile ;----------------------------------------------------- __vbaLineInputVar ;line input #文件号,变量 (顺序文件操作)LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;文件号 LEA EAX,DWORD PTR SS:[EBP-44] PUSH EAX ;变量 CALL DWORD PTR DS:[<&MSVBVM60.__vbaLineI>; MSVBVM60.__vbaLineInputVar ;结果在eax中返回 ;----------------------------------------------------- rtcInputCharCountVar ;函数 input(#文件号,长度) #621 (顺序文件操作)LEA ECX,DWORD PTR SS:[EBP-34]
PUSH ECX ;文件号 LEA EDX,DWORD PTR SS:[EBP-64] PUSH 2 ;长度 PUSH EDX ;结果 CALL DWORD PTR DS:[<&MSVBVM60.#621>]; MSVBVM60.rtcInputCharCountVar ;结果在eax中返回 ;----------------------------------------------------- __vbaPut4 ;语句 Put 文件号,位置,变量 (binary文件操作)LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;文件号 LEA ECX,DWORD PTR SS:[EBP-24] PUSH 2 ;位置 PUSH ECX ;变量 PUSH -1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaPut4>>;MSVBVM60.__vbaPut4 ;----------------------------------------------------- __vbaFileSeek ;语句 Seek 文件号,位置 (binary文件操作)LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;文件号 PUSH 2 ;位置 CALL DWORD PTR DS:[<&MSVBVM60.__vbaFileS>;MSVBVM60.__vbaFileSeek ;----------------------------------------------------- __vbaGet4 ;语句 Get 文件号,位置,变量 (binary文件操作)LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;文件号 LEA ECX,DWORD PTR SS:[EBP-44] PUSH 2 ;位置 PUSH ECX ;变量 PUSH -1 CALL DWORD PTR DS:[<&MSVBVM60.__vbaGet4>>;MSVBVM60.__vbaGet4--------------------
variant结构, 和vartype enum
vb中如果不显示的定义数据类型, 并且没有加
Option Explicit的话, 那么定义的变量为variant. variant的结构的前2个字节描述了类型, 后面有3个word的保留. 接着为值.enum VARENUM
{ VT_EMPTY = 0, VT_NULL = 1, VT_I2 = 2, VT_I4 = 3, VT_R4 = 4, VT_R8 = 5, VT_CY = 6, VT_DATE = 7, VT_BSTR = 8, VT_DISPATCH = 9, VT_ERROR = 10, VT_BOOL = 11, VT_VARIANT = 12, VT_UNKNOWN = 13, VT_DECIMAL = 14, VT_I1 = 16, VT_UI1 = 17, VT_UI2 = 18, VT_UI4 = 19, VT_I8 = 20, VT_UI8 = 21, VT_INT = 22, VT_UINT = 23, VT_VOID = 24, VT_HRESULT = 25, VT_PTR = 26, VT_SAFEARRAY = 27, VT_CARRAY = 28, VT_USERDEFINED = 29, VT_LPSTR = 30, VT_LPWSTR = 31, VT_RECORD = 36, VT_INT_PTR = 37, VT_UINT_PTR = 38, VT_FILETIME = 64, VT_BLOB = 65, VT_STREAM = 66, VT_STORAGE = 67, VT_STREAMED_OBJECT = 68, VT_STORED_OBJECT = 69, VT_BLOB_OBJECT = 70, VT_CF = 71, VT_CLSID = 72, VT_VERSIONED_STREAM = 73, VT_BSTR_BLOB = 0xfff, VT_VECTOR = 0x1000, VT_ARRAY = 0x2000, VT_BYREF = 0x4000, VT_RESERVED = 0x8000, VT_ILLEGAL = 0xffff, VT_ILLEGALMASKED = 0xfff, VT_TYPEMASK = 0xfff } ;struct tagVARIANT { union { struct __tagVARIANT { VARTYPE vt; WORD wReserved1; WORD wReserved2; WORD wReserved3; union { LONGLONG llVal; LONG lVal; BYTE bVal; SHORT iVal; FLOAT fltVal; DOUBLE dblVal; VARIANT_BOOL boolVal; _VARIANT_BOOL bool; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; IUnknown *punkVal; IDispatch *pdispVal; SAFEARRAY *parray; BYTE *pbVal; SHORT *piVal; LONG *plVal; LONGLONG *pllVal; FLOAT *pfltVal; DOUBLE *pdblVal; VARIANT_BOOL *pboolVal; _VARIANT_BOOL *pbool; SCODE *pscode; CY *pcyVal; DATE *pdate; BSTR *pbstrVal; IUnknown **ppunkVal; IDispatch **ppdispVal; SAFEARRAY **pparray; VARIANT *pvarVal; PVOID byref; CHAR cVal; USHORT uiVal; ULONG ulVal; ULONGLONG ullVal; INT intVal; UINT uintVal; DECIMAL *pdecVal; CHAR *pcVal; USHORT *puiVal; ULONG *pulVal; ULONGLONG *pullVal; INT *pintVal; UINT *puintVal; struct __tagBRECORD { PVOID pvRecord; IRecordInfo *pRecInfo; } __VARIANT_NAME_4; } __VARIANT_NAME_3; } __VARIANT_NAME_2; DECIMAL decVal; } __VARIANT_NAME_1; } ;