创建一个控制设备对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//创建一个控制设备对象 (Ring3.exe交互)
DEVICE_OBJECT* CreateDevice(WCHAR* DeviceName,
WCHAR* LinkName,
DRIVER_OBJECT* DriverObject,
BOOLEAN IsDeviceExclusive)
{
NTSTATUS Status;
UNICODE_STRING v1;
UNICODE_STRING v2;
DEVICE_OBJECT* DeviceObject = NULL; //一维指针
PDEVICE_EXTENSION DeviceExtension; //设备扩展的指针 ????????????

RtlInitUnicodeString(&v1, DeviceName);
RtlInitUnicodeString(&v2, LinkName);

Status = IoCreateDevice(
DriverObject,
sizeof(DEVICE_EXTENSION),
&v1,
FILE_DEVICE_UNKNOWN,
0,
IsDeviceExclusive,
&DeviceObject); //二维指针
if (NT_SUCCESS(Status) == FALSE)
{
return NULL;
}

//设备扩展自定义的设备对象的私有数据
DeviceExtension = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension; //系统分配出来的设备扩展
DeviceExtension->chDriver = '\0';
DeviceExtension->pFSDeviceObject = NULL; //不需要挂载到设备栈
DeviceExtension->DeviceType = MAIN_CTRL;

DeviceObject->Flags |= DO_BUFFERED_IO;

Status = IoCreateSymbolicLink(&v2, &v1);
if (NT_SUCCESS(Status) == FALSE)
{
IoDeleteDevice(DeviceObject);
return NULL;
}

return DeviceObject;
}