LIST_ENTRY IrpQueue;
KSPIN_LOCK IrpQueueLock;
+/* Device object */
+PDEVICE_OBJECT DeviceObject;
+
/*
* CSQ Callbacks
*/
}
VOID NTAPI Unload(PDRIVER_OBJECT DriverObject)
+/*
+ * Function: called by the OS to release resources before unload
+ */
{
+ UNICODE_STRING LinkName;
+
+ RtlInitUnicodeString(&LinkName, DOS_DEVICE_NAME);
+
+ IoDeleteSymbolicLink(&LinkName);
+
+ if(DeviceObject)
+ IoDeleteDevice(DeviceObject);
}
/*
NTSTATUS Status;
UNICODE_STRING NtName;
UNICODE_STRING DosName;
- PDEVICE_OBJECT DeviceObject;
-
- DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
- DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)DispatchCreateCloseCleanup;
- DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)DispatchReadWrite;
- DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)DispatchReadWrite;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)DispatchIoctl;
- DriverObject->DriverUnload = (PDRIVER_UNLOAD)Unload;
-
- Status = IoCsqInitialize(&Csq, (PIO_CSQ_INSERT_IRP)CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp,
- CsqAcquireLock, (PIO_CSQ_RELEASE_LOCK)CsqReleaseLock, CsqCompleteCancelledIrp);
+
+ DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateCloseCleanup;
+ DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateCloseCleanup;
+ DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DispatchCreateCloseCleanup;
+ DriverObject->MajorFunction[IRP_MJ_READ] = DispatchReadWrite;
+ DriverObject->MajorFunction[IRP_MJ_WRITE] = DispatchReadWrite;
+ DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
+ DriverObject->DriverUnload = Unload;
+
+ Status = IoCsqInitialize(&Csq, CsqInsertIrp, CsqRemoveIrp, CsqPeekNextIrp,
+ CsqAcquireLock, CsqReleaseLock, CsqCompleteCancelledIrp);
if(Status != STATUS_SUCCESS)
KdPrint(("csqtest: IoCsqInitalize failed: 0x%x\n", Status));