驱动的设备对象中有一个字段是设备扩展
该设备扩展的大小是不固定的,依据在创建设备对象时给定的大小分配内存
例如:
typedef struct _DEVICE_EXTENSION {
ULONG number;
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
//创建设备对象
status = IoCreateDevice( pDriver, //驱动对象的指针
sizeof(DEVICE_EXTENSION), //为扩展设备分配的字节数,扩展设备是自己定义的数据结构,可以当做全局变量使用
&DeviceName, //该设备的名字,通过设备名来区分不同的设备
FILE_DEVICE_UNKNOWN, //设备的类型
FILE_DEVICE_SECURE_OPEN, //大多数的驱动设备设置为此值
FALSE, //设备对象是否独占设备,大多数情况设置为FALSE 不独占
&pDeviceObj //返回来的设备对象指针
);
(PDEVICE_EXTENSION)pDeviceObj-> ustrDeviceName=xxx;
(PDEVICE_EXTENSION)pDeviceObj-> ustrSymLinkName=xxx;
这样在设备对象中就有一个大小为DEVICE_EXTENSION结构大小的内存可以使用。扩展设备中的数据是可以当成全局变量使用的,当然在驱动中的全局变量的使用也应该尽量使用此方式。
//自定义扩展设备结构体
typedef struct _DEVICE_EXTENSION {
ULONG number;
PDEVICE_OBJECT pDevice;
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
NTSTATUS IrpCreateProc(PDEVICE_OBJECT pDeviceObject/*设备信息*/, PIRP pIrp/*参数信息*/)
{
//当成全局一样的使用。
DbgPrint("number=%x \n", ((PDEVICE_EXTENSION)pDeviceObject->DeviceExtension)->number);
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING reg_path)
{
status = IoCreateDevice( pDriver, //驱动对象的指针
sizeof(DEVICE_EXTENSION), //为扩展设备分配的字节数,扩展设备是自己定义的数据结构,里面的字段可以当做全局变量使用
&DeviceName, //该设备的名字,通过设备名来区分不同的设备
FILE_DEVICE_UNKNOWN, //设备的类型
FILE_DEVICE_SECURE_OPEN, //大多数的驱动设备设置为此值
FALSE, //设备对象是否独占设备,大多数情况设置为FALSE 不独占
&pDeviceObj //返回来的设备对象指针
);
//设备创建后 给扩展结构中的number字段赋值
pDevExt->number = 100;
}