定义一个结构作为设备扩展
typedef struct _C2P_DEV_EXT
{
//结构的大小
ULONG NodeSize;
//过滤设备对象
PDEVICE_OBJECT pFilterDeviceObject;
//同时调用时候的保护锁
KSPIN_LOCK IoRequestsSpinLock;
//进程间同步处理
KEVENT IoInProcessEvent;
//绑定的设备对象
PDRIVER_OBJECT TargetDeviceObject;
//绑定前底层的设备对象
PDEVICE_OBJECT LowerDeviceObject;
}C2P_DEV_EXT,*PC2P_DEV_EXT;
生成带有设备扩展info的object,调用 IoCreateDevice时候,注意second 参数填入扩展的长度
status = IoCreateDevice(
IN DriverObject,
IN sizeof(C2P_DEV_EXT),
IN NULL,
IN pTargetDeviceObject->DeviceType,
IN pTargetDeviceObject->Characteristics,
IN FALSE,
OUT &pFilterDeviceObject
);
sizeof(C2P_DEV_EXT)这个参数在设备生成之后需要填写这个域
// 设备扩展,详细描述设备扩展的应用
devExt = (PC2P_DEV_EXT)(pFilterDeviceObject->DeviceExtension);
c2pDevExtInit(
devExt,
pFilterDeviceObject,
pTargetDeviceObject,
pLowerDeviceObject
);
//关于如何填写这个域都放在c2pDevExtInit函数中,代码如下
NTSTATUS
c2pDevExtInit(
IN P2CP_DEV_EXT devExt,
IN PDEVICE_OBJECT pFilterDeviceObject,
IN PDEVICE_OBJECT pTargetDeviceObject,
IN PDEVICE_OBJECT pLowerDeviceObject
)
{
memset(devExt,0,sizeof(C2P_DEV_EXT));
devExt->NodeSize = sizeof(C2P_DEV_EXT);
devExt->pFilterDeviceObject = pFilterDeviceObject;
KeInitializeSpinLock(&(devExt->IoRequestsSpinLock));
KeInitializeEvent(&(devExt->IoInProcessEvent),NotificationEvent,FALSE);
devExt->TargetDeviceObject = pTargetDeviceObject;
devExt->LowerDeviceObject = pLowerDeviceObject;
return( STATUS_SUCCESS );
}