Alexandre Julliard : krnl386: Add a simple wrapper for CommonUnimpStub instead of saving/ restoring all registers.

Alexandre Julliard julliard at winehq.org
Mon Jul 24 15:51:20 CDT 2017


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jul 24 11:19:32 2017 +0200

krnl386: Add a simple wrapper for CommonUnimpStub instead of saving/restoring all registers.

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

---

 dlls/kernel32/kernel32.spec           |  2 +-
 dlls/krnl386.exe16/krnl386.exe16.spec |  2 +-
 dlls/krnl386.exe16/thunk.c            | 37 ++++++++++++++++++++++++-----------
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec
index 15cb998..f67141d 100644
--- a/dlls/kernel32/kernel32.spec
+++ b/dlls/kernel32/kernel32.spec
@@ -24,7 +24,7 @@
  14 stdcall -noname -i386 -private k32LoadStringA(long long ptr long) krnl386.exe16.k32LoadStringA
  15 varargs -noname -i386 -private k32wsprintfA(str str) krnl386.exe16.k32wsprintfA
  16 stdcall -noname -i386 -private k32wvsprintfA(ptr str ptr) krnl386.exe16.k32wvsprintfA
- 17 stdcall -noname -i386 -private -register CommonUnimpStub() krnl386.exe16.CommonUnimpStub
+ 17 stdcall -noname -i386 -private -norelay CommonUnimpStub() krnl386.exe16.CommonUnimpStub
  18 stdcall -noname -i386 -private GetProcessDword(long long) krnl386.exe16.GetProcessDword
  19 stub -noname -i386 ThunkTheTemplateHandle
  20 stdcall -noname -i386 -private DosFileHandleToWin32Handle(long) krnl386.exe16.DosFileHandleToWin32Handle
diff --git a/dlls/krnl386.exe16/krnl386.exe16.spec b/dlls/krnl386.exe16/krnl386.exe16.spec
index 66d33dd..09e2cf6 100644
--- a/dlls/krnl386.exe16/krnl386.exe16.spec
+++ b/dlls/krnl386.exe16/krnl386.exe16.spec
@@ -565,7 +565,7 @@
 @ stdcall -arch=win32 k32LoadStringA(long long ptr long)
 @ varargs -arch=win32 k32wsprintfA(str str)
 @ stdcall -arch=win32 k32wvsprintfA(ptr str ptr)
-@ stdcall -arch=win32 -register CommonUnimpStub()
+@ stdcall -arch=win32 -norelay CommonUnimpStub()
 @ stdcall -arch=win32 GetProcessDword(long long)
 @ stdcall -arch=win32 DosFileHandleToWin32Handle(long)
 @ stdcall -arch=win32 Win32HandleToDosFileHandle(long)
diff --git a/dlls/krnl386.exe16/thunk.c b/dlls/krnl386.exe16/thunk.c
index 8940605..9126125 100644
--- a/dlls/krnl386.exe16/thunk.c
+++ b/dlls/krnl386.exe16/thunk.c
@@ -2123,22 +2123,37 @@ LPVOID WINAPI GetPK16SysVar(void)
 /**********************************************************************
  *           CommonUnimpStub    (KERNEL32.17)
  */
-void WINAPI __regs_CommonUnimpStub( CONTEXT *context )
+int WINAPI __regs_CommonUnimpStub( const char *name, int type )
 {
-    FIXME("generic stub: %s\n", ((LPSTR)context->Eax ? (LPSTR)context->Eax : "?"));
+    FIXME("generic stub %s\n", debugstr_a(name));
 
-    switch ((context->Ecx >> 4) & 0x0f)
+    switch (type)
     {
-    case 15:  context->Eax = -1;   break;
-    case 14:  context->Eax = 0x78; break;
-    case 13:  context->Eax = 0x32; break;
-    case 1:   context->Eax = 1;    break;
-    default:  context->Eax = 0;    break;
+    case 15:  return -1;
+    case 14:  return ERROR_CALL_NOT_IMPLEMENTED;
+    case 13:  return ERROR_NOT_SUPPORTED;
+    case 1:   return 1;
+    default:  return 0;
     }
-
-    context->Esp += (context->Ecx & 0x0f) * 4;
 }
-DEFINE_REGS_ENTRYPOINT( CommonUnimpStub, 0 )
+__ASM_STDCALL_FUNC( CommonUnimpStub, 0,
+                    "pushl %ecx\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+                    "shrl $4,%ecx\n\t"
+                    "andl $0xf,%ecx\n\t"
+                    "pushl %ecx\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+                    "pushl %eax\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset 4\n\t")
+                    "call " __ASM_NAME("__regs_CommonUnimpStub") __ASM_STDCALL(8) "\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset -8\n\t")
+                    "popl %ecx\n\t"
+                    __ASM_CFI(".cfi_adjust_cfa_offset -4\n\t")
+                    "andl $0xf,%ecx\n\t"
+                    "movl (%esp),%edx\n\t"
+                    "leal (%esp,%ecx,4),%esp\n\t"
+                    "movl %edx,(%esp)\n\t"
+                    "ret" )
 
 /**********************************************************************
  *           HouseCleanLogicallyDeadHandles    (KERNEL32.33)




More information about the wine-cvs mailing list