﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-textbox-随笔分类-window 驱动</title><link>http://www.cnitblog.com/textbox/category/8830.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 14:38:58 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 14:38:58 GMT</pubDate><ttl>60</ttl><item><title>windows内核函数命名</title><link>http://www.cnitblog.com/textbox/archive/2011/07/29/74916.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Fri, 29 Jul 2011 11:44:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2011/07/29/74916.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/74916.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2011/07/29/74916.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/74916.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/74916.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 函数名字开头说明：<br>    Ex: 管理层，Executive 的开头两字母<br>    Ke: 核心层，Kernerl的开头两字母<br>    Hal:硬件抽象层，Hardware Abstration Layer 缩写<br>    Ob :对象管理，Object<br>    Mm :内存管理 Memory Manager<br>    Ps :进程管理 Process<br>    Se :安全管理 Security<br>    Io :I/O管理<br>    Fs :文件管理 File System<br>    Cc :文件缓存管理 Cache<br>    Cm :系统配置 Configuration Manager<br>    Pp :即插即用 Pnp<br>    Rtl:运行时程序库 Runtime Library&nbsp;&nbsp;<a href='http://www.cnitblog.com/textbox/archive/2011/07/29/74916.html'>阅读全文</a><img src ="http://www.cnitblog.com/textbox/aggbug/74916.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2011-07-29 19:44 <a href="http://www.cnitblog.com/textbox/archive/2011/07/29/74916.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>内核驱动线程同步</title><link>http://www.cnitblog.com/textbox/archive/2010/12/12/72222.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Sun, 12 Dec 2010 13:11:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2010/12/12/72222.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/72222.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2010/12/12/72222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/72222.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/72222.html</trackback:ping><description><![CDATA[方法:<br />  <font size="4"> </font><strong><font size="4">1).通过提高或降低IRQL (只能适用于单CPU).</font><br /></strong>      原理:当IRQL提高到DISPATCH_LEVEL的时候就不会出现线程切换.       <br />      注意:提升到DISPATCH_LEVEL的时候程序必须使用非分页内存.原因是分页内容随时都有可能把物理内存中的内容转存到磁盘文件内.读取一个不存在的物理内存中的分页内存会引发<strong>页故障</strong> ,而在DISPATCH_LEVEL级以上的级别发生页故障是会引发系统崩溃.<br />      使用:  KeGetcurrentIrql 获取当前级别.<br />                KeRaiseIrql提升级别<br />                KeLowerIrql降低级别<br /><font size="4"> </font><strong><font size="4"> 2).自旋锁(Spin Lock)</font><br /></strong>      原理:自旋所不同于一般的线程互斥,线程发生自旋锁它不会让cpu切换到别的线程工作.而是一直占用cpu.(在单cpu情况下自旋锁只是通过提升IRQL级别来阻止线程切换就是(1)的方法来实现的;多CPU就比较复杂一定.)<br />      注意:驱动程序必须在&lt;=DISPATCH_LEVEL的IRQL的级别使用自旋锁.<br />      使用: KeAcquireSpinLock <br />               KeReleaseSpinLock<br /><strong><font size="4"> 3).KEvent<br /></font></strong>   KEvent 使用 KinitializeEvent, KeWaitForSingleObject,KeWaitFoMultipleObject 实现线程等待.<br />   ObReferenceObjectByHandle(计数+1)实现用户模式的Event转换成内核使用的KEVENT.使用完需要调用ObDereferenceObject(计数-1);<br />    IoCreateNotiticationEvent,IoCreateSynchornizationEvent创建有名的事件打到驱动之间也可以线程等待.达到同步目的.<br /><strong><font size="4"> 4) 内核信号灯</font></strong> <br />    使用KeInitializeSemaphore 初始化<br />         KeReadStateSemaphore 获取计数<br />         KeReleaseSemaphore     计数减1<br />         KeWaitForSingleObject  等待.<br /><font size="4"><strong> 5)互斥(KNUTEX)</strong></font><br />      使用 KeinitializeMutex 初始化<br />               KReleaseMutex 释放<br />               KeWaitForSingleObject  等待.<br /><br /><strong><font size="4">  6) 原子锁</font></strong><br />      InterLockedXXXX实现同步<br /><img src ="http://www.cnitblog.com/textbox/aggbug/72222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2010-12-12 21:11 <a href="http://www.cnitblog.com/textbox/archive/2010/12/12/72222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>windows驅動對象與設備對象</title><link>http://www.cnitblog.com/textbox/archive/2009/02/27/54927.html</link><dc:creator>零度</dc:creator><author>零度</author><pubDate>Fri, 27 Feb 2009 08:54:00 GMT</pubDate><guid>http://www.cnitblog.com/textbox/archive/2009/02/27/54927.html</guid><wfw:comment>http://www.cnitblog.com/textbox/comments/54927.html</wfw:comment><comments>http://www.cnitblog.com/textbox/archive/2009/02/27/54927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/textbox/comments/commentRss/54927.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/textbox/services/trackbacks/54927.html</trackback:ping><description><![CDATA[
		<span id="ArticleContent1_ArticleContent1_lblContent"> IO 管理器调用函数 nt!IopLoadDriver 载入的。nt!IopLoadDriver 读取注册表，获得驱动程序文件 的路径，<br />将这个文件载入内存。之后会调用 nt!ObCreateObject 创建一个驱动对象。<br /><br /></span>
		<span id="ArticleContent1_ArticleContent1_lblContent">设备对象 (DEVICE_OBJECT)由驱动创建。一个驱动可以创建多个设备对象(DEVICE_OBJECT)。通过驱动对象 (DRIVER_OBJECT)，可以找到由该驱动创建的所有设备对象(DEVICE_OBJECT)。一个驱动创建的所有设备对象 (DEVICE_OBJECT)链成一条链，该驱动的驱动对象(DRIVER_OBJECT)可以找到这个链。一个设备对象 (DEVICE_OBJECT)也可以找到创建它的驱动的驱动对象(DRIVER_OBJECT)</span>
		<br />
		<br />
		<br />
		<br />
		<span id="ArticleContent1_ArticleContent1_lblContent">设备栈上的设备对象，从上自下，通过 DEVICE_OBJECT 的 DEVOBJ_EXTENSION 的 +18 struct _DEVICE_OBJECT *AttachedTo 联系在一起。<br />设备栈上的设备对象，从下自上，通过 DEVICE_OBJECT 的 +10 struct _DEVICE_OBJECT *AttachedDevice 联系在一起。</span>
		<br />
<img src ="http://www.cnitblog.com/textbox/aggbug/54927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/textbox/" target="_blank">零度</a> 2009-02-27 16:54 <a href="http://www.cnitblog.com/textbox/archive/2009/02/27/54927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>