最近因为工作关系,接触了一下WDF驱动开发。
WDF驱动其实是微软公司提供的一套驱动开发的框架。有了这个框架之后,开发驱动会简单一些。WDF本身是从WDM基础上封装而成的。WDF里面封装了很多对象,如WDFDRIVER等。如果要学习使用WDF来开发驱动,个人感觉还是需要WDM的一些基础,不然很多东西挺难理解的。
写了一个简单的WDF驱动(非pnp),基本步骤如下:
创建framework 驱动对象
几乎任何一个WDF驱动一开始就要创建一个framework的驱动对象,这个对象是所有其他对象的parent对象。
//初始化WDF_DRIVER_CONFIG
WDF_DRIVER_CONFIG_INIT(
&cfg,
NULL //不提供adddevice函数 );
cfg.DriverInitFlags = WdfDriverInitNonPnpDriver; //非pnp驱动
cfg.DriverPoolTag = (ULONG)'PEPU';
cfg.EvtDriverUnload = EvtDriverUnload; //卸载函数
//
//创建一个framework的驱动对象。
status = WdfDriverCreate(DriverObject,RegistryPath,WDF_NO_OBJECT_ATTRIBUTES,&cfg,&drv);
if(!NT_SUCCESS(status))
{
goto DriverEntry_Complete;
}
KdPrint(("Create wdf driver object successfully\n"));
这样,一个framework的驱动对象就创建好了。
创建一个设备(control device)
1. 要创建一个control device,首先得先分配一块内存
//分配一块内存
device_init = WdfControlDeviceInitAllocate(drv,&SDDL_DEVOBJ_SYS_ALL_ADM_RWX_WORLD_RW_RES_R);
if( device_init == NULL )
{
status = STATUS_INSUFFICIENT_RESOURCES;
goto DriverEntry_Complete;
}
WdfControlDeviceInitAllocate函数分配了一块内存给结构WDFDEVICE_INIT,这个结构在创建control device的时候会被用到。更多细节看MSDN:http://msdn.microsoft.com/en-us/library/windows/hardware/ff545841(v=vs.85).aspx
2. 然后给这个设备绑定一个设备名字,注意这个设备名字只能被内核模式下的代码所看到,比如其他的内核驱动,用户模式代码是看不到的。
就好象是WDM里面的IoCreateDevice函数的第三个参数。
//设备名字,如: L"\\Device\\MyWDF_Device",只能被其他的内核驱动看到。
RtlInitUnicodeString(&ustring, MYWDF_KDEVICE);
//将这个设备名字存入DEVICE_INIT结构中
status = WdfDeviceInitAssignName(device_init,&ustring);
if(!NT_SUCCESS(status))
{
goto DriverEntry_Complete;
}
KdPrint((