DWORD GetFunctionAddressBySsdt(WCHAR *zwFunctionName,DWORD index)
{
PSERVICE_DESCRIPTOR_TABLE sdt;//ssdt 表
DWORD zwFunctionAddress; //应该是老的方法的地址吧
if(zwFunctionName!=NULL) //不等于NULL才进去
{
UNICODE_STRING functionName;
RtlInitUnicodeString(&functionName,zwFunctionName);//给局部变量赋值
zwFunctionAddress=(DWORD)MmGetSystemRoutineAddress(&functionName);//获取SSDT表的函数地址,这里获取的就是zw系列的函数
if(zwFunctionAddress==0)
{
//如果获取失败
KdPrint(("get zw Function address fialed\n"));
return 0;
}
index=*(DWORD*)(zwFunctionAddress+1);//+1是为了得到索引号,可以通过windbg查看源码u ZwXXXX
}
sdt=KeServiceDescriptorTable;
return sdt->ServiceTable[index];//这个才是得到了SSDT表的函数地址
}