阅读:3809回复:11
NtQuerySystemInformation 的奇怪问题
这段代码在 DriverEntry 里面调用没有问题,可是通过 DeviceIoControl 调用驱动,引用的时候就出错,帮忙看看,问题在那里:
//============================================== NtQuerySystemInformation (SystemModuleInformation, &dwNeedSize, 0, &dwNeedSize); KPrint ("Moduile list required: %d Bytes\n", dwNeedSize); p = GET_MEM(dwNeedSize); if (p) { status = NtQuerySystemInformation (SystemModuleInformation, p, dwNeedSize, &dwNeedSize); if (!NT_SUCCESS(status)) { FREE(p); p = NULL; KPrint ("Failed to query module information: status = %lX!, Size Need = %d\n", status, dwNeedSize); } } else { KPrint ("Failed to alloc memory!\n"); } //============================================== 问题是,第一次调用 NtQuerySystemInformation 后应该返回实际所需缓冲大小,可是,我获取的是 0,导致后面出错。 帮忙看看,谢谢! |
|
沙发#
发布于:2007-03-13 19:02
Ntxxx()好像只能从KernelMode模式调用,而DeviceIoContorl()是UserMode了。
|
|
板凳#
发布于:2007-03-14 06:33
引用第1楼slwqw于2007-03-13 21:02发表的“”: must be in system thread context |
|
|
地板#
发布于:2007-03-14 09:52
must be in system thread context
能不能说得清楚一些,我刚刚接触这个。 另外,我编写的是驱动程序。 NtQuerySystemInformation 是通过 ZwQuerySystemInformation 代码中第二个字节获取序号,查找 SSDT 表得到的真实 NtQuerySystemInformation 调用地址。 |
|
地下室#
发布于:2007-03-14 10:14
Ntxxx只能在system thread context下运行。自己创建一个worker thread,在里面调用NtQuerySystemInformation
|
|
|
5楼#
发布于:2007-03-14 10:26
我记得好象可以在UserMode调用,但参数中所有的内存(指针),都必须小于MmHighestUserAddress,可以用ZwAllocateVirtualxxxx()来分配内存。比如2、4两个参数。
另外不明白为什么要通过Zwxxx根据序号得到的Ntxxx再调用? |
|
6楼#
发布于:2007-03-14 10:36
引用第5楼GNiDiA于2007-03-14 12:26发表的“”: 是吗?改天我试试看 他的意思应该是Ntxxx不是直接导出的,只能根据Zwxxx的序号到ssdt中找到Ntxxx的地址,然后才可以调用。 |
|
|
7楼#
发布于:2007-03-14 12:42
最奇怪的是 DriverEntry 里面调用可以成功,我既没有创建 work thead,也没有什么特殊要求。
但是后来就不行了。 努力搭建测试环境,跟进去看看~,郁闷 |
|
8楼#
发布于:2007-03-14 12:57
引用第7楼codez于2007-03-14 14:42发表的“”: DriverEntry本来就是IoManager在system thread context中调用的,DDK里面讲的很清楚。 你自己创建的worker thread会运行在system process中,也是system thread。 |
|
|
9楼#
发布于:2007-03-15 13:59
这样子啊,那么 DriverEntry 作为 callback 存在,那么 IRP_MJ_DEVICE_CONTROL 的 Dispatch 函数也应该是 callback,应该同样运行在 system thread context 中了?
如果是这样,就不应该出错,或者还有其他的不同? 跟入发现 NtQuerySystemInformation 出错在试图往 [ntoskrnl!MmUserProbeAddress] 也就是 0x7FFF0000 (winxp sp2 chs free version) 中写入 0,导致异常。 |
|
10楼#
发布于:2007-03-15 14:43
引用第9楼codez于2007-03-15 15:59发表的“”: 仔细看看DDK,IRP_MJ_DEVICE_CONTROL是在caller app的thread context中 |
|
|
11楼#
发布于:2007-03-16 09:59
对,lz 还要学学驱动的基础知识,和偶差不多。
|
|
|