Добавил:
Novilit
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по драйверам / lab3 / 21 11 2015 _1 / lab3_1 / 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;
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);
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 sSymbolic;
UNICODE_STRING sSymbolic2;
UNICODE_STRING sSymbolic3;
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);
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);
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->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;
}
VOID OnDrvUnload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING sSymbolic;
UNICODE_STRING sSymbolic2;
UNICODE_STRING sSymbolic3;
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);
IoDeleteDevice(DriverObject->DeviceObject->NextDevice);
IoDeleteDevice(DriverObject->DeviceObject->NextDevice);
IoDeleteDevice(DriverObject->DeviceObject);
DbgPrint("[driver] Finish OnDrvUnload");
return;
}