<?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/" >
<channel>
	<title>内核研究 - 星空博客</title>
	<link>http://www.xklog.org/rss.php?cate=8</link>
	<description>对操作系统的内核研究</description>
	<language>zh-cn</language>
	<copyright>Powered By XKLog V0.7.244.Copyright 2010 星空博客 All Rights Reserved.</copyright>
	<pubDate>Thu, 09 Sep 2010 11:04:27 +0000</pubDate>
	<generator>XKLog V0.7.244</generator>
	
	<item>
		<title><![CDATA[亲自翻译 Windows Research Kernel v1.2 readme.txt]]></title>
		<link>http://www.xklog.org/article/kernel/the-translation-of-Windows-Research-Kernel-v1-2-readme-txt.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>Copyright (c) Microsoft Corporation. All rights reserved. <br />
这句就不用翻译了吧&hellip;&hellip;<br />
<br />
You may only use this code if you agree to the terms of<br />
the Windows Research Kernel Source Code License agreement<br />
(see License.txt).&nbsp;&nbsp;If you do not agree to the terms, do not use the code.<br />
<br />
你只有同意 Windows 研究内核源代码协议（见License.txt） 才能使用这些代码。<br />
如果你不同意，请不要使用这些代码。<br />
<br />
***<br />
<br />
WRK v1.2<br />
<br />
The Windows Research Kernel v1.2 contains the sources for the core of<br />
the Windows (NTOS) kernel and a build environment for a kernel that will run on<br />
&nbsp; &nbsp; x86&nbsp; &nbsp;&nbsp;&nbsp;(Windows Server 2003 Service Pack 1) and<br />
&nbsp; &nbsp; AMD64&nbsp; &nbsp;(Windows XP x64 Professional)<br />
A future version may also support booting WRK kernels on Windows XP x86 systems,<br />
but the current kernels will fail to boot due to differences in some shared structures.<br />
<br />
Windows 研究内核 v1.2 包含了Windows 的内核代码以及一个编译内核的环境，这个内核能够在x86&nbsp;&nbsp;(Windows Server 2003 Service Pack 1)&nbsp;&nbsp;和 AMD64&nbsp; &nbsp;(Windows XP x64 Professional) 上运行。一个未来的版本可能会支持在 Windows XP x86 系统上启动内核。但是目前的版本不行，因为在一些共享的结构上存在差异。<br />
<br />
The NTOS kernel implements the basic OS functions<br />
for processes, threads, virtual memory and cache managers, I/O management,<br />
the registry, executive functions such as the kernel heap and synchronization,<br />
the object manager, the local procedure call mechanism, the security reference<br />
monitor, low-level CPU management (thread scheduling, Asynchronous and Deferred<br />
Procedure calls, interrupt/trap handling, exceptions), etc.<br />
<br />
这个 NTOS 内核实现了一些基础的操作系统函数，包括进程、线程、虚拟内存、高速缓存管理器、输入输出管理，内核堆和同步的注册、执行函数、对象管理器、本地过程调用机制、安全参考监视器、低水平的 CPU 管理（线程调度，异步以及延迟过程调用，中断/陷阱处理，异常处理），等等<br />
<br />
The NT Hardware Abstraction Layer, file systems, network stacks, and device<br />
drivers are implemented separately from NTOS and loaded into kernel mode<br />
as dynamic libraries.&nbsp;&nbsp;Sources for these dynamic components are not included<br />
in the WRK, but some are available in various development kits published<br />
by Microsoft, such as the Installable File System (IFS) Kit and the<br />
Windows Driver Development Kit (DDK).<br />
<br />
NT 硬件抽象层，文件系统，网络堆栈。设备驱动程序被从 NTOS 中分离了出来，以动态链接库的方式运行在内核模式。这些动态组件的源代码并没有被包含在 WRK 中，但是其中的某一些可以在微软发布的各种开发包中找到，例如设备文件系统开发包和 Windows 驱动开发套件。<br />
<br />
WRK v1.2 includes most of the NTOS kernel sources from the latest released<br />
version of Windows, which supports the AMD64 architecture on the Desktop.<br />
The kernel sources excluded from the kit are primarily in the areas of<br />
plug-and-play, power management, the device verifier, kernel debugger<br />
interface, and virtual dos machine.&nbsp;&nbsp;The primary modifications to WRK<br />
from the released kernel are related to cleanup and removal of server<br />
support, such as code related to the Intel IA64.<br />
<br />
WRK v1.2 包含了 NTOS 内核的大部分源代码，这些代码来自最新发布版的 Windows。它支持 AMD64 结构的桌面。内核代码中不包含的代码主要在即插即用、电源管理、设备校验、内核调试接口以及 DOS 虚拟机。从发布版内核到 WRK 主要的修改与清除和移去服务（器？）支持有关，例如与 Intel IA64 有关的代码。<br />
<br />
***<br />
<br />
Organization of the WRK sources<br />
<br />
WRK 源代码的组织<br />
<br />
The file License.txt contains the license covering use of the WRK.<br />
<br />
License.txt 文件包含了使用 WRK 所需要遵循的协议。<br />
<br />
The public\ directory contains a number of include files shared among system<br />
components.&nbsp;&nbsp;base\ntos\ contains the NTOS sources.<br />
<br />
public\ 目录包含了系统组件共享的一些包含文件。base\ntos\ 目录下包含了 NTOS 的源代码。<br />
<br />
The primary NTOS source components included in the WRK are organized as follows:<br />
<br />
WRK 中主要的 NTOS 源代码按如下方式组织：<br />
<br />
&nbsp; &nbsp; cache\&nbsp;&nbsp;- cache manager<br />
&nbsp; &nbsp; config\ - registry implementation<br />
&nbsp; &nbsp; dbgk\&nbsp; &nbsp;- user-mode debugger support<br />
&nbsp; &nbsp; ex\&nbsp; &nbsp;&nbsp;&nbsp;- executive functions (kernel heap, synchronization, time)<br />
&nbsp; &nbsp; fsrtl\&nbsp;&nbsp;- file system run-time support<br />
&nbsp; &nbsp; io\&nbsp; &nbsp;&nbsp;&nbsp;- I/O manager<br />
&nbsp; &nbsp; ke\&nbsp; &nbsp;&nbsp;&nbsp;- scheduler, CPU management, low-level synchronization<br />
&nbsp; &nbsp; lpc\&nbsp; &nbsp; - local procedure call implementation<br />
&nbsp; &nbsp; mm\&nbsp; &nbsp;&nbsp;&nbsp;- virtual memory manager<br />
&nbsp; &nbsp; ob\&nbsp; &nbsp;&nbsp;&nbsp;- kernel object manager<br />
&nbsp; &nbsp; ps\&nbsp; &nbsp;&nbsp;&nbsp;- process/thread support<br />
&nbsp; &nbsp; se\&nbsp; &nbsp;&nbsp;&nbsp;- security functions<br />
&nbsp; &nbsp; wmi\&nbsp; &nbsp; - Windows Management Instrumentation<br />
<br />
&nbsp; &nbsp; inc\&nbsp; &nbsp; - NTOS-only include files<br />
&nbsp; &nbsp; rtl\&nbsp; &nbsp; - kernel run-time support<br />
&nbsp; &nbsp; init\&nbsp; &nbsp;- kernel startup<br />
<br />
&nbsp; &nbsp;cache\&nbsp;&nbsp;- 高速缓存管理器<br />
&nbsp; &nbsp; config\ - 注册实现<br />
&nbsp; &nbsp; dbgk\&nbsp; &nbsp;-用户模式调试器支持<br />
&nbsp; &nbsp; ex\&nbsp; &nbsp;&nbsp;&nbsp;- 执行功能 (内核堆, 同步, 时间)<br />
&nbsp; &nbsp; fsrtl\&nbsp;&nbsp;- 运行时文件系统支持<br />
&nbsp; &nbsp; io\&nbsp; &nbsp;&nbsp;&nbsp;- 输入输出管理器<br />
&nbsp; &nbsp; ke\&nbsp; &nbsp;&nbsp;&nbsp;- 调度程序, CPU 管理, 低水平的同步<br />
&nbsp; &nbsp; lpc\&nbsp; &nbsp; - 本地过程调用实现<br />
&nbsp; &nbsp; mm\&nbsp; &nbsp;&nbsp;&nbsp;- 虚拟内存管理器<br />
&nbsp; &nbsp; ob\&nbsp; &nbsp;&nbsp;&nbsp;- 内核对象管理器<br />
&nbsp; &nbsp; ps\&nbsp; &nbsp;&nbsp;&nbsp;- 进程/线程支持<br />
&nbsp; &nbsp; se\&nbsp; &nbsp;&nbsp;&nbsp;- 安全功能体<br />
&nbsp; &nbsp; wmi\&nbsp; &nbsp; - Windows 管理装置<br />
<br />
&nbsp; &nbsp; inc\&nbsp; &nbsp; - NTOS 包含文件<br />
&nbsp; &nbsp; rtl\&nbsp; &nbsp; - 运行时内核支持<br />
&nbsp; &nbsp; init\&nbsp; &nbsp;- 内核启动<br />
<br />
***<br />
<br />
Two of the best existing sources for documentation of the NTOS kernel are<br />
<br />
现有的两个关于 NTOS 内核最好的文档是：<br />
<br />
&nbsp; &nbsp; Microsoft Windows Internals, 4th Ed 2005, Mark Russinovich and David Solomon<br />
<br />
&nbsp; &nbsp; The Windows Curriculum Resource Kit (CRK)<br />
&nbsp; &nbsp; <a href="http://www.msdnaa.net/curriculum/pfv.aspx?ID=6191" target="_blank">http://www.msdnaa.net/curriculum/pfv.aspx?ID=6191</a><br />
<br />
Additional information about using Windows for teaching and research<br />
in operating systems is available at<br />
<br />
使用 Windows 进行教学和研究操作系统的更多信息可以访问以下网址：<br />
<br />
&nbsp; &nbsp; <a href="http://www.microsoft.com/resources/sharedsource/Licensing/WindowsAcademic.mspx" target="_blank">http://www.microsoft.com/resourc ... indowsAcademic.mspx</a><br />
<br />
Specific questions about use of the WRK, CRK, or ProjectOZ can be directed to<br />
<br />
关于使用 WRK, CRK, 或者 ProjectOZ 特殊问题可以发邮件到：<br />
<br />
&nbsp; &nbsp; <a href="mailto:compsci@microsoft.com">compsci@microsoft.com</a><br />
<br />
Questions about the kernel sources (or CRK or ProjectOZ) can be directed to<br />
the MSDN academic forum groups (<a href="http://forums.microsoft.com/WindowsAcademic" target="_blank">http://forums.microsoft.com/WindowsAcademic</a>)<br />
<br />
关于内核代码（或者 CRK 或者 ProjectOZ）的任何疑问可以前往 MSDN academic forum groups (<a href="http://forums.microsoft.com/WindowsAcademic" target="_blank">http://forums.microsoft.com/WindowsAcademic</a>)<br />
<br />
<br />
&nbsp; &nbsp; Curriculum<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;A discussion forum regarding development of operating systems curriculum<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;based on the Windows kernel, including use of the Windows Curriculum<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Resource Kit, the Windows Research Kernel, and ProjectOZ.<br />
<br />
&nbsp; &nbsp; 课程<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;一个基于 Windows 内核开发操作系统的讨论论坛<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;包括 Windows 课程资源包的使用, WRK 和 ProjectOZ.<br />
<br />
&nbsp; &nbsp; Kernel <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Questions &amp; Answers regarding the Windows Research Kernel,<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;its architecture, source code and use in teaching and research.<br />
<br />
&nbsp; &nbsp; 内核<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;关于 WRK 的问答,它的结构，源代码在教学研究中的使用<br />
<br />
&nbsp; &nbsp; ProjectOZ<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Questions &amp; Answers regarding use of ProjectOZ for teaching and<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;research of operating systems topics.<br />
<br />
&nbsp; &nbsp; ProjectOZ<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;使用 ProjectOZ 进行操作系统主题的教学研究的问答<br />
<br />
***<br />
<br />
Building/deploying a WRK kernel for x86 [or amd64]<br />
<br />
为 x86 [或者 amd64] 建立/配置一个 WRK 内核：<br />
<br />
&nbsp; &nbsp; 0. Copy the WRK into a directory, say %wrk%.&nbsp;&nbsp;<br />
&nbsp; &nbsp; 1. set arch=x86 [or amd64]<br />
&nbsp; &nbsp; 2. path %wrk%\tools\%arch%;%path%<br />
&nbsp; &nbsp; 3. cd %wrk%\base\ntos<br />
&nbsp; &nbsp; 4. nmake -nologo %arch%=<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;will produce kernel files in BUILD\EXE\%arch%<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[wrkx86.* or wrkx64.*]<br />
&nbsp; &nbsp; 5. copy the kernel to %SystemRoot%\system32\<br />
&nbsp; &nbsp; 6. if x86, find the Multi-processor version of hal.dll [see below]<br />
&nbsp; &nbsp; 7. add a line to C:\boot.ini of the target system<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;to boot this kernel and the MP hal [see below]<br />
&nbsp; &nbsp; 8. reboot and select the boot option for the new kernel<br />
&nbsp; &nbsp; 9. you will boot up on a kernel you built/linked yourself!<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[always keep the original boot.ini line and kernel/hal available so you<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;can still boot your system if something fails with your WRK kernel modifications]<br />
&nbsp; &nbsp; 10. set up a debugger [see below]<br />
<br />
&nbsp; &nbsp; 0. 把 WRK 复制到一个目录中, 称之为 %wrk%.&nbsp;&nbsp;<br />
&nbsp; &nbsp; 1. 设置 arch=x86 [或 amd64]<br />
&nbsp; &nbsp; 2. path %wrk%\tools\%arch%;%path%<br />
&nbsp; &nbsp; 3. cd %wrk%\base\ntos<br />
&nbsp; &nbsp; 4. nmake -nologo %arch%=<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;将会把内核文件产生到 BUILD\EXE\%arch% 中<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[wrkx86.* 或 wrkx64.*]<br />
&nbsp; &nbsp; 5. 把内核复制到 %SystemRoot%\system32\<br />
&nbsp; &nbsp; 6. 如果是 x86, 找到 hal.dll 的多处理器版本[见下面]<br />
&nbsp; &nbsp; 7. 在 C:\boot.ini 为目标系统中添加一行<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;以便引导内核和 MP 硬件抽象层 [见下面]<br />
&nbsp; &nbsp; 8. 重启并选择新内核的启动选项<br />
&nbsp; &nbsp; 9. 你将会以你自己建立/连接的内核启动！<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[总是保持原有的 boot.ini 和 kernel/hal 可用，这样当 WRK 启动失败的时候你仍然可以启动你的系统]<br />
&nbsp; &nbsp; 10. 启动一个调试器[见下面]<br />
<br />
Multi-processor hal (x86 only, amd64 hals are all MP)<br />
&nbsp; &nbsp; All hals are renamed hal.dll, so you have to use the link command to<br />
&nbsp; &nbsp; see what type of hal hal.dll really is:<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;link -dump -all hal.dll | findstr pdb<br />
&nbsp; &nbsp; The MP hals have an 'm' in the native name of the hal, e.g. halmacpi.dll<br />
&nbsp; &nbsp; You may already have an MP hal installed on UP systems, due to hyperthreading.<br />
&nbsp; &nbsp; If the hal isn't MP, you need to find the MP hal that corresponds to the current hal<br />
&nbsp; &nbsp; the target system does have, i.e. <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halacpi.dll&nbsp;&nbsp;-&gt; halacpim.dll&nbsp; &nbsp; ; ACPI PIC-based PC&nbsp;&nbsp;[used by VirtualPC]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halaacpi.dll -&gt; halmacpi.dll&nbsp; &nbsp; ; ACPI APIC-based PC<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halapic.dll&nbsp;&nbsp;-&gt; halmps.dll&nbsp; &nbsp;&nbsp; &nbsp;; MPS<br />
&nbsp; &nbsp; Look in the WRK WS03SP1HALS\x86 directory for the MP hal you need.<br />
<br />
多处理器硬件抽象层 (只针对 x86 , amd64 hals 都是 MP 的)<br />
&nbsp; &nbsp; 所有的硬件抽象层都被重命名为 hal.dll, 所以你必须使用连接命令究竟是何种 hal.dll ：<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;link -dump -all hal.dll | findstr pdb<br />
&nbsp; &nbsp; 多处理器硬件抽象层在本地硬件抽象层的名称中有一个字母 'm' , 例如 halmacpi.dll<br />
&nbsp; &nbsp; 由于超线程，你可能已经在一个 UP 系统上安装了一个 MP 硬件抽象层。<br />
&nbsp; &nbsp; 如果硬件抽象层不是 MP, 你需要找到与目标系统当前拥有的 hal 相对应的 MP hal <br />
&nbsp; &nbsp; 也就是： <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halacpi.dll&nbsp;&nbsp;-&gt; halacpim.dll&nbsp; &nbsp; ; ACPI PIC-based PC&nbsp;&nbsp;[used by VirtualPC]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halaacpi.dll -&gt; halmacpi.dll&nbsp; &nbsp; ; ACPI APIC-based PC<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;halapic.dll&nbsp;&nbsp;-&gt; halmps.dll&nbsp; &nbsp;&nbsp; &nbsp;; MPS<br />
&nbsp; &nbsp; 在 WRK WS03SP1HALS\x86 目录中寻找你所需要的 MP hal.<br />
<br />
Boot.ini<br />
&nbsp; &nbsp; Edit boot.ini (you may have to use attrib -h -s -r first)<br />
&nbsp; &nbsp; Copy the line for the first operating system listed to the end of the file and edit it.<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[boot loader]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;timeout=30<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[operating systems]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=&quot;Windows Server 2003, Standard&quot;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=&quot;test&quot; /kernel=wrkx86.exe /hal=halmacpi.dll<br />
&nbsp; &nbsp; Note that the filenames must be short (8.3) names.<br />
&nbsp; &nbsp; You can add additional options for debugging (as specified in the WinDbg/KD help).<br />
<br />
Boot.ini<br />
&nbsp; &nbsp;编辑 boot.ini (你可能需要先使用 attrib -h -s -r)<br />
&nbsp; &nbsp; 把列出来的第一个操作系统的那一行复制到文件尾部并编辑它.<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[boot loader]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;timeout=30<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;default=multi(0)disk(0)rdisk(0)partition(2)\WINDOWS<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;[operating systems]<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=&quot;Windows Server 2003, Standard&quot;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;multi(0)disk(0)rdisk(0)partition(2)\WINDOWS=&quot;test&quot; /kernel=wrkx86.exe /hal=halmacpi.dll<br />
&nbsp; &nbsp; 注意文件名必须是短文件名.<br />
&nbsp; &nbsp; 你可以为调试器添加一个额外的项 (按照 WinDbg/KD 帮助手册中的说明).<br />
<br />
Debugging WRK<br />
&nbsp; &nbsp; The WinDBG/KD debuggers will work with the WRK.&nbsp;&nbsp;The documentation is pretty thorough, and<br />
&nbsp; &nbsp; includes information about how to debug across a serial port, locally (examining kernel <br />
&nbsp; &nbsp; data from user-mode), and debugging kernels running on VirtualPC.<br />
<br />
&nbsp; &nbsp; Version 6.6.3.5 of the WinDBG/KD debuggers is available with the Curriculum Resource Kit<br />
&nbsp; &nbsp; Tools (&quot;CurriculumResourceKit-CRK\CRKTools\Debugging Tools&quot; directory on the CD).&nbsp;&nbsp;<br />
&nbsp; &nbsp; The latest version of the Windows Debugging Tools can be downloaded from<br />
&nbsp; &nbsp; <a href="http://www.microsoft.com/whdc/devtools/debugging." target="_blank">http://www.microsoft.com/whdc/devtools/debugging.</a><br />
<br />
调试 WRK<br />
&nbsp; &nbsp; WinDBG/KD 调试器能够与 WRK 一起工作.&nbsp;&nbsp;文档非常完整, 并且包含了如何通过一个串口行调试的信息，<br />
&nbsp; &nbsp;&nbsp;&nbsp;局部的 (从用户模式检查内核数据), 并调试在 VirtualPC 上运行的内核.<br />
<br />
&nbsp; &nbsp; 6.6.3.5 版本的 WinDBG/KD 调试器已经在课程资源包中提供了。<br />
&nbsp; &nbsp;工具(CD 中的&quot;CurriculumResourceKit-CRK\CRKTools\Debugging Tools&quot; 目录).&nbsp;&nbsp;<br />
&nbsp; &nbsp; Windows 调试工具的最新版本可以在<a href="http://www.microsoft.com/whdc/devtools/debugging." target="_blank">http://www.microsoft.com/whdc/devtools/debugging.</a>下载</p>]]></description>
		<category>内核研究</category>
		<guid>http://www.xklog.org/article/kernel/the-translation-of-Windows-Research-Kernel-v1-2-readme-txt.html</guid>
		<pubDate>Sun, 06 Dec 2009 00:25:19 +0000</pubDate>
	</item>

	
	<item>
		<title><![CDATA[一个隐藏文件的驱动程序源代码]]></title>
		<link>http://www.xklog.org/article/kernel/source-code-of-a-hide-file-device-driver.html</link>
		<author>星空泪</author>
		<description><![CDATA[<p>&nbsp;这个驱动被加载后能够自动隐藏所有以&ldquo;__Nova__&rdquo;开头的文件和文件夹。</p>
<p>Hidefile.h 文件</p>
<div class="codeText">
<div class="codeHead">C++代码</div>
<ol class="dp-cpp">
    <li class="alt"><span><span class="preprocessor">#include&nbsp;&quot;ntddk.h&quot; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span class="preprocessor">#include&nbsp;&lt;windef.h&gt; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="preprocessor">#pragma&nbsp;pack(1)&nbsp;//SSDT&nbsp;Table </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">struct</span><span>&nbsp;ServiceDescriptorEntry&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span class="datatypes">int</span><span>&nbsp;*ServiceTableBase; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span class="datatypes">int</span><span>&nbsp;*ServiceCounterTableBase;&nbsp;</span><span class="comment">//仅适用于checked&nbsp;build版本 </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span class="datatypes">int</span><span>&nbsp;NumberOfServices; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span class="datatypes">char</span><span>&nbsp;*ParamTableBase; &nbsp;&nbsp;</span></li>
    <li><span>}&nbsp;ServiceDescriptorTableEntry_t,&nbsp;*PServiceDescriptorTableEntry_t; &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="preprocessor">#pragma&nbsp;pack() </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">__declspec</span><span>(</span><span class="keyword">dllimport</span><span>)&nbsp;ServiceDescriptorTableEntry_t&nbsp;KeServiceDescriptorTable; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//获得SSDT基址宏 </span><span>&nbsp;&nbsp;</span></li>
    <li><span class="preprocessor">#define&nbsp;SYSTEMSERVICE(_function)&nbsp;&nbsp;KeServiceDescriptorTable.ServiceTableBase[&nbsp;*(PULONG)((PUCHAR)_function+1)] </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>NTSTATUS&nbsp;DriverEntry(IN&nbsp;PDRIVER_OBJECT&nbsp;&nbsp;DriverObject,IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;RegistryPath); &nbsp;&nbsp;</span></li>
    <li class="alt"><span class="datatypes">VOID</span><span>&nbsp;Unload(IN&nbsp;PDRIVER_OBJECT&nbsp;&nbsp;DriverObject); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//取代的新函数 </span><span>&nbsp;&nbsp;</span></li>
    <li><span>NTSTATUS&nbsp;NTAPI&nbsp;NewZwQueryDirectoryFile( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;PIO_APC_ROUTINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcRoutine&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcContext&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;OUT&nbsp;PIO_STATUS_BLOCK&nbsp;&nbsp;&nbsp;&nbsp;IoStatusBlock, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;OUT&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformation, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;FILE_INFORMATION_CLASS&nbsp;FileInformationClass, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnSingleEntry, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMask&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestartScan&nbsp;); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//API&nbsp;声明 </span><span>&nbsp;&nbsp;</span></li>
    <li><span>NTSYSAPI&nbsp;NTSTATUS&nbsp;NTAPI&nbsp;ZwQueryDirectoryFile( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;PIO_APC_ROUTINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcRoutine&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcContext&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;OUT&nbsp;PIO_STATUS_BLOCK&nbsp;&nbsp;&nbsp;&nbsp;IoStatusBlock, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;OUT&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformation, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;FILE_INFORMATION_CLASS&nbsp;FileInformationClass, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnSingleEntry, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMask&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestartScan&nbsp;); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="keyword">typedef</span><span>&nbsp;NTSTATUS&nbsp;(*ZWQUERYDIRECTORYFILE)( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;PIO_APC_ROUTINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcRoutine&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcContext&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;OUT&nbsp;PIO_STATUS_BLOCK&nbsp;&nbsp;&nbsp;&nbsp;IoStatusBlock, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;OUT&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformation, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;FILE_INFORMATION_CLASS&nbsp;FileInformationClass, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnSingleEntry, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMask&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestartScan&nbsp;); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">struct</span><span>&nbsp;_FILE_BOTH_DIR_INFORMATION&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;NextEntryOffset; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;FileIndex; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;CreationTime; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;LastAccessTime; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;LastWriteTime; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;ChangeTime; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;EndOfFile; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;AllocationSize; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;FileAttributes; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;FileNameLength; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;EaSize; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;CCHAR&nbsp;ShortNameLength; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">WCHAR</span><span>&nbsp;ShortName[12]; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">WCHAR</span><span>&nbsp;FileName[1]; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;FILE_BOTH_DIR_INFORMATION,&nbsp;*PFILE_BOTH_DIR_INFORMATION; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span class="comment">//源地址 </span><span>&nbsp;&nbsp;</span></li>
    <li><span>ZWQUERYDIRECTORYFILE&nbsp;OldZwQueryDirectoryFile&nbsp;=&nbsp;NULL;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>Hidefile.c 文件</p>
<p>&nbsp;</p>
<div class="codeText">
<div class="codeHead">C++代码</div>
<ol class="dp-cpp">
    <li class="alt"><span><span class="preprocessor">#include&nbsp;&quot;Hidefile.h&quot; </span><span>&nbsp;&nbsp;</span></span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>NTSTATUS&nbsp;DriverEntry(IN&nbsp;PDRIVER_OBJECT&nbsp;&nbsp;DriverObject,IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;RegistryPath) &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS&nbsp;ntStatus&nbsp;=&nbsp;STATUS_SUCCESS; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;DriverUnload&nbsp;=&nbsp;Unload; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;Driver&nbsp;Entry&nbsp;Called!\n&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;OldAddress:0x%X\tNewAddress:0x%X\n&quot;</span><span>,SYSTEMSERVICE(ZwQueryDirectoryFile),NewZwQueryDirectoryFile)); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;OldZwQueryDirectoryFile&nbsp;=&nbsp;(ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;(ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile)&nbsp;=&nbsp;NewZwQueryDirectoryFile; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ntStatus; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span class="datatypes">VOID</span><span>&nbsp;Unload(IN&nbsp;PDRIVER_OBJECT&nbsp;&nbsp;DriverObject) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;Driver&nbsp;Unload&nbsp;Called!\n&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;(ZWQUERYDIRECTORYFILE)SYSTEMSERVICE(ZwQueryDirectoryFile)&nbsp;=&nbsp;OldZwQueryDirectoryFile; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;Address:0x%X\n&quot;</span><span>,SYSTEMSERVICE(ZwQueryDirectoryFile))); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>NTSTATUS&nbsp;NTAPI&nbsp;NewZwQueryDirectoryFile( &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">HANDLE</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;PIO_APC_ROUTINE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcRoutine&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcContext&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;OUT&nbsp;PIO_STATUS_BLOCK&nbsp;&nbsp;&nbsp;&nbsp;IoStatusBlock, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;OUT&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformation, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">ULONG</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;FILE_INFORMATION_CLASS&nbsp;FileInformationClass, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnSingleEntry, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;IN&nbsp;PUNICODE_STRING&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMask&nbsp;OPTIONAL, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;IN&nbsp;</span><span class="datatypes">BOOLEAN</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestartScan&nbsp;) &nbsp;&nbsp;</span></li>
    <li><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS&nbsp;ntStatus&nbsp;=&nbsp;OldZwQueryDirectoryFile( &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileHandle, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Event, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcRoutine, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApcContext, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoStatusBlock, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformation, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Length, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInformationClass, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReturnSingleEntry, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileMask, &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RestartScan); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(NT_SUCCESS(ntStatus)&nbsp;&amp;&amp;&nbsp;(FileInformationClass&nbsp;==&nbsp;FileBothDirectoryInformation)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;p&nbsp;=&nbsp;FileInformation; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">PVOID</span><span>&nbsp;pLast&nbsp;=&nbsp;NULL; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">DWORD</span><span>&nbsp;pLastOne&nbsp;=&nbsp;0; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//KdPrint((&quot;&lt;--------\n&quot;)); </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">do</span><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pLastOne&nbsp;=&nbsp;((PFILE_BOTH_DIR_INFORMATION)p)-&gt;NextEntryOffset; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//KdPrint((&quot;[*]Last:0x%x\tCurrent:0x%x\tpLastOne:%ld\n&quot;,pLast,p,pLastOne)); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(RtlCompareMemory((</span><span class="datatypes">PVOID</span><span>)&amp;((PFILE_BOTH_DIR_INFORMATION)p)-&gt;FileName[0],&nbsp;L</span><span class="string">&quot;__Nova__&quot;</span><span>,&nbsp;16&nbsp;)&nbsp;==&nbsp;16&nbsp;) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;[-]Hide.....\n&quot;</span><span>)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(pLastOne&nbsp;==&nbsp;0) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(p&nbsp;==&nbsp;FileInformation) &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ntStatus&nbsp;=&nbsp;STATUS_NO_MORE_FILES; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((PFILE_BOTH_DIR_INFORMATION)p)-&gt;NextEntryOffset&nbsp;=&nbsp;0; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;iPos&nbsp;=&nbsp;((</span><span class="datatypes">ULONG</span><span>)p)&nbsp;-&nbsp;(</span><span class="datatypes">ULONG</span><span>)FileInformation; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="datatypes">int</span><span>&nbsp;iLeft&nbsp;=&nbsp;(</span><span class="datatypes">DWORD</span><span>)Length&nbsp;-&nbsp;iPos&nbsp;-&nbsp;pLastOne; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlCopyMemory(p,(</span><span class="datatypes">PVOID</span><span>)((</span><span class="datatypes">char</span><span>*)p&nbsp;+&nbsp;pLastOne),(</span><span class="datatypes">DWORD</span><span>)iLeft); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KdPrint((</span><span class="string">&quot;iPos:%ld\tLength:%ld\tiLeft:%ld\t,NextOffset:%ld\tpLastOne:%ld\tCurrent:0x%x\n&quot;</span><span>,iPos,Length,iLeft,((PFILE_BOTH_DIR_INFORMATION)p)-&gt;NextEntryOffset,pLastOne,p)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">continue</span><span>; &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pLast&nbsp;=&nbsp;p; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;((</span><span class="datatypes">char</span><span>*)p&nbsp;+&nbsp;((PFILE_BOTH_DIR_INFORMATION)p)-&gt;NextEntryOffset); &nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">while</span><span>&nbsp;(pLastOne&nbsp;!=&nbsp;0); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//KdPrint((&quot;--------&gt;\n&quot;)); </span><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;ntStatus; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>]]></description>
		<category>内核研究</category>
		<guid>http://www.xklog.org/article/kernel/source-code-of-a-hide-file-device-driver.html</guid>
		<pubDate>Mon, 19 Oct 2009 09:35:40 +0000</pubDate>
	</item>

	</channel>
</rss>