Piotr Caban : wow64: Fix NtQueryDirectoryObject wrapper.

Alexandre Julliard julliard at winehq.org
Mon Jun 6 16:10:29 CDT 2022


Module: wine
Branch: master
Commit: 70d119b7b4f379a2d040ebefa5b79ce2606cdb0e
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=70d119b7b4f379a2d040ebefa5b79ce2606cdb0e

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Sat Jun  4 20:18:02 2022 +0200

wow64: Fix NtQueryDirectoryObject wrapper.

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;
 }
 




More information about the wine-cvs mailing list