Alexandre Julliard : wow64: Add thunks for the debug object syscalls.

Alexandre Julliard julliard at winehq.org
Fri Jul 23 18:08:01 CDT 2021


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Jul 23 17:10:57 2021 +0200

wow64: Add thunks for the debug object syscalls.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wow64/struct32.h      |  57 +++++++++++++++++++++
 dlls/wow64/sync.c          | 125 +++++++++++++++++++++++++++++++++++++++++++++
 dlls/wow64/syscall.h       |   4 ++
 dlls/wow64/wow64_private.h |   8 +++
 4 files changed, 194 insertions(+)

diff --git a/dlls/wow64/struct32.h b/dlls/wow64/struct32.h
index 23144e9e15a..776b1d4df35 100644
--- a/dlls/wow64/struct32.h
+++ b/dlls/wow64/struct32.h
@@ -37,4 +37,61 @@ typedef struct
     UNICODE_STRING32 ObjectTypeName;
 } DIRECTORY_BASIC_INFORMATION32;
 
+typedef struct
+{
+    DBG_STATE   NewState;
+    CLIENT_ID32 AppClientId;
+    union
+    {
+        struct
+        {
+            EXCEPTION_RECORD32 ExceptionRecord;
+            ULONG FirstChance;
+        } Exception;
+        struct
+        {
+            ULONG HandleToThread;
+            struct
+            {
+                ULONG SubSystemKey;
+                ULONG StartAddress;
+            } NewThread;
+        } CreateThread;
+        struct
+        {
+            ULONG HandleToProcess;
+            ULONG HandleToThread;
+            struct
+            {
+                ULONG SubSystemKey;
+                ULONG FileHandle;
+                ULONG BaseOfImage;
+                ULONG DebugInfoFileOffset;
+                ULONG DebugInfoSize;
+                struct
+                {
+                    ULONG SubSystemKey;
+                    ULONG StartAddress;
+                } InitialThread;
+            } NewProcess;
+        } CreateProcessInfo;
+        struct
+        {
+            NTSTATUS ExitStatus;
+        } ExitProcess, ExitThread;
+        struct
+        {
+            ULONG FileHandle;
+            ULONG BaseOfDll;
+            ULONG DebugInfoFileOffset;
+            ULONG DebugInfoSize;
+            ULONG NamePointer;
+        } LoadDll;
+        struct
+        {
+            ULONG BaseAddress;
+        } UnloadDll;
+    } StateInfo;
+} DBGUI_WAIT_STATE_CHANGE32;
+
 #endif /* __WOW64_STRUCT32_H */
diff --git a/dlls/wow64/sync.c b/dlls/wow64/sync.c
index 55c0ed08e32..d280f1324a3 100644
--- a/dlls/wow64/sync.c
+++ b/dlls/wow64/sync.c
@@ -55,6 +55,27 @@ NTSTATUS WINAPI wow64_NtClearEvent( UINT *args )
 }
 
 
+/**********************************************************************
+ *           wow64_NtCreateDebugObject
+ */
+NTSTATUS WINAPI wow64_NtCreateDebugObject( UINT *args )
+{
+    ULONG *handle_ptr = get_ptr( &args );
+    ACCESS_MASK access = get_ulong( &args );
+    OBJECT_ATTRIBUTES32 *attr32 = get_ptr( &args );
+    ULONG flags = get_ulong( &args );
+
+    struct object_attr64 attr;
+    HANDLE handle = 0;
+    NTSTATUS status;
+
+    *handle_ptr = 0;
+    status = NtCreateDebugObject( &handle, access, objattr_32to64( &attr, attr32 ), flags );
+    put_handle( handle_ptr, handle );
+    return status;
+}
+
+
 /**********************************************************************
  *           wow64_NtCreateDirectoryObject
  */
@@ -182,6 +203,21 @@ NTSTATUS WINAPI wow64_NtCreateTimer( UINT *args )
 }
 
 
+/**********************************************************************
+ *           wow64_NtDebugContinue
+ */
+NTSTATUS WINAPI wow64_NtDebugContinue( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    CLIENT_ID32 *id32 = get_ptr( &args );
+    NTSTATUS status = get_ulong( &args );
+
+    CLIENT_ID id;
+
+    return NtDebugContinue( handle, client_id_32to64( &id, id32 ), status );
+}
+
+
 /**********************************************************************
  *           wow64_NtOpenDirectoryObject
  */
@@ -474,6 +510,21 @@ NTSTATUS WINAPI wow64_NtSetEvent( UINT *args )
 }
 
 
+/**********************************************************************
+ *           wow64_NtSetInformationDebugObject
+ */
+NTSTATUS WINAPI wow64_NtSetInformationDebugObject( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    DEBUGOBJECTINFOCLASS class = get_ulong( &args );
+    void *ptr = get_ptr( &args );
+    ULONG len = get_ulong( &args );
+    ULONG *retlen = get_ptr( &args );
+
+    return NtSetInformationDebugObject( handle, class, ptr, len, retlen );
+}
+
+
 /**********************************************************************
  *           wow64_NtSetTimer
  */
@@ -492,6 +543,80 @@ NTSTATUS WINAPI wow64_NtSetTimer( UINT *args )
 }
 
 
+/**********************************************************************
+ *           wow64_NtWaitForDebugEvent
+ */
+NTSTATUS WINAPI wow64_NtWaitForDebugEvent( UINT *args )
+{
+    HANDLE handle = get_handle( &args );
+    BOOLEAN alertable = get_ulong( &args );
+    LARGE_INTEGER *timeout = get_ptr( &args );
+    DBGUI_WAIT_STATE_CHANGE32 *state32 = get_ptr( &args );
+
+    ULONG i;
+    DBGUI_WAIT_STATE_CHANGE state;
+    NTSTATUS status = NtWaitForDebugEvent( handle, alertable, timeout, &state );
+
+    if (!status)
+    {
+        state32->NewState = state.NewState;
+        state32->AppClientId.UniqueProcess = HandleToULong( state.AppClientId.UniqueProcess );
+        state32->AppClientId.UniqueThread = HandleToULong( state.AppClientId.UniqueThread );
+        switch (state.NewState)
+        {
+#define COPY_ULONG(field) state32->StateInfo.field = state.StateInfo.field
+#define COPY_PTR(field)   state32->StateInfo.field = PtrToUlong( state.StateInfo.field )
+        case DbgCreateThreadStateChange:
+            COPY_PTR( CreateThread.HandleToThread );
+            COPY_PTR( CreateThread.NewThread.StartAddress );
+            COPY_ULONG( CreateThread.NewThread.SubSystemKey );
+            break;
+        case DbgCreateProcessStateChange:
+            COPY_PTR( CreateProcessInfo.HandleToProcess );
+            COPY_PTR( CreateProcessInfo.HandleToThread );
+            COPY_PTR( CreateProcessInfo.NewProcess.FileHandle );
+            COPY_PTR( CreateProcessInfo.NewProcess.BaseOfImage );
+            COPY_PTR( CreateProcessInfo.NewProcess.InitialThread.StartAddress );
+            COPY_ULONG( CreateProcessInfo.NewProcess.InitialThread.SubSystemKey );
+            COPY_ULONG( CreateProcessInfo.NewProcess.DebugInfoFileOffset );
+            COPY_ULONG( CreateProcessInfo.NewProcess.DebugInfoSize );
+            break;
+        case DbgExitThreadStateChange:
+        case DbgExitProcessStateChange:
+            COPY_ULONG( ExitThread.ExitStatus );
+            break;
+        case DbgExceptionStateChange:
+        case DbgBreakpointStateChange:
+        case DbgSingleStepStateChange:
+            COPY_ULONG( Exception.FirstChance );
+            COPY_ULONG( Exception.ExceptionRecord.ExceptionCode );
+            COPY_ULONG( Exception.ExceptionRecord.ExceptionFlags );
+            COPY_ULONG( Exception.ExceptionRecord.NumberParameters );
+            COPY_PTR( Exception.ExceptionRecord.ExceptionRecord );
+            COPY_PTR( Exception.ExceptionRecord.ExceptionAddress );
+            for (i = 0; i < state.StateInfo.Exception.ExceptionRecord.NumberParameters; i++)
+                COPY_ULONG( Exception.ExceptionRecord.ExceptionInformation[i] );
+            break;
+        case DbgLoadDllStateChange:
+            COPY_PTR( LoadDll.FileHandle );
+            COPY_PTR( LoadDll.BaseOfDll );
+            COPY_ULONG( LoadDll.DebugInfoFileOffset );
+            COPY_ULONG( LoadDll.DebugInfoSize );
+            COPY_PTR( LoadDll.NamePointer );
+            break;
+        case DbgUnloadDllStateChange:
+            COPY_PTR( UnloadDll.BaseAddress );
+            break;
+        default:
+            break;
+        }
+#undef COPY_ULONG
+#undef COPY_PTR
+    }
+    return status;
+}
+
+
 /**********************************************************************
  *           wow64_NtWaitForKeyedEvent
  */
diff --git a/dlls/wow64/syscall.h b/dlls/wow64/syscall.h
index b64cabd15b5..a56e775bda3 100644
--- a/dlls/wow64/syscall.h
+++ b/dlls/wow64/syscall.h
@@ -28,12 +28,14 @@
     SYSCALL_ENTRY( NtCancelTimer ) \
     SYSCALL_ENTRY( NtClearEvent ) \
     SYSCALL_ENTRY( NtClose ) \
+    SYSCALL_ENTRY( NtCreateDebugObject ) \
     SYSCALL_ENTRY( NtCreateDirectoryObject ) \
     SYSCALL_ENTRY( NtCreateEvent ) \
     SYSCALL_ENTRY( NtCreateKeyedEvent ) \
     SYSCALL_ENTRY( NtCreateMutant ) \
     SYSCALL_ENTRY( NtCreateSemaphore ) \
     SYSCALL_ENTRY( NtCreateTimer ) \
+    SYSCALL_ENTRY( NtDebugContinue ) \
     SYSCALL_ENTRY( NtDeleteAtom ) \
     SYSCALL_ENTRY( NtFindAtom ) \
     SYSCALL_ENTRY( NtGetCurrentProcessorNumber ) \
@@ -60,7 +62,9 @@
     SYSCALL_ENTRY( NtSetDefaultLocale ) \
     SYSCALL_ENTRY( NtSetDefaultUILanguage ) \
     SYSCALL_ENTRY( NtSetEvent ) \
+    SYSCALL_ENTRY( NtSetInformationDebugObject ) \
     SYSCALL_ENTRY( NtSetTimer ) \
+    SYSCALL_ENTRY( NtWaitForDebugEvent ) \
     SYSCALL_ENTRY( NtWaitForKeyedEvent )
 
 #endif /* __WOW64_SYSCALL_H */
diff --git a/dlls/wow64/wow64_private.h b/dlls/wow64/wow64_private.h
index f555f8db7bb..9e3fd914045 100644
--- a/dlls/wow64/wow64_private.h
+++ b/dlls/wow64/wow64_private.h
@@ -83,6 +83,14 @@ static inline UNICODE_STRING *unicode_str_32to64( UNICODE_STRING *str, const UNI
     return str;
 }
 
+static inline CLIENT_ID *client_id_32to64( CLIENT_ID *id, const CLIENT_ID32 *id32 )
+{
+    if (!id32) return NULL;
+    id->UniqueProcess = LongToHandle( id32->UniqueProcess );
+    id->UniqueThread = LongToHandle( id32->UniqueThread );
+    return id;
+}
+
 static inline SECURITY_DESCRIPTOR *secdesc_32to64( SECURITY_DESCRIPTOR *out, const SECURITY_DESCRIPTOR *in )
 {
     /* relative descr has the same layout for 32 and 64 */




More information about the wine-cvs mailing list