Variant结构深入分析

数组

vbscript中数组由SAFEARRAY和SAFEARRAYBOUND结构体定义

SAFEARRAY:
1.  typedef struct tagSAFEARRAY {  
2.  USHORT cDims; // 数组维数  
3.  USHORT fFeatures; // 数组特性  
4.  ULONG cbElements; // 每个元素大小  
5.  ULONG cLocks; // 锁定计数  
6.  PVOID pvData; // 实际数组数据指针  
7.  SAFEARRAYBOUND rgsabound[1]; // 数组下标相关信息  
8.  } SAFEARRAY;  
 
SAFEARRAYBOUND:
typedef struct tagSAFEARRAYBOUND {  
1.  ULONG cElements; // 该维数数组大小,即元素个数  
2.  LONG lLbound; // 该维数数组索引的起始值  
3.  } SAFEARRAYBOUND, *LPSAFEARRAYBOUND;

完整版的variant

参考:https://docs.microsoft.com/en-us/windows/win32/api/oaidl/ns-oaidl-variant

dt VARIANT 005cfe98
UxTheme!VARIANT
   +0x000 vt               : 8
   +0x002 wReserved1       : 0
   +0x004 wReserved2       : 0xd2a4
   +0x006 wReserved3       : 0x212
   +0x008 llVal            : 0n207683933920534092
   +0x008 lVal             : 0n48471628
   +0x008 bVal             : 0x4c 'L'
   +0x008 iVal             : 0n-25012
   +0x008 fltVal           : 3.344551015e-037 
   +0x008 dblVal           : 8.7298524972645008e-295 
   +0x008 boolVal          : 0n-25012
   +0x008 scode            : 0n48471628
   +0x008 cyVal            : tagCY
   +0x008 date             : 8.7298524972645008e-295 
   +0x008 bstrVal          : 0x02e39e4c  "hello"
   +0x008 punkVal          : 0x02e39e4c IUnknown
   +0x008 pdispVal         : 0x02e39e4c IDispatch
   +0x008 parray           : 0x02e39e4c tagSAFEARRAY
   +0x008 pbVal            : 0x02e39e4c  "h"
   +0x008 piVal            : 0x02e39e4c  -> 0n104
   +0x008 plVal            : 0x02e39e4c  -> 0n6619240
   +0x008 pllVal           : 0x02e39e4c  -> 0n30399761347838056
   +0x008 pfltVal          : 0x02e39e4c  -> 9.275530847e-039 
   +0x008 pdblVal          : 0x02e39e4c  -> 1.246114697985077e-306 
   +0x008 pboolVal         : 0x02e39e4c  -> 0n104
   +0x008 pscode           : 0x02e39e4c  -> 0n6619240
   +0x008 pcyVal           : 0x02e39e4c tagCY
   +0x008 pdate            : 0x02e39e4c  -> 1.246114697985077e-306 
   +0x008 pbstrVal         : 0x02e39e4c  -> 0x00650068  "햿Ȃ햰Ȃմ???"
   +0x008 ppunkVal         : 0x02e39e4c  -> 0x00650068 IUnknown
   +0x008 ppdispVal        : 0x02e39e4c  -> 0x00650068 IDispatch
   +0x008 pparray          : 0x02e39e4c  -> 0x00650068 tagSAFEARRAY
   +0x008 pvarVal          : 0x02e39e4c tagVARIANT
   +0x008 byref            : 0x02e39e4c Void
   +0x008 cVal             : 76 'L'
   +0x008 uiVal            : 0x9e4c
   +0x008 ulVal            : 0x2e39e4c
   +0x008 ullVal           : 0x02e1d770`02e39e4c
   +0x008 intVal           : 0n48471628
   +0x008 uintVal          : 0x2e39e4c
   +0x008 pdecVal          : 0x02e39e4c tagDEC
   +0x008 pcVal            : 0x02e39e4c  "h"
   +0x008 puiVal           : 0x02e39e4c  -> 0x68
   +0x008 pulVal           : 0x02e39e4c  -> 0x650068
   +0x008 pullVal          : 0x02e39e4c  -> 0x006c006c`00650068
   +0x008 pintVal          : 0x02e39e4c  -> 0n6619240
   +0x008 puintVal         : 0x02e39e4c  -> 0x650068
   +0x008 pvRecord         : 0x02e39e4c Void
   +0x00c pRecInfo         : 0x02e1d770 IRecordInfo
   +0x000 decVal           : tagDEC

调试用到的代码

整数:
<!doctype html>
<html lang="en">
<head>
</head>
<body>
<script LANGUAGE="VBScript">
    dim a
    a = &h1234
    IsEmpty(a)
</script>
</body>
</html>
 字符串时替换代码
dim d
    d = "hello"
    IsEmpty(d)
  数组时替换代码
 dim a(2)
    a(0) = &h12345678
    a(1) = &h87654321
    IsEmpty(a) 

(1)数字:直接在对应位置处

0:005> dd poi(esp+c) l4
01e79d30  00000002 00000000 00001234 00000000
0:005> dt VARIANT 01e79d30 vt uintVal
UxTheme!VARIANT
   +0x000 vt      : 2
   +0x008 uintVal : 0x1234

(2)字符串:

0:005> dd poi(esp+c) l4
01d695b0  0000004a 01d4cfd4 000efd10 030bfc80
0:005> dt VARIANT 01d695b0 vt bstrVal
UxTheme!VARIANT
   +0x000 vt      : 0x4a
   +0x008 bstrVal : 0x000efd10  "???"
0:005> dt VARIANT 0x000efd10 vt wReserved1 wReserved2 wReserved3 bstrVal
UxTheme!VARIANT
   +0x000 vt         : 8
   +0x002 wReserved1 : 0
   +0x004 wReserved2 : 0xcfd4
   +0x006 wReserved3 : 0x1d4
   +0x008 bstrVal    : 0x030c32f4  "hello"
总结:当variant的结构为字符串的时候,其值存储在bstrVal 所指向的地址处```

(3)数组

```c
0:005> dd poi(esp+c) l4
01c885f0  0000600c 00000000 01c80ed8 02f85918
0:005> dt VARIANT 01c885f0 vt pparray
UxTheme!VARIANT
   +0x000 vt      : 0x600c
   +0x008 pparray : 0x01c80ed8  -> 0x02f85918 tagSAFEARRAY
0:005> dt SAFEARRAY 0x02f85918
UxTheme!SAFEARRAY
   +0x000 cDims            : 1
   +0x002 fFeatures        : 0x892
   +0x004 cbElements       : 0x10
   +0x008 cLocks           : 0
   +0x00c pvData           : 0x030e2660 Void
   +0x010 rgsabound        : [1] tagSAFEARRAYBOUND
0:005> dd 0x030e2660 l4
030e2660  00000003 00000000 12345678 00000000
0:005> dd 0x030e2660+0x10 l4
030e2670  00000003 00000000 87654321 00000000
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值