资源描述:
《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_