Win64 Driver开发问题记录(三)

在32位driver中,获取SSDT表中的函数可根据以下固定的公式(64位下获取KeServiceDescriptorTable参见Win64 Driver开发问题记录二)


SSDTTableBase=(PVOID)((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase;

ULONG_PTR func_addr = (ULONG)SSDTTableBase+index*4


但是64位下,SSDT表中存的其实是函数的偏移并非实际的函数地址, 因此函数地址 = SSDTTableBase + 偏移地址

此外, win7和vista 64位下SSTD的函数偏移是28位,而其他64位下SSTD的函数偏移是32位(且最后8位对齐)


他们之所以这么设计 (要算位移) 的原因是,他们开始取消了 nt!KiArgumentTable,
那么参数表放哪里了呢? 答案就是和"偏移"拼在一起了,微软认定 SSDT 例程地址是对齐的。
后来估计是觉得这样算一下影响效率? 就又恢复了 nt!KiArgumentTable(参见http://bbs.dbgtech.net/forum.php?mod=viewthread&tid=360)


因此,  vista以前的64位计算SSDT数地址:

SSDTTableBase=(PVOID)((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase;

ULONG_PTR FuncAddr = (ULONG_PTR)SSDTTableBase + (((*(ULONG_PTR *)((ULONG_PTR)SSDTTableBase+(index-1)*4)) >> 32) & 0xFFFFFFF0);

vista和win7 64位计算SSDT函数地址:

SSDTTableBase=(PVOID)((PServiceDescriptorTableEntry)KeServiceDescriptorTable)->ServiceTableBase;
ULONG_PTR FuncAddr = (ULONG_PTR)SSDTTableBase + ((*(ULONG_PTR *)((ULONG_PTR)SSDTTableBase+(index-1)*4)) >> 36)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值