+ if (wcslen(CurrentDir) > 3)
+ CurrentDir[3] = 0;
+
+ lpRootPath = CurrentDir;
+ }
+ else
+ {
+ size_t Length = wcslen(lpRootPathName);
+
+ TRACE("lpRootPathName: %S\n", lpRootPathName);
+
+ lpRootPath = lpRootPathName;
+ if (Length == 2)
+ {
+ WCHAR DriveLetter = RtlUpcaseUnicodeChar(lpRootPathName[0]);
+
+ if (DriveLetter >= L'A' && DriveLetter <= L'Z' && lpRootPathName[1] == L':')
+ {
+ Length = (Length + 2) * sizeof(WCHAR);
+
+ CurrentDir = HeapAlloc(GetProcessHeap(), 0, Length);
+ if (!CurrentDir)
+ return DRIVE_UNKNOWN;
+
+ StringCbPrintfW(CurrentDir, Length, L"%s\\", lpRootPathName);
+
+ lpRootPath = CurrentDir;
+ }
+ }
+ }
+
+ TRACE("lpRootPath: %S\n", lpRootPath);
+
+ if (!RtlDosPathNameToNtPathName_U(lpRootPath, &PathName, NULL, NULL))
+ {
+ if (CurrentDir != NULL)
+ HeapFree(GetProcessHeap(), 0, CurrentDir);
+
+ return DRIVE_NO_ROOT_DIR;
+ }
+
+ TRACE("PathName: %S\n", PathName.Buffer);
+
+ if (CurrentDir != NULL)
+ HeapFree(GetProcessHeap(), 0, CurrentDir);
+
+ if (PathName.Buffer[(PathName.Length >> 1) - 1] != L'\\')
+ {
+ return DRIVE_NO_ROOT_DIR;
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &PathName,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ Status = NtOpenFile(&FileHandle,
+ FILE_READ_ATTRIBUTES | SYNCHRONIZE,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_SYNCHRONOUS_IO_NONALERT);
+
+ RtlFreeHeap(RtlGetProcessHeap(), 0, PathName.Buffer);
+ if (!NT_SUCCESS(Status))
+ return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */
+
+ Status = NtQueryVolumeInformationFile(FileHandle,
+ &IoStatusBlock,
+ &FileFsDevice,
+ sizeof(FILE_FS_DEVICE_INFORMATION),
+ FileFsDeviceInformation);
+ NtClose(FileHandle);
+ if (!NT_SUCCESS(Status))
+ {
+ return 0;
+ }
+
+ switch (FileFsDevice.DeviceType)
+ {
+ case FILE_DEVICE_CD_ROM:
+ case FILE_DEVICE_CD_ROM_FILE_SYSTEM:
+ return DRIVE_CDROM;
+ case FILE_DEVICE_VIRTUAL_DISK:
+ return DRIVE_RAMDISK;
+ case FILE_DEVICE_NETWORK_FILE_SYSTEM:
+ return DRIVE_REMOTE;
+ case FILE_DEVICE_DISK:
+ case FILE_DEVICE_DISK_FILE_SYSTEM:
+ if (FileFsDevice.Characteristics & FILE_REMOTE_DEVICE)
+ return DRIVE_REMOTE;
+ if (FileFsDevice.Characteristics & FILE_REMOVABLE_MEDIA)
+ return DRIVE_REMOVABLE;
+ return DRIVE_FIXED;
+ }
+
+ ERR("Returning DRIVE_UNKNOWN for device type %lu\n", FileFsDevice.DeviceType);