Alexandre Julliard : wow64: Add thunks for the directory object syscalls.
Alexandre Julliard
julliard at winehq.org
Fri Jul 23 18:08:01 CDT 2021
Module: wine
Branch: master
Commit: 994e4fba75a561ea643ad82988109507523d72b8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=994e4fba75a561ea643ad82988109507523d72b8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Jul 23 17:09:08 2021 +0200
wow64: Add thunks for the directory object syscalls.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wow64/struct32.h | 6 ++++
dlls/wow64/sync.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++
dlls/wow64/syscall.h | 3 ++
3 files changed, 89 insertions(+)
diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index e8b2e22cdcf..23144e9e15a 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -31,4 +31,10 @@ typedef struct
ULONG SecurityQualityOfService;
} OBJECT_ATTRIBUTES32;
+typedef struct
+{
+ UNICODE_STRING32 ObjectName;
+ UNICODE_STRING32 ObjectTypeName;
+} DIRECTORY_BASIC_INFORMATION32;
+
#endif /* __WOW64_STRUCT32_H */
diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c
index 596e90bc71d..55c0ed08e32 100644
--- a/dlls/wow64/sync.c
+++ b/dlls/wow64/sync.c
@@ -27,6 +27,9 @@
#include "winnt.h"
#include "winternl.h"
#include "wow64_private.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(wow);
/**********************************************************************
@@ -52,6 +55,26 @@ NTSTATUS WINAPI wow64_NtClearEvent( UINT *args )
}
+/**********************************************************************
+ * wow64_NtCreateDirectoryObject
+ */
+NTSTATUS WINAPI wow64_NtCreateDirectoryObject( UINT *args )
+{
+ ULONG *handle_ptr = get_ptr( &args );
+ ACCESS_MASK access = get_ulong( &args );
+ OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args );
+
+ struct object_attr64 attr;
+ HANDLE handle = 0;
+ NTSTATUS status;
+
+ *handle_ptr = 0;
+ status = NtCreateDirectoryObject( &handle, access, objattr_32to64( &attr, attr32 ));
+ put_handle( handle_ptr, handle );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtCreateEvent
*/
@@ -159,6 +182,26 @@ NTSTATUS WINAPI wow64_NtCreateTimer( UINT *args )
}
+/**********************************************************************
+ * wow64_NtOpenDirectoryObject
+ */
+NTSTATUS WINAPI wow64_NtOpenDirectoryObject( UINT *args )
+{
+ ULONG *handle_ptr = get_ptr( &args );
+ ACCESS_MASK access = get_ulong( &args );
+ OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args );
+
+ struct object_attr64 attr;
+ HANDLE handle = 0;
+ NTSTATUS status;
+
+ *handle_ptr = 0;
+ status = NtOpenDirectoryObject( &handle, access, objattr_32to64( &attr, attr32 ));
+ put_handle( handle_ptr, handle );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtOpenEvent
*/
@@ -271,6 +314,43 @@ NTSTATUS WINAPI wow64_NtPulseEvent( UINT *args )
}
+/**********************************************************************
+ * wow64_NtQueryDirectoryObject
+ */
+NTSTATUS WINAPI wow64_NtQueryDirectoryObject( UINT *args )
+{
+ HANDLE handle = get_handle( &args );
+ DIRECTORY_BASIC_INFORMATION32 *info32 = get_ptr( &args );
+ ULONG size32 = get_ulong( &args );
+ BOOLEAN single_entry = get_ulong( &args );
+ BOOLEAN restart = get_ulong( &args );
+ ULONG *context = get_ptr( &args );
+ ULONG *retlen = get_ptr( &args );
+
+ NTSTATUS status;
+ DIRECTORY_BASIC_INFORMATION *info;
+ ULONG size = size32 + sizeof(*info) - sizeof(*info32);
+
+ if (!single_entry) FIXME( "not implemented\n" );
+ info = RtlAllocateHeap( GetProcessHeap(), 0, size );
+ status = NtQueryDirectoryObject( handle, info, size, single_entry, restart, context, NULL );
+ if (!status)
+ {
+ info32->ObjectName.Buffer = PtrToUlong( info32 + 1 );
+ 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;
+ size = info->ObjectName.MaximumLength + info->ObjectTypeName.MaximumLength;
+ memcpy( info32 + 1, info + 1, size );
+ if (retlen) *retlen = sizeof(*info32) + size;
+ }
+ RtlFreeHeap( GetProcessHeap(), 0, info );
+ return status;
+}
+
+
/**********************************************************************
* wow64_NtQueryEvent
*/
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index db2b386fe24..b64cabd15b5 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -28,6 +28,7 @@
SYSCALL_ENTRY( NtCancelTimer ) \
SYSCALL_ENTRY( NtClearEvent ) \
SYSCALL_ENTRY( NtClose ) \
+ SYSCALL_ENTRY( NtCreateDirectoryObject ) \
SYSCALL_ENTRY( NtCreateEvent ) \
SYSCALL_ENTRY( NtCreateKeyedEvent ) \
SYSCALL_ENTRY( NtCreateMutant ) \
@@ -36,6 +37,7 @@
SYSCALL_ENTRY( NtDeleteAtom ) \
SYSCALL_ENTRY( NtFindAtom ) \
SYSCALL_ENTRY( NtGetCurrentProcessorNumber ) \
+ SYSCALL_ENTRY( NtOpenDirectoryObject ) \
SYSCALL_ENTRY( NtOpenEvent ) \
SYSCALL_ENTRY( NtOpenKeyedEvent ) \
SYSCALL_ENTRY( NtOpenMutant ) \
@@ -44,6 +46,7 @@
SYSCALL_ENTRY( NtPulseEvent ) \
SYSCALL_ENTRY( NtQueryDefaultLocale ) \
SYSCALL_ENTRY( NtQueryDefaultUILanguage ) \
+ SYSCALL_ENTRY( NtQueryDirectoryObject ) \
SYSCALL_ENTRY( NtQueryEvent ) \
SYSCALL_ENTRY( NtQueryInformationAtom ) \
SYSCALL_ENTRY( NtQueryInstallUILanguage ) \
More information about the wine-cvs
mailing list