和NT驱动一样,WDM驱动的入口程序也是DriverEntry,但是初始化作用被分散到其他例程中。例如,创建设备对象的责任就不在DriverEntry中,而被放在了AddDevice例程中。同时,在DriverEntry中,需要设置对IRP_MJ_PNP处理的派遣函数。下面是示例程序:
#pragma INITCODE
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath)
{
KdPrint(("Enter DriverEntry\n"));
pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;
pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;
pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
pDriverObject->MajorFunction[IRP_MJ_CREATE] =
pDriverObject->MajorFunction[IRP_MJ_READ] =
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;
pDriverObject->DriverUnload = HelloWDMUnload;
KdPrint(("Leave DriverEntry\n"));
return STATUS_SUCCESS;
}
从上述代码可以看出,WDM驱动的DriverEntry和NT式驱动的DriverEntry有以下几点不同:
1. 增加了对AddDevice函数的设置,这是WDM驱动和NT驱动非常重要的不同点。因为NT驱动是主动加载设备的,也就是驱动一旦加载就创建设备。而WDM驱动是被动加载设备的,操作系统必须加载PDO以后,调佣驱动的AddDevice例程,AddDevice例程中负责创建FDO,并且附加到PDO之上。
2. 创建设备对象已经不在这个函数中了,而在AddDevice例程中创建。
3. 必须加入IRP_MJ_PNP的派遣回调函数。IRP_MJ_PNP主要是负责计算机中即插即用的处理。