From 085b1c7ec7b10849546e8393ebb053d9d0d8772d Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 6 Jun 2018 17:27:37 -0400 Subject: [PATCH] Implement some 16-bit APIs that our hello16.exe needs. --- native/doscalls-lx.h | 41 ++++++++++++++++++++++++++++++++++++ native/doscalls.c | 50 +++++++++++++++++++++++++++++++++++++++++--- native/doscalls.h | 13 ++++++++++++ native/msg-lx.h | 25 +++++++++++++++++++++- native/msg.c | 18 ++++++++++++---- native/msg.h | 1 + 6 files changed, 140 insertions(+), 8 deletions(-) diff --git a/native/doscalls-lx.h b/native/doscalls-lx.h index 52bea16..8c01448 100644 --- a/native/doscalls-lx.h +++ b/native/doscalls-lx.h @@ -9,6 +9,32 @@ /* This is glue code for OS/2 binaries. Native binaries don't need this. */ #if LX_LEGACY +static VOID bridge16to32_Dos16Exit(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, result); + LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, action); + Dos16Exit(action, result); +} + +static APIRET16 bridge16to32_Dos16GetHugeShift(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pcount); + return Dos16GetHugeShift(pcount); +} + +static APIRET16 bridge16to32_Dos16GetMachineMode(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PBYTE, pmode); + return Dos16GetMachineMode(pmode); +} + +static APIRET16 bridge16to32_Dos16GetVersion(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PUSHORT, pver); + return Dos16GetVersion(pver); +} + +static APIRET16 bridge16to32_Dos16GetPID(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PPIDINFO, ppidinfo); + return Dos16GetPID(ppidinfo); +} + static APIRET16 bridge16to32_DosSemRequest(uint8 *args) { LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(LONG, ms); LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PHSEM16, sem); @@ -32,6 +58,11 @@ static APIRET16 bridge16to32_DosSemSet(uint8 *args) { } LX_NATIVE_MODULE_16BIT_SUPPORT() + LX_NATIVE_MODULE_16BIT_API(Dos16Exit) + LX_NATIVE_MODULE_16BIT_API(Dos16GetHugeShift) + LX_NATIVE_MODULE_16BIT_API(Dos16GetMachineMode) + LX_NATIVE_MODULE_16BIT_API(Dos16GetVersion) + LX_NATIVE_MODULE_16BIT_API(Dos16GetPID) LX_NATIVE_MODULE_16BIT_API(DosSemRequest) LX_NATIVE_MODULE_16BIT_API(DosSemClear) LX_NATIVE_MODULE_16BIT_API(DosSemWait) @@ -44,6 +75,11 @@ LX_NATIVE_MODULE_DEINIT({ static int init16_doscalls(void) { LX_NATIVE_MODULE_INIT_16BIT_SUPPORT() + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16Exit, 4) + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetHugeShift, 4) + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetMachineMode, 4) + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetVersion, 4) + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16GetPID, 4) LX_NATIVE_INIT_16BIT_BRIDGE(DosSemRequest, 8) LX_NATIVE_INIT_16BIT_BRIDGE(DosSemClear, 4) LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8) @@ -53,6 +89,11 @@ static int init16_doscalls(void) { } LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; }) + LX_NATIVE_EXPORT16(Dos16Exit, 5), + LX_NATIVE_EXPORT16(Dos16GetHugeShift, 41), + LX_NATIVE_EXPORT16(Dos16GetMachineMode, 49), + LX_NATIVE_EXPORT16(Dos16GetVersion, 92), + LX_NATIVE_EXPORT16(Dos16GetPID, 94), LX_NATIVE_EXPORT16(DosSemRequest, 140), LX_NATIVE_EXPORT16(DosSemClear, 141), LX_NATIVE_EXPORT16(DosSemWait, 142), diff --git a/native/doscalls.c b/native/doscalls.c index dd05845..77045d6 100644 --- a/native/doscalls.c +++ b/native/doscalls.c @@ -295,10 +295,8 @@ static void runDosExitList(const uint32 why) } // for } // runDosExitList -VOID DosExit(ULONG action, ULONG exitcode) +static VOID DosExit_implementation(ULONG action, ULONG exitcode) { - TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode); - // !!! FIXME: what does a value other than 0 or 1 do here? if (action == EXIT_THREAD) { // !!! FIXME: If last thread: terminate process. @@ -310,6 +308,12 @@ VOID DosExit(ULONG action, ULONG exitcode) runDosExitList(TC_EXIT); GLoaderState.terminate(exitcode); +} // DosExit_implementation + +VOID DosExit(ULONG action, ULONG exitcode) +{ + TRACE_NATIVE("DosExit(%u, %u)", (uint) action, (uint) exitcode); + DosExit_implementation(action, exitcode); } // DosExit APIRET DosExitList(ULONG ordercode, PFNEXITLIST fn) @@ -2862,6 +2866,46 @@ APIRET DosSetFileSize(HFILE h, ULONG len) return NO_ERROR; } // DosSetFileSize +APIRET16 Dos16GetVersion(PUSHORT pver) +{ + TRACE_NATIVE("Dos16GetVersion(%p)", pver); + uint8 *bytes = (uint8 *) pver; + FIXME("better version here?"); + bytes[0] = 2; + bytes[1] = 4; + return NO_ERROR; +} // Dos16GetVersion + +APIRET16 Dos16GetMachineMode(PBYTE pmode) +{ + TRACE_NATIVE("Dos16GetMachineMode(%p)", pmode); + *pmode = 1; // 1==OS/2 mode (as opposed to zero for DOS mode). + return NO_ERROR; +} // Dos16GetMachineMode + +APIRET16 Dos16GetHugeShift(PUSHORT pcount) +{ + TRACE_NATIVE("Dos16GetHugeShift(%p)", pcount); + *pcount = 0; FIXME("maybe?"); + return NO_ERROR; +} // Dos16GetHugeShift + +APIRET16 Dos16GetPID(PPIDINFO ppidinfo) +{ + TRACE_NATIVE("Dos16GetPID(%p)", ppidinfo); + PTIB2 tib2 = (PTIB2) LX_GETTIB2(); + ppidinfo->pid = GLoaderState.pib.pib_ulpid; + ppidinfo->tid = tib2->tib2_ultid; + ppidinfo->pidParent = GLoaderState.pib.pib_ulppid; + return NO_ERROR; +} // Dos16GetPID + +VOID Dos16Exit(USHORT action, USHORT exitcode) +{ + TRACE_NATIVE("Dos16Exit(%u, %u)", (uint) action, (uint) exitcode); + DosExit_implementation(action, exitcode); +} // Dos16Exit + LX_NATIVE_CONSTRUCTOR(doscalls) { diff --git a/native/doscalls.h b/native/doscalls.h index 72eb733..f356eb4 100644 --- a/native/doscalls.h +++ b/native/doscalls.h @@ -430,6 +430,19 @@ OS2EXPORT APIRET16 OS2API16 DosSemWait(PHSEM16 sem, LONG ms) OS2APIINFO(142); OS2EXPORT APIRET16 OS2API16 DosSemSet(PHSEM16 sem) OS2APIINFO(143); +// These are only meant to be available to 16-bit binaries, some were removed in OS/2 2.0's SDK. +OS2EXPORT APIRET16 OS2API16 Dos16GetVersion(PUSHORT pver) OS2APIINFO(92); +OS2EXPORT APIRET16 OS2API16 Dos16GetMachineMode(PBYTE pmode) OS2APIINFO(49); +OS2EXPORT APIRET16 OS2API16 Dos16GetHugeShift(PUSHORT pcount) OS2APIINFO(41); +OS2EXPORT VOID OS2API16 Dos16Exit(USHORT action, USHORT result) OS2APIINFO(5); + +typedef struct { + PID pid; + TID tid; + PID pidParent; +} PIDINFO, *PPIDINFO; +OS2EXPORT APIRET16 OS2API16 Dos16GetPID(PPIDINFO ppidinfo) OS2APIINFO(94); + // !!! FIXME: these should probably get sorted alphabetically and/or grouped // !!! FIXME: into areas of functionality, but for now, I'm just listing them diff --git a/native/msg-lx.h b/native/msg-lx.h index f452d9e..c91855c 100644 --- a/native/msg-lx.h +++ b/native/msg-lx.h @@ -9,7 +9,30 @@ /* This is glue code for OS/2 binaries. Native binaries don't need this. */ #if LX_LEGACY -LX_NATIVE_MODULE_INIT() +static APIRET16 bridge16to32_Dos16PutMessage(uint8 *args) { + LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PCHAR, pBuf); + LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, cbMsg); + LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, hfile); + return Dos16PutMessage(hfile, cbMsg, pBuf); +} + +LX_NATIVE_MODULE_16BIT_SUPPORT() + LX_NATIVE_MODULE_16BIT_API(Dos16PutMessage) +LX_NATIVE_MODULE_16BIT_SUPPORT_END() + +LX_NATIVE_MODULE_DEINIT({ + LX_NATIVE_MODULE_DEINIT_16BIT_SUPPORT(); +}) + +static int init16_msg(void) { + LX_NATIVE_MODULE_INIT_16BIT_SUPPORT() + LX_NATIVE_INIT_16BIT_BRIDGE(Dos16PutMessage, 8) + LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END() + return 1; +} + +LX_NATIVE_MODULE_INIT({ if (!init16_msg()) return 0; }) + LX_NATIVE_EXPORT16(Dos16PutMessage, 1), LX_NATIVE_EXPORT(DosPutMessage, 5) LX_NATIVE_MODULE_INIT_END() diff --git a/native/msg.c b/native/msg.c index 1d05624..f921f2f 100644 --- a/native/msg.c +++ b/native/msg.c @@ -6,18 +6,28 @@ * This file written by Ryan C. Gordon. */ -#include - -#include "os2native.h" +#include "os2native16.h" #include "msg.h" +#include + #include "msg-lx.h" APIRET DosPutMessage(HFILE handle, ULONG msglen, PCHAR msg) { + TRACE_NATIVE("DosPutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg); + FIXME("really implement this"); write(handle, msg, msglen); - return 0; + return NO_ERROR; } // DosPutMessage +APIRET16 Dos16PutMessage(USHORT handle, USHORT msglen, PCHAR msg) +{ + TRACE_NATIVE("Dos16PutMessage(%u, %u, %p)", (uint) handle, (uint) msglen, msg); + FIXME("really implement this"); + write(handle, msg, msglen); + return NO_ERROR; +} // Dos16PutMessage + // end of msg.c ... diff --git a/native/msg.h b/native/msg.h index 9860f3a..49cb6bb 100644 --- a/native/msg.h +++ b/native/msg.h @@ -15,6 +15,7 @@ extern "C" { #endif +OS2EXPORT APIRET16 OS2API16 Dos16PutMessage(USHORT hfile, USHORT cbMsg, PCHAR pBuf) OS2APIINFO(1); OS2EXPORT APIRET OS2API DosPutMessage(HFILE hfile, ULONG cbMsg, PCHAR pBuf) OS2APIINFO(5); #ifdef __cplusplus