Добавил:
Novilit
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы по драйверам / lab1 / simple3 / simple3 / simple3
.c#include "stdafx.h"
#if DBG
#define DebugPrint(x) DbgPrint x
#else
#define DebugPrint(x)
#endif
NTSTATUS OnClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
VOID OnDrvUnload(IN PDRIVER_OBJECT DriverObject);
NTSTATUS OnCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
PDEVICE_OBJECT devO;
UNICODE_STRING path;
UNICODE_STRING syml;
NTSTATUS st;
DebugPrint(("Entry open"));
RtlInitUnicodeString(&syml, L"\\Device\\Simple3");
RtlInitUnicodeString(&path, L"\\DosDevices\\Simple3Link");
st=IoCreateDevice(DriverObject, 0, &path, 40000,0, FALSE, &devO);
if (!NT_SUCCESS(st)) return st;
st=IoCreateSymbolicLink(&syml, &path);
if (!NT_SUCCESS(st)) {
DebugPrint(("Bad link"));
IoDeleteDevice(devO);
return st;
}
DriverObject->MajorFunction[IRP_MJ_CREATE] = OnCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = OnClose;
DriverObject->DriverUnload = OnDrvUnload;
DebugPrint(("Entry close"));
return STATUS_SUCCESS;
}
VOID OnDrvUnload(IN PDRIVER_OBJECT DriverObject){
UNICODE_STRING dLUS;
UNICODE_STRING syml;
PDEVICE_OBJECT d_o;
PIRP pNewIrp = NULL;
ULONG m_size;
NTSTATUS ntStatus;
DebugPrint(("Unload open"));
RtlInitUnicodeString(&syml, L"\\Device\\Simple3");
IoDeleteSymbolicLink(&syml);
d_o=DriverObject->DeviceObject;
while (d_o){
DbgPrint("delete %p", d_o);
IoDeleteDevice(d_o);
d_o=d_o->NextDevice;
}
DebugPrint(("Unload Close"));
return STATUS_SUCCESS;
}
NTSTATUS OnCreate(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
DebugPrint(("Create open"));
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DebugPrint(("Create close"));
return STATUS_SUCCESS;
}
NTSTATUS OnClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp){
DebugPrint(("Close open"));
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
DebugPrint(("Close close"));
return STATUS_SUCCESS;
}