Index: dll/win32/kernel32/client/file/volume.c =================================================================== --- dll/win32/kernel32/client/file/volume.c (revision 62704) +++ dll/win32/kernel32/client/file/volume.c (working copy) @@ -222,104 +222,114 @@ OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN 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)]; + 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; + DWORD BufferSize; + LPWSTR CurrentDir; - FileFsVolume = (PFILE_FS_VOLUME_INFORMATION)Buffer; - FileFsAttribute = (PFILE_FS_ATTRIBUTE_INFORMATION)Buffer; + 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); - 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) + //If NULL is passed set the label in CurrentDirectory path + if(!lpRootPathName) { - return FALSE; + BufferSize = GetCurrentDirectoryW(0, NULL); + CurrentDir = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize * sizeof(WCHAR)); + if(!CurrentDir) + { + return FALSE; + } + if(!GetCurrentDirectoryW(BufferSize, CurrentDir)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); + return FALSE; + } } - TRACE("hFile: %p\n", hFile); - errCode = NtQueryVolumeInformationFile(hFile, - &IoStatusBlock, - FileFsVolume, - FS_VOLUME_BUFFER_SIZE, - FileFsVolumeInformation); - if ( !NT_SUCCESS(errCode) ) + hFile = InternalOpenDirW(lpRootPathName?lpRootPathName:CurrentDir, FALSE); + if (hFile == INVALID_HANDLE_VALUE) + { + if(!lpRootPathName) + RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); + return FALSE; + } + + TRACE("hFile: %p\n", hFile); + errCode = NtQueryVolumeInformationFile(hFile, + &IoStatusBlock, + FileFsVolume, + FS_VOLUME_BUFFER_SIZE, + FileFsVolumeInformation); + if ( !NT_SUCCESS(errCode) ) { - WARN("Status: %x\n", errCode); - CloseHandle(hFile); - BaseSetLastNTError (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + CloseHandle(hFile); + BaseSetLastNTError (errCode); + RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); + return FALSE; } - - if (lpVolumeSerialNumber) + + if (lpVolumeSerialNumber) *lpVolumeSerialNumber = FileFsVolume->VolumeSerialNumber; - - if (lpVolumeNameBuffer) + + if (lpVolumeNameBuffer) { - if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) + if (nVolumeNameSize * sizeof(WCHAR) >= FileFsVolume->VolumeLabelLength + sizeof(WCHAR)) { - memcpy(lpVolumeNameBuffer, - FileFsVolume->VolumeLabel, - FileFsVolume->VolumeLabelLength); - lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpVolumeNameBuffer, FileFsVolume->VolumeLabel, FileFsVolume->VolumeLabelLength); + lpVolumeNameBuffer[FileFsVolume->VolumeLabelLength / sizeof(WCHAR)] = 0; + } + else { - CloseHandle(hFile); - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + CloseHandle(hFile); + SetLastError(ERROR_MORE_DATA); + return FALSE; + } } - - errCode = NtQueryVolumeInformationFile (hFile, - &IoStatusBlock, - FileFsAttribute, - FS_ATTRIBUTE_BUFFER_SIZE, - FileFsAttributeInformation); - CloseHandle(hFile); - if (!NT_SUCCESS(errCode)) + + errCode = NtQueryVolumeInformationFile (hFile, + &IoStatusBlock, + FileFsAttribute, + FS_ATTRIBUTE_BUFFER_SIZE, + FileFsAttributeInformation); + CloseHandle(hFile); + if (!NT_SUCCESS(errCode)) { - WARN("Status: %x\n", errCode); - BaseSetLastNTError (errCode); - return FALSE; + WARN("Status: %x\n", errCode); + BaseSetLastNTError (errCode); + return FALSE; } - - if (lpFileSystemFlags) + + if (lpFileSystemFlags) *lpFileSystemFlags = FileFsAttribute->FileSystemAttributes; - if (lpMaximumComponentLength) + if (lpMaximumComponentLength) *lpMaximumComponentLength = FileFsAttribute->MaximumComponentNameLength; - if (lpFileSystemNameBuffer) + if (lpFileSystemNameBuffer) { - if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) + if (nFileSystemNameSize * sizeof(WCHAR) >= FileFsAttribute->FileSystemNameLength + sizeof(WCHAR)) { - memcpy(lpFileSystemNameBuffer, - FileFsAttribute->FileSystemName, - FileFsAttribute->FileSystemNameLength); - lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; - } - else + memcpy(lpFileSystemNameBuffer, + FileFsAttribute->FileSystemName, + FileFsAttribute->FileSystemNameLength); + lpFileSystemNameBuffer[FileFsAttribute->FileSystemNameLength / sizeof(WCHAR)] = 0; + } + else { - SetLastError(ERROR_MORE_DATA); - return FALSE; - } + SetLastError(ERROR_MORE_DATA); + return FALSE; } - return TRUE; + } + return TRUE; } /* @@ -364,57 +374,83 @@ SetVolumeLabelW(IN LPCWSTR lpRootPathName, IN LPCWSTR lpVolumeName OPTIONAL) /* NULL if deleting label */ { - PFILE_FS_LABEL_INFORMATION LabelInfo; - IO_STATUS_BLOCK IoStatusBlock; - ULONG LabelLength; - HANDLE hFile; - NTSTATUS Status; + PFILE_FS_LABEL_INFORMATION LabelInfo; + IO_STATUS_BLOCK IoStatusBlock; + DWORD BufferSize; + LPWSTR CurrentDir; + 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; + } - 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); + //Set or reset the LabelName?... + if(lpVolumeName) + { + LabelInfo->VolumeLabelLength = LabelLength; + memcpy(LabelInfo->VolumeLabel, lpVolumeName, LabelLength); + }else + { + LabelInfo->VolumeLabelLength = 0; + memcpy(LabelInfo->VolumeLabel, lpVolumeName, 0); + } - hFile = InternalOpenDirW(lpRootPathName, TRUE); - if (INVALID_HANDLE_VALUE == hFile) - { - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); - return FALSE; - } + //...to which Volume? + if(!lpRootPathName) + { //If NULL is passed set the label in CurrentDirectory path + BufferSize = GetCurrentDirectoryW(0, NULL); + CurrentDir = RtlAllocateHeap(RtlGetProcessHeap(), 0, BufferSize * sizeof(WCHAR)); + if(!CurrentDir) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, LabelInfo); + return FALSE; + } - Status = NtSetVolumeInformationFile(hFile, - &IoStatusBlock, - LabelInfo, - sizeof(FILE_FS_LABEL_INFORMATION) + - LabelLength, - FileFsLabelInformation); + if(!GetCurrentDirectoryW(BufferSize, CurrentDir)) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, LabelInfo); + RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); + return FALSE; + } + } - RtlFreeHeap(RtlGetProcessHeap(), - 0, - LabelInfo); + hFile = InternalOpenDirW(lpRootPathName ? lpRootPathName : CurrentDir, TRUE); - if (!NT_SUCCESS(Status)) - { - WARN("Status: %x\n", Status); - CloseHandle(hFile); - BaseSetLastNTError(Status); - return FALSE; - } + if (INVALID_HANDLE_VALUE == hFile) + { + RtlFreeHeap(RtlGetProcessHeap(), 0, LabelInfo); + if(!lpRootPathName) RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); + return FALSE; + } + + Status = NtSetVolumeInformationFile(hFile, + &IoStatusBlock, + LabelInfo, + sizeof(FILE_FS_LABEL_INFORMATION) + + LabelLength, + FileFsLabelInformation); + + //Free resources. + RtlFreeHeap(RtlGetProcessHeap(), 0, LabelInfo); + if(!lpRootPathName) RtlFreeHeap(RtlGetProcessHeap(), 0, CurrentDir); - CloseHandle(hFile); - return TRUE; + if (!NT_SUCCESS(Status)) + { + WARN("Status: %x\n", Status); + CloseHandle(hFile); + BaseSetLastNTError(Status); + return FALSE; + } + + CloseHandle(hFile); + return TRUE; } /*