Добавил:
Novilit
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по драйверам / lab1 / lab1_3 / lab1_3 / lab1_3
.c#include "stdafx.h"
#include <ntddk.h>
#define THE_BUFFER_LENGTH 16
typedef struct _DEVICE_EXTENSION
{
unsigned char Image[THE_BUFFER_LENGTH];
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
#define FILE_DEVICE_IOCTL 0x00008301
#define IOCTL_MY_NEITHER CTL_CODE(FILE_DEVICE_IOCTL, 0x800, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_MY_BUFFERED CTL_CODE(FILE_DEVICE_IOCTL, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MY_INDIRECT CTL_CODE(FILE_DEVICE_IOCTL, 0x802, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
#define IOCTL_MY_OUTDIRECT CTL_CODE(FILE_DEVICE_IOCTL, 0x803, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
NTSTATUS OnCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS OnClose(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS OnRead(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS OnWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp);
NTSTATUS OnControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
VOID OnDrvUnload(PDRIVER_OBJECT DriverObject);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
UNICODE_STRING sDeviceName;
UNICODE_STRING sDeviceName2;
UNICODE_STRING sDeviceName3;
UNICODE_STRING sDeviceName4;
UNICODE_STRING sSymbolic;
UNICODE_STRING sSymbolic2;
UNICODE_STRING sSymbolic3;
UNICODE_STRING sSymbolic4;
PDEVICE_OBJECT devObj;
NTSTATUS status;
DbgPrint("[driver] Start DriverEntry");
RtlInitUnicodeString(&sDeviceName, L"\\Device\\lab1_3_B0");
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &sDeviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
devObj->Flags |= DO_BUFFERED_IO;
RtlInitUnicodeString(&sDeviceName2, L"\\Device\\lab1_3_D0");
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &sDeviceName2, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
devObj->Flags |= DO_DIRECT_IO;
RtlInitUnicodeString(&sDeviceName3, L"\\Device\\lab1_3_N0");
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &sDeviceName3, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
RtlInitUnicodeString(&sDeviceName4, L"\\Device\\lab1_30");
status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &sDeviceName4, FILE_DEVICE_UNKNOWN, 0, FALSE, &devObj);
if (NT_SUCCESS(status))
{
DbgPrint("[driver] DriverEntry IoCreateDevice Success");
RtlInitUnicodeString(&sSymbolic, L"\\DosDevices\\lab1_3Link_B0");
status = IoCreateSymbolicLink(&sSymbolic, &sDeviceName);
RtlInitUnicodeString(&sSymbolic2, L"\\DosDevices\\lab1_3Link_D0");
status = IoCreateSymbolicLink(&sSymbolic2, &sDeviceName2);
RtlInitUnicodeString(&sSymbolic3, L"\\DosDevices\\lab1_3Link_N0");
status = IoCreateSymbolicLink(&sSymbolic3, &sDeviceName3);
RtlInitUnicodeString(&sSymbolic4, L"\\DosDevices\\lab1_3Link0");
status = IoCreateSymbolicLink(&sSymbolic4, &sDeviceName4);
if (NT_SUCCESS(status))
{
DbgPrint("[driver] DriverEntry IoCreateSymLink Success");
DriverObject->MajorFunction[IRP_MJ_CREATE] = OnCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = OnClose;
DriverObject->MajorFunction[IRP_MJ_READ] = OnRead;
DriverObject->MajorFunction[IRP_MJ_WRITE] = OnWrite;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = OnControl;
DriverObject->DriverUnload = OnDrvUnload;
}
else
{
DbgPrint("[driver] DriverEntry IoCreateSymLink Not Success");
IoDeleteDevice(DriverObject->DeviceObject);
}
}
DbgPrint("[driver] Finish DriverEntry");
return status;
}
NTSTATUS OnCreate(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS status;
DbgPrint("[driver] Start OnCreate");
status=STATUS_SUCCESS;
Irp->IoStatus.Status=status;
Irp->IoStatus.Information=0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DbgPrint("[driver] Finish OnCreate");
return status;
}
NTSTATUS OnClose(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS status;
DbgPrint("[driver] Start OnClose");
status=STATUS_SUCCESS;
Irp->IoStatus.Status=status;
Irp->IoStatus.Information=0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DbgPrint("[driver] Finish OnClose");
return status;
}
NTSTATUS OnRead(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS status;
PIO_STACK_LOCATION stack;
unsigned long bufsize;
void* buf;
PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
DbgPrint("[driver] Start OnRead");
Irp->IoStatus.Information=0;
if (DeviceObject->Flags & DO_BUFFERED_IO)
{
buf = Irp->AssociatedIrp.SystemBuffer;
}
else if (DeviceObject->Flags & DO_DIRECT_IO)
{
buf = MmGetSystemAddressForMdl(Irp->MdlAddress);
}
else
{
buf = Irp->UserBuffer;
}
stack = IoGetCurrentIrpStackLocation( Irp );
bufsize = stack->Parameters.Read.Length;
RtlMoveMemory(buf, DeviceExtension->Image, bufsize>THE_BUFFER_LENGTH?THE_BUFFER_LENGTH:bufsize);
Irp->IoStatus.Information = bufsize>THE_BUFFER_LENGTH?THE_BUFFER_LENGTH:bufsize;
status=STATUS_SUCCESS;
Irp->IoStatus.Status=status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DbgPrint("[driver] Finish OnRead");
return status;
}
NTSTATUS OnWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS status;
PIO_STACK_LOCATION stack;
unsigned long bufsize;
void* buf;
PDEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
DbgPrint("[driver] Start OnWrite");
Irp->IoStatus.Information=0;
if (DeviceObject->Flags & DO_BUFFERED_IO)
{
buf = Irp->AssociatedIrp.SystemBuffer;
}
else if (DeviceObject->Flags & DO_DIRECT_IO)
{
buf = MmGetSystemAddressForMdl( Irp->MdlAddress );
}
else
{
buf = Irp->UserBuffer;
}
stack = IoGetCurrentIrpStackLocation( Irp );
bufsize = stack->Parameters.Write.Length;
RtlMoveMemory(DeviceExtension->Image, buf, bufsize>THE_BUFFER_LENGTH?THE_BUFFER_LENGTH:bufsize);
Irp->IoStatus.Information = bufsize>THE_BUFFER_LENGTH?THE_BUFFER_LENGTH:bufsize;
status=STATUS_SUCCESS;
Irp->IoStatus.Status=status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DbgPrint("[driver] Finish OnWrite");
return status;
}
NTSTATUS OnControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
{
NTSTATUS status;
PIO_STACK_LOCATION stack;
unsigned long bufsize, InLength, OutLength, method;
void* buf;
void* InBuffer;
void* OutBuffer;
DbgPrint("[driver] Start OnControl");
method = -1;
stack = IoGetCurrentIrpStackLocation(Irp);
switch (stack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_MY_BUFFERED:
DbgPrint("IOCTL.SYS: IOCTL_MY_BUFFERED:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = Irp->AssociatedIrp.SystemBuffer;
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case IOCTL_MY_INDIRECT:
DbgPrint("IOCTL.SYS: IOCTL_MY_INDIRECT:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case IOCTL_MY_OUTDIRECT:
DbgPrint("IOCTL.SYS: IOCTL_MY_OUTDIRECT:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case IOCTL_MY_NEITHER:
DbgPrint("IOCTL.SYS: IOCTL_MY_NEITHER:\n");
InBuffer = stack->Parameters.DeviceIoControl.Type3InputBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = Irp->UserBuffer;
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
default:
method = stack->Parameters.DeviceIoControl.IoControlCode & 0x03L;
break;
}
if (method != -1)
{
DbgPrint("DETECTED UNKNOWN\n");
switch(method)
{
case METHOD_BUFFERED:
DbgPrint("IOCTL.SYS: METHOD_BUFFERED:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = Irp->AssociatedIrp.SystemBuffer;
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case METHOD_IN_DIRECT:
DbgPrint("IOCTL.SYS: METHOD_IN_DIRECT:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case METHOD_OUT_DIRECT:
DbgPrint("IOCTL.SYS: METHOD_OUT_DIRECT:\n");
InBuffer = Irp->AssociatedIrp.SystemBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
case METHOD_NEITHER:
DbgPrint("IOCTL.SYS: METHOD_NEITHER:\n");
InBuffer = stack->Parameters.DeviceIoControl.Type3InputBuffer;
InLength = stack->Parameters.DeviceIoControl.InputBufferLength;
OutBuffer = Irp->UserBuffer;
OutLength = stack->Parameters.DeviceIoControl.OutputBufferLength;
break;
}
}
DbgPrint("IOCTL.SYS: InB=%08lx len=%lx, OutB=%08lx, len=%lx\n", (ULONG)InBuffer, InLength, (ULONG)OutBuffer, OutLength);
status=STATUS_SUCCESS;
Irp->IoStatus.Status=status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DbgPrint("[driver] Finish OnControl");
return status;
}
VOID OnDrvUnload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING sSymbolic;
UNICODE_STRING sSymbolic2;
UNICODE_STRING sSymbolic3;
UNICODE_STRING sSymbolic4;
DbgPrint("[driver] Start OnDrvUnload");
RtlInitUnicodeString(&sSymbolic, L"\\DosDevices\\lab1_3Link_B0");
IoDeleteSymbolicLink(&sSymbolic);
RtlInitUnicodeString(&sSymbolic2, L"\\DosDevices\\lab1_3Link_D0");
IoDeleteSymbolicLink(&sSymbolic2);
RtlInitUnicodeString(&sSymbolic3, L"\\DosDevices\\lab1_3Link_N0");
IoDeleteSymbolicLink(&sSymbolic3);
RtlInitUnicodeString(&sSymbolic4, L"\\DosDevices\\lab1_3Link0");
IoDeleteSymbolicLink(&sSymbolic4);
IoDeleteDevice(DriverObject->DeviceObject->NextDevice);
IoDeleteDevice(DriverObject->DeviceObject->NextDevice);
IoDeleteDevice(DriverObject->DeviceObject->NextDevice);
IoDeleteDevice(DriverObject->DeviceObject);
DbgPrint("[driver] Finish OnDrvUnload");
return;
}