https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2da92ac67bc7f664840a21f1d55e87192828ae06
commit 2da92ac67bc7f664840a21f1d55e87192828ae06 Author: Pierre Schweitzer <pie...@reactos.org> AuthorDate: Thu Oct 17 22:40:23 2019 +0200 Commit: Pierre Schweitzer <pie...@reactos.org> CommitDate: Thu Oct 17 22:42:47 2019 +0200 [MOUNTMGR] QueryPointsFromMemory: take into account the multiple MOUNTMGR_MOUNT_POINT This fixes returning too small structure on an IOCTL_MOUNTMGR_QUERY_POINTS call. The multiple MOUNTMGR_MOUNT_POINT structures were ignored and thus the data of the first one were erased by the multiple structures. MountMgr now returns consistent output on this IOCTL call. --- drivers/filters/mountmgr/point.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/drivers/filters/mountmgr/point.c b/drivers/filters/mountmgr/point.c index 26c263eec08..35fe8bb2435 100644 --- a/drivers/filters/mountmgr/point.c +++ b/drivers/filters/mountmgr/point.c @@ -336,9 +336,9 @@ QueryPointsFromMemory(IN PDEVICE_EXTENSION DeviceExtension, MountPoints = (PMOUNTMGR_MOUNT_POINTS)Irp->AssociatedIrp.SystemBuffer; /* Ensure we set output to let user reallocate! */ - MountPoints->Size = sizeof(MOUNTMGR_MOUNT_POINTS) + TotalSize; + MountPoints->Size = sizeof(MOUNTMGR_MOUNT_POINTS) + TotalSymLinks * sizeof(MOUNTMGR_MOUNT_POINT) + TotalSize; MountPoints->NumberOfMountPoints = TotalSymLinks; - Irp->IoStatus.Information = sizeof(MOUNTMGR_MOUNT_POINTS) + TotalSize; + Irp->IoStatus.Information = MountPoints->Size; if (MountPoints->Size > Stack->Parameters.DeviceIoControl.OutputBufferLength) { @@ -353,8 +353,8 @@ QueryPointsFromMemory(IN PDEVICE_EXTENSION DeviceExtension, } /* Now, start putting mount points */ + TotalSize = sizeof(MOUNTMGR_MOUNT_POINTS) + TotalSymLinks * sizeof(MOUNTMGR_MOUNT_POINT); TotalSymLinks = 0; - TotalSize = 0; for (DeviceEntry = DeviceExtension->DeviceListHead.Flink; DeviceEntry != &(DeviceExtension->DeviceListHead); DeviceEntry = DeviceEntry->Flink) @@ -391,16 +391,12 @@ QueryPointsFromMemory(IN PDEVICE_EXTENSION DeviceExtension, { SymlinkInformation = CONTAINING_RECORD(SymlinksEntry, SYMLINK_INFORMATION, SymbolicLinksListEntry); - - MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameOffset = sizeof(MOUNTMGR_MOUNT_POINTS) + - TotalSize; + MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameOffset = TotalSize; MountPoints->MountPoints[TotalSymLinks].SymbolicLinkNameLength = SymlinkInformation->Name.Length; - MountPoints->MountPoints[TotalSymLinks].UniqueIdOffset = sizeof(MOUNTMGR_MOUNT_POINTS) + - SymlinkInformation->Name.Length + + MountPoints->MountPoints[TotalSymLinks].UniqueIdOffset = SymlinkInformation->Name.Length + TotalSize; MountPoints->MountPoints[TotalSymLinks].UniqueIdLength = DeviceInformation->UniqueId->UniqueIdLength; - MountPoints->MountPoints[TotalSymLinks].DeviceNameOffset = sizeof(MOUNTMGR_MOUNT_POINTS) + - SymlinkInformation->Name.Length + + MountPoints->MountPoints[TotalSymLinks].DeviceNameOffset = SymlinkInformation->Name.Length + DeviceInformation->UniqueId->UniqueIdLength + TotalSize; MountPoints->MountPoints[TotalSymLinks].DeviceNameLength = DeviceInformation->DeviceName.Length;