https://git.reactos.org/?p=reactos.git;a=commitdiff;h=be97a36f25c3fec7ad8ca6c43aeadfe12d9eab34

commit be97a36f25c3fec7ad8ca6c43aeadfe12d9eab34
Author:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
AuthorDate: Sun Jan 19 22:23:56 2025 +0100
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@reactos.org>
CommitDate: Tue Jan 21 19:15:59 2025 +0100

    [MOUNTMGR] Simplify MountMgrQueryDosVolumePath() code (#6990)
    
    - Use a variable of correct type instead of casting every time.
    - Remove one level of indentation by returning early.
---
 drivers/storage/mountmgr/device.c | 66 ++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 32 deletions(-)

diff --git a/drivers/storage/mountmgr/device.c 
b/drivers/storage/mountmgr/device.c
index ca8ed5c1395..62d28cf7192 100644
--- a/drivers/storage/mountmgr/device.c
+++ b/drivers/storage/mountmgr/device.c
@@ -819,6 +819,7 @@ MountMgrQueryDosVolumePath(IN PDEVICE_EXTENSION 
DeviceExtension,
     PLIST_ENTRY SymlinksEntry;
     UNICODE_STRING SymbolicName;
     PMOUNTMGR_TARGET_NAME Target;
+    PMOUNTMGR_VOLUME_PATHS Output;
     PWSTR DeviceString, OldBuffer;
     USHORT DeviceLength, OldLength;
     PDEVICE_INFORMATION DeviceInformation;
@@ -992,46 +993,47 @@ TryWithVolumeName:
             }
 
             RtlCopyMemory(DeviceString, SymlinkInformation->Name.Buffer, 
DeviceLength);
-            /* Ensure we are in the right namespace; [1] can be ? */
+            /* Ensure we are in the Win32 namespace; [1] can be '?' */
             DeviceString[1] = L'\\';
         }
     }
 
-    /* If we found something */
-    if (DeviceString)
-    {
-        /* At least, we will return our length */
-        
((PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer)->MultiSzLength = 
DeviceLength;
-        /* MOUNTMGR_VOLUME_PATHS is a string + a ULONG */
-        Irp->IoStatus.Information = DeviceLength + sizeof(ULONG);
+    /* If we didn't find something, fail */
+    if (!DeviceString)
+        return STATUS_NOT_FOUND;
 
-        /* If we have enough room for copying the string */
-        if (sizeof(ULONG) + DeviceLength <= 
Stack->Parameters.DeviceIoControl.OutputBufferLength)
-        {
-            /* Copy it */
-            if (DeviceLength)
-            {
-                
RtlCopyMemory(((PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer)->MultiSz,
 DeviceString, DeviceLength);
-            }
+    /* Get the output buffer */
+    Output = (PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer;
 
-            /* And double zero at its end - this is needed in case of multiple 
paths which are separated by a single 0 */
-            FreePool(DeviceString);
-            
((PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer)->MultiSz[DeviceLength 
/ sizeof(WCHAR)] = 0;
-            
((PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer)->MultiSz[DeviceLength 
/ sizeof(WCHAR) + 1] = 0;
+    /* At least, we will return our length */
+    Output->MultiSzLength = DeviceLength;
+    /* MOUNTMGR_VOLUME_PATHS is a string + a ULONG */
+    Irp->IoStatus.Information = DeviceLength + sizeof(ULONG);
 
-            return STATUS_SUCCESS;
-        }
-        else
+    /* If we have enough room for copying the string */
+    if (sizeof(ULONG) + DeviceLength <= 
Stack->Parameters.DeviceIoControl.OutputBufferLength)
+    {
+        /* Copy it */
+        if (DeviceLength)
         {
-            /* Just return appropriate size and leave */
-            FreePool(DeviceString);
-            Irp->IoStatus.Information = sizeof(ULONG);
-            return STATUS_BUFFER_OVERFLOW;
+            RtlCopyMemory(Output->MultiSz, DeviceString, DeviceLength);
         }
-    }
 
-    /* Fail */
-    return STATUS_NOT_FOUND;
+        /* And double-NUL at its end - this is needed in case of
+         * multiple paths which are separated by a single NUL */
+        FreePool(DeviceString);
+        Output->MultiSz[DeviceLength / sizeof(WCHAR)] = UNICODE_NULL;
+        Output->MultiSz[DeviceLength / sizeof(WCHAR) + 1] = UNICODE_NULL;
+
+        return STATUS_SUCCESS;
+    }
+    else
+    {
+        /* Just return the size needed and leave */
+        FreePool(DeviceString);
+        Irp->IoStatus.Information = sizeof(ULONG);
+        return STATUS_BUFFER_OVERFLOW;
+    }
 }
 
 /*
@@ -1557,7 +1559,7 @@ MountMgrQueryDosVolumePaths(IN PDEVICE_EXTENSION 
DeviceExtension,
         MountMgrNotifyNameChange(DeviceExtension, &SymbolicName, FALSE);
     }
 
-    /* Get output buffer */
+    /* Get the output buffer */
     Output = (PMOUNTMGR_VOLUME_PATHS)Irp->AssociatedIrp.SystemBuffer;
 
     /* Set required size */
@@ -1566,7 +1568,7 @@ MountMgrQueryDosVolumePaths(IN PDEVICE_EXTENSION 
DeviceExtension,
     /* Compute total length */
     OutputLength = Output->MultiSzLength + sizeof(ULONG);
 
-    /* If it cannot fit, just return need size and quit */
+    /* If it cannot fit, just return the size needed and leave */
     if (OutputLength > Stack->Parameters.DeviceIoControl.OutputBufferLength)
     {
         Irp->IoStatus.Information = sizeof(ULONG);

Reply via email to