-
-
[原创]一个宏的理解
-
发表于:
2011-12-10 23:57
5605
-
#define SYSCALL_INDEX(_Function) *(PULONG)( (PUCHAR)_Function +1 )
这个宏折腾了半天,我说下我的理解吧,大家帮忙纠正下
1000 0000 0XAA
1000 0001 0XBB
1000 0002 0XBB
1000 0003 0XBB
1000 0004 0XBB
//获得函数在SSDT中的索引宏
#define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
*(PULONG)((PUCHAR)_Function+1)保存了索引,是个DWORD(32)
(PULONG)((PUCHAR)_Function+1) 存放索引(DWORD)的地址
(PUCHAR)_Function+1存放索引的地址
用(PULONG)使得指针指向的类型变成DWORD,否则的话,索引就是个 AA,是个一个字节的值
_Function 1000 0000 0XAA (PUCHAR)强制转化是为了让_Function+1变成1000 0001,而不是1000 0000 +__cdecl(当然这种情况编译不通过啦)。。
这里理解还是有点偏差。。_Function+1指向的是_Function+sizeof(指针指向的类型),因为强制转化了(UCHAR *),
所以,指针指向的类型是UCHAR,所以_Function+1 是地址0001,如果不加(UCHAR *),那么_Function+1应该是指针指向的类型(函数) +1,到底实际地址加了多少,
经过测试,可以直接输出函数的地址,但是如果函数的地址+1的话,出现下面错误,也就是说函数指针的类型是__cdecl *,无法用XX+sizeof(__cdecl)来计算 +1 后的地址
error C2296: '+' : illegal, left operand has type 'int (__cdecl *)(void)'
_Function+1 1000 0001 0XBB
(PULONG)将指针指向的类型强制成ULONG,4个字节的,在用*也就是变成了指向的类型是ULONG的一个ULONG值,这里理解不知道对不对。。(PULONG)到底强制转换了是地址还是地址里面的内容??应该是地址里面的内容吧,
这种情况下*((PUCHAR)_Function+1) 的值是0XBB
*(PULONG)((PUCHAR)_Function+1)的值是0XBB BB BB BB
不知道理解的对不对,感觉还是有点偏差,大大们帮忙纠正下把,。。关键是2个强制转化的问题
当然对于这个宏的本意,是把函数的第二个字节取出来作为索引,而查看函数原型的话,如果索引是A0的话,函数开头是XX A0 00 00 00 ,那么如果把(PULONG)去掉是不是也可以达到同样的效果呢????
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课