windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/as/cpi32.9x/osi.cpp

256 lines
5.2 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
#include "precomp.h"
//
// OSI.C
// OS Isolation Layer, Win95 version
//
// Copyright(c) Microsoft 1997-
//
#include <version.h>
#include <ndcgver.h>
#include <osi.h>
extern "C"
{
#include <asthk.h>
}
#define MLZ_FILE_ZONE ZONE_CORE
//
// OSI_Load()
// This handles our process attach code. It establishes thunks to the
// 16-bit Win95 library. WE CAN ONLY DO THIS ONCE. It is imperative
// that a flat-thunk pair come/go together, since the 32-bit piece hangs
// on to a shared memory section that is the thunk table in the 16-bit piece.
//
void OSI_Load(void)
{
DebugEntry(OSI_Load);
ASSERT(!g_hInstAs16);
g_asWin95 = TRUE;
//
// Establish the thunks with AS16
//
if (FT_thkConnectToFlatThkPeer(TEXT("rdas16.dll"), TEXT("rdas32.dll")))
{
OSILoad16(&g_hInstAs16);
ASSERT(g_hInstAs16);
}
else
{
ERROR_OUT(("Couldn't load nmaswin.dll"));
//
// Note, even on load failure, we will continue. We just don't let
// you do app sharing stuff.
//
}
DebugExitVOID(OSI_Load);
}
//
// OSI_Unload()
// This handles our process detach code. It frees the 16-bit library that
// we are pared with.
//
void OSI_Unload(void)
{
DebugEntry(OSI_Unload);
if (g_hInstAs16)
{
//
// See comment for OSI_Term(). On catastropic failure, we may
// call this BEFORE OSI_Term. So null out variables it uses.
//
g_osiInitialized = FALSE;
//
// Free 16-bit library so loads + frees are paired. Note that 16-bit
// cleanup occurs when the library is freed.
//
FreeLibrary16(g_hInstAs16);
g_hInstAs16 = 0;
}
DebugExitVOID(OSI_Unload);
}
//
// OSI_Init
// This initializes our display driver/hook dll communication code.
//
// We load our 16-bit library and establish thunks to it.
//
void OSI_Init(void)
{
DebugEntry(OSI_Init);
if (!g_hInstAs16)
{
WARNING_OUT(("No app sharing at all since library not present"));
DC_QUIT;
}
//
// We are quasi initialized.
//
g_osiInitialized = TRUE;
ASSERT(g_asMainWindow);
//
// Call into 16-bit code to do any initialization necessary
//
g_asCanHost = OSIInit16(DCS_MAKE_VERSION(), g_asMainWindow,
(LPDWORD)&g_asSharedMemory, (LPDWORD)g_poaData,
(LPDWORD)&g_lpimSharedData, (LPDWORD)&g_sbcEnabled, (LPDWORD)g_asbcShuntBuffers,
g_asbcBitMasks);
if (g_asCanHost)
{
ASSERT(g_asSharedMemory);
ASSERT(g_poaData[0]);
ASSERT(g_poaData[1]);
ASSERT(g_lpimSharedData);
if (g_sbcEnabled)
{
ASSERT(g_asbcShuntBuffers[0]);
}
}
else
{
ASSERT(!g_asSharedMemory);
ASSERT(!g_poaData[0]);
ASSERT(!g_poaData[1]);
ASSERT(!g_sbcEnabled);
ASSERT(!g_asbcShuntBuffers[0]);
}
DC_EXIT_POINT:
DebugExitVOID(OSI_Init);
}
//
// OSI_Term()
// This cleans up our resources, closes the driver, etc.
//
void OSI_Term(void)
{
UINT i;
DebugEntry(OSI_Term);
ASSERT(GetCurrentThreadId() == g_asMainThreadId);
if (g_osiInitialized)
{
g_osiInitialized = FALSE;
//
// In Ctl+Alt+Del, the process detach of mnmcpi32.dll may happen
// first, followed by the process detach of mnmcrsp_.dll. The latter
// will call DCS_Term, which will call OSI_Term(). We don't want to
// blow up. So OSI_Unload nulls out these variables also.
//
ASSERT(g_hInstAs16);
OSITerm16(FALSE);
}
// Clear our shared memory variables
for (i = 0; i < 3; i++)
{
g_asbcBitMasks[i] = 0;
}
for (i = 0; i < SBC_NUM_TILE_SIZES; i++)
{
g_asbcShuntBuffers[i] = NULL;
}
g_sbcEnabled = FALSE;
g_asSharedMemory = NULL;
g_poaData[0] = NULL;
g_poaData[1] = NULL;
g_asCanHost = FALSE;
g_lpimSharedData = NULL;
DebugExitVOID(OSI_Term);
}
//
// OSI_FunctionRequest()
//
// This is a generic way of communicating with the graphics part of
// hosting. On NT, it's a real display driver, and this uses ExtEscape.
// On Win95, it's a 16-bit dll, and this uses a thunk.
//
BOOL OSI_FunctionRequest
(
DWORD escapeFn,
LPOSI_ESCAPE_HEADER pRequest,
DWORD requestLen
)
{
BOOL rc;
DebugEntry(OSI_FunctionRequest);
ASSERT(g_osiInitialized);
ASSERT(g_hInstAs16);
//
// NOTE: In Win95, since we use a direct thunk to communicate
// with our driver, we don't really need to
// (1) Fill in an identifier (AS16 knows it's us)
// (2) Fill in the escape fn field
// (3) Fill in the version stamp (the thunk fixups will fail
// if pieces are mismatched)
//
// However, we keep the identifer field around. If/when we support
// multiple AS clients at the same time, we will want to know
// who the caller was.
//
pRequest->identifier = OSI_ESCAPE_IDENTIFIER;
pRequest->escapeFn = escapeFn;
pRequest->version = DCS_MAKE_VERSION();
rc = OSIFunctionRequest16(escapeFn, pRequest, requestLen);
DebugExitBOOL(OSI_FunctionRequest, rc);
return(rc);
}
void OSI_RepaintDesktop(void)
{
}
void OSI_SetGUIEffects(BOOL fOn)
{
}