<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>知识库 &#187; irp</title>
	<atom:link href="http://www.wezu.net/blog/archives/category/%e5%ad%a6%e4%b9%a0%e7%ac%94%e8%ae%b0/irp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wezu.net/blog</link>
	<description>知识就是力量，知识就是财富！</description>
	<lastBuildDate>Fri, 06 Feb 2009 03:15:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>彻底弄明白IRP</title>
		<link>http://www.wezu.net/blog/archives/31</link>
		<comments>http://www.wezu.net/blog/archives/31#comments</comments>
		<pubDate>Fri, 20 Jun 2008 06:40:30 +0000</pubDate>
		<dc:creator>snox</dc:creator>
				<category><![CDATA[irp]]></category>

		<guid isPermaLink="false">http://www.wezu.net/blog/?p=31</guid>
		<description><![CDATA[微软的东东，多数是把聪明人搞晕，把晕的人搞残，把残的人搞死！     一直以来，想弄明白驱动和IRP到底是怎么回事，在驱网上也查了无数的资料，到头来，手脚抽筋也没弄明白。     从网上查到一段说明，可以说是迄今最后的解释，在家里看了N天，似同天书。 引用: 1.    子系统调用NT的IO系统服务打开命名文件。 2.    NT的IO管理器调用对象管理器，查询命名文件，并且帮助解决文件对象的符号连接。同时调用安全参照监视器，检查子系统是否具备打开文件句柄的正确权限。 3.    如果NT文件系统不认识文件对象，IO管理器挂起请求。调用多个文件系统直到识别出文件对象才继续请求。 4.    IO管理器负责为打开的请求分配内存和初始化IRP。对于NT驱动，打开请求等同于创建请求。 5.    IO管理器调用文件系统驱动，将IRP传递给它们。文件系统存取它们的IRP中本地IO栈，决定必须进行哪一种操作。检查参数，确定请求文件是否在缓存中。如果不是，设置下一个IRP中驱动的IO栈。 6.    无论是驱动处理IRP还是完成IO请求操作。都调用IO管理器和其它NT元素提供的核心态例程。 7.    驱动设置返回给IO管理器的IRP中的IO状态块表示请求操作是成功还是失败。 8.    IO管理器通过获取IRP中的IO状态，将信息同过保护子系统返回给原始调用者。 9.    IO管理器释放已完成的IRP。 10.    如果打开操作成功，IO管理器返回文件句柄给子系统。反之返回错误状态。 晕晕乎乎中，似乎有所顿悟，何不用一个具体的类比，也解释一下IRP到底是怎么回事，所以喝了二两二锅头，斗胆把上面的10段话作如下的翻译，有翻译不妥当之处，望大大们指正： 引用: 1.    客人(IRP)来到大厦(驱动程序)外，该大厦有一个按人名造册的接待系统（IO管理器）。 2.    客人(IRP)先到大厅，查花名册，按人名（设备对象DeviceObject，符号连接SymbolicLink）查。同时查安全薄，看这个人是不是恐怖分子、台独分子(STATUS_INVALID_DEVICE_REQUEST, SECURITY_CLIENT_CONTEXT)，不是则被允许进入。如是，则不允许则禁入。 3.    如果查不到客人名，则拒绝进入。调用多本花名册（文件系统,FSD），直到识别出来人，才继续。 4.    接待系统（IO管理器）为客人（IRP）分配房间、会议室，餐饮，一应俱全(RtlZeroMemory ，RtlCopyMemory)，并打扫一遍（初始化, KeSetEvent, [...]]]></description>
			<content:encoded><![CDATA[<p>微软的东东，多数是把聪明人搞晕，把晕的人搞残，把残的人搞死！<br />
    一直以来，想弄明白驱动和IRP到底是怎么回事，在驱网上也查了无数的资料，到头来，手脚抽筋也没弄明白。</p>
<p>    从网上查到一段说明，可以说是迄今最后的解释，在家里看了N天，似同天书。</p>
<div class="quote">
<h5>引用:</h5>
<blockquote><p>1.    子系统调用NT的IO系统服务打开命名文件。</p>
<p>2.    NT的IO管理器调用对象管理器，查询命名文件，并且帮助解决文件对象的符号连接。同时调用安全参照监视器，检查子系统是否具备打开文件句柄的正确权限。</p>
<p>3.    如果NT文件系统不认识文件对象，IO管理器挂起请求。调用多个文件系统直到识别出文件对象才继续请求。</p>
<p>4.    IO管理器负责为打开的请求分配内存和初始化IRP。对于NT驱动，打开请求等同于创建请求。</p>
<p>5.    IO管理器调用文件系统驱动，将IRP传递给它们。文件系统存取它们的IRP中本地IO栈，决定必须进行哪一种操作。检查参数，确定请求文件是否在缓存中。如果不是，设置下一个IRP中驱动的IO栈。</p>
<p>6.    无论是驱动处理IRP还是完成IO请求操作。都调用IO管理器和其它NT元素提供的核心态例程。</p>
<p>7.    驱动设置返回给IO管理器的IRP中的IO状态块表示请求操作是成功还是失败。</p>
<p>8.    IO管理器通过获取IRP中的IO状态，将信息同过保护子系统返回给原始调用者。</p>
<p>9.    IO管理器释放已完成的IRP。</p>
<p>10.    如果打开操作成功，IO管理器返回文件句柄给子系统。反之返回错误状态。</p></blockquote>
</div>
<p>晕晕乎乎中，似乎有所顿悟，何不用一个具体的类比，也解释一下IRP到底是怎么回事，所以喝了二两二锅头，斗胆把上面的10段话作如下的翻译，有翻译不妥当之处，望大大们指正：</p>
<div class="quote">
<h5>引用:</h5>
<blockquote><p>1.    客人(IRP)来到大厦(驱动程序)外，该大厦有一个按人名造册的接待系统（IO管理器）。</p>
<p>2.    客人(IRP)先到大厅，查花名册，按人名（设备对象DeviceObject，符号连接SymbolicLink）查。同时查安全薄，看这个人是不是恐怖分子、台独分子(STATUS_INVALID_DEVICE_REQUEST, SECURITY_CLIENT_CONTEXT)，不是则被允许进入。如是，则不允许则禁入。</p>
<p>3.    如果查不到客人名，则拒绝进入。调用多本花名册（文件系统,FSD），直到识别出来人，才继续。</p>
<p>4.    接待系统（IO管理器）为客人（IRP）分配房间、会议室，餐饮，一应俱全(RtlZeroMemory ，RtlCopyMemory)，并打扫一遍（初始化, KeSetEvent, KeWaitForSingleObject, IoMarkIrpPending, InitializeObjectAttributes）。</p>
<p>5.    接待系统（IO管理器）调用管理人员，将客人的信息传递给下面各部门。各部门管理人员根据他们的子系统情况，分配资源队列（本地IO栈），并决定必须进行哪一种操作(IoGetCurrentIrpStackLocation, Irp-&gt;AssociatedIrp.SystemBuffer)。客人是否在不同级别的客人清单中。如果没有这个级别，则新建一个级别 (DeviceObject-&gt;DeviceExtension)，并进行登记。比如是国宾级，则一定要准备一个总统套间。</p>
<p>6.    不论是对于客人（Irp），还是客人的级别档次要求（IO栈），都使用模块化的规范流程。</p>
<p>7.    向大厦总经理报告人员进入、级别招待的请求是成功还是失败。</p>
<p>8.    获取人员、招待的状态，将是不是超过招待能力的信息（过保护状态）返回给新来的客人。如果超出接待能力，则挂牌“客满，恕不接待”。</p>
<p>9.    人员离开，则释放客人占有的所有资源(分配房间、会议室等)。IoCompleteRequest, DriverObject-&gt;DriverUnload，IoDeleteDevice, ZwClose</p>
<p>10.    招待成功，返回OK或返回错误（Irp-&gt;IoStatus.Status = STATUS_SUCCESS,return ntStatus）</p></blockquote>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.wezu.net/blog/archives/31/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
