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)整型數據到字符串: dom
2) 數據移動: ide
a) __vbaStrCopy 將一個字符串拷貝到內存,相似於 Windows API HMEMCPY
b) __vbaVarCopy 將一個變量值串拷貝到內存
c) __vbaVarMove 變量在內存中移動,或將一個變量值串拷貝到內存 函數
3) 數學運算: oop
a) __vbavaradd 兩個變量值相加
b) __vbavarsub 第一個變量減去第二個變量
c) __vbavarmul 兩個變量值相乘
d) __vbavaridiv 第一個變量除以第二個變量,獲得一個整數商
e) __vbavarxor 兩個變量值作異或運算 ui
4) 程序設計雜項: spa
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 ;變體變量取模運算 Mod
lea 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 ;邏輯運算 And
lea eax,var1
push eax ;變量1
lea ecx,var2
push ecx ;變量2
lea edx,var3
push edx ;結果
call __vbaVarAnd ;邏輯運算,在eax中返回
;------------------------------------------------
__vbaVarOr ;邏輯運算 Or
lea eax,var1
push eax ;變量1
lea ecx,var2
push ecx ;變量2
lea edx,var3
push edx ;結果
call __vbaVarOr ;邏輯運算,在eax中返回
;------------------------------------------------
__vbaVarXor ;邏輯運算 Xor
lea eax,var1
push eax ;變量1
lea ecx,var2
push ecx ;變量2
lea edx,var3
push edx ;結果
call __vbaVarXor ;邏輯運算,在eax中返回
;------------------------------------------------
__vbaVarEqv ;邏輯運算 Eqv
lea eax,var1
push eax ;變量1
lea ecx,var2
push ecx ;變量2
lea edx,var3
push edx ;結果
call __vbaVarEqv ;邏輯運算,在eax中返回
;------------------------------------------------
__vbaVarImp ;邏輯運算 Imp
lea eax,var1
push eax ;變量1
lea ecx,var2
push ecx ;變量2
lea edx,var3
push edx ;結果
call __vbaVarImp ;邏輯運算,在eax中返回
;------------------------------------------------
__vbaVarNot ;邏輯運算 Not
lea 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() #670
push eax ;參數1 字符串
call rtcCommandVar ;結果在eax中返回 string
;------------------------------------------------
rtcCos ;函數 Cos(num) #583
call rtcCos ;輸入參數在當前棧頂,8個字節,注意是浮點型
fstp st ;結果在浮點棧頂
;------------------------------------------------
rtcCurrentDir ;函數 curdir(string) #647
lea eax,var1 ;參數1 字符串
push eax
lea edx,var2 ;結果
push edx
call rtcCurrentDir ;結果在eax中返回
;-------------------------------------------------
rtcGetDateVar ;函數 Date #610
lea edx,var1 ;結果
push edx
call rtcGetDateVar ;結果在eax中返回,日期型(Date)
;-------------------------------------------------
rtcDateAdd ;函數 DateAdd(string,double,date) #661
push date ;8字節日期date
push double ;8字節浮點數double
push string ;1字節字符的ASCII碼,這裏是地址
push var1 ;結果,日期型(date)
call rtcDateAdd ;結果在eax中返回,日期型(Date)
;--------------------------------------------------
rtcDateDiff ;函數 DateDiff(string,date1,date2,...,...) #662
push 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,...,...) #663
push 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) #538
lea 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) #542
lea eax,var1 ;日期
push eax
lea ecx,var2 ;結果
push ecx
call rtcGetDayOfMonth ;結果在eax中返回,整型
;-----------------------------------------------------
rtcDir ;函數 Dir #645
lea eax, var1 ;屬性
push eax
lea ecx,var2 ;路徑
push ecx
call rtcDir ;結果在eax中返回,字符串型(string)
;-----------------------------------------------------
rtcExp ;函數 exp #586
LEA 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 #577
LEA EDX,DWORD PTR SS:[EBP-34]
PUSH 工程1.004016B0 ;文件名
PUSH EDX ;結果
CALL DWORD PTR DS:[<&MSVBVM60.#577>] ;rtcFileDateTime
;調用後結果同時在eax中
;------------------------------------------------------
rtcFileLen ;函數 FileLen #578
PUSH 工程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 #543
LEA 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(源字符串,目標字符串,起始位置,比較方式) #709
XOR 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 #557
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這是指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#557>]; MSVBVM60.rtcIsDate
;結果在eax中返回
;------------------------------------------------------
rtcIsEmpty ;函數 IsEmpty #558
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這是指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#558>] ; MSVBVM60.rtcIsEmpty
;結果在eax中返回
;------------------------------------------------------
rtcIsError ;函數 IsError #559
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這是指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#559>] ; MSVBVM60.rtcIsError
;結果在eax中返回
;------------------------------------------------------
rtcIsMissing ;函數 IsMissing #592
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這是指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#592>] ; MSVBVM60.rtcIsMissing
;結果在eax中返回
;------------------------------------------------------
rtcIsNull ;函數 IsNull #560
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這是指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#560>] ;MSVBVM60.rtcIsNull
;結果在eax中返回
;------------------------------------------------------
rtcIsNumeric ;函數 IsNumeric #561
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1 **這裏指針
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#561>];MSVBVM60.rtcIsNumeric
;結果在eax中返回
;------------------------------------------------------
rtcIsObject ;函數 IsObject #562
LEA EAX,DWORD PTR SS:[EBP-2C]
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.#562>] ;MSVBVM60.rtcIsObject
;結果在eax中返回
;------------------------------------------------------
__vbaLbound ;函數 Lbound
LEA EAX,DWORD PTR SS:[EBP-2C] ;參數1,數組
PUSH EAX
PUSH 1 ;參數2,數組維數
CALL DWORD PTR DS:[<&MSVBVM60.__vbaLboun>; MSVBVM60.__vbaLbound
;結果在eax中返回
;------------------------------------------------------
rtcLowerCaseVar ;函數 Lcase #518
LEA 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 #617
LEA 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 ;函數 Len
MOV EDX,DWORD PTR SS:[EBP-18] ;參數1
PUSH EDX
CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; MSVBVM60.__vbaLenBstr
;結果在eax中返回
;------------------------------------------------------
__vbaLenBstrB ;函數 LenB
MOV EAX,DWORD PTR SS:[EBP-18] ;參數1
PUSH EAX
CALL DWORD PTR DS:[<&MSVBVM60.__vbaLenBs>; MSVBVM60.__vbaLenBstrB
;結果在eax中返回
;------------------------------------------------------
rtcLog ;函數 Log #587
LEA 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 #522
LEA 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 ;函數 Mid
PUSH 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 #544
LEA 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 #545
LEA 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 #707
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#707>] ;MSVBVM60.rtcMonthName
;結果在eax中返回
;------------------------------------------------------
rtcMsgBox ;函數 MsgBox
LEA 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 #546
LEA 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 #712
PUSH 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 ;函數 #588
PUSH 28 ;參數3
PUSH 1E ;參數2
PUSH 14 ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#588>]; MSVBVM60.rtcRgb
;結果在eax中返回
;-----------------------------------------------------
rtcRightCharVar ;函數Right #619
LEA 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 #714
LEA 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 #594
LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX
CALL DWORD PTR DS:[<&MSVBVM60.#594>] ; MSVBVM60.rtcRandomize
;-----------------------------------------------------
rtcRandomNext ;函數 Rnd #593
LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#593>] ; MSVBVM60.rtcRandomNext
;結果在浮點棧中
;-----------------------------------------------------
rtcRightTrimVar ;函數 Rtrim #524
LEA 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 #547
LEA 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 ;函數 Sgn
PUSH 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 #600
PUSH 1 ;參數2
PUSH EDX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#600>];MSVBVM60.rtcShell
;結果在浮點棧中
;-----------------------------------------------------
rtcSin ;函數 Sin #582
LEA 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 #526
PUSH 5 ;參數1
LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;結果
CALL DWORD PTR DS:[<&MSVBVM60.#526>]; MSVBVM60.rtcSpaceVar
;結果在eax中返回
;-----------------------------------------------------
rtcSplit ;函數 Split #711
PUSH 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 #614
LEA 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 #613
LEA 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 ;函數 StrComp
LEA 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 #717
PUSH 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 ;函數 String
LEA 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 #713
LEA EAX,DWORD PTR SS:[EBP-38]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#713>] ;MSVBVM60.rtcStrReverse
;結果在eax中返回
;-----------------------------------------------------
rtcTan ;函數 Tan #584
LEA 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 #612
LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;結果
CALL DWORD PTR DS:[<&MSVBVM60.#612>];MSVBVM60.rtcGetTimeVar
;結果在eax中返回
-------------------------------------------------------
rtcGetTimer ;函數 Timer #535
CALL DWORD PTR DS:[<&MSVBVM60.#535>] ; MSVBVM60.rtcGetTimer
;結果在浮點棧中返回
;-----------------------------------------------------
rtcPackTime ;函數 TimeSerial #539
LEA 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 #541
LEA 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 #520
LEA 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 #591
LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#591>];MSVBVM60.rtcTypeName
;結果在eax中返回
-------------------------------------------------------
__vbaUbound ;函數 Ubound
LEA ECX,DWORD PTR SS:[EBP-2C] ;參數1,數組
PUSH ECX
PUSH 1 ;參數2,數組維數
CALL DWORD PTR DS:[<&MSVBVM60.__vbaUboun>;MSVBVM60.__vbaUbound
;結果在eax中返回
;------------------------------------------------------
rtcUpperCaseVar ;函數 Ucase
LEA 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 #581
LEA EAX,DWORD PTR SS:[EBP-38]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#581>];MSVBVM60.rtcR8ValFromBstr
;結果在浮點棧中
;-----------------------------------------------------
rtcVarType ;函數 VarType #563
LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.#563>];MSVBVM60.rtcVarType
;結果在eax中
;-----------------------------------------------------
rtcWeekdayName ;函數 WeekdayName #706
PUSH EDI
LEA EDX,DWORD PTR SS:[EBP-24]
PUSH EDI
PUSH EDX
CALL DWORD PTR DS:[<&MSVBVM60.#706>];MSVBVM60.rtcWeekdayName
;結果在eax中
;-----------------------------------------------------
rtcGetYear ;函數 Year #553
LEA 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 ;函數 CBool
LEA EDX,DWORD PTR SS:[EBP-74]
PUSH EDX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaBoolE>; MSVBVM60.__vbaBoolErrVar
;結果在ax中
;-----------------------------------------------------
__vbaUI1ErrVar ;函數 Cbyte
LEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaUI1Er>; MSVBVM60.__vbaUI1ErrVar
;結果在al中
;-----------------------------------------------------
__vbaCyErrVar ;函數 Ccur
LEA ECX,DWORD PTR SS:[EBP-74]
PUSH ECX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaCyErr>; MSVBVM60.__vbaCyErrVar
;結果在eax中
;-----------------------------------------------------
__vbaDateVar ;函數 Cdate
LEA 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 ;函數 Cdbl
LEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaR8Err>; MSVBVM60.__vbaR8ErrVar
;結果在浮點棧中
;-----------------------------------------------------
rtDecFromVar ;函數 Cdec #564
LEA 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 ;函數 Cint
LEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaI2Err>; MSVBVM60.__vbaI2ErrVar
;結果在ax中
;-----------------------------------------------------
__vbaI4ErrVar ;函數 Clng
LEA ECX,DWORD PTR SS:[EBP-74]
PUSH ECX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaI4Err>; MSVBVM60.__vbaI4ErrVar
;結果在eax中
;-----------------------------------------------------
__vbaR4ErrVar ;函數 Csng
LEA EDX,DWORD PTR SS:[EBP-74]
PUSH EDX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaR4Err>; MSVBVM60.__vbaR4ErrVar
;結果在浮點棧中
;-----------------------------------------------------
__vbaStrErrVarCopy ;函數 Cstr
LEA EAX,DWORD PTR SS:[EBP-74]
PUSH EAX ;參數1
CALL DWORD PTR DS:[<&MSVBVM60.__vbaStrEr>; MSVBVM60.__vbaStrErrVarCopy
;結果在eax中
;-----------------------------------------------------
__vbaVarCopy ;函數 Cvar
LEA 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 ;函數 FreeFile
LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;結果
CALL DWORD PTR DS:[<&MSVBVM60.#648>]; MSVBVM60.rtcFreeFile
;結果在ax中
;------------------------------------------------------
rtcFileLength ;函數 LOF #570
LEA EDX,DWORD PTR SS:[EBP-34]
PUSH EDX ;文件號
CALL DWORD PTR DS:[<&MSVBVM60.#570>]; MSVBVM60.rtcFileLength
;結果在eax中
;------------------------------------------------------
rtcFileLocation ;函數 loc #569
LEA EAX,DWORD PTR SS:[EBP-34]
PUSH EAX ;文件號
CALL DWORD PTR DS:[<&MSVBVM60.#569>]; MSVBVM60.rtcFileLocation
;結果在eax中
;------------------------------------------------------
rtcFileAttributes ;函數 FileAttr #555
LEA 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; } ;