Author: rharabien
Date: Thu Apr 28 22:15:39 2011
New Revision: 51485
URL:
http://svn.reactos.org/svn/reactos?rev=51485&view=rev
Log:
[KERNEL32]
* Use current directory in GetDriveType if no path is given
* Check if path is properly ended
* Remove slash from end when calling NtCrateFile function
* Fixes few kernel32_apitest tests and floppy icon in My Computer if no floppy is
inserted
See issue #6148 for more details.
Modified:
trunk/reactos/dll/win32/kernel32/file/volume.c
Modified: trunk/reactos/dll/win32/kernel32/file/volume.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/file/vo…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/file/volume.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/file/volume.c [iso-8859-1] Thu Apr 28 22:15:39 2011
@@ -434,28 +434,81 @@
{
FILE_FS_DEVICE_INFORMATION FileFsDevice;
IO_STATUS_BLOCK IoStatusBlock;
-
HANDLE hFile;
- NTSTATUS errCode;
-
- hFile = InternalOpenDirW(lpRootPathName, FALSE);
- if (hFile == INVALID_HANDLE_VALUE)
- {
- return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */
- }
-
- errCode = NtQueryVolumeInformationFile (hFile,
- &IoStatusBlock,
- &FileFsDevice,
- sizeof(FILE_FS_DEVICE_INFORMATION),
- FileFsDeviceInformation);
- if (!NT_SUCCESS(errCode))
- {
- CloseHandle(hFile);
- SetLastErrorByStatus (errCode);
- return 0;
- }
+ NTSTATUS Status;
+ UNICODE_STRING NtPath;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ WCHAR Buffer[MAX_PATH+1];
+
+ if (!lpRootPathName)
+ {
+ DWORD cBytes;
+
+ /* Get current directory */
+ cBytes = RtlGetCurrentDirectory_U(sizeof(Buffer), Buffer);
+ if(cBytes < sizeof(Buffer))
+ {
+ ASSERT(cBytes < MAX_PATH*sizeof(WCHAR));
+ Buffer[cBytes/sizeof(WCHAR)] = L'\\';
+ Buffer[cBytes/sizeof(WCHAR)+1] = L'\0';
+ lpRootPathName = Buffer;
+ } /* else fail... should we allow longer current dirs? */
+ }
+
+ if (!RtlDosPathNameToNtPathName_U(lpRootPathName, &NtPath, NULL, NULL))
+ {
+ WARN("Invalid path: %ls\n", lpRootPathName);
+ return DRIVE_NO_ROOT_DIR;
+ }
+
+ /* Path from RtlDosPathNameToNtPathName_U does not contain '/' and multiple
'\\' in a row */
+ if(!NtPath.Length || NtPath.Buffer[NtPath.Length/sizeof(WCHAR)-1] != L'\\')
+ {
+ /* Path must be ended by slash */
+ WARN("Invalid path: %ls\n", NtPath.Buffer);
+ return DRIVE_NO_ROOT_DIR;
+ }
+
+ /* Remove ending slash */
+ NtPath.Length -= sizeof(WCHAR);
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &NtPath,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ Status = NtCreateFile(&hFile,
+ FILE_GENERIC_READ,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ 0,
+ FILE_SHARE_READ|FILE_SHARE_WRITE,
+ FILE_OPEN,
+ 0,
+ NULL,
+ 0);
+
+ RtlFreeUnicodeString(&NtPath);
+
+ if (!NT_SUCCESS(Status))
+ {
+ WARN("Invalid path: %ls\n", lpRootPathName);
+ return DRIVE_NO_ROOT_DIR; /* According to WINE regression tests */
+ }
+
+ Status = NtQueryVolumeInformationFile (hFile,
+ &IoStatusBlock,
+ &FileFsDevice,
+ sizeof(FILE_FS_DEVICE_INFORMATION),
+ FileFsDeviceInformation);
CloseHandle(hFile);
+ if (!NT_SUCCESS(Status))
+ {
+ ERR("NtQueryVolumeInformationFile failed for %ls\n", lpRootPathName);
+ return DRIVE_UNKNOWN;
+ }
switch (FileFsDevice.DeviceType)
{