Minor cleanup of GetVolumeNameForVolumeMountPointW and fix some incorrect return codes (spotted by w3seek).

svn path=/trunk/; revision=20219
This commit is contained in:
Filip Navara 2005-12-17 12:05:55 +00:00
parent 4ef6abb3a2
commit e4556f6060

View file

@ -811,7 +811,6 @@ GetVolumeNameForVolumeMountPointW(
OBJECT_ATTRIBUTES ObjectAttributes;
HANDLE FileHandle;
IO_STATUS_BLOCK Iosb;
PVOID Buffer;
ULONG BufferLength;
PMOUNTDEV_NAME MountDevName;
PMOUNTMGR_MOUNT_POINT MountPoint;
@ -819,6 +818,7 @@ GetVolumeNameForVolumeMountPointW(
PMOUNTMGR_MOUNT_POINTS MountPoints;
ULONG Index;
PUCHAR SymbolicLinkName;
BOOL Result;
NTSTATUS Status;
/*
@ -858,31 +858,33 @@ GetVolumeNameForVolumeMountPointW(
BufferLength = sizeof(MOUNTDEV_NAME) + 50 * sizeof(WCHAR);
do
{
MountDevName = Buffer = RtlAllocateHeap(GetProcessHeap(), 0, BufferLength);
if (Buffer == NULL)
MountDevName = RtlAllocateHeap(GetProcessHeap(), 0, BufferLength);
if (MountDevName == NULL)
{
NtClose(FileHandle);
SetLastErrorByStatus(Status);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb,
IOCTL_MOUNTDEV_QUERY_DEVICE_NAME,
NULL, 0, Buffer, BufferLength);
NULL, 0, MountDevName, BufferLength);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(GetProcessHeap(), 0, MountDevName);
if (Status == STATUS_BUFFER_OVERFLOW)
{
BufferLength = sizeof(MOUNTDEV_NAME) + MountDevName->NameLength;
RtlFreeHeap(GetProcessHeap(), 0, Buffer);
continue;
}
else if (!NT_SUCCESS(Status))
else
{
RtlFreeHeap(GetProcessHeap(), 0, Buffer);
NtClose(FileHandle);
SetLastErrorByStatus(Status);
return FALSE;
}
}
}
while (!NT_SUCCESS(Status));
NtClose(FileHandle);
@ -920,33 +922,35 @@ GetVolumeNameForVolumeMountPointW(
BufferLength = sizeof(MOUNTMGR_MOUNT_POINTS);
do
{
MountPoints = Buffer = RtlAllocateHeap(GetProcessHeap(), 0, BufferLength);
if (Buffer == NULL)
MountPoints = RtlAllocateHeap(GetProcessHeap(), 0, BufferLength);
if (MountPoints == NULL)
{
RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
NtClose(FileHandle);
SetLastErrorByStatus(Status);
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
Status = NtDeviceIoControlFile(FileHandle, NULL, NULL, NULL, &Iosb,
IOCTL_MOUNTMGR_QUERY_POINTS,
MountPoint, MountPointSize,
Buffer, BufferLength);
MountPoints, BufferLength);
if (!NT_SUCCESS(Status))
{
RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
if (Status == STATUS_BUFFER_OVERFLOW)
{
BufferLength = MountPoints->Size;
RtlFreeHeap(GetProcessHeap(), 0, Buffer);
continue;
}
else if (!NT_SUCCESS(Status))
{
RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
RtlFreeHeap(GetProcessHeap(), 0, Buffer);
SetLastErrorByStatus(Status);
return FALSE;
}
}
}
while (!NT_SUCCESS(Status));
RtlFreeHeap(GetProcessHeap(), 0, MountPoint);
@ -983,14 +987,16 @@ GetVolumeNameForVolumeMountPointW(
(PUCHAR)MountPoints + MountPoint->SymbolicLinkNameOffset,
MountPoint->SymbolicLinkNameLength);
VolumeName[1] = L'\\';
RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
return TRUE;
Result = TRUE;
}
else
{
RtlFreeHeap(GetProcessHeap(), 0, MountPoints);
SetLastError(ERROR_FILENAME_EXCED_RANGE);
Result = FALSE;
}
return FALSE;
return Result;
}
}
}