practice_code

practice_code

ID:28696815

大小:88.50 KB

页数:15页

时间:2018-12-13

practice_code_第1页
practice_code_第2页
practice_code_第3页
practice_code_第4页
practice_code_第5页
资源描述:

《practice_code》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、WdmDriver的源代码由六个文件组成,包括WdmDriver.h与guid.h两个头文件和Init.cpp、Pnp.cpp、Dispatch.cpp与WMI.cpp四个C++源文件。C++源文件的内容将在后面介绍,下面先看一看头文件。WdmDriver.hWdmDriver.h头文件中包括:函数原型声明;一个UNICODE_STRING类型全局变量servkey的定义,servkey在这里用于备份设备服务键的键名RegistryPath;以及设备扩展结构的定义。下面是WdmDriver.h的部分源代码:#ifdef__cplusplusexte

2、rn"C"{#endif#include#include#include#include"guid.h"externUNICODE_STRINGservkey;typedefstruct_WDM_DEVICE_EXTENSION{PDEVICE_OBJECTpdo;PDEVICE_OBJECTfdo;PDEVICE_OBJECTNextDevice;UNICODE_STRINGifSymLinkName;WMILIB_CONTEXTWmiLibInfo;}DEVICE_EXTENSION,*PD

3、EVICE_EXTENSION;//以下为函数原型声明VOIDWdmUnload(INPDRIVER_OBJECTDriverObject);...guid.h为GUID定义:DEFINE_GUID(WDM_GUID,0x87472ba0,0x61bc,0x11d2,0xb6,0x77,0x0,0xc0,0xdf,0xe4,0xc1,0xf3);DEFINE_GUID(WMI_GUID,0x87472ba1,0x61bc,0x11d2,0xb6,0x77,0x0,0xc0,0xdf,0xe4,0xc1,0xf3);9.4.2初始化与清除源文件Ini

4、t.cpp实现驱动程序的初始化,其中包括入口例程DriverEntry和清除例程DriverUnload的源代码。DriverEntry例程的源代码基本上已经在9.3.1节中给出了,其中缺少的语句读者应该能够自行补上。注意在WdmDriver驱动程序的DriverEntry例程中调用ExAllocatePool函数分配了系统空间内存:servkey.Buffer=(PWSTR)ExAllocatePool(PagedPool,RegistryPath->Length+sizeof(WCHAR));所以清除例程DriverUnload例程需要释放该内

5、存,除此之外DriverUnload例程没有什么清除工作要做。下面是DriverUnload例程的源代码:VOIDWdmUnload(INPDRIVER_OBJECTDriverObject){ExFreePool(servkey.Buffer);}9.4.3PnP与电源管理源文件Pnp.cpp实现了三个例程:AddDevice、DispatchPnp和DispatchPower。AddDevice例程的大部分源代码在9.3.1节中已经详细解释了,下面把分散的代码组合在一起,写出完整的AddDevice例程:NTSTATUSAddDevice(IN

6、PDRIVER_OBJECTDriverObject,INPDEVICE_OBJECTpdo){NTSTATUSstatus;PDEVICE_OBJECTfdo;//在fdo中创建功能设备对象status=IoCreateDevice(DriverObject,sizeof(DEVICE_EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fdo);if(NT_ERROR(status))returnstatus;//将fdo记录在设备扩展中PWDM_DEVICE_EXTENSIONdx=(PWDM_DEVIC

7、E_EXTENSION)fdo->DeviceExtension;dx->pdo=pdo;dx->fdo=fdo;//注册设备status=IoRegisterDeviceInterface(pdo,&WDM_GUID,NULL,&dx->ifSymLinkName);if(NT_ERROR(status)){IoDeleteDevice(fdo);returnstatus;}IoSetDeviceInterfaceState(&dx->ifSymLinkName,TRUE);//把设备对象放到设备堆栈上dx->NextDevice=IoAttac

8、hDeviceToDeviceStack(fdo,pdo);//设置设备标志fdo->Flags&=~DO_DEVICE_

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
相关文章
更多
相关标签