[PATCH 1/1] wow64: Fix NtQueryDirectoryObject wrapper.

Piotr Caban wine at gitlab.winehq.org
Sat Jun 4 13:42:09 CDT 2022


From: Piotr Caban <piotr at codeweavers.com>

Signed-off-by: Piotr Caban <piotr at codeweavers.com>
---
 dlls/wow64/sync.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c
index d4122ddf3f3..578ef57201f 100644
--- a/dlls/wow64/sync.c
+++ b/dlls/wow64/sync.c
@@ -769,26 +769,32 @@ NTSTATUS WINAPI wow64_NtQueryDirectoryObject( UINT *args )
     BOOLEAN restart = get_ulong( &args );
     ULONG *context = get_ptr( &args );
     ULONG *retlen = get_ptr( &args );
+    ULONG retsize;
 
     NTSTATUS status;
     DIRECTORY_BASIC_INFORMATION *info;
-    ULONG size = size32 + sizeof(*info) - sizeof(*info32);
+    ULONG size = size32 + 2 * sizeof(*info) - 2 * sizeof(*info32);
 
     if (!single_entry) FIXME( "not implemented\n" );
     info = Wow64AllocateTemp( size );
-    status = NtQueryDirectoryObject( handle, info, size, single_entry, restart, context, NULL );
+    status = NtQueryDirectoryObject( handle, info, size, single_entry, restart, context, &retsize );
     if (!status)
     {
-        info32->ObjectName.Buffer            = PtrToUlong( info32 + 1 );
+        info32->ObjectName.Buffer            = PtrToUlong( info32 + 2 );
         info32->ObjectName.Length            = info->ObjectName.Length;
         info32->ObjectName.MaximumLength     = info->ObjectName.MaximumLength;
         info32->ObjectTypeName.Buffer        = info32->ObjectName.Buffer + info->ObjectName.MaximumLength;
         info32->ObjectTypeName.Length        = info->ObjectTypeName.Length;
         info32->ObjectTypeName.MaximumLength = info->ObjectTypeName.MaximumLength;
+        memset( info32 + 1, 0, sizeof(*info32) );
         size = info->ObjectName.MaximumLength + info->ObjectTypeName.MaximumLength;
-        memcpy( info32 + 1, info + 1, size );
-        if (retlen) *retlen = sizeof(*info32) + size;
+        memcpy( info32 + 2, info + 2, size );
+        if (retlen) *retlen = 2 * sizeof(*info32) + size;
     }
+    else if (retlen && status == STATUS_BUFFER_TOO_SMALL)
+        *retlen = retsize - 2 * sizeof(*info) + 2 * sizeof(*info32);
+    else if (retlen && status == STATUS_NO_MORE_ENTRIES)
+        *retlen = 0;
     return status;
 }
 
-- 
GitLab

https://gitlab.winehq.org/wine/wine/-/merge_requests/188



More information about the wine-devel mailing list