Alexandre Julliard : ntoskrnl.exe: Reuse the kernel32 instruction emulation support for kernel-mode drivers.

Alexandre Julliard julliard at wine.codeweavers.com
Fri May 18 13:56:06 CDT 2007


Module: wine
Branch: master
Commit: 73cc00f9a55ea5a0fe78a302034637f21f05e283
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=73cc00f9a55ea5a0fe78a302034637f21f05e283

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 18 16:37:23 2007 +0200

ntoskrnl.exe: Reuse the kernel32 instruction emulation support for kernel-mode drivers.

---

 dlls/kernel32/instr.c          |    6 +++---
 dlls/kernel32/kernel32.spec    |    1 +
 dlls/kernel32/kernel_private.h |    2 +-
 dlls/kernel32/wowthunk.c       |    4 ++--
 dlls/ntoskrnl.exe/ntoskrnl.c   |   19 +++++++++++++++++++
 5 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/dlls/kernel32/instr.c b/dlls/kernel32/instr.c
index 8a37a47..f9b99c8 100644
--- a/dlls/kernel32/instr.c
+++ b/dlls/kernel32/instr.c
@@ -428,12 +428,12 @@ static void INSTR_outport( WORD port, int size, DWORD val, CONTEXT86 *context )
 
 
 /***********************************************************************
- *           INSTR_EmulateInstruction
+ *           __wine_emulate_instruction
  *
  * Emulate a privileged instruction.
  * Returns exception continuation status.
  */
-DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context )
+DWORD __wine_emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT86 *context )
 {
     int prefix, segprefix, prefixlen, len, repX, long_op, long_addr;
     BYTE *instr;
@@ -886,7 +886,7 @@ LONG CALLBACK INSTR_vectored_handler( EXCEPTION_POINTERS *ptrs )
         (record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ||
          record->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION))
     {
-        if (INSTR_EmulateInstruction( record, context ) == ExceptionContinueExecution)
+        if (__wine_emulate_instruction( record, context ) == ExceptionContinueExecution)
             return EXCEPTION_CONTINUE_EXECUTION;
     }
     return EXCEPTION_CONTINUE_SEARCH;
diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index d6bb2bf..32bf8e3 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -1234,6 +1234,7 @@
 @ cdecl __wine_dll_register_16(ptr str)
 @ cdecl __wine_dll_unregister_16(ptr)
 @ varargs -private __wine_call_from_16_regs()
+@ cdecl __wine_emulate_instruction(ptr ptr)
 
 # Unix files
 @ cdecl wine_get_unix_file_name(wstr)
diff --git a/dlls/kernel32/kernel_private.h b/dlls/kernel32/kernel_private.h
index 4796e62..dd7c916 100644
--- a/dlls/kernel32/kernel_private.h
+++ b/dlls/kernel32/kernel_private.h
@@ -79,7 +79,7 @@ extern void FILE_SetDosError(void);
 extern WCHAR *FILE_name_AtoW( LPCSTR name, BOOL alloc );
 extern DWORD FILE_name_WtoA( LPCWSTR src, INT srclen, LPSTR dest, INT destlen );
 
-extern DWORD INSTR_EmulateInstruction( EXCEPTION_RECORD *rec, CONTEXT86 *context );
+extern DWORD __wine_emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT86 *context );
 extern LONG CALLBACK INSTR_vectored_handler( EXCEPTION_POINTERS *ptrs );
 extern void INSTR_CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );
 
diff --git a/dlls/kernel32/wowthunk.c b/dlls/kernel32/wowthunk.c
index 9e27f85..4f714ab 100644
--- a/dlls/kernel32/wowthunk.c
+++ b/dlls/kernel32/wowthunk.c
@@ -256,7 +256,7 @@ static DWORD call16_handler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RE
         else
         {
             SEGPTR gpHandler;
-            DWORD ret = INSTR_EmulateInstruction( record, context );
+            DWORD ret = __wine_emulate_instruction( record, context );
 
             /*
              * Insert check for pending DPMI events. Note that this 
@@ -310,7 +310,7 @@ static DWORD vm86_handler( EXCEPTION_RECORD *record, EXCEPTION_REGISTRATION_RECO
     if (record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ||
         record->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION)
     {
-        return INSTR_EmulateInstruction( record, context );
+        return __wine_emulate_instruction( record, context );
     }
 
     return ExceptionContinueSearch;
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 3380434..b0007fc 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -30,6 +30,7 @@
 #define WIN32_NO_STATUS
 #include "windef.h"
 #include "winternl.h"
+#include "excpt.h"
 #include "ddk/wdm.h"
 #include "wine/unicode.h"
 #include "wine/server.h"
@@ -103,6 +104,23 @@ static HANDLE get_device_manager(void)
     return ret;
 }
 
+/* exception handler for emulation of privileged instructions */
+static LONG CALLBACK vectored_handler( EXCEPTION_POINTERS *ptrs )
+{
+    extern DWORD __wine_emulate_instruction( EXCEPTION_RECORD *rec, CONTEXT86 *context );
+
+    EXCEPTION_RECORD *record = ptrs->ExceptionRecord;
+    CONTEXT86 *context = ptrs->ContextRecord;
+
+    if (record->ExceptionCode == EXCEPTION_ACCESS_VIOLATION ||
+        record->ExceptionCode == EXCEPTION_PRIV_INSTRUCTION)
+    {
+        if (__wine_emulate_instruction( record, context ) == ExceptionContinueExecution)
+            return EXCEPTION_CONTINUE_EXECUTION;
+    }
+    return EXCEPTION_CONTINUE_SEARCH;
+}
+
 /* process an ioctl request for a given device */
 static NTSTATUS process_ioctl( DEVICE_OBJECT *device, ULONG code, void *in_buff, ULONG in_size,
                                void *out_buff, ULONG *out_size )
@@ -479,6 +497,7 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
     {
     case DLL_PROCESS_ATTACH:
         DisableThreadLibraryCalls( inst );
+        RtlAddVectoredExceptionHandler( TRUE, vectored_handler );
         break;
     }
     return TRUE;




More information about the wine-cvs mailing list