/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
驱动通信回调
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
NTSTATUS IrpDeviceControlProc(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
PIO_STACK_LOCATION Stack;
ULONG uIoControlCode;
ULONG IoControlCode
=
0
;
NTSTATUS status
=
STATUS_INVALID_DEVICE_REQUEST;
/
/
设置临时变量的值
PIO_STACK_LOCATION IoStackLocation
=
IoGetCurrentIrpStackLocation(pIrp);
IoControlCode
=
IoStackLocation
-
>Parameters.DeviceIoControl.IoControlCode;
switch (IoControlCode)
{
case IRP_MJ_CREATE: {
DbgPrint(
"IRP_MJ_CREATE触发\n"
);
break
;
}
case IRP_MJ_CLOSE: {
DbgPrint(
"IRP_MJ_CLOSE触发\n"
);
break
;
}
case IRP_MJ_DEVICE_CONTROL: {
DbgPrint(
"IRP_MJ_DEVICE_CONTROL触发\n"
);
break
;
}
}
pIrp
-
>IoStatus.Status
=
status;
/
/
pIrp
-
>IoStatus.Information
=
uWriteLength;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return
status;
}
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp
-
>IoStatus.Status
=
STATUS_SUCCESS;
/
/
DbgPrint(
"DispatchClose执行成功\n"
);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return
STATUS_SUCCESS;
}
NTSTATUS Dispatchcreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp
-
>IoStatus.Status
=
STATUS_SUCCESS;
/
/
DbgPrint(
"Dispatchcreate执行成功\n"
);
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return
STATUS_SUCCESS;
}
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
安装驱动通信
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
NTSTATUS InitializeDevice(PDRIVER_OBJECT DriverObject)
{
/
/
定义IO名称
/
/
/
/
创建IO对象
NTSTATUS status
=
STATUS_SUCCESS;
/
/
返回状态码
/
/
UNICODE_STRING deviceName
=
RTL_CONSTANT_STRING(DEVICE_NAME);
/
/
设备名称
/
/
UNICODE_STRING dosDeviceName
=
RTL_CONSTANT_STRING(DOS_DEVICES_LINK_NAME);
/
/
Dos名称
UNICODE_STRING deviceName, dosDeviceName
=
{
0
};
RtlInitUnicodeString(&deviceName, DEVICE_NAME);
RtlInitUnicodeString(&dosDeviceName, DOS_DEVICES_LINK_NAME);
PDEVICE_OBJECT deviceObject
=
NULL;
/
/
设备句柄
status
=
IoCreateDevice(DriverObject,
0
, &deviceName, FILE_DEVICE_UNKNOWN,
0
, FALSE, &deviceObject);
/
/
创建设备
if
(!NT_SUCCESS(status)){
DbgPrint(
"IoCreateDevice 失败:%08x\n"
, status);
return
status;
}
DriverObject
-
>Flags |
=
DO_BUFFERED_IO;
/
/
定义通信类型:读写操作使用缓冲方式(系统复制缓冲区)访问用户模式数据
status
=
IoCreateSymbolicLink(&dosDeviceName, &deviceName);
/
/
创建符号链接
if
(!NT_SUCCESS(status))
{
IoDeleteDevice(deviceObject);
DbgPrint(
"IoCreateSymbolicLink 失败:%08x\n"
, status);
return
status;
}
/
/
DriverObject
-
>MajorFunction[IRP_MJ_CREATE]
=
Dispatchcreate;
/
/
DriverObject
-
>MajorFunction[IRP_MJ_CLOSE]
=
DispatchClose;
DriverObject
-
>MajorFunction[IRP_MJ_DEVICE_CONTROL]
=
IrpDeviceControlProc;
return
status;
}
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
卸载驱动通信
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
VOID UnloadDevice(PDRIVER_OBJECT driverObject)
{
UNICODE_STRING dosDeviceName
=
{
0
};
RtlInitUnicodeString(&dosDeviceName, DOS_DEVICES_LINK_NAME);
PDEVICE_OBJECT DeleteDeviceObject
=
NULL;
IoDeleteSymbolicLink(&dosDeviceName);
DeleteDeviceObject
=
driverObject
-
>DeviceObject;
IoDeleteDevice(DeleteDeviceObject);
}
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
驱动卸载
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
VOID Unload(PDRIVER_OBJECT driverObject)
{
UnloadDevice(driverObject);
DbgPrint(
"驱动卸载成功\n"
);
}
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
驱动加载
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
/
NTSTATUS DriverEntry(PDRIVER_OBJECT driverObject, PUNICODE_STRING registryPath)
{
InitializeDevice(driverObject);
/
/
安装驱动通信
driverObject
-
>DriverUnload
=
Unload;
return
STATUS_SUCCESS;
}