驱动代码是:
extern "C"{
#include "wdm.h"
}
NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo){
PDEVICE_OBJECT device;
UNICODE_STRING device_name;
RtlInitUnicodeString(&device_name,L"\\Device\\Example");
NTSTATUS status;
status=IoCreateDevice(DriverObject,0,&device_name,FILE_DEVICE_UNKNOWN,0,FALSE,&device);
if (!NT_SUCCESS(status)){
DbgPrint("Fail to build Driver\r\n");
}
UNICODE_STRING symb_name;
RtlInitUnicodeString(&symb_name,L"\\Global??\\Example");
status = IoCreateSymbolicLink(&symb_name,&device_name);
if (!NT_SUCCESS(status)){
DbgPrint("Fail to build Driver2\r\n");
IoDeleteDevice(device);
return STATUS_SUCCESS;
}
device->Flags |= DO_BUFFERED_IO;
device->Flags &= ~DO_DEVICE_INITIALIZING;
return STATUS_SUCCESS;
}
VOID DriverUnload(PDRIVER_OBJECT DriverObject){
UNICODE_STRING UnString;
RtlInitUnicodeString(&UnString,L"\\Global??\\Example");
IoDeleteSymbolicLink(&UnString);
IoDeleteDevice(DriverObject->DeviceObject);
DbgPrint("Fail to build Driver3\r\n");
}
NTSTATUS MyFunction(IN PDEVICE_OBJECT dev,PIRP irp){
PIO_STACK_LOCATION irpsp=IoGetCurrentIrpStackLocation(irp);
ULONG in_len =irpsp->Parameters.DeviceIoControl.InputBufferLength;
ULONG out_len =irpsp->Parameters.DeviceIoControl.OutputBufferLength;
// 请注意输入输出缓冲是公用内存空间的
PVOID buffer = irp->AssociatedIrp.SystemBuffer;
irp->AssociatedIrp.SystemBuffer="RYYFile";
irp->IoStatus.Information = 8;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (irp,IO_NO_INCREMENT);
DbgPrint("Fail to build Driver\r\n");
return STATUS_SUCCESS;
}
NTSTATUS Function(IN PDEVICE_OBJECT dev,PIRP irp){
irp->IoStatus.Information = 1;
irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest (irp,IO_NO_INCREMENT);
KdPrint(("Fail to build Driver\r\n"));
return irp->IoStatus.Status;
}
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegPathName){
for(int uiIndex = 0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++){
DriverObject->MajorFunction[uiIndex] = Function;
}
DriverObject->DriverUnload=DriverUnload;
DriverObject->DriverExtension->AddDevice = AddDevice;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyFunction;
return STATUS_SUCCESS;
}
为什么每次我在monitor里开始驱动的时候就会蓝屏?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课