#include<ntddk.h>
#define DRIVER_NAME L"\\Device\\MyfirstDevice"
#define SYM_NAME L"\\??\\MyfirstDevice"
void DrvUnload(PDRIVER_OBJECT pdriver)
{
DbgPrint("驱动已经卸载");
if (pdriver->DeviceObject)
{
IoDeleteDevice(pdriver->DeviceObject);
UNICODE_STRING sybolName = {0};
RtlInitUnicodeString(&sybolName,SYM_NAME);
IoDeleteSymbolicLink(&sybolName);
}
}
NTSTATUS MyCreate(PDEVICE_OBJECT device,PIRP pirp)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("Mycreaete has be opened");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS MyClose(PDEVICE_OBJECT pdevice, PIRP pirp)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("Myclode has be run");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS MyClean(PDEVICE_OBJECT device, PIRP pirp)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("MyClean has be run");
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 0;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS MyRead(PDEVICE_OBJECT device, PIRP pirp)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("开始读操作!!!");
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);
ULONG Size = stack->Parameters.Read.Length;
PCHAR readBuffer = pirp->AssociatedIrp.SystemBuffer;
DbgPrint("--%p----%d",readBuffer, Size);
RtlCopyMemory(readBuffer,"this is from Kernel.",strlen("this is from Kernel."));
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = strlen("this is from Kernel.");
DbgPrint("read really is %d!", strlen("this is from Kernel."));
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS MyWrite(PDEVICE_OBJECT device, PIRP pirp)
{
NTSTATUS status = STATUS_SUCCESS;
DbgPrint("开始写操作!!!\n");
PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pirp);
ULONG writeSize = stack->Parameters.Write.Length;
PCHAR writeBuffer = pirp->AssociatedIrp.SystemBuffer;
RtlZeroMemory(device->DeviceExtension,200);
RtlCopyMemory(device->DeviceExtension,writeBuffer,writeSize);
DbgPrint("%p--%s--\n", writeBuffer, (PCHAR)device->DeviceExtension);
pirp->IoStatus.Status = status;
pirp->IoStatus.Information = 13;
IoCompleteRequest(pirp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
DbgPrint("start");
NTSTATUS status = STATUS_SUCCESS;
driver->DriverUnload = DrvUnload;
UNICODE_STRING devicename = { 0 };
RtlInitUnicodeString(&devicename, DRIVER_NAME);
PDEVICE_OBJECT pDevice=NULL;
status = IoCreateDevice(driver,0,&devicename,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevice);
if (!NT_SUCCESS(status))
{
DbgPrint("创建设备对象失败!");
return status;
}
pDevice->Flags |= DO_BUFFERED_IO;
UNICODE_STRING sybolName = { 0 };
RtlInitUnicodeString(&sybolName,SYM_NAME);
status = IoCreateSymbolicLink(&sybolName,&devicename);
if (!NT_SUCCESS(status))
{
DbgPrint("创建符号链接失败!!!");
IoDeleteDevice(pDevice);
return status;
}
driver->MajorFunction[IRP_MJ_CREATE] = MyCreate;
driver->MajorFunction[IRP_MJ_CLOSE] = MyClose;
driver->MajorFunction[IRP_MJ_CLEANUP] = MyClean;
driver->MajorFunction[IRP_MJ_READ] = MyRead;
driver->MajorFunction[IRP_MJ_WRITE] = MyWrite;
return 0;
}
驱动学习一
最新推荐文章于 2024-01-29 11:08:03 发布