From 2e244c45a3a767205ab0a9965b4f6414dc66a5a5 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Sun, 11 Oct 1998 19:29:22 +0000 Subject: [PATCH] Implemented CommonUnimpStub, MapHInst(LS|SL)_PN, W32S_BackTo32. Stub for HouseCleanLogicallyDeadHandles, fixed k32wvsprintfA. --- loader/ne/module.c | 24 ++++++++++++++++++++++-- relay32/kernel32.spec | 12 ++++++------ win32/ordinals.c | 33 ++++++++++++++++++++++++++++++++- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/loader/ne/module.c b/loader/ne/module.c index 3e193ac1a6b..5ad60031920 100644 --- a/loader/ne/module.c +++ b/loader/ne/module.c @@ -292,6 +292,10 @@ WORD NE_GetOrdinal( HMODULE16 hModule, const char *name ) * Return the entry point for a given ordinal. */ FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ) +{ + return NE_GetEntryPointEx( hModule, ordinal, TRUE ); +} +FARPROC16 NE_GetEntryPointEx( HMODULE16 hModule, WORD ordinal, BOOL16 snoop ) { NE_MODULE *pModule; WORD curOrdinal = 1; @@ -335,7 +339,7 @@ FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal ) else sel = GlobalHandleToSel(NE_SEG_TABLE(pModule)[sel-1].hSeg); if (sel==0xffff) return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ); - if (!fnSNOOP16_GetProcAddress16) + if (!snoop || !fnSNOOP16_GetProcAddress16) return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset ); else return (FARPROC16)fnSNOOP16_GetProcAddress16(hModule,ordinal,(FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset )); @@ -1165,12 +1169,28 @@ REGS_ENTRYPOINT(MapHInstLS) { } /*************************************************************************** - * MapHInstLS (KERNEL32.518) + * MapHInstSL (KERNEL32.518) */ REGS_ENTRYPOINT(MapHInstSL) { EAX_reg(context) = MapHModuleSL(EAX_reg(context)); } +/*************************************************************************** + * MapHInstLS_PN (KERNEL32.517) + */ +REGS_ENTRYPOINT(MapHInstLS_PN) { + if (EAX_reg(context)) + EAX_reg(context) = MapHModuleLS(EAX_reg(context)); +} + +/*************************************************************************** + * MapHInstSL_PN (KERNEL32.519) + */ +REGS_ENTRYPOINT(MapHInstSL_PN) { + if (EAX_reg(context)) + EAX_reg(context) = MapHModuleSL(EAX_reg(context)); +} + /*************************************************************************** * WIN16_MapHInstLS (KERNEL.472) */ diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec index 92d225ee68c..72c28ce1ee9 100644 --- a/relay32/kernel32.spec +++ b/relay32/kernel32.spec @@ -27,8 +27,8 @@ type win32 13 stdcall k32OemToCharBuffA(ptr ptr long) OemToCharBuff32A 14 stdcall k32LoadStringA(long long ptr long) LoadString32A 15 varargs k32wsprintfA() wsprintf32A - 16 stdcall k32wvsprintfA() wvsprintf32A - 17 stub CommonUnimpStub + 16 stdcall k32wvsprintfA(ptr str ptr) wvsprintf32A + 17 register CommonUnimpStub() CommonUnimpStub 18 stdcall GetProcessDword(long long) GetProcessDword 19 stub ThunkTheTemplateHandle 20 stub DosFileHandleToWin32Handle @@ -44,7 +44,7 @@ type win32 30 stdcall GlobalUnWire16(long) GlobalUnWire16 31 stdcall GlobalFree16(long) GlobalFree16 32 stdcall GlobalSize16(long) GlobalSize16 - 33 stub HouseCleanLogicallyDeadHandles + 33 stdcall HouseCleanLogicallyDeadHandles() HouseCleanLogicallyDeadHandles 34 stdcall GetWin16DOSEnv() GetWin16DOSEnv 35 stdcall LoadLibrary16(str) LoadLibrary16 36 stdcall FreeLibrary16(long) FreeLibrary16 @@ -62,7 +62,7 @@ type win32 48 stdcall ReleaseThunkLock(ptr) ReleaseThunkLock 49 stdcall RestoreThunkLock(long) RestoreThunkLock 50 stdcall AddAtomA(str) AddAtom32A - 51 stub W32S_BackTo32 + 51 register W32S_BackTo32() W32S_BackTo32 52 stdcall GetThunkBuff() GetThunkBuff 53 stdcall GetThunkStuff(str str) GetThunkStuff 54 stdcall K32WOWCallback16(long long) WOWCallback16 @@ -531,9 +531,9 @@ type win32 514 stdcall LockResource(long) LockResource32 515 stdcall MakeCriticalSectionGlobal(ptr) MakeCriticalSectionGlobal 516 register MapHInstLS() MapHInstLS -517 stub MapHInstLS_PN +517 register MapHInstLS_PN() MapHInstLS_PN 518 register MapHInstSL() MapHInstSL -519 stub MapHInstSL_PN +519 register MapHInstSL_PN() MapHInstSL_PN 520 stdcall MapHModuleLS(long) MapHModuleLS 521 stdcall MapHModuleSL(long) MapHModuleSL 522 stdcall MapLS(ptr) MapLS diff --git a/win32/ordinals.c b/win32/ordinals.c index 97209dff428..541816e00b7 100644 --- a/win32/ordinals.c +++ b/win32/ordinals.c @@ -14,6 +14,7 @@ #include "module.h" #include "task.h" #include "callback.h" +#include "stackframe.h" #include "debug.h" /********************************************************************** @@ -90,7 +91,7 @@ DWORD WINAPI GetProcessDword(DWORD processid,DWORD action) case 52:/* return process flags */ return process->flags; case 56:/* unexplored */ - return 0; + return process->process_dword; default: WARN(win32,"Unknown offset (%ld)\n",action); return 0; @@ -112,6 +113,7 @@ VOID WINAPI SetProcessDword(DWORD processid,DWORD action,DWORD value) if (!process || action>56) return; switch (action) { + case 56: process->process_dword = value; break; default: FIXME(win32,"Unknown offset (%ld)\n",action); break; @@ -139,6 +141,35 @@ LPVOID WINAPI GetPK16SysVar(void) return PK16SysVar; } +/********************************************************************** + * CommonUnimpStub (KERNEL32.17) + */ +REGS_ENTRYPOINT(CommonUnimpStub) +{ + if (EAX_reg(context)) + MSG( "*** Unimplemented Win32 API: %s\n", EAX_reg(context) ); + + switch ((ECX_reg(context) >> 4) & 0x0f) + { + case 15: EAX_reg(context) = -1; break; + case 14: EAX_reg(context) = 0x78; break; + case 13: EAX_reg(context) = 0x32; break; + case 1: EAX_reg(context) = 1; break; + default: EAX_reg(context) = 0; break; + } + + ESP_reg(context) += (ECX_reg(context) & 0x0f) * 4; +} + +/********************************************************************** + * HouseCleanLogicallyDeadHandles (KERNEL32.33) + */ +void WINAPI HouseCleanLogicallyDeadHandles(void) +{ + /* Whatever this is supposed to do, our handles probably + don't need it :-) */ +} + BOOL32 WINAPI _KERNEL32_100(HANDLE32 threadid,DWORD exitcode,DWORD x) { FIXME(thread,"(%d,%ld,0x%08lx): stub\n",threadid,exitcode,x);