驱动中的默认派遣函数,通过IRP_MJ_MAXIMUM_FUNCTION
得到所有的派遣函数,并初始化为DriverDefaultHandle
默认派遣,以及驱动中创建设备对象的基础知识总结。
初始化默认派遣函数: 通过IRP_MJ_MAXIMUM_FUNCTION
得到所有的派遣函数,并初始化为DriverDefaultHandle
默认派遣。
#include <ntifs.h>
NTSTATUS DriverDefaultHandle(PDEVICE_OBJECT pDevObj, PIRP pIrp) { NTSTATUS status = STATUS_SUCCESS; pIrp->IoStatus.Status = status; pIrp->IoStatus.Information = 0; IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status; }
VOID UnDriver(PDRIVER_OBJECT Driver) { DbgPrint(("Uninstall Driver Is OK \n")); }
NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) { DbgPrint("Enter DriverEntry\n");
NTSTATUS status = STATUS_SUCCESS; Driver->DriverUnload = UnDriver;
for (ULONG i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) { Driver->MajorFunction[i] = DriverDefaultHandle; }
return status; }
|
驱动中创建设备对象: 想要在应用层与内核层进行直接通信必须要创建设备并增加符号连接实现通信.
#include <ntifs.h>
VOID UnDriver(PDRIVER_OBJECT pDriver) { PDEVICE_OBJECT pDev; UNICODE_STRING SymLinkName;
pDev = pDriver->DeviceObject;
IoDeleteDevice(pDev);
RtlInitUnicodeString(&SymLinkName, "\\??\\My_Driver");
IoDeleteSymbolicLink(&SymLinkName); DbgPrint("删除设备与符号链接成功..."); }
NTSTATUS CreateDriverObject(IN PDRIVER_OBJECT pDriver) { NTSTATUS Status; PDEVICE_OBJECT pDevObj; UNICODE_STRING DriverName; UNICODE_STRING SymLinkName;
RtlInitUnicodeString(&DriverName, "\\Device\\My_Device");
Status = IoCreateDevice(pDriver, 0, &DriverName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pDevObj); if (!NT_SUCCESS(Status)) { if (Status == STATUS_OBJECT_NAME_COLLISION) { DbgPrint("对象名冲突..."); return STATUS_SUCCESS; } if (Status == STATUS_OBJECT_NAME_EXISTS) { DbgPrint("指定对象名存在..."); return STATUS_SUCCESS; } if (Status == STATUS_INSUFFICIENT_RESOURCES) { DbgPrint("资源不足..."); return STATUS_SUCCESS; } DbgPrint("创建失败."); return STATUS_SUCCESS; }
pDevObj->Flags |= DO_BUFFERED_IO;
RtlInitUnicodeString(&SymLinkName, L"\\??\\My_Device"); Status = IoCreateSymbolicLink(&SymLinkName, &DriverName);
if (!NT_SUCCESS(Status)) { IoDeleteDevice(pDevObj); DbgPrint("删除设备成功..."); return Status; } else { DbgPrint("创建符号链接成功..."); } return STATUS_SUCCESS; }
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING RegistryPath) { CreateDriverObject(pDriver);
DbgPrint("驱动已加载..."); pDriver->DriverUnload = UnDriver; return STATUS_SUCCESS; }
|