Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
194
Добавлен:
20.02.2016
Размер:
5.89 Кб
Скачать
#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;
}
Соседние файлы в папке lab1_3
  • #
    20.02.2016792 б193buildchk_wxp_x86.log
  • #
    20.02.201676 б194buildchk_wxp_x86.wrn
  • #
    20.02.20165.89 Кб194lab1_3.c
  • #
    20.02.20167.52 Mб193lab1_3.ncb
  • #
    20.02.2016147 б195lab1_3.reg
  • #
    20.02.2016877 б194lab1_3.sln
  • #
    20.02.201616.9 Кб193lab1_3.suo
  • #
    20.02.20162.99 Кб193lab1_3.vcproj