VOID DokanDeregisterUncProvider(__in PDokanDCB Dcb) { if (Dcb->MupHandle) { FsRtlDeregisterUncProvider(Dcb->MupHandle); Dcb->MupHandle = 0; } PsTerminateSystemThread(STATUS_SUCCESS); }
VOID DokanDeleteDeviceObject( __in PDokanDCB Dcb) { UNICODE_STRING symbolicLinkName; WCHAR symbolicLinkBuf[MAXIMUM_FILENAME_LENGTH]; PDokanVCB vcb; ASSERT(GetIdentifierType(Dcb) == DCB); vcb = Dcb->Vcb; if (Dcb->MupHandle) { FsRtlDeregisterUncProvider(Dcb->MupHandle); } DDbgPrint(" Delete Symbolic Name: %wZ\n", Dcb->SymbolicLinkName); IoDeleteSymbolicLink(Dcb->SymbolicLinkName); FreeUnicodeString(Dcb->SymbolicLinkName); FreeUnicodeString(Dcb->DiskDeviceName); FreeUnicodeString(Dcb->FileSystemDeviceName); Dcb->SymbolicLinkName = NULL; Dcb->DiskDeviceName = NULL; Dcb->FileSystemDeviceName = NULL; if (Dcb->DeviceObject->Vpb) { Dcb->DeviceObject->Vpb->DeviceObject = NULL; Dcb->DeviceObject->Vpb->RealDevice = NULL; Dcb->DeviceObject->Vpb->Flags = 0; } //IoUnregisterFileSystem(vcb->DeviceObject); DDbgPrint(" FCB allocated: %d\n", vcb->FcbAllocated); DDbgPrint(" FCB freed: %d\n", vcb->FcbFreed); DDbgPrint(" CCB allocated: %d\n", vcb->CcbAllocated); DDbgPrint(" CCB freed: %d\n", vcb->CcbFreed); // delete diskDeviceObject DDbgPrint(" Delete DeviceObject\n"); IoDeleteDevice(vcb->DeviceObject); // delete DeviceObject DDbgPrint(" Delete Disk DeviceObject\n"); IoDeleteDevice(Dcb->DeviceObject); }