BOOL DOKANAPI DokanRemoveMountPoint( LPCWSTR MountPoint) { DOKAN_CONTROL control; BOOL result; //ZeroMemory(&control, sizeof(DOKAN_CONTROL)); DOKAN_CONTROL_INIT(control); control.Type = DOKAN_CONTROL_UNMOUNT; wcscpy_s(control.MountPoint, sizeof(control.MountPoint) / sizeof(WCHAR), MountPoint); DbgPrintW(L"DokanRemoveMountPoint %ws\n", MountPoint); result = DokanMountControl(&control); if (result) { DbgPrint("DokanControl recieved DeviceName:%ws\n", control.DeviceName); SHChangeNotify(SHCNE_DRIVEREMOVED ,SHCNF_PATH|SHCNF_FLUSHNOWAIT,MountPoint,NULL); SendReleaseIRP(control.DeviceName); } else { DbgPrint("DokanRemoveMountPoint failed\n"); } return result; }
BOOL DOKANAPI DokanUnmount( WCHAR DriveLetter) { HANDLE pipe; DOKAN_CONTROL control; SendReleaseIRP(DriveLetter); ZeroMemory(&control, sizeof(DOKAN_CONTROL)); control.Type = DOKAN_CONTROL_UNMOUNT; control.Unmount.Drive = DriveLetter; if (DokanControl(&control)) { return TRUE; } else { return FALSE; } }
BOOL DOKANAPI DokanRemoveMountPoint(LPCWSTR MountPoint) { DOKAN_CONTROL control; BOOL result; ZeroMemory(&control, sizeof(DOKAN_CONTROL)); control.Type = DOKAN_CONTROL_UNMOUNT; wcscpy_s(control.MountPoint, sizeof(control.MountPoint) / sizeof(WCHAR), MountPoint); DbgPrintW(L"DokanRemoveMountPoint %ws\n", MountPoint); result = DokanMountControl(&control); if (result) { DbgPrint("DokanControl recieved DeviceName:%ws\n", control.DeviceName); SendReleaseIRP(control.DeviceName); } else { DbgPrint("DokanRemoveMountPoint failed\n"); } return result; }
int DOKANAPI DokanMain(PDOKAN_OPTIONS DokanOptions, PDOKAN_OPERATIONS DokanOperations) { ULONG threadNum = 0; ULONG i; int error; HANDLE device; HANDLE threadIds[DOKAN_MAX_THREAD]; BOOL useMountPoint = FALSE; PDOKAN_INSTANCE instance; g_DebugMode = DokanOptions->Options & DOKAN_OPTION_DEBUG; g_UseStdErr = DokanOptions->Options & DOKAN_OPTION_STDERR; if (g_DebugMode) { DbgPrintW(L"Dokan: debug mode on\n"); } if (g_UseStdErr) { DbgPrintW(L"Dokan: use stderr\n"); g_DebugMode = TRUE; } if (DokanOptions->ThreadCount == 0) { DokanOptions->ThreadCount = 5; } else if ((DOKAN_MAX_THREAD - 1) < DokanOptions->ThreadCount) { // DOKAN_MAX_THREAD includes DokanKeepAlive thread, so // available thread is DOKAN_MAX_THREAD -1 DokanDbgPrintW(L"Dokan Error: too many thread count %d\n", DokanOptions->ThreadCount); DokanOptions->ThreadCount = DOKAN_MAX_THREAD - 1; } if (DOKAN_MOUNT_POINT_SUPPORTED_VERSION <= DokanOptions->Version && DokanOptions->MountPoint) { error = CheckMountPoint(DokanOptions->MountPoint); if (error != DOKAN_SUCCESS) { return error; } useMountPoint = TRUE; } else if (!IsValidDriveLetter((WCHAR)DokanOptions->Version)) { // Older versions use the first 2 bytes of DokanOptions struct as DriveLetter. DokanDbgPrintW(L"Dokan Error: bad drive letter %wc\n", (WCHAR)DokanOptions->Version); return DOKAN_DRIVE_LETTER_ERROR; } device = CreateFile( DOKAN_GLOBAL_DEVICE_NAME, // lpFileName GENERIC_READ|GENERIC_WRITE, // dwDesiredAccess FILE_SHARE_READ|FILE_SHARE_WRITE, // dwShareMode NULL, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDistribution 0, // dwFlagsAndAttributes NULL // hTemplateFile ); if (device == INVALID_HANDLE_VALUE){ DokanDbgPrintW(L"Dokan Error: CreatFile Failed %s: %d\n", DOKAN_GLOBAL_DEVICE_NAME, GetLastError()); return DOKAN_DRIVER_INSTALL_ERROR; } DbgPrint("device opened\n"); instance = NewDokanInstance(); instance->DokanOptions = DokanOptions; instance->DokanOperations = DokanOperations; if (useMountPoint) { wcscpy_s(instance->MountPoint, sizeof(instance->MountPoint) / sizeof(WCHAR), DokanOptions->MountPoint); } else { // Older versions use the first 2 bytes of DokanOptions struct as DriveLetter. instance->MountPoint[0] = (WCHAR)DokanOptions->Version; instance->MountPoint[1] = L':'; instance->MountPoint[2] = L'\\'; } if (!DokanStart(instance)) { CloseHandle(device); return DOKAN_START_ERROR; } if (!DokanMount(instance->MountPoint, instance->DeviceName)) { SendReleaseIRP(instance->DeviceName); DokanDbgPrint("Dokan Error: DefineDosDevice Failed\n"); return DOKAN_MOUNT_ERROR; } DbgPrintW(L"mounted: %s -> %s\n", instance->MountPoint, instance->DeviceName); //Start Keep Alive thread threadIds[threadNum++] = (HANDLE)_beginthreadex( NULL, // Security Attributes 0, //stack size DokanKeepAlive, (PVOID)instance, // param 0, // create flag NULL); for (i = 0; i < DokanOptions->ThreadCount; ++i) { threadIds[threadNum++] = (HANDLE)_beginthreadex( NULL, // Security Attributes 0, //stack size DokanLoop, (PVOID)instance, // param 0, // create flag NULL); } // wait for thread terminations WaitForMultipleObjects(threadNum, threadIds, TRUE, INFINITE); for (i = 0; i < threadNum; ++i) { CloseHandle(threadIds[i]); } CloseHandle(device); Sleep(1000); DbgPrint("\nunload\n"); DeleteDokanInstance(instance); return DOKAN_SUCCESS; }