- 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)
+ BOOL Ret;
+ NTSTATUS Status;
+ PUNICODE_STRING RootPathNameU;
+ ANSI_STRING VolumeName, FileSystemName;
+ UNICODE_STRING VolumeNameU, FileSystemNameU;
+
+ /* If no root path provided, default to \ */
+ if (lpRootPathName == NULL)
+ {
+ lpRootPathName = "\\";
+ }
+
+ /* Convert root path to unicode */
+ RootPathNameU = Basep8BitStringToStaticUnicodeString(lpRootPathName);
+ if (RootPathNameU == NULL)
+ {
+ return FALSE;
+ }
+
+ /* Init all our STRINGS (U/A) */
+ VolumeNameU.Buffer = NULL;
+ VolumeNameU.MaximumLength = 0;
+ FileSystemNameU.Buffer = NULL;
+ FileSystemNameU.MaximumLength = 0;
+
+ VolumeName.Buffer = lpVolumeNameBuffer;
+ VolumeName.MaximumLength = nVolumeNameSize + 1;
+ FileSystemName.Buffer = lpFileSystemNameBuffer;
+ FileSystemName.MaximumLength = nFileSystemNameSize + 1;
+
+ /* Assume failure for now */
+ Ret = FALSE;
+
+ /* If caller wants volume name, allocate a buffer to receive it */
+ if (lpVolumeNameBuffer != NULL)
+ {
+ VolumeNameU.MaximumLength = sizeof(WCHAR) * (nVolumeNameSize + 1);
+ VolumeNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0,
+ VolumeNameU.MaximumLength);
+ if (VolumeNameU.Buffer == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ goto CleanAndQuit;
+ }
+ }
+
+ /* If caller wants file system name, allocate a buffer to receive it */
+ if (lpFileSystemNameBuffer != NULL)
+ {
+ FileSystemNameU.MaximumLength = sizeof(WCHAR) * (nVolumeNameSize + 1);
+ FileSystemNameU.Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0,
+ FileSystemNameU.MaximumLength);
+ if (FileSystemNameU.Buffer == NULL)