📄 driver.cpp
字号:
extern "C" {
#include <NTDDK.h>
}
typedef struct _MY_DEVICE_EXTENSION {
PDEVICE_OBJECT pDevice; //设备对象指针
UNICODE_STRING ustrDeviceName; //设备名称
UNICODE_STRING ustrSymLinkName; //符号链接名
} MY_DEVICE_EXTENSION, *PMY_DEVICE_EXTENSION;
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
NTSTATUS OnFileCreate(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS OnFileClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp);
extern "C" NTSTATUS DriverEntry (
IN PDRIVER_OBJECT pDriverObject,
IN PUNICODE_STRING pRegistryPath )
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("Enter DriverEntry\n"));
KdPrint(("RegistryPath: %wZ\n", pRegistryPath));
//注册其他回调函数入口
pDriverObject->DriverUnload = HelloDDKUnload;
pDriverObject->MajorFunction[IRP_MJ_CREATE] = OnFileCreate;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = OnFileClose;
pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;
//创建驱动设备对象
status = CreateDevice(pDriverObject);
if (!NT_SUCCESS(status))
KdPrint(("CreateDevice Error!\n"));
else
KdPrint(("CreateDevice Success!\n"));
KdPrint(("Leave DriverEntry\n"));
return status;
}
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
PMY_DEVICE_EXTENSION pDevExt;
//创建设备名称
UNICODE_STRING devName;
RtlInitUnicodeString(&devName,L"\\Device\\MyTestDevice");
//创建设备
status = IoCreateDevice( pDriverObject,
sizeof(MY_DEVICE_EXTENSION),
&(UNICODE_STRING)devName,
FILE_DEVICE_UNKNOWN,
0, TRUE,
&pDevObj );
if (!NT_SUCCESS(status))
return status;
//对设备对象进行必要的初始化
pDevObj->Flags |= DO_BUFFERED_IO;
pDevExt = (PMY_DEVICE_EXTENSION)pDevObj->DeviceExtension;
pDevExt->pDevice = pDevObj;
pDevExt->ustrDeviceName = devName;
//创建符号链接
UNICODE_STRING symLinkName;
RtlInitUnicodeString(&symLinkName,L"\\??\\TestDevice");
pDevExt->ustrSymLinkName = symLinkName;
status = IoCreateSymbolicLink( &symLinkName,&devName );
if (!NT_SUCCESS(status))
{
IoDeleteDevice( pDevObj );
return status;
}
return STATUS_SUCCESS;
}
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{
PDEVICE_OBJECT pNextObj;
KdPrint(("Enter DriverUnload\n"));
pNextObj = pDriverObject->DeviceObject;
while (pNextObj != NULL)
{
PMY_DEVICE_EXTENSION pDevExt = (PMY_DEVICE_EXTENSION)
pNextObj->DeviceExtension;
//删除符号链接
UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
IoDeleteSymbolicLink(&pLinkName);
//删除设备对象
pNextObj = pNextObj->NextDevice;
IoDeleteDevice( pDevExt->pDevice );
}
KdPrint(("Leave DriverUnload\n"));
}
NTSTATUS OnFileCreate(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
KdPrint(("I've received an IRP_MJ_CREATE message!\n"));
// 通知操作系统该IRP已处理完毕
NTSTATUS status = STATUS_SUCCESS;
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave OnFileCreate Routin\n"));
return status;
}
NTSTATUS OnFileClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
{
KdPrint(("I've received an IRP_MJ_CLOSE message!\n"));
// 通知操作系统该IRP已处理完毕
NTSTATUS status = STATUS_SUCCESS;
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest( pIrp, IO_NO_INCREMENT );
KdPrint(("Leave OnFileClose Routin\n"));
return status;
}
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
IN PIRP pIrp)
{
NTSTATUS status = STATUS_SUCCESS;
KdPrint(("Enter HelloDDKDispatchRoutine\n"));
KdPrint(("Leave HelloDDKDispatchRoutine\n"));
return status;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -