首页 > Windows驱动开发 > PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题

PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题

今天奇迹般的遇到了这个问题,蓝屏了无数次,代号为PAGE_FAULT_IN_NONPAGED_AREA。从名字来看像是在非分页内存中发生了缺页错误。
不是很明白,于是用WinDbg调试,在驱动卸载函数中调用IoDeleteSymbolicLink出了问题。IoDeleteSymbolicLink只有一个参数,于是原因可以锁定到这个符号链接上面。于是将鼠标移到UNICODE_STRING变量上,提示Buffer为“……memory read error at address 0x……..……”,一直都想不明白这里内存怎么就非法了。前面很多程序都是同样的代码都没错。

于是以为是系统问题,重装了虚拟机。问题还是存在。于是去WDK找了一下IoDeleteSymbolicLink,说必须运行在PASSIVE_LEVEL,所以我在程序中测试了一下,通过KeGetCurrentIrql得到为PASSIVE_LEVEL。这下奇怪了。卸载函数本来就是运行在PASSIVE_LEVEL的。

最后在网上找了很久,在驱网和CSDN上面都看到了同样的问题。说那个符号链接在一个自定义的CreateDevice函数中创建,而这个函数被标记了#pragma code_seg(“INIT”),表示加载完后就可以卸载了。于是其中的变量就不存在了。所以后面引用的符号链接是存在很大问题的。应该把INIT换成PAGE。问题就解决了。

疑问:前面那么多次都没出问题,看来偶尔会产生问题。《Windows驱动开发技术详解》这书难道除了大量小印刷问题之外,还有此等BUG?


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> PAGE_FAULT_IN_NONPAGED_AREA蓝屏问题
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



  1. 2011年2月26日22:17 | #1

    看得不是太懂!

    [回复]

  2. 2011年3月4日21:30 | #2

    @晨光
    各有各的研究,呵呵

    [回复]

  3. neosec
    2011年3月9日15:42 | #3

    默默无语两眼泪,很是无奈。刚找到答案。郁闷了我两天。没想到。如果是印刷的话,我理解了。如果是笔误的话。我无语了。作为国内这么一本入门级的经典图书,写成这样也太糙了吧。要做就做好它。哎。

    [回复]

  4. 2011年3月9日16:44 | #4

    @neosec
    这个问题可以归纳到技术上来了。另外你应该也看到了这本书上有很多的小错误,很多小小的地方印错了。还有一些地方参数不正确等。
    不过,个人认为这本书终究功大于过,只怪国内这方面的书太少了

    [回复]

  5. neosec
    2011年3月10日09:03 | #5

    呵呵,也是。攻大于过。其实我是不希望让这些小的失误来影响这本书的价值。如果没有这么多小问题,小瑕疵,那就更好了。不管是销量,还是口碑,还会上一个档次。呵呵。毕竟一个小错误,让一个初学者花费了2天的时间来弥补。这代价也太昂贵了。两天!

    [回复]

  6. 2011年3月10日12:18 | #6

    @neosec
    我的观点也是同样的。这本书上还打了个珍藏版的记号,真不知道是什么意思

    [回复]

  7. 码工
    2011年3月29日11:10 | #7

    我现在做一个X86的项目也遇到这样的问题,是关于用READ_REGISTER_ULONG和WRITE_REGISTER_ULONG去读写南桥上寄存器的操作,出现蓝屏:0×00000050 PAGE_FAULT_IN_NONPAGED_AREA

    我也是看《Windows驱动开发技术详解》这书做开发的,希望能跟博主交流:
    QQ:929739889

    [回复]

  8. 2011年3月29日12:20 | #8

    @码工
    这段时间我要准备一些东西,驱动暂时没看了。另外,我也只是一个新手,南桥这些东西根本没看过。因为我看驱动都集中在软件这一块,硬件没有搞。你可以用WinDbg跟踪一下,你读或者写的变量是不是有问题。

    [回复]

  9. 码工
    2011年3月29日15:14 | #9

    @代码疯子
    其实我是基于AMD公版的开发板,硬件其实都已经没有问题了,问题是我不知道怎样读取采用内存映射方式读写的寄存器。
    我之前用READ_PORT_UCHAR和WRITE_PORT_UCHAR可以读写比如0xCF8和0xCFC这样的PCI配置数据端口,但是如果我采用READ_REGISTER_UCHAR和WRITE_REGISTER_UCHAR读写基地址为0xFED80000这样已经映射到内存的南桥芯片寄存器,就出现问题了。
    我也试着在DeviceIOControl()函数前标记#pragma LOCKEDCODE,但是韩式出现蓝屏:0×00000050 PAGE_FAULT_IN_NONPAGED_AREA

    [回复]

  10. 码工
    2011年3月30日10:33 | #10

    @码工
    现在蓝屏的问题解决了,但是我的目标还没有实现。
    采用READ_REGISTER_UCHAR和WRITE_REGISTER_UCHAR读写寄存有些问题,后来跟网友交流,改用MmMapIoSpace后直接直接读写的方法,没有蓝屏。

    [回复]

  11. 多谢楼主
    2013年4月5日10:24 | #11

    就是这个问题,多谢楼主分享,终于解决了

    [回复]

    代码疯子 回复:

    @多谢楼主, 能让大家节约时间,就是写博客的目的之一 [em012]

    [回复]

  12. hellosin
    2014年7月25日10:50 | #12

    说简单点,怎么弄可以搞定,求教

    [回复]

    代码疯子 回复:

    @hellosin, 如果你是程序员的话,把INIT改成PAGE就可以了。如果你只是一个普通用户,那我就不知道了。

    [回复]

  13. 2016年1月12日08:31 | #13

    好激动啊,碰到了同样的问题!
    昨晚调试了半天总发现指向 UNICODE_STRING 的那段内存莫名奇妙的消失,抓狂了都。

    [回复]