视窗驱动程序模型(Windows Driver Model,简称WDM),是微软视窗操作系统的驱动程序设计架构,包括对于各项设备(Device)的支持,如键盘(Keyboard)、鼠标(Mouse)、网卡(Network Driver Interface Specification,Ndis)、通用串行总线(Universal Serial Bus,USB)等。WDM可支持Windows 98, Windows 98 Second Edition, Windows Me, Windows 2000, Windows XP以及Windows Server 2003在x86平台上的建制工作。这个架构分成好几个管理层面:
驱动程序的种类有总线驱动程序(bus driver)、功能驱动程序(function driver)、筛选驱动程序(filter driver)三种:
如同许多语言从main函数开始,WDM驱动程序的加载(Loading)乃至于动作,以及其卸载(Unload)行为,都有其步骤与规则。WDM驱动程序可以动态式的加载与卸载,当侦测到设备(Device)插入的时候,依据“PnP Manager”会自动地加载相对应的设备驱动程序,然后成为“Driver Object”,并调用DriverEntry函数。所有的WDM驱动程序,都必须拥有这个DriverEntry例程(routine),而且“此一名称不可改变”的,所有的驱动程序也是从这里开始运行的,I/O Manager首先调用驱动程序的DriverEntry()
。DriverEntry在DDK Compiler编译出来的输出符号表是“DriverEntry@8
”,原因是微软的C编译器把stdcall函示(例如VcDCall)的名称加上“记号”,加上一个@符号,在附上参数的总字节个数,8指此function的所有参数所占的byte数。
DriverEntry函数有两个参数,其中第一个参数PDRIVER_OBJECT DriverObject
是指向该驱动程序对应的对象指针;PUNICODE_STRING RegistryPath
,驱动程序的服务主要键码,这个参数的使用时机并不多。以下是一个简单而标准的DriverEntry基本实现:
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING pRegistryString) { //PDEVICE_OBJECT DriverObject; UNICODE_STRING deviceName; RtlInitUnicodeString( &deviceName, DEVICE_NAME ); status = IoCreateDevice( DriverObject, 0, &deviceName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, true, &pDeviceObj ); UNICODE_STRING linkName; RtlInitUnicodeString( &linkName, LINK_NAME ); status = IoCreateSymbolicLink( &linkName, &deviceName ); DriverObject->DriverUnload = DriverUnload; DriverObject->MajorFunction = DriverObject->MajorFunction = DriverObject->MajorFunction = xxDriverDispatch; DriverObject->DriverUnload = xxUnload; return STATUS_SUCCESS; }