<?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>零度x&#039;s blog &#187; 驱动</title>
	<atom:link href="http://www.lingdux.com/tag/%e9%a9%b1%e5%8a%a8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.lingdux.com</link>
	<description>Take it slowly,it&#039;s OK,it&#039;s OK.</description>
	<lastBuildDate>Wed, 09 Mar 2011 14:16:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>驱动学习笔记&#8211;irp</title>
		<link>http://www.lingdux.com/2009/76.html</link>
		<comments>http://www.lingdux.com/2009/76.html#comments</comments>
		<pubDate>Fri, 26 Jun 2009 17:41:21 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[irp]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[派遣函数]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=76</guid>
		<description><![CDATA[irp是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时，应用程序会发出I/O请求，操作系统将相应的I/O请求转换成相应的IRP，不同的IRP会根据类型被分派到不同的派遣例程中进行处理。

irp相当于ring3下的消息，应用程序对驱动程序进行操作的时候会发出相应的消息，驱动程序根据这些消息做出相应的操作。这些操作通过我们自己编写的派遣函数来决定执行什么样的操作。

看下面流程： 

<span class="readmore"><a href="http://www.lingdux.com/2009/76.html" title="驱动学习笔记&#8211;irp">阅读全文——共1904字</a></span>]]></description>
			<content:encoded><![CDATA[<p>irp是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时，应用程序会发出I/O请求，操作系统将相应的I/O请求转换成相应的IRP，不同的IRP会根据类型被分派到不同的派遣例程中进行处理。</p>
<p>irp相当于ring3下的消息，应用程序对驱动程序进行操作的时候会发出相应的消息，驱动程序根据这些消息做出相应的操作。这些操作通过我们自己编写的派遣函数来决定执行什么样的操作。</p>
<p>看下面流程： </p>
<p>1.为不同的irp类型设置派遣函数</p>
<p>2.编写派遣函数来处理收到不懂类型的irp的不同操作</p>
<p>3.<a href="http://www.lingdux.com/2009/61.html" target="_blank">创建设备与符号链接</a></p>
<p>4.<a href="http://www.lingdux.com/2009/61.html" target="_blank">在卸载历程中删除设备与符号链接</a></p>
<p>流程很简单，但是处理起来就不那么简单了。</p>
<p>代码如下：</p>
<p><span id="more-76"></span></p>
<p>#include “ntddk.h”<br />
VOID Unload(IN PDRIVER_OBJECT DriverObject)//卸载时删除符号链接<br />
{<br />
 UNICODE_STRING symLinkName;<br />
 RtlInitUnicodeString(&amp;symLinkName,L”\\??\\mysymboliclink”);<br />
 IoDeleteSymbolicLink(&amp;symLinkName);<br />
 IoDeleteDevice(DriverObject-&gt;DeviceObject);<br />
 KdPrint((“Device Delete Success\n”));<br />
}<br />
NTSTATUS MyMajor(IN PDEVICE_OBJECT Device,IN PIRP irp)<br />
{<br />
 PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);//动态获取irp的IO堆栈<br />
 irp-&gt;IoStatus.Status = STATUS_SUCCESS;//填充返回的状态值<br />
 irp-&gt;IoStatus.Information = 0;<br />
 //判断是否为打开驱动的irp，如果是则输出“IRP_MJ_CREATE”<br />
 if (stack-&gt;MajorFunction==IRP_MJ_CREATE)<br />
 {<br />
  KdPrint((“IRP_MJ_CREATE\n”));<br />
 }<br />
 //判断是否为关闭驱动的irp，如果是则输出“IRP_MJ_CLOS”<br />
 if (stack-&gt;MajorFunction==IRP_MJ_CLOSE)<br />
 {<br />
  KdPrint((“IRP_MJ_CLOSE\n”));<br />
 }<br />
 IoCompleteRequest( irp, IO_NO_INCREMENT );//结束掉irp<br />
 return irp-&gt;IoStatus.Status;//返回<br />
}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 PDEVICE_OBJECT mydevice;//定义设备对象<br />
 UNICODE_STRING devicename;//定义设备名称<br />
 UNICODE_STRING symboliclinkname;//定义符号连接名称<br />
 //为不同的irp类型设置派遣函数<br />
 DriverObject-&gt;MajorFunction[IRP_MJ_CREATE]=MyMajor;//打开<br />
 DriverObject-&gt;MajorFunction[IRP_MJ_CLOSE]=MyMajor;//关闭<br />
 DriverObject-&gt;DriverUnload=Unload;</p>
<p> RtlInitUnicodeString(&amp;devicename,L”\\Device\\mydevice”);//初始化设备名称<br />
 RtlInitUnicodeString(&amp;symboliclinkname,L”\\??\\mysymboliclink”);//初始化符号连接名称<br />
 //创建设备<br />
 IoCreateDevice(<br />
  DriverObject,//驱动对象<br />
  0,<br />
  &amp;devicename,//设备名称<br />
  FILE_DEVICE_UNKNOWN,//类型<br />
  0,<br />
  FALSE,<br />
  &amp;mydevice//设备对象<br />
  );<br />
 //创建符号链接<br />
 IoCreateSymbolicLink(<br />
  &amp;symboliclinkname,//符号链接名称<br />
  &amp;devicename//设备名称<br />
  );</p>
<p> return STATUS_SUCCESS;<br />
}</p>
<p>下面写一个简单的vc程序打开然后关闭驱动，打开的时候会发送给两个消息转换成irp就是IRP_MJ_CREATE和IRP_MJ_CLOSE,然后截获到输出“IRP_MJ_CREATE和IRP_MJ_CLOSE”。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/76.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;创建线程</title>
		<link>http://www.lingdux.com/2009/72.html</link>
		<comments>http://www.lingdux.com/2009/72.html#comments</comments>
		<pubDate>Sun, 21 Jun 2009 05:03:24 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[创建]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[线程]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=72</guid>
		<description><![CDATA[在内核模式下创建线程和用户模式下创建线程有所不同，在用户模式下创建线程线程函数执行完自动返回，在内核模式下需要调用API来结束一个线程。

下面编写一个新建一个线程来输出”welcome to www.lingdux.com”

首先确认流程如下:

<span class="readmore"><a href="http://www.lingdux.com/2009/72.html" title="驱动学习笔记&#8211;创建线程">阅读全文——共730字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在内核模式下创建线程和用户模式下创建线程有所不同，在用户模式下创建线程线程函数执行完自动返回，在内核模式下需要调用API来结束一个线程。</p>
<p>下面编写一个新建一个线程来输出”welcome to <a href="http://www.lingdux.com">www.lingdux.com</a>”</p>
<p>首先确认流程如下:</p>
<p>1.定义线程函数MyThread()用来实现输出”welcome to <a href="http://www.lingdux.com/">www.lingdux.com</a>\n”。</p>
<p>2.线程函数中使用PsTerminateSystemThread()函数来终止线程。</p>
<p>3.使用PsCreateSystemThread()函数来创建线程并运行线程函数。</p>
<p>实现代码如下：</p>
<p> </p>
<p>#include “ntddk.h”</p>
<p><span id="more-72"></span><br />
VOID Unload(IN PDRIVER_OBJECT DriverObject)<br />
{<br />
}<br />
VOID MyThread(IN PVOID pContext)//线程函数<br />
{<br />
 DbgPrint(“Welcome to <a href="http://www.lingdux.com">www.lingdux.com</a>\n”);<br />
 PsTerminateSystemThread(0);//终止线程<br />
}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 HANDLE myhandle;//定义句柄<br />
 PsCreateSystemThread(&amp;myhandle,//得到句柄<br />
  0,<br />
  NULL,<br />
  NULL,<br />
  NULL,<br />
  MyThread,//线程函数<br />
  NULL);//不传递参数，为空<br />
 DriverObject-&gt;DriverUnload=Unload;<br />
 return STATUS_SUCCESS;<br />
}</p>
<p>加载驱动DbgView成功截获到Welcome to <a href="http://www.lingdux.com">www.lingdux.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/72.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;设备与符号连接</title>
		<link>http://www.lingdux.com/2009/61.html</link>
		<comments>http://www.lingdux.com/2009/61.html#comments</comments>
		<pubDate>Wed, 10 Jun 2009 10:46:44 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[符号连接]]></category>
		<category><![CDATA[设备]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=61</guid>
		<description><![CDATA[创建设备与符号连接是为了驱动程序和应用程序的交互。

流程很简单：

1.用IoCreateDevice()函数创建设备对性。

<span class="readmore"><a href="http://www.lingdux.com/2009/61.html" title="驱动学习笔记&#8211;设备与符号连接">阅读全文——共1232字</a></span>]]></description>
			<content:encoded><![CDATA[<p>创建设备与符号连接是为了驱动程序和应用程序的交互。</p>
<p>流程很简单：</p>
<p>1.用IoCreateDevice()函数创建设备对性。</p>
<p>2.用IoCreateSymbolicLink()函数来绑定设备和符号链接。</p>
<p>3.卸载时用IoDeleteSymbolicLink删除符号连接。</p>
<p>4.然后用IoDeleteDevice来删除设备。</p>
<p>完整代码如下：</p>
<p>#include “ntddk.h”</p>
<p><span id="more-61"></span><br />
void Unload(IN PDRIVER_OBJECT DriverObject)<br />
{<br />
 //定义两个临时设备对象用于删除设备对象<br />
 PDEVICE_OBJECT temp1;<br />
 PDEVICE_OBJECT temp2;<br />
 UNICODE_STRING symboliclinkname;//定义符号连接名称<br />
 RtlInitUnicodeString(&amp;symboliclinkname,L”\\??\\mysymboliclink”);//初始化符号连接名称<br />
 IoDeleteSymbolicLink(&amp;symboliclinkname);//删除符号连接<br />
 if(DriverObject)<br />
 {<br />
  temp1=DriverObject-&gt;DeviceObject;<br />
  while(temp1)<br />
  {<br />
   temp2=temp1;<br />
   temp1=temp1-&gt;NextDevice;<br />
   IoDeleteDevice(temp2);//删除设备<br />
  }<br />
 }<br />
}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 PDEVICE_OBJECT mydevice;//定义设备对象<br />
 UNICODE_STRING devicename;//定义设备名称<br />
 UNICODE_STRING symboliclinkname;//定义符号连接名称<br />
 RtlInitUnicodeString(&amp;devicename,L”\\Device\\mydevice”);//初始化设备名称<br />
 RtlInitUnicodeString(&amp;symboliclinkname,L”\\??\\mysymboliclink”);//初始化符号连接名称<br />
 IoCreateDevice(<br />
  DriverObject,//驱动对象<br />
  0,<br />
  &amp;devicename,//设备名称<br />
  FILE_DEVICE_UNKNOWN,//类型<br />
  0,<br />
  FALSE,<br />
  &amp;mydevice//设备对象<br />
  );<br />
 IoCreateSymbolicLink(<br />
  &amp;symboliclinkname,//符号链接名称<br />
  &amp;devicename//设备名称<br />
  );<br />
DriverObject-&gt;DriverUnload=Unload;<br />
 return STATUS_SUCCESS;<br />
}</p>
<p>使用winobj成功看到名称为mysymboliclink的符号连接，和mydevice绑定，如图所示：</p>
<p><img class="aligncenter size-full wp-image-64" title="devicelink" src="http://www.lingdux.com/wp-content/uploads/2009/06/devicelink.jpg" alt="devicelink" width="657" height="406" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/61.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;注册表+关掉360木马防火墙</title>
		<link>http://www.lingdux.com/2009/40.html</link>
		<comments>http://www.lingdux.com/2009/40.html#comments</comments>
		<pubDate>Wed, 03 Jun 2009 10:06:09 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[360]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[木马]]></category>
		<category><![CDATA[注册表]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[防火墙]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=40</guid>
		<description><![CDATA[对注册表的操作的和对文件的操作差不多 ，但是还是有些区别，下面就写一个对注册表操作的例子，这个是修改360安全卫士的注册表选项，使其木马防火墙失效。(在ring3下是不行的，驱动才行得通，即使360开自我保护也无所谓)

首先明确一下流程：

1.定义一个操作对象OBJECT_ATTRIBUTES

<span class="readmore"><a href="http://www.lingdux.com/2009/40.html" title="驱动学习笔记&#8211;注册表+关掉360木马防火墙">阅读全文——共1123字</a></span>]]></description>
			<content:encoded><![CDATA[<p>对注册表的操作的和对文件的操作差不多 ，但是还是有些区别，下面就写一个对注册表操作的例子，这个是修改360安全卫士的注册表选项，使其木马防火墙失效。(在ring3下是不行的，驱动才行得通，即使360开自我保护也无所谓)</p>
<p>首先明确一下流程：</p>
<p>1.定义一个操作对象OBJECT_ATTRIBUTES</p>
<p>2.用InitializeObjectAttributes()函数初始化这个对象</p>
<p>3.用ZwOpenKey()函数来打开注册表打开360的选项</p>
<p>4.用ZwSetValueKey()函数来把360木马防火墙的的键值设置成空</p>
<p>5用ZwClose()函数来关闭打开的注册表</p>
<p>代码如下：</p>
<p><span id="more-40"></span></p>
<p>#include &lt;ntddk.h&gt;<br />
VOID Unload(IN PDRIVER_OBJECT DriverObject)<br />
{}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING UnicodeString)<br />
{<br />
 UNICODE_STRING path;//定义注册表路径字符串<br />
 UNICODE_STRING name;//定义名称字符串<br />
 UNICODE_STRING data;//定义数据字符串<br />
 OBJECT_ATTRIBUTES oa;//定义操作对象<br />
 HANDLE myhandle=NULL;//定义返回句柄</p>
<p> RtlInitUnicodeString(&amp;path,L”\\Registry\\Machine\\SOFTWARE\\360Safe\\safemon”);//初始化注册表路径字符串<br />
 RtlInitUnicodeString(&amp;name,L”ExecAccess”);//初始化名称字符串<br />
 RtlInitUnicodeString(&amp;data,0);//初始化数据字符串<br />
 InitializeObjectAttributes(&amp;oa,&amp;path,OBJ_CASE_INSENSITIVE,NULL,NULL);//初始化操作对象<br />
 ZwOpenKey(//打开注册表<br />
  &amp;myhandle,//返回句柄<br />
  KEY_WRITE,//权限<br />
  &amp;oa//操作对象<br />
  );<br />
 ZwSetValueKey(//设置注册表键值<br />
  myhandle,//当前句柄<br />
  &amp;name,//键名<br />
  0,<br />
  REG_SZ,//方式<br />
  data.Buffer,//字符串缓冲<br />
  data.Length//字符串长度<br />
  );<br />
 ZwClose(myhandle);//关闭注册表<br />
 DriverObject-&gt;DriverUnload=Unload;<br />
 return STATUS_SUCCESS;<br />
}</p>
<p>编译后加载驱动就可以关闭360的木马防火墙了～！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/40.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;文件操作</title>
		<link>http://www.lingdux.com/2009/34.html</link>
		<comments>http://www.lingdux.com/2009/34.html#comments</comments>
		<pubDate>Mon, 01 Jun 2009 19:06:17 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[操作]]></category>
		<category><![CDATA[文件]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=34</guid>
		<description><![CDATA[驱动中文件的操作和在ring3下对文件的操作有所不同，ring3下直接输文件路径就可以对文件操作了，在驱动中应该先为文件初始化一个对象，然后对这个对象操作，下面来编写一个驱动实现创建一个文件并写入字符串“www.lingdux.com”。

首先确定一下流程：

1.定义一个操作对象OBJECT_ATTRIBUTES

<span class="readmore"><a href="http://www.lingdux.com/2009/34.html" title="驱动学习笔记&#8211;文件操作">阅读全文——共1362字</a></span>]]></description>
			<content:encoded><![CDATA[<p>驱动中文件的操作和在ring3下对文件的操作有所不同，ring3下直接输文件路径就可以对文件操作了，在驱动中应该先为文件初始化一个对象，然后对这个对象操作，下面来编写一个驱动实现创建一个文件并写入字符串“<a href="http://www.lingdux.com”" target="_blank">www.lingdux.com”</a>。</p>
<p>首先确定一下流程：</p>
<p>1.定义一个操作对象OBJECT_ATTRIBUTES</p>
<p>2.用InitializeObjectAttributes()函数初始化这个对象</p>
<p>3.用ZwCreateFile()函数来创建一个文件</p>
<p>4.用ZwWriteFile()函数写入字符串</p>
<p>5. 关闭打开的文件ZwClose();</p>
<p>实现代码如下：</p>
<p><span id="more-34"></span></p>
<p>#include &lt;ntddk.h&gt;<br />
void UnLoad(IN PDRIVER_OBJECT DriverObject)<br />
{}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 UNICODE_STRING mystr;//定义字符串结构用来存放字符串<br />
 UNICODE_STRING mypath;//定义字符串结构来存放路径<br />
 OBJECT_ATTRIBUTES myoa;//定义一个操作对象<br />
 HANDLE hfile=NULL;//定义一个句柄用于接收返回的文件句柄<br />
 IO_STATUS_BLOCK iostatus;//定义结构用来接收打开文件的返回值</p>
<p> </p>
<p> RtlInitUnicodeString(&amp;mystr,L”<a href="http://www.lingdux.com" target="_blank">www.lingdux.com</a>“);//初始化字符串<br />
 RtlInitUnicodeString(&amp;mypath,L”\\??\\E:\\lingdux.txt”);//初始化路径字符串<br />
 InitializeObjectAttributes(//初始化操作对象<br />
  &amp;myoa,//操作对象<br />
  &amp;mypath,//路径<br />
  OBJ_KERNEL_HANDLE|OBJ_CASE_INSENSITIVE,//属性<br />
  NULL,<br />
  NULL<br />
  );<br />
 ZwCreateFile(//创建文件<br />
  &amp;hfile,//返回的句柄<br />
  GENERIC_ALL,//打开文件时候的权限<br />
  &amp;myoa,//文件对象<br />
  &amp;iostatus,//返回值<br />
  NULL,<br />
  FILE_ATTRIBUTE_NORMAL,<br />
  FILE_SHARE_READ,//共享权限<br />
  FILE_OPEN_IF,//打开文件的方式<br />
  FILE_NON_DIRECTORY_FILE|FILE_RANDOM_ACCESS|FILE_SYNCHRONOUS_IO_NONALERT,<br />
  NULL,<br />
  0);<br />
 ZwWriteFile(<br />
  hfile,//文件句柄<br />
  NULL,<br />
  NULL,<br />
  NULL,<br />
  &amp;iostatus,//返回值<br />
  mystr.Buffer,//字符串缓冲区<br />
  mystr.Length,//字符串长度<br />
  NULL,<br />
  NULL<br />
  );<br />
 ZwClose(hfile);<br />
 DriverObject-&gt;DriverUnload=UnLoad;<br />
 return STATUS_SUCCESS;<br />
}</p>
<p>编译后用驱动加载工具加载，成功在E盘根目录想建立文件lingdux.txt，内容为“<a href="http://www.lingdux.com" target="_blank">www.lingdux.com</a>”</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/34.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;字符串</title>
		<link>http://www.lingdux.com/2009/23.html</link>
		<comments>http://www.lingdux.com/2009/23.html#comments</comments>
		<pubDate>Tue, 26 May 2009 20:08:47 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[字符串]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[编写]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=23</guid>
		<description><![CDATA[在驱动编程中，处理字符串最好用UNICODE_STRING，UNICODE_STRING是一个结构，查看MSDN如下：

typedef struct _UNICODE_STRING{

USHORT length;\\字符串的长度

<span class="readmore"><a href="http://www.lingdux.com/2009/23.html" title="驱动学习笔记&#8211;字符串">阅读全文——共1424字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在驱动编程中，处理字符串最好用UNICODE_STRING，UNICODE_STRING是一个结构，查看MSDN如下：</p>
<p>typedef struct _UNICODE_STRING{</p>
<p>USHORT length;\\字符串的长度</p>
<p>USHORT MaxnumLength;\\整个缓冲区的最大长度</p>
<p>PWSTR Buffer;\\缓冲</p>
<p>}UNICODE_STRING *PUNICODE_STRING;</p>
<p>字符串不是以00结尾，而是用一个结构来指定字符串的长度。</p>
<p>DDK提供了一个函数用于初始化字符串</p>
<p>VOID RtlInitUnicodeString(</p>
<p>IN OUT PUNICODE_STRING DestiantionString,//定义的字符串结构指针</p>
<p>IN PCWSTR SourceString//字符串</p>
<p>);</p>
<p><span id="more-23"></span></p>
<p>创建好一个工程框架，在框架中加入下面代码：</p>
<p>UNICODE_STRING mystr;//定义字符串</p>
<p>RtlInitUnicodeString(&amp;mystr,L”<a href="http://www.lingdux.com" target="_blank">www.lingdux.com</a>“);//字符串初始化</p>
<p>DbgPrint(“%wZ”,&amp;mystr);//打印字符串</p>
<p>加载驱动，用DEBUG View 成功看到结果<a href="http://www.lingdux.com" target="_blank">www.lingdux.com</a></p>
<p>接下来在定义一个字符串结构,把字符串copy到新的结构</p>
<p>要为新的字符串初始化，并且分配空间</p>
<p>ddk提供了一个函数来分配空间</p>
<p>PVOID ExAllocatePool(<br />
    IN POOL_TYPE  <em>PoolType</em>,//分页方式<br />
    IN SIZE_T  <em>NumberOfBytes//大小</em><br />
    );</p>
<p>用下面的函数copy字符串</p>
<p>VOID RtlInitUnicodeString(</p>
<p>IN OUT PUNICODE_STRING destinationString,//目标字符串指针</p>
<p>IN PUNICODE_STRING SourceString//源字符串指针</p>
<p>);</p>
<p>UNICODE_STRING mynewstr;//定义字符串</p>
<p>mynewstr.Buffer=(PWSTR)ExAllocatePool(PagedPool,256);//分配内存空间</p>
<p>RtlInitUnicodeString(&amp;mynewstr,&amp;mystr);//copy字符串</p>
<p>DbgPrint(“%wZ”,&amp;mynewstr);//打印字符串</p>
<p>载入驱动后用Debug Viwe成功截获到两个<a href="http://www.lingdux.com">www.lingdux.com</a></p>
<p>最终代码如下</p>
<p>#include &lt;ntddk.h&gt;<br />
VOID Unload(IN PDRIVER_OBJECT DriverObject)<br />
{<br />
}<br />
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 UNICODE_STRING mystr;<br />
 UNICODE_STRING mynewstr;<br />
 RtlInitUnicodeString(&amp;mystr,L”<a href="http://www.lingdux.com" target="_blank">www.lingdux.com</a>“);<br />
 DbgPrint(“%wZ”,&amp;mystr);<br />
 mynewstr.Buffer=(PWSTR)ExAllocatePool(PagedPool,256);<br />
 RtlCopyUnicodeString(&amp;mynewstr,&amp;mystr);<br />
 DbgPrint(“%wZ”,&amp;mynewstr);<br />
 DriverObject-&gt;DriverUnload=Unload;<br />
 return STATUS_SUCCESS;<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/23.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>驱动学习笔记&#8211;”hello world”</title>
		<link>http://www.lingdux.com/2009/17.html</link>
		<comments>http://www.lingdux.com/2009/17.html#comments</comments>
		<pubDate>Mon, 25 May 2009 19:56:59 +0000</pubDate>
		<dc:creator>零度x</dc:creator>
				<category><![CDATA[驱动学习]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[编写]]></category>
		<category><![CDATA[驱动]]></category>

		<guid isPermaLink="false">http://www.lingdux.com/?p=17</guid>
		<description><![CDATA[编译环境用xp下VC6+DDK

新建一个文件夹当作工程目录，路径是E:\lingdux\

从别的工程copy过来两个文件，

<span class="readmore"><a href="http://www.lingdux.com/2009/17.html" title="驱动学习笔记&#8211;”hello world”">阅读全文——共1121字</a></span>]]></description>
			<content:encoded><![CDATA[<p>编译环境用xp下VC6+DDK</p>
<p>新建一个文件夹当作工程目录，路径是E:\lingdux\</p>
<p>从别的工程copy过来两个文件，</p>
<p>一个是makefile，它用来指定文件之间的依赖关系，确定项目中哪些文件时需要重新编译的，那些事已经编译过的。里面的内容不用改，直接默认就OK</p>
<p>另一个是source，它用来保存一些配置信息，内容如下：</p>
<p>TARGETNAME=lingdux  这句用来指定目标程序存放的路径</p>
<p>TARGETTYPE=DRIVER 这句是指定目标类型，DRIVER为驱动程序</p>
<p>TARGETPATH=Driver 这句指定编译时的中间文件存放的路径</p>
<p>SOURCES=lingdux.c  这句指定了源文件</p>
<p>在工程目录想创建一个空文件命名lingdux.c，双击用VC6打开，开始写代码～！</p>
<p>遵循C语言，只有一个入口函数DriverEntry，有两个参数</p>
<p>NTSTATUS Driver Entry(IN PDRIVER_OBJECT DriverObject, 第一个是PDRIVER_OBJECT类型 系统进程调用的驱动对象<br />
                            IN OUNICODE_STRING RegistryPath)  第二个是IN OUNICODE_STRING类型  字符串类型，注册路径</p>
<p>返回值类型为NTSTATUS，系统状态。</p>
<p>输出函数为DbgPrint()，包含的头文件是ntddk.h <span id="more-17"></span></p>
<p>编写完成后，发现这个驱动程序没有退出功能,系统加载后不能停止，重新启动后才能再次加载，不利于调试，下面就添加一个退出功能。</p>
<p>DriverObject-&gt;DriverUnload=Unload 为驱动对象注册一个卸载例程指定一个空函数</p>
<p>在驱动停止的时候被调用，用于删除一些设备对象，符号链接，释放驱动加载的资源。</p>
<p>VOID Unload(IN PDRIVER_OBJECT DriverObject)</p>
<p>{</p>
<p>}</p>
<p>完整代码如下：</p>
<p>#include &lt;ntddk.h&gt;<br />
VOID Unload(IN PDRIVER_OBJECT DriverObject)<br />
{<br />
}</p>
<p>NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)<br />
{<br />
 DriverObject-&gt;DriverUnload=Unload;<br />
 DbgPrint(“Hello World!”);<br />
 return STATUS_SUCCESS;<br />
}</p>
<p>保存以上代码，然后打开DDK，路径选择工程目录，运行build命令，</p>
<p>编译出来的驱动文件为E:\lingdux\driver\i386\lingdux.sys</p>
<p>用coderui的驱动加载工具加载</p>
<p><img class="aligncenter size-full wp-image-18" title="jiazai" src="http://www.lingdux.com/wp-content/uploads/2009/05/jiazai.jpg" alt="jiazai" width="441" height="164" /></p>
<p>用debug viwe成功截获到输出</p>
<p><img class="aligncenter size-full wp-image-19" title="jiehuo" src="http://www.lingdux.com/wp-content/uploads/2009/05/jiehuo.jpg" alt="jiehuo" width="500" height="302" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lingdux.com/2009/17.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

