Author: rharabien Date: Mon May 2 20:56:02 2011 New Revision: 51560
URL: http://svn.reactos.org/svn/reactos?rev=51560&view=rev Log: [KERNEL32] * Revert 51485. It needs more work.
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/vol... ============================================================================== --- trunk/reactos/dll/win32/kernel32/file/volume.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/file/volume.c [iso-8859-1] Mon May 2 20:56:02 2011 @@ -29,41 +29,41 @@
static HANDLE InternalOpenDirW(LPCWSTR DirName, - BOOLEAN Write) -{ - UNICODE_STRING NtPathU; - OBJECT_ATTRIBUTES ObjectAttributes; - NTSTATUS errCode; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; - - if (!RtlDosPathNameToNtPathName_U(DirName, - &NtPathU, - NULL, - NULL)) - { - WARN("Invalid path\n"); - SetLastError(ERROR_BAD_PATHNAME); - return INVALID_HANDLE_VALUE; + BOOLEAN Write) +{ + UNICODE_STRING NtPathU; + OBJECT_ATTRIBUTES ObjectAttributes; + NTSTATUS errCode; + IO_STATUS_BLOCK IoStatusBlock; + HANDLE hFile; + + if (!RtlDosPathNameToNtPathName_U(DirName, + &NtPathU, + NULL, + NULL)) + { + WARN("Invalid path\n"); + SetLastError(ERROR_BAD_PATHNAME); + return INVALID_HANDLE_VALUE; }
InitializeObjectAttributes(&ObjectAttributes, - &NtPathU, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); + &NtPathU, + OBJ_CASE_INSENSITIVE, + NULL, + NULL);
errCode = NtCreateFile (&hFile, - Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, - &ObjectAttributes, - &IoStatusBlock, - NULL, - 0, - FILE_SHARE_READ|FILE_SHARE_WRITE, - FILE_OPEN, - 0, - NULL, - 0); + Write ? FILE_GENERIC_WRITE : FILE_GENERIC_READ, + &ObjectAttributes, + &IoStatusBlock, + NULL, + 0, + FILE_SHARE_READ|FILE_SHARE_WRITE, + FILE_OPEN, + 0, + NULL, + 0);
RtlFreeHeap(RtlGetProcessHeap(), 0, @@ -71,8 +71,8 @@
if (!NT_SUCCESS(errCode)) { - SetLastErrorByStatus (errCode); - return INVALID_HANDLE_VALUE; + SetLastErrorByStatus (errCode); + return INVALID_HANDLE_VALUE; } return hFile; } @@ -84,34 +84,34 @@ /* Synced to Wine-2008/12/28 */ DWORD WINAPI GetLogicalDriveStringsA(DWORD nBufferLength, - LPSTR lpBuffer) -{ - DWORD drive, count; - DWORD dwDriveMap; - LPSTR p; - - dwDriveMap = GetLogicalDrives(); - - for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) - { - if (dwDriveMap & (1<<drive)) - count++; - } - - - if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1); - - p = lpBuffer; - - for (drive = 0; drive < MAX_DOS_DRIVES; drive++) - if (dwDriveMap & (1<<drive)) - { - *p++ = 'A' + (UCHAR)drive; - *p++ = ':'; - *p++ = '\'; - *p++ = '\0'; - } - *p = '\0'; + LPSTR lpBuffer) +{ + DWORD drive, count; + DWORD dwDriveMap; + LPSTR p; + + dwDriveMap = GetLogicalDrives(); + + for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) + { + if (dwDriveMap & (1<<drive)) + count++; + } + + + if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1); + + p = lpBuffer; + + for (drive = 0; drive < MAX_DOS_DRIVES; drive++) + if (dwDriveMap & (1<<drive)) + { + *p++ = 'A' + (UCHAR)drive; + *p++ = ':'; + *p++ = '\'; + *p++ = '\0'; + } + *p = '\0';
return (count * 4); } @@ -123,19 +123,19 @@ /* Synced to Wine-2008/12/28 */ DWORD WINAPI GetLogicalDriveStringsW(DWORD nBufferLength, - LPWSTR lpBuffer) -{ - DWORD drive, count; - DWORD dwDriveMap; - LPWSTR p; - - dwDriveMap = GetLogicalDrives(); - - for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) - { - if (dwDriveMap & (1<<drive)) - count++; - } + LPWSTR lpBuffer) +{ + DWORD drive, count; + DWORD dwDriveMap; + LPWSTR p; + + dwDriveMap = GetLogicalDrives(); + + for (drive = count = 0; drive < MAX_DOS_DRIVES; drive++) + { + if (dwDriveMap & (1<<drive)) + count++; + }
if ((count * 4) + 1 > nBufferLength) return ((count * 4) + 1);
@@ -161,24 +161,24 @@ DWORD WINAPI GetLogicalDrives(VOID) { - NTSTATUS Status; - PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; - - /* Get the Device Map for this Process */ - Status = NtQueryInformationProcess(NtCurrentProcess(), - ProcessDeviceMap, - &ProcessDeviceMapInfo, - sizeof(ProcessDeviceMapInfo), - NULL); - - /* Return the Drive Map */ - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return 0; - } - - return ProcessDeviceMapInfo.Query.DriveMap; + NTSTATUS Status; + PROCESS_DEVICEMAP_INFORMATION ProcessDeviceMapInfo; + + /* Get the Device Map for this Process */ + Status = NtQueryInformationProcess(NtCurrentProcess(), + ProcessDeviceMap, + &ProcessDeviceMapInfo, + sizeof(ProcessDeviceMapInfo), + NULL); + + /* Return the Drive Map */ + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return 0; + } + + return ProcessDeviceMapInfo.Query.DriveMap; }
@@ -187,26 +187,26 @@ */ BOOL WINAPI GetDiskFreeSpaceA ( - LPCSTR lpRootPathName, - LPDWORD lpSectorsPerCluster, - LPDWORD lpBytesPerSector, - LPDWORD lpNumberOfFreeClusters, - LPDWORD lpTotalNumberOfClusters -) -{ - PWCHAR RootPathNameW=NULL; - - if (lpRootPathName) - { - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; - } - - return GetDiskFreeSpaceW (RootPathNameW, - lpSectorsPerCluster, - lpBytesPerSector, - lpNumberOfFreeClusters, - lpTotalNumberOfClusters); + LPCSTR lpRootPathName, + LPDWORD lpSectorsPerCluster, + LPDWORD lpBytesPerSector, + LPDWORD lpNumberOfFreeClusters, + LPDWORD lpTotalNumberOfClusters + ) +{ + PWCHAR RootPathNameW=NULL; + + if (lpRootPathName) + { + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; + } + + return GetDiskFreeSpaceW (RootPathNameW, + lpSectorsPerCluster, + lpBytesPerSector, + lpNumberOfFreeClusters, + lpTotalNumberOfClusters); }
@@ -220,7 +220,7 @@ LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters -) + ) { FILE_FS_SIZE_INFORMATION FileFsSize; IO_STATUS_BLOCK IoStatusBlock; @@ -238,11 +238,11 @@ } RootPathName[3] = 0;
- hFile = InternalOpenDirW(RootPathName, FALSE); - if (INVALID_HANDLE_VALUE == hFile) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; + hFile = InternalOpenDirW(RootPathName, FALSE); + if (INVALID_HANDLE_VALUE == hFile) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; }
errCode = NtQueryVolumeInformationFile(hFile, @@ -276,24 +276,24 @@ */ BOOL WINAPI GetDiskFreeSpaceExA ( - LPCSTR lpDirectoryName OPTIONAL, - PULARGE_INTEGER lpFreeBytesAvailableToCaller, - PULARGE_INTEGER lpTotalNumberOfBytes, - PULARGE_INTEGER lpTotalNumberOfFreeBytes -) -{ - PWCHAR DirectoryNameW=NULL; - - if (lpDirectoryName) - { - if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) - return FALSE; - } - - return GetDiskFreeSpaceExW (DirectoryNameW , - lpFreeBytesAvailableToCaller, - lpTotalNumberOfBytes, - lpTotalNumberOfFreeBytes); + LPCSTR lpDirectoryName OPTIONAL, + PULARGE_INTEGER lpFreeBytesAvailableToCaller, + PULARGE_INTEGER lpTotalNumberOfBytes, + PULARGE_INTEGER lpTotalNumberOfFreeBytes + ) +{ + PWCHAR DirectoryNameW=NULL; + + if (lpDirectoryName) + { + if (!(DirectoryNameW = FilenameA2W(lpDirectoryName, FALSE))) + return FALSE; + } + + return GetDiskFreeSpaceExW (DirectoryNameW , + lpFreeBytesAvailableToCaller, + lpTotalNumberOfBytes, + lpTotalNumberOfFreeBytes); }
@@ -306,7 +306,7 @@ PULARGE_INTEGER lpFreeBytesAvailableToCaller, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes -) + ) { union { @@ -417,12 +417,12 @@ UINT WINAPI GetDriveTypeA(LPCSTR lpRootPathName) { - PWCHAR RootPathNameW; - - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return DRIVE_UNKNOWN; - - return GetDriveTypeW(RootPathNameW); + PWCHAR RootPathNameW; + + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return DRIVE_UNKNOWN; + + return GetDriveTypeW(RootPathNameW); }
@@ -432,105 +432,52 @@ UINT WINAPI GetDriveTypeW(LPCWSTR lpRootPathName) { - FILE_FS_DEVICE_INFORMATION FileFsDevice; - IO_STATUS_BLOCK IoStatusBlock; - HANDLE hFile; - 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) - { - 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 %d\n", FileFsDevice.DeviceType); - - return DRIVE_UNKNOWN; + 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; + } + CloseHandle(hFile); + + 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 %d\n", FileFsDevice.DeviceType); + + return DRIVE_UNKNOWN; }
@@ -539,134 +486,134 @@ */ BOOL WINAPI GetVolumeInformationA( - LPCSTR lpRootPathName, - LPSTR lpVolumeNameBuffer, - DWORD nVolumeNameSize, - LPDWORD lpVolumeSerialNumber, - LPDWORD lpMaximumComponentLength, - LPDWORD lpFileSystemFlags, - LPSTR lpFileSystemNameBuffer, - DWORD nFileSystemNameSize -) -{ - UNICODE_STRING FileSystemNameU; - UNICODE_STRING VolumeNameU = { 0, 0, NULL }; - ANSI_STRING VolumeName; - ANSI_STRING FileSystemName; - PWCHAR RootPathNameW; - BOOL Result; - - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; - - if (lpVolumeNameBuffer) - { - VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); - VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.MaximumLength); - if (VolumeNameU.Buffer == NULL) - { - goto FailNoMem; - } - } - - if (lpFileSystemNameBuffer) - { - FileSystemNameU.Length = 0; - FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); - FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.MaximumLength); - if (FileSystemNameU.Buffer == NULL) - { - if (VolumeNameU.Buffer != NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - VolumeNameU.Buffer); - } + LPCSTR lpRootPathName, + LPSTR lpVolumeNameBuffer, + DWORD nVolumeNameSize, + LPDWORD lpVolumeSerialNumber, + LPDWORD lpMaximumComponentLength, + LPDWORD lpFileSystemFlags, + LPSTR lpFileSystemNameBuffer, + DWORD nFileSystemNameSize + ) +{ + UNICODE_STRING FileSystemNameU; + UNICODE_STRING VolumeNameU = { 0, 0, NULL }; + ANSI_STRING VolumeName; + ANSI_STRING FileSystemName; + PWCHAR RootPathNameW; + BOOL Result; + + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; + + if (lpVolumeNameBuffer) + { + VolumeNameU.MaximumLength = (USHORT)nVolumeNameSize * sizeof(WCHAR); + VolumeNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.MaximumLength); + if (VolumeNameU.Buffer == NULL) + { + goto FailNoMem; + } + } + + if (lpFileSystemNameBuffer) + { + FileSystemNameU.Length = 0; + FileSystemNameU.MaximumLength = (USHORT)nFileSystemNameSize * sizeof(WCHAR); + FileSystemNameU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.MaximumLength); + if (FileSystemNameU.Buffer == NULL) + { + if (VolumeNameU.Buffer != NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + VolumeNameU.Buffer); + }
FailNoMem: - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - } - - Result = GetVolumeInformationW (RootPathNameW, - lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, - nVolumeNameSize, - lpVolumeSerialNumber, - lpMaximumComponentLength, - lpFileSystemFlags, - lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, - nFileSystemNameSize); - - if (Result) - { - if (lpVolumeNameBuffer) - { - VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); - VolumeName.Length = 0; - VolumeName.MaximumLength = (USHORT)nVolumeNameSize; - VolumeName.Buffer = lpVolumeNameBuffer; - } - - if (lpFileSystemNameBuffer) - { - FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); - FileSystemName.Length = 0; - FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; - FileSystemName.Buffer = lpFileSystemNameBuffer; - } - - /* convert unicode strings to ansi (or oem) */ - if (bIsFileApiAnsi) - { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToAnsiString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToAnsiString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } - else - { - if (lpVolumeNameBuffer) - { - RtlUnicodeStringToOemString (&VolumeName, - &VolumeNameU, - FALSE); - } - if (lpFileSystemNameBuffer) - { - RtlUnicodeStringToOemString (&FileSystemName, - &FileSystemNameU, - FALSE); - } - } - } - - if (lpVolumeNameBuffer) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameU.Buffer); - } - if (lpFileSystemNameBuffer) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - FileSystemNameU.Buffer); - } - - return Result; + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + } + + Result = GetVolumeInformationW (RootPathNameW, + lpVolumeNameBuffer ? VolumeNameU.Buffer : NULL, + nVolumeNameSize, + lpVolumeSerialNumber, + lpMaximumComponentLength, + lpFileSystemFlags, + lpFileSystemNameBuffer ? FileSystemNameU.Buffer : NULL, + nFileSystemNameSize); + + if (Result) + { + if (lpVolumeNameBuffer) + { + VolumeNameU.Length = wcslen(VolumeNameU.Buffer) * sizeof(WCHAR); + VolumeName.Length = 0; + VolumeName.MaximumLength = (USHORT)nVolumeNameSize; + VolumeName.Buffer = lpVolumeNameBuffer; + } + + if (lpFileSystemNameBuffer) + { + FileSystemNameU.Length = wcslen(FileSystemNameU.Buffer) * sizeof(WCHAR); + FileSystemName.Length = 0; + FileSystemName.MaximumLength = (USHORT)nFileSystemNameSize; + FileSystemName.Buffer = lpFileSystemNameBuffer; + } + + /* convert unicode strings to ansi (or oem) */ + if (bIsFileApiAnsi) + { + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToAnsiString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToAnsiString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } + else + { + if (lpVolumeNameBuffer) + { + RtlUnicodeStringToOemString (&VolumeName, + &VolumeNameU, + FALSE); + } + if (lpFileSystemNameBuffer) + { + RtlUnicodeStringToOemString (&FileSystemName, + &FileSystemNameU, + FALSE); + } + } + } + + if (lpVolumeNameBuffer) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameU.Buffer); + } + if (lpFileSystemNameBuffer) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + FileSystemNameU.Buffer); + } + + return Result; }
#define FS_VOLUME_BUFFER_SIZE (MAX_PATH * sizeof(WCHAR) + sizeof(FILE_FS_VOLUME_INFORMATION)) @@ -686,106 +633,106 @@ LPDWORD lpFileSystemFlags, LPWSTR lpFileSystemNameBuffer, DWORD nFileSystemNameSize -) -{ - PFILE_FS_VOLUME_INFORMATION FileFsVolume; - PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; - IO_STATUS_BLOCK IoStatusBlock; - WCHAR RootPathName[MAX_PATH]; - UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; - - HANDLE hFile; - NTSTATUS errCode; - - FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; - FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; - - TRACE("FileFsVolume %p\n", FileFsVolume); - TRACE("FileFsAttribute %p\n", FileFsAttribute); - - if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) - { - GetCurrentDirectoryW (MAX_PATH, RootPathName); - } - else - { - wcsncpy (RootPathName, lpRootPathName, 3); - } - RootPathName[3] = 0; - - hFile = InternalOpenDirW(RootPathName, FALSE); - if (hFile == INVALID_HANDLE_VALUE) - { - return FALSE; - } - - TRACE("hFile: %x\n", hFile); - errCode = NtQueryVolumeInformationFile(hFile, - &IoStatusBlock, - FileFsVolume, - FS_VOLUME_BUFFER_SIZE, - FileFsVolumeInformation); - if ( !NT_SUCCESS(errCode) ) - { - WARN("Status: %x\n", errCode); - CloseHandle(hFile); - SetLastErrorByStatus (errCode); - return FALSE; - } - - if (lpVolumeSerialNumber) - *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; - - if (lpVolumeNameBuffer) - { - if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) - { - memcpy(lpVolumeNameBuffer, - FileFsVolume->VolumeLabel, - FileFsVolume->VolumeLabelLength); - lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; - } - else - { - CloseHandle(hFile); - SetLastError(ERROR_MORE_DATA); - return FALSE; - } - } - - errCode = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - FileFsAttribute, - FS_ATTRIBUTE_BUFFER_SIZE, - FileFsAttributeInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(errCode)) - { - WARN("Status: %x\n", errCode); - SetLastErrorByStatus (errCode); - return FALSE; - } - - if (lpFileSystemFlags) - *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; - if (lpMaximumComponentLength) - *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; - if (lpFileSystemNameBuffer) - { - if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) - { - memcpy(lpFileSystemNameBuffer, - FileFsAttribute->FileSystemName, - FileFsAttribute->FileSystemNameLength); - lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; - } - else - { - SetLastError(ERROR_MORE_DATA); - return FALSE; - } - } - return TRUE; + ) +{ + PFILE_FS_VOLUME_INFORMATION FileFsVolume; + PFILE_FS_ATTRIBUTE_INFORMATION FileFsAttribute; + IO_STATUS_BLOCK IoStatusBlock; + WCHAR RootPathName[MAX_PATH]; + UCHAR Buffer[max(FS_VOLUME_BUFFER_SIZE, FS_ATTRIBUTE_BUFFER_SIZE)]; + + HANDLE hFile; + NTSTATUS errCode; + + FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; + FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + + TRACE("FileFsVolume %p\n", FileFsVolume); + TRACE("FileFsAttribute %p\n", FileFsAttribute); + + if (!lpRootPathName || !wcscmp(lpRootPathName, L"")) + { + GetCurrentDirectoryW (MAX_PATH, RootPathName); + } + else + { + wcsncpy (RootPathName, lpRootPathName, 3); + } + RootPathName[3] = 0; + + hFile = InternalOpenDirW(RootPathName, FALSE); + if (hFile == INVALID_HANDLE_VALUE) + { + return FALSE; + } + + TRACE("hFile: %x\n", hFile); + errCode = NtQueryVolumeInformationFile(hFile, + &IoStatusBlock, + FileFsVolume, + FS_VOLUME_BUFFER_SIZE, + FileFsVolumeInformation); + if ( !NT_SUCCESS(errCode) ) + { + WARN("Status: %x\n", errCode); + CloseHandle(hFile); + SetLastErrorByStatus (errCode); + return FALSE; + } + + if (lpVolumeSerialNumber) + *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; + + if (lpVolumeNameBuffer) + { + if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) + { + memcpy(lpVolumeNameBuffer, + FileFsVolume->VolumeLabel, + FileFsVolume->VolumeLabelLength); + lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; + } + else + { + CloseHandle(hFile); + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + } + + errCode = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + FileFsAttribute, + FS_ATTRIBUTE_BUFFER_SIZE, + FileFsAttributeInformation); + CloseHandle(hFile); + if (!NT_SUCCESS(errCode)) + { + WARN("Status: %x\n", errCode); + SetLastErrorByStatus (errCode); + return FALSE; + } + + if (lpFileSystemFlags) + *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; + if (lpMaximumComponentLength) + *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; + if (lpFileSystemNameBuffer) + { + if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + { + memcpy(lpFileSystemNameBuffer, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; + } + else + { + SetLastError(ERROR_MORE_DATA); + return FALSE; + } + } + return TRUE; }
@@ -795,34 +742,34 @@ BOOL WINAPI SetVolumeLabelA ( - LPCSTR lpRootPathName, - LPCSTR lpVolumeName /* NULL if deleting label */ -) -{ - PWCHAR RootPathNameW; - PWCHAR VolumeNameW = NULL; - BOOL Result; - - if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) - return FALSE; - - if (lpVolumeName) - { - if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) - return FALSE; - } - - Result = SetVolumeLabelW (RootPathNameW, - VolumeNameW); - - if (VolumeNameW) - { - RtlFreeHeap (RtlGetProcessHeap (), - 0, - VolumeNameW ); - } - - return Result; + LPCSTR lpRootPathName, + LPCSTR lpVolumeName /* NULL if deleting label */ + ) +{ + PWCHAR RootPathNameW; + PWCHAR VolumeNameW = NULL; + BOOL Result; + + if (!(RootPathNameW = FilenameA2W(lpRootPathName, FALSE))) + return FALSE; + + if (lpVolumeName) + { + if (!(VolumeNameW = FilenameA2W(lpVolumeName, TRUE))) + return FALSE; + } + + Result = SetVolumeLabelW (RootPathNameW, + VolumeNameW); + + if (VolumeNameW) + { + RtlFreeHeap (RtlGetProcessHeap (), + 0, + VolumeNameW ); + } + + return Result; }
@@ -831,61 +778,61 @@ */ BOOL WINAPI SetVolumeLabelW( - LPCWSTR lpRootPathName, - LPCWSTR lpVolumeName /* NULL if deleting label */ -) -{ - PFILE_FS_LABEL_INFORMATION LabelInfo; - IO_STATUS_BLOCK IoStatusBlock; - ULONG LabelLength; - HANDLE hFile; - NTSTATUS Status; - - LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); - LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), - 0, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength); - if (LabelInfo == NULL) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + LPCWSTR lpRootPathName, + LPCWSTR lpVolumeName /* NULL if deleting label */ + ) +{ + PFILE_FS_LABEL_INFORMATION LabelInfo; + IO_STATUS_BLOCK IoStatusBlock; + ULONG LabelLength; + HANDLE hFile; + NTSTATUS Status; + + LabelLength = wcslen(lpVolumeName) * sizeof(WCHAR); + LabelInfo = RtlAllocateHeap(RtlGetProcessHeap(), + 0, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength); + if (LabelInfo == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + LabelInfo->VolumeLabelLength = LabelLength; + memcpy(LabelInfo->VolumeLabel, + lpVolumeName, + LabelLength); + + hFile = InternalOpenDirW(lpRootPathName, TRUE); + if (INVALID_HANDLE_VALUE == hFile) + { + RtlFreeHeap(RtlGetProcessHeap(), + 0, + LabelInfo); return FALSE; - } - LabelInfo->VolumeLabelLength = LabelLength; - memcpy(LabelInfo->VolumeLabel, - lpVolumeName, - LabelLength); - - hFile = InternalOpenDirW(lpRootPathName, TRUE); - if (INVALID_HANDLE_VALUE == hFile) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); - return FALSE; - } - - Status = NtSetVolumeInformationFile(hFile, - &IoStatusBlock, - LabelInfo, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength, - FileFsLabelInformation); - - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); - - if (!NT_SUCCESS(Status)) - { - WARN("Status: %x\n", Status); - CloseHandle(hFile); - SetLastErrorByStatus(Status); - return FALSE; - } - - CloseHandle(hFile); - return TRUE; + } + + Status = NtSetVolumeInformationFile(hFile, + &IoStatusBlock, + LabelInfo, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength, + FileFsLabelInformation); + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + LabelInfo); + + if (!NT_SUCCESS(Status)) + { + WARN("Status: %x\n", Status); + CloseHandle(hFile); + SetLastErrorByStatus(Status); + return FALSE; + } + + CloseHandle(hFile); + return TRUE; }
/** @@ -909,217 +856,217 @@
BOOL WINAPI GetVolumeNameForVolumeMountPointW( - IN LPCWSTR VolumeMountPoint, - OUT LPWSTR VolumeName, - IN DWORD VolumeNameLength) -{ - UNICODE_STRING NtFileName; - OBJECT_ATTRIBUTES ObjectAttributes; - HANDLE FileHandle; - IO_STATUS_BLOCK Iosb; - ULONG BufferLength; - PMOUNTDEV_NAME MountDevName; - PMOUNTMGR_MOUNT_POINT MountPoint; - ULONG MountPointSize; - PMOUNTMGR_MOUNT_POINTS MountPoints; - ULONG Index; - PUCHAR SymbolicLinkName; - BOOL Result; - NTSTATUS Status; - - if (!VolumeMountPoint || !VolumeMountPoint[0]) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } - - /* - * First step is to convert the passed volume mount point name to - * an NT acceptable name. - */ - - if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) - { - SetLastError(ERROR_PATH_NOT_FOUND); - return FALSE; - } - - if (NtFileName.Length > sizeof(WCHAR) && - NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\') - { - NtFileName.Length -= sizeof(WCHAR); - } - - /* - * Query mount point device name which we will later use for determining - * the volume name. - */ - - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, - &ObjectAttributes, &Iosb, - FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - RtlFreeUnicodeString(&NtFileName); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - return FALSE; - } - - BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); - do - { - MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountDevName == NULL) - { + IN LPCWSTR VolumeMountPoint, + OUT LPWSTR VolumeName, + IN DWORD VolumeNameLength) +{ + UNICODE_STRING NtFileName; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE FileHandle; + IO_STATUS_BLOCK Iosb; + ULONG BufferLength; + PMOUNTDEV_NAME MountDevName; + PMOUNTMGR_MOUNT_POINT MountPoint; + ULONG MountPointSize; + PMOUNTMGR_MOUNT_POINTS MountPoints; + ULONG Index; + PUCHAR SymbolicLinkName; + BOOL Result; + NTSTATUS Status; + + if (!VolumeMountPoint || !VolumeMountPoint[0]) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } + + /* + * First step is to convert the passed volume mount point name to + * an NT acceptable name. + */ + + if (!RtlDosPathNameToNtPathName_U(VolumeMountPoint, &NtFileName, NULL, NULL)) + { + SetLastError(ERROR_PATH_NOT_FOUND); + return FALSE; + } + + if (NtFileName.Length > sizeof(WCHAR) && + NtFileName.Buffer[(NtFileName.Length / sizeof(WCHAR)) - 1] == '\') + { + NtFileName.Length -= sizeof(WCHAR); + } + + /* + * Query mount point device name which we will later use for determining + * the volume name. + */ + + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_READ_ATTRIBUTES | SYNCHRONIZE, + &ObjectAttributes, &Iosb, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + RtlFreeUnicodeString(&NtFileName); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR); + do + { + MountDevName = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountDevName == NULL) + { + NtClose(FileHandle); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, + NULL, 0, MountDevName, BufferLength); + if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + if (Status == STATUS_BUFFER_OVERFLOW) + { + BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; + continue; + } + else + { NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + SetLastErrorByStatus(Status); return FALSE; - } - - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTDEV_QUERY_DEVICE_NAME, - NULL, 0, MountDevName, BufferLength); - if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - if (Status == STATUS_BUFFER_OVERFLOW) + } + } + } + while (!NT_SUCCESS(Status)); + + NtClose(FileHandle); + + /* + * Get the mount point information from mount manager. + */ + + MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); + if (MountPoint == NULL) + { + RtlFreeHeap(GetProcessHeap(), 0, MountDevName); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); + MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); + MountPoint->DeviceNameLength = MountDevName->NameLength; + RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); + + RtlInitUnicodeString(&NtFileName, L"\??\MountPointManager"); + InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); + Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, + &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_SYNCHRONOUS_IO_NONALERT); + if (!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + return FALSE; + } + + BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); + do + { + MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); + if (MountPoints == NULL) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, + IOCTL_MOUNTMGR_QUERY_POINTS, + MountPoint, MountPointSize, + MountPoints, BufferLength); + if (!NT_SUCCESS(Status)) + { + if (Status == STATUS_BUFFER_OVERFLOW) + { + BufferLength = MountPoints->Size; + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + continue; + } + else if (!NT_SUCCESS(Status)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + NtClose(FileHandle); + SetLastErrorByStatus(Status); + return FALSE; + } + } + } + while (!NT_SUCCESS(Status)); + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); + NtClose(FileHandle); + + /* + * Now we've gathered info about all mount points mapped to our device, so + * select the correct one and copy it into the output buffer. + */ + + for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) + { + MountPoint = MountPoints->MountPoints + Index; + SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; + + /* + * Check for "\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" + * (with the last slash being optional) style symbolic links. + */ + + if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || + (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && + SymbolicLinkName[48] == L'\')) + { + if (RtlCompareMemory(SymbolicLinkName, L"\??\Volume{", + 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && + SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && + SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && + SymbolicLinkName[47] == L'}') + { + if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) { - BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength; - continue; + RtlCopyMemory(VolumeName, + (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, + MountPoint->SymbolicLinkNameLength); + VolumeName[1] = L'\'; + Result = TRUE; } else { - NtClose(FileHandle); - SetLastErrorByStatus(Status); - return FALSE; + SetLastError(ERROR_FILENAME_EXCED_RANGE); + Result = FALSE; } - } - } - while (!NT_SUCCESS(Status)); - - NtClose(FileHandle); - - /* - * Get the mount point information from mount manager. - */ - - MountPointSize = MountDevName->NameLength + sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint = RtlAllocateHeap(GetProcessHeap(), 0, MountPointSize); - if (MountPoint == NULL) - { - RtlFreeHeap(GetProcessHeap(), 0, MountDevName); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - RtlZeroMemory(MountPoint, sizeof(MOUNTMGR_MOUNT_POINT)); - MountPoint->DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINT); - MountPoint->DeviceNameLength = MountDevName->NameLength; - RtlCopyMemory(MountPoint + 1, MountDevName->Name, MountDevName->NameLength); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountDevName); - - RtlInitUnicodeString(&NtFileName, L"\??\MountPointManager"); - InitializeObjectAttributes(&ObjectAttributes, &NtFileName, 0, NULL, NULL); - Status = NtOpenFile(&FileHandle, FILE_GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, - &Iosb, FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_SYNCHRONOUS_IO_NONALERT); - if (!NT_SUCCESS(Status)) - { - SetLastErrorByStatus(Status); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - return FALSE; - } - - BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS); - do - { - MountPoints = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferLength); - if (MountPoints == NULL) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb, - IOCTL_MOUNTMGR_QUERY_POINTS, - MountPoint, MountPointSize, - MountPoints, BufferLength); - if (!NT_SUCCESS(Status)) - { - if (Status == STATUS_BUFFER_OVERFLOW) - { - BufferLength = MountPoints->Size; - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - continue; - } - else if (!NT_SUCCESS(Status)) - { - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - NtClose(FileHandle); - SetLastErrorByStatus(Status); - return FALSE; - } - } - } - while (!NT_SUCCESS(Status)); - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoint); - NtClose(FileHandle); - - /* - * Now we've gathered info about all mount points mapped to our device, so - * select the correct one and copy it into the output buffer. - */ - - for (Index = 0; Index < MountPoints->NumberOfMountPoints; Index++) - { - MountPoint = MountPoints->MountPoints + Index; - SymbolicLinkName = (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset; - - /* - * Check for "\?\Volume{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" - * (with the last slash being optional) style symbolic links. - */ - - if (MountPoint->SymbolicLinkNameLength == 48 * sizeof(WCHAR) || - (MountPoint->SymbolicLinkNameLength == 49 * sizeof(WCHAR) && - SymbolicLinkName[48] == L'\')) - { - if (RtlCompareMemory(SymbolicLinkName, L"\??\Volume{", - 11 * sizeof(WCHAR)) == 11 * sizeof(WCHAR) && - SymbolicLinkName[19] == L'-' && SymbolicLinkName[24] == L'-' && - SymbolicLinkName[29] == L'-' && SymbolicLinkName[34] == L'-' && - SymbolicLinkName[47] == L'}') - { - if (VolumeNameLength >= MountPoint->SymbolicLinkNameLength / sizeof(WCHAR)) - { - RtlCopyMemory(VolumeName, - (PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset, - MountPoint->SymbolicLinkNameLength); - VolumeName[1] = L'\'; - Result = TRUE; - } - else - { - SetLastError(ERROR_FILENAME_EXCED_RANGE); - Result = FALSE; - } - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - - return Result; - } - } - } - - RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); - SetLastError(ERROR_INVALID_PARAMETER); - - return FALSE; + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + + return Result; + } + } + } + + RtlFreeHeap(RtlGetProcessHeap(), 0, MountPoints); + SetLastError(ERROR_INVALID_PARAMETER); + + return FALSE; }
/* @@ -1131,7 +1078,7 @@ LPCSTR lpszVolumeMountPoint, LPSTR lpszVolumeName, DWORD cchBufferLength -) + ) { BOOL ret; WCHAR volumeW[50], *pathW = NULL; @@ -1155,9 +1102,9 @@ HANDLE WINAPI FindFirstVolumeW( - LPWSTR volume, - DWORD len -) + LPWSTR volume, + DWORD len + ) { DWORD size = 1024; HANDLE mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, @@ -1204,9 +1151,9 @@ HANDLE WINAPI FindFirstVolumeA( - LPSTR volume, - DWORD len -) + LPSTR volume, + DWORD len + ) { WCHAR *buffer = NULL; HANDLE handle; @@ -1240,7 +1187,7 @@ WINAPI FindVolumeClose( HANDLE hFindVolume -) + ) { return RtlFreeHeap(RtlGetProcessHeap(), 0, hFindVolume); } @@ -1328,12 +1275,12 @@ }
while (!GetVolumeNameForVolumeMountPointW(UnicodeFilePath.Buffer, - VolumeName, - MAX_PATH)) + VolumeName, + MAX_PATH)) { if (((UnicodeFilePath.Length == 4) && (UnicodeFilePath.Buffer[0] == '\') && - (UnicodeFilePath.Buffer[1] == '\')) || ((UnicodeFilePath.Length == 6) && - (UnicodeFilePath.Buffer[1] == ':'))) + (UnicodeFilePath.Buffer[1] == '\')) || ((UnicodeFilePath.Length == 6) && + (UnicodeFilePath.Buffer[1] == ':'))) { break; }