Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
204
Добавлен:
20.02.2016
Размер:
10.47 Кб
Скачать
#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;
}
Соседние файлы в папке lab1_3
  • #
    20.02.2016350 б197buildchk_wxp_x86.err
  • #
    20.02.2016940 б197buildchk_wxp_x86.log
  • #
    20.02.201610.47 Кб204lab1_3.c
  • #
    20.02.20162.89 Mб197lab1_3.ncb
  • #
    20.02.2016147 б198lab1_3.reg
  • #
    20.02.2016877 б198lab1_3.sln
  • #
    20.02.201616.9 Кб197lab1_3.suo
  • #
    20.02.20162.99 Кб198lab1_3.vcproj