⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 夜行动物 - 驱动程序简单入门.htm

📁 用户态使用Win32 CreateFile访问驱动程序
💻 HTM
📖 第 1 页 / 共 5 页
字号:
IRP_MJ_READ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从设备得到数据&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReadFile&nbsp;<br>
&nbsp;<br>
IRP_MJ_WRITE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;传送数据到设备&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteFile&nbsp;<br>
&nbsp;<br>
IRP_MJ_DEVICE_CONTROL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;控制操作(利用IOCTL宏)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeviceIoControl&nbsp;<br>
&nbsp;<br>
IRP_MJ_INTERNAL_DEVICE_CONTROL&nbsp;&nbsp;控制操作(只能被内核调用)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;N/A&nbsp;<br>
&nbsp;<br>
IRP_MJ_QUERY_INFORMATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;得到文件的长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetFileSize&nbsp;<br>
&nbsp;<br>
IRP_MJ_SET_INFORMATION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置文件的长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetFileSize&nbsp;<br>
&nbsp;<br>
IRP_MJ_FLUSH_BUFFERS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;写输出缓冲区或者丢弃输入缓冲区&nbsp;FlushFileBuffers&nbsp;FlushConsoleInputBuffer&nbsp;PurgeComm&nbsp;<br>
&nbsp;<br>
IRP_MJ_SHUTDOWN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;系统关闭&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitiateSystemShutdown<br>
<br>
=================================================================================================================================<br>
<br>
下面开始写我们的驱动版的“Hello&nbsp;World”,程序很简单,先介绍一下流程:<br>
<br>
1,调用IoCreateDevice()创建一个设备,并返回一个设备对象。<br>
2,调用IoCreateSynbolicLink()创建一个符号连接,使Win32程序可以使用驱动程序<br>
3,设置IRP_MJ_DEVICE_CONTROL派遣例程HelloWorldDispatch()和卸载例程HelloWorldUnLoad()。<br>
<br>
如果Win32程序使用DeviceIoControl(),则执行HelloWorldDispatch()函数<br>
4,调用IoGetCurrentIrpStackLocation()得到当前调用者的IRP指针<br>
5,取得IO控制代码,完成后使用IoCompleteRequest()完成IRP操作<br>
<br>
如果使用ControlService()停止驱动程序,则执行HelloWorldUnLoad()函数<br>
4,调用IoDeleteSymbolicLink()删除符号连接<br>
5,调用IoDeleteDevice()删除已建立的设备<br>
<br>
<br>
<br>
驱动入口DriverEntry()<br>
<br>
//创建设备<br>
IoCreateDevice(DriverObject,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//驱动程序对象<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//扩展设备的大小,由于不需要,所以置0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&DeviceNameString,&nbsp;&nbsp;&nbsp;//设备名称<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILE_DEVICE_UNKNOWN,&nbsp;//设备类型<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指示设备允许的操作<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FALSE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果为TRUE,表示只能有一个线程使用该设备,为FALSE,则没有限制<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lpDeviceObject);&nbsp;&nbsp;&nbsp;&nbsp;//返回的设备对象<br>
<br>
//创建符号连接<br>
IoCreateSymbolicLink(&DeviceLinkString,&nbsp;&nbsp;&nbsp;//存放符号连接的UNICODE_STRING<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&DeviceNameString);&nbsp;&nbsp;//设备名称<br>
<br>
//派遣例程和卸载例程<br>
DriverObject-&gt;MajorFunction[IRP_MJ_CREATE]=<br>
&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;MajorFunction[IRP_MJ_CLOSE]=<br>
DriverObject-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL]=HelloWorldDispatch;<br>
DriverObject-&gt;DriverUnload=HelloWorldUnLoad;<br>
<br>
IRP派遣例程HelloWorldDispatch()<br>
<br>
IrpStack=IoGetCurrentIrpStackLocation(pIrp);&nbsp;&nbsp;&nbsp;//得到当前调用者的IRP堆栈<br>
<br>
//获取IO控制代码,并执行指定操作,这里只是DbgPrint()<br>
IoControlCodes=IrpStack-&gt;Parameters.DeviceIoControl.IoControlCode;<br>
switch&nbsp;(IoControlCodes)&nbsp;&nbsp;{<br>
......<br>
<br>
IoCompleteRequest(pIrp,IO_NO_INCREMENT);&nbsp;&nbsp;&nbsp;//完成IRP操作<br>
<br>
卸载例程HelloWorldUnLoad()<br>
<br>
//删除符号连接和设备<br>
IoDeleteSymbolicLink(&DeviceLinkString);<br>
IoDeleteDevice(DriverObject-&gt;DeviceObject);<br>
<br>
=================================================================================================================================<br>
<br>
完整代码:<br>
<br>
=================================================================================================================================<br>
<br>
驱动程序的编译需要使用DDK中的build实用程序,它是一个命令行程序,使用不是很方便。VC知识库有一篇在VC++&nbsp;6.0中编译驱动的文章,有兴趣可以去看看。<br>
<br>
1,makefile<br>
编译驱动程序,首先应该准备一个makefile,这个文件很简单,只有一句代码:<br>
#<br>
#&nbsp;DO&nbsp;NOT&nbsp;EDIT&nbsp;THIS&nbsp;FILE!!!&nbsp;&nbsp;Edit&nbsp;.\sources.&nbsp;if&nbsp;you&nbsp;want&nbsp;to&nbsp;add&nbsp;a&nbsp;new&nbsp;source<br>
#&nbsp;file&nbsp;to&nbsp;this&nbsp;component.&nbsp;&nbsp;This&nbsp;file&nbsp;merely&nbsp;indirects&nbsp;to&nbsp;the&nbsp;real&nbsp;make&nbsp;file<br>
#&nbsp;that&nbsp;is&nbsp;shared&nbsp;by&nbsp;all&nbsp;the&nbsp;driver&nbsp;components&nbsp;of&nbsp;the&nbsp;Windows&nbsp;NT&nbsp;DDK<br>
#<br>
<br>
!INCLUDE&nbsp;$(NTMAKEENV)\makefile.def<br>
<br>
正如描述的那样,不要修改这个文件---它是通用的!<br>
<br>
2,sources<br>
准备的第二个文件就是sources,它描述了一些编译的细节。针对本文的程序,sources文件的内容是这样的:<br>
TARGETNAME=HelloWorld&nbsp;&nbsp;&nbsp;//驱动名称<br>
TARGETPATH=.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//编译后SYS的路径<br>
TARGETTYPE=DRIVER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//类型为驱动程序<br>
<br>
SOURCES=&nbsp;HelloWorld.c&nbsp;&nbsp;&nbsp;//只有一个源文件<br>
<br>
有了这2个文件后,就可以使用build进行编译了。进入「开始」菜单\程序\Development&nbsp;Kits\Windows&nbsp;2000&nbsp;DDK,<br>
分别有3个CMD程序:1)Checked&nbsp;64&nbsp;Bit&nbsp;Build&nbsp;Environment,“Debug”的64位版本;2)Checked&nbsp;Build&nbsp;Environment<br>
“Debug”的32位版本;3)Free&nbsp;Build&nbsp;Environment,“Release”的32位版本。不用说,肯定是使用Free&nbsp;Build&nbsp;Environment。<br>
<br>
New&nbsp;or&nbsp;updated&nbsp;MSVC&nbsp;detected.&nbsp;&nbsp;Updating&nbsp;DDK&nbsp;environment....<br>
<br>
Setting&nbsp;environment&nbsp;for&nbsp;using&nbsp;Microsoft&nbsp;Visual&nbsp;C++&nbsp;tools.<br>
Starting&nbsp;dirs&nbsp;creation...Completed.<br>
<br>
C:\NTDDK&gt;cd\<br>
<br>
C:\&gt;cd&nbsp;HelloWorld<br>
<br>
C:\HelloWorld&gt;build<br>
BUILD:&nbsp;Object&nbsp;root&nbsp;set&nbsp;to:&nbsp;==&gt;&nbsp;objfre<br>
BUILD:&nbsp;/i&nbsp;switch&nbsp;ignored<br>
BUILD:&nbsp;Compile&nbsp;and&nbsp;Link&nbsp;for&nbsp;i386<br>
BUILD:&nbsp;Loading&nbsp;c:\NTDDK\build.dat...<br>
BUILD:&nbsp;Computing&nbsp;Include&nbsp;file&nbsp;dependencies:<br>
BUILD:&nbsp;Examining&nbsp;c:\helloworld&nbsp;directory&nbsp;for&nbsp;files&nbsp;to&nbsp;compile.<br>
&nbsp;&nbsp;&nbsp;&nbsp;c:\helloworld&nbsp;-&nbsp;1&nbsp;source&nbsp;files&nbsp;(127&nbsp;lines)<br>
BUILD:&nbsp;Saving&nbsp;c:\NTDDK\build.dat...<br>
BUILD:&nbsp;Compiling&nbsp;c:\helloworld&nbsp;directory<br>
Compiling&nbsp;-&nbsp;helloworld.c&nbsp;for&nbsp;i386<br>
BUILD:&nbsp;Linking&nbsp;c:\helloworld&nbsp;directory<br>
Linking&nbsp;Executable&nbsp;-&nbsp;i386\helloworld.sys&nbsp;for&nbsp;i386<br>
BUILD:&nbsp;Done<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;file&nbsp;compiled<br>
&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;executable&nbsp;built<br>
<br>
C:\HelloWorld&gt;<br>
<br>
现在C:\HelloWorld\i386目录下,就有了HelloWorld.sys。<br>
<br>
=================================================================================================================================<br>
<br>
驱动程序的安装如同安装服务一样,唯一不同的是,创建服务时,类型是内核驱动,其他跟操作服务没什么区别。<br>
<br>
安装驱动程序流程:<br>
1,调用OpenSCManager()打开服务控制管理器<br>
2,调用CreateService()创建一个服务,服务类型为内核驱动<br>
3,调用OpenService()取得服务句柄<br>
启动服务<br>
4,调用StartService()启动服务<br>
停止服务<br>
4,调用ControlService()停止服务<br>
删除服务<br>
4,调用DeleteService()删除服务<br>
5,调用CloseServiceHandle()关闭服务句柄<br>
<br>
操作驱动程序流程:&nbsp;<br>
1,调用CreateFile()取得设备句柄<br>
2,调用DeviceIoControl()传递I/O控制代码<br>
3,调用CloseHandle()关闭设备句柄<br>
<br>
http://www.xfocus.net/tools/200411/882.html<br>
这里有一个完整的驱动安装程序,所以我就不写了,只给出操作驱动程序的代码<br>
<br>
完整代码:<br>
<br>
=================================================================================================================================<br>
<br>
参考资料<br>
<br>
《Windows&nbsp;2000&nbsp;DDK》<br>
<br>
《Windows&nbsp;2000&nbsp;驱动程序设计》<br>
<br>
<br>
附录代码:<br>
<code><OL><LI></LI><LI>#ifndef&nbsp;__HELLOWORLD_C__</LI><LI>#define&nbsp;__HELLOWORLD_C__</LI><LI></LI><LI>#define&nbsp;DEBUGMSG</LI><LI></LI><LI>#include&nbsp;&lt;ntddk.h&gt;</LI><LI></LI><LI>#define&nbsp;DEVICE_HELLO_INDEX&nbsp;0x860</LI><LI></LI><LI>//2个IOCTL宏</LI><LI>#define&nbsp;START_HELLPWORLD&nbsp;CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS)</LI><LI>#define&nbsp;STOP_HELLPWORLD&nbsp;&nbsp;CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS)</LI><LI></LI><LI>#define&nbsp;NT_DEVICE_NAME&nbsp;L"\\Device\\HelloWorld"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设备名称</LI><LI>#define&nbsp;DOS_DEVICE_NAME&nbsp;L"\\DosDevices\\HelloWorld"&nbsp;&nbsp;&nbsp;//符号连接</LI><LI></LI><LI>NTSTATUS&nbsp;HelloWorldDispatch&nbsp;(IN&nbsp;PDEVICE_OBJECT&nbsp;DeviceObject,IN&nbsp;PIRP&nbsp;pIrp);</LI><LI></LI><LI>VOID&nbsp;HelloWorldUnLoad&nbsp;(IN&nbsp;PDRIVER_OBJECT&nbsp;DriverObject);</LI><LI></LI><LI>//驱动入口</LI><LI>NTSTATUS&nbsp;DriverEntry&nbsp;(IN&nbsp;PDRIVER_OBJECT&nbsp;DriverObject,IN&nbsp;PUNICODE_STRING&nbsp;RegistryPath)</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS&nbsp;ntStatus=STATUS_SUCCESS;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_OBJECT&nbsp;lpDeviceObject=NULL;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指向设备对象的指针</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_STRING&nbsp;DeviceNameString={0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设备名称</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_STRING&nbsp;DeviceLinkString={0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//符号连接</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//调试信息</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("Starting&nbsp;DriverEntry()\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;RtlInitUnicodeString(&DeviceNameString,NT_DEVICE_NAME);&nbsp;&nbsp;//初始化Unicode字符串</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//创建设备</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;ntStatus=IoCreateDevice(DriverObject,0,&DeviceNameString,FILE_DEVICE_UNKNOWN,0,FALSE,&lpDeviceObject);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//使用NT_SUCCESS宏检测函数调用是否成功</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!NT_SUCCESS(ntStatus))</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("IoCreateDevice()&nbsp;error&nbsp;reports&nbsp;0x%08X\n",ntStatus);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ntStatus;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//创建符号连接</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&DeviceNameString);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!NT_SUCCESS(ntStatus))</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("IoCreateSymbolicLink()&nbsp;error&nbsp;reports&nbsp;0x%08X\n",ntStatus);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(lpDeviceObject)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoDeleteDevice(lpDeviceObject);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ntStatus;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//设置IRP派遣例程和卸载例程</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;MajorFunction[IRP_MJ_CREATE]=</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;MajorFunction[IRP_MJ_CLOSE]=</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;MajorFunction[IRP_MJ_DEVICE_CONTROL]=HelloWorldDispatch;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;DriverObject-&gt;DriverUnload=HelloWorldUnLoad;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ntStatus;</LI><LI>}</LI><LI></LI><LI>NTSTATUS&nbsp;HelloWorldDispatch&nbsp;(IN&nbsp;PDEVICE_OBJECT&nbsp;DeviceObject,IN&nbsp;PIRP&nbsp;pIrp)</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;NTSTATUS&nbsp;ntStatus=STATUS_SUCCESS;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;PIO_STACK_LOCATION&nbsp;IrpStack=NULL;&nbsp;&nbsp;&nbsp;//IRP堆栈</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;IoControlCodes=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//I/O控制代码</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;//设置IRP状态</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;pIrp-&gt;IoStatus.Status=STATUS_SUCCESS;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;pIrp-&gt;IoStatus.Information=0;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("Starting&nbsp;HelloWorldDispatch()\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;IrpStack=IoGetCurrentIrpStackLocation(pIrp);&nbsp;&nbsp;&nbsp;&nbsp;//得到当前调用者的IRP</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(IrpStack-&gt;MajorFunction)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;IRP_MJ_CREATE:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("IRP_MJ_CREATE\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;IRP_MJ_CLOSE:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("IRP_MJ_CLOSE\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;IRP_MJ_DEVICE_CONTROL:</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("IRP_MJ_DEVICE_CONTROL\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//取得I/O控制代码</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoControlCodes=IrpStack-&gt;Parameters.DeviceIoControl.IoControlCode;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(IoControlCodes)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;START_HELLPWORLD:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("Starting&nbsp;\"Hello&nbsp;World\"\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;STOP_HELLPWORLD:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("Stoping&nbsp;\"Hello&nbsp;World\"\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pIrp-&gt;IoStatus.Status=STATUS_INVALID_PARAMETER;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;ntStatus=pIrp-&gt;IoStatus.Status;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;IoCompleteRequest(pIrp,IO_NO_INCREMENT);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ntStatus;</LI><LI>}</LI><LI></LI><LI>VOID&nbsp;HelloWorldUnLoad&nbsp;(IN&nbsp;PDRIVER_OBJECT&nbsp;DriverObject)</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNICODE_STRING&nbsp;DeviceLinkString={0};</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_OBJECT&nbsp;DeviceObjectTemp1=NULL;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PDEVICE_OBJECT&nbsp;DeviceObjectTemp2=NULL;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DbgPrint("Starting&nbsp;HelloWorldUnLoad()\n");</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DeviceLinkString.Buffer)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoDeleteSymbolicLink(&DeviceLinkString);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(DriverObject)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeviceObjectTemp1=DriverObject-&gt;DeviceObject;</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(DeviceObjectTemp1)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeviceObjectTemp2=DeviceObjectTemp1;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeviceObjectTemp1=DeviceObjectTemp1-&gt;NextDevice;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoDeleteDevice(DeviceObjectTemp2);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI>}</LI><LI></LI><LI>#endif</LI><LI></LI><LI></LI></OL></code>
<br>
<br>
用户态程序:<br>
<code><OL><LI></LI><LI>#define&nbsp;DEBUGMSG</LI><LI></LI><LI>#include&nbsp;&lt;windows.h&gt;</LI><LI>#include&nbsp;&lt;winioctl.h&gt;</LI><LI>#include&nbsp;&lt;stdio.h&gt;</LI><LI></LI><LI>#define&nbsp;DEVICE_FILTER_INDEX&nbsp;0x860</LI><LI></LI><LI>#define&nbsp;START_HELLPWORLD&nbsp;CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_FILTER_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS)</LI><LI>#define&nbsp;STOP_HELLPWORLD&nbsp;CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_FILTER_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS)</LI><LI></LI><LI>#define&nbsp;erron&nbsp;GetLastError()</LI><LI></LI><LI>#define&nbsp;MY_DEVICE_NAME&nbsp;"\\\\.\\HelloWorld"</LI><LI></LI><LI>#define&nbsp;MY_DEVICE_START&nbsp;"-start"</LI><LI>#define&nbsp;MY_DEVICE_STOP&nbsp;"-stop"</LI><LI></LI><LI>BOOL&nbsp;DriverControl&nbsp;(TCHAR&nbsp;*Maik);</LI><LI></LI><LI>void&nbsp;Usage&nbsp;(TCHAR&nbsp;*Paramerter);</LI><LI></LI><LI>int&nbsp;main&nbsp;(int&nbsp;argc,TCHAR&nbsp;*argv[])</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(argc!=2)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usage(argv[0]);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strcmpi(argv[1],MY_DEVICE_START)==0&nbsp;||&nbsp;strcmpi(argv[1],MY_DEVICE_STOP)==0)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DriverControl(argv[1]);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;else</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Usage(argv[0]);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;</LI><LI>}</LI><LI></LI><LI>BOOL&nbsp;DriverControl&nbsp;(TCHAR&nbsp;*Maik)</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hDevice=NULL;&nbsp;&nbsp;//设备句柄</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得设备句柄</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hDevice=CreateFile(MY_DEVICE_NAME,GENERIC_READ&nbsp;|&nbsp;GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hDevice==INVALID_HANDLE_VALUE)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("CreateFile()&nbsp;GetLastError&nbsp;reports&nbsp;%d\n",erron);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strcmpi(Maik,MY_DEVICE_START)==0)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//传递启动的I/O控制代码</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!(DeviceIoControl(hDevice,START_HELLPWORLD,NULL,0,NULL,0,NULL,NULL)))</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("DeviceIoControl()&nbsp;GetLastError&nbsp;reports&nbsp;%d\n",erron);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hDevice);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strcmpi(Maik,MY_DEVICE_STOP)==0)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//传递停止的I/O控制代码</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!(DeviceIoControl(hDevice,STOP_HELLPWORLD,NULL,0,NULL,0,NULL,NULL)))</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#ifdef&nbsp;DEBUGMSG</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("DeviceIoControl()&nbsp;GetLastError&nbsp;reports&nbsp;%d\n",erron);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#endif</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hDevice);</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;FALSE;</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hDevice)</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hDevice);&nbsp;&nbsp;//关闭句柄</LI><LI></LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;TRUE;</LI><LI>}</LI><LI></LI><LI>void&nbsp;Usage&nbsp;(TCHAR&nbsp;*Paramerter)</LI><LI>{</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"============================================================================\n"</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;驱动版Hello&nbsp;World\n"</LI><LI>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"作者:dahubaob

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -