codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
阅读:3808回复:11

NtQuerySystemInformation 的奇怪问题

楼主#
更多 发布于:2007-03-12 15:43
  这段代码在 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,导致后面出错。

帮忙看看,谢谢!
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-13 19:02
Ntxxx()好像只能从KernelMode模式调用,而DeviceIoContorl()是UserMode了。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-14 06:33
引用第1楼slwqw2007-03-13 21:02发表的“”:
Ntxxx()好像只能从KernelMode模式调用,而DeviceIoContorl()是UserMode了。


must be in system thread context
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-14 09:52
must be in system thread context

能不能说得清楚一些,我刚刚接触这个。
另外,我编写的是驱动程序。

NtQuerySystemInformation  是通过 ZwQuerySystemInformation 代码中第二个字节获取序号,查找 SSDT 表得到的真实 NtQuerySystemInformation  调用地址。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-14 10:14
Ntxxx只能在system thread context下运行。自己创建一个worker thread,在里面调用NtQuerySystemInformation
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
GNiDiA
驱动小牛
驱动小牛
  • 注册日期2006-10-11
  • 最后登录2017-10-09
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望145点
  • 贡献值0点
  • 好评度124点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-03-14 10:26
我记得好象可以在UserMode调用,但参数中所有的内存(指针),都必须小于MmHighestUserAddress,可以用ZwAllocateVirtualxxxx()来分配内存。比如2、4两个参数。

另外不明白为什么要通过Zwxxx根据序号得到的Ntxxx再调用?
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-14 10:36
引用第5楼GNiDiA2007-03-14 12:26发表的“”:
我记得好象可以在UserMode调用,但参数中所有的内存(指针),都必须小于MmHighestUserAddress,可以用ZwAllocateVirtualxxxx()来分配内存。比如2、4两个参数。

另外不明白为什么要通过Zwxxx根据序号得到的Ntxxx再调用?


是吗?改天我试试看

他的意思应该是Ntxxx不是直接导出的,只能根据Zwxxx的序号到ssdt中找到Ntxxx的地址,然后才可以调用。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-14 12:42
最奇怪的是 DriverEntry 里面调用可以成功,我既没有创建 work thead,也没有什么特殊要求。
但是后来就不行了。 努力搭建测试环境,跟进去看看~,郁闷
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-14 12:57
引用第7楼codez2007-03-14 14:42发表的“”:
最奇怪的是 DriverEntry 里面调用可以成功,我既没有创建 work thead,也没有什么特殊要求。
但是后来就不行了。 努力搭建测试环境,跟进去看看~,郁闷


DriverEntry本来就是IoManager在system thread context中调用的,DDK里面讲的很清楚。

你自己创建的worker thread会运行在system process中,也是system thread。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
codez
驱动牛犊
驱动牛犊
  • 注册日期2005-06-20
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
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,导致异常。
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-15 14:43
引用第9楼codez2007-03-15 15:59发表的“”:
这样子啊,那么 DriverEntry 作为 callback 存在,那么 IRP_MJ_DEVICE_CONTROL 的 Dispatch 函数也应该是 callback,应该同样运行在 system thread context 中了?

如果是这样,就不应该出错,或者还有其他的不同?

跟入发现 NtQuerySystemInformation 出错在试图往 [ntoskrnl!MmUserProbeAddress] 也就是 0x7FFF0000 (winxp sp2 chs free version) 中写入 0,导致异常。


仔细看看DDK,IRP_MJ_DEVICE_CONTROL是在caller app的thread context中
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
ks12345
驱动小牛
驱动小牛
  • 注册日期2006-09-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望223点
  • 贡献值0点
  • 好评度189点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-03-16 09:59
对,lz 还要学学驱动的基础知识,和偶差不多。
Thinking
游客

返回顶部