Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

571 lines
13 KiB

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
tllp.c
Abstract:
This implements the local transport layer for OSDebug versions
2 and 4 on Win32.
Author:
Jim Schaad (jimsch)
Kent Forschmiedt (kentf)
--*/
#ifdef WIN32
#include <windows.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <memory.h>
#ifdef OSDEBUG4
#include "odtypes.h"
#include "od.h"
#include "odp.h"
#include "odassert.h"
#else
#include "defs.h"
#include "mm.h"
#include "ll.h"
#include "od.h"
#include "tl.h"
#include "llhpt.h"
#include "mhhpt.h"
#include "lbhpt.h"
#include "osassert.h"
#include "emdm.h"
#endif
#include "dbgver.h"
extern AVS Avs;
#ifndef CVWS
int _acrtused = 0;
#endif
int fReplyDM = FALSE;
int fReplyEM = FALSE;
// debug monitor function definitions.
#ifdef WIN32
LPDMINIT LpDmInit;
LPDMFUNC LpDmFunc;
LPDMDLLINIT LpDmDllInit;
void FAR PASCAL LOADDS DMInit (DMTLFUNCTYPE, LPVOID);
#else
void FAR PASCAL LOADDS DMInit (DMTLFUNCTYPE);
#endif
LPDBF lpdbf = (LPDBF)0; // the debugger helper functions
LOCAL TLCALLBACKTYPE TLCallBack; // central osdebug callback function
XOSD FAR PASCAL LOADDS TLFunc ( TLF, HPID, DWORD, LONG);
XOSD FAR PASCAL LOADDS DMTLFunc ( TLF, HPID, DWORD, LONG);
// these variables are static to prevent collisions with other TL's
static BOOL fConDM = FALSE;
static BOOL fConEM = FALSE;
static BOOL fConnected = FALSE;
static LPBYTE lpbDM;
static DWORD ibMaxDM;
static DWORD ibDM;
static LPBYTE lpbEM;
static DWORD ibMaxEM;
static DWORD ibEM;
char * LpszDm = "DM.DLL";
HANDLE HDm = NULL;
/**** DBGVersionCheck ****
* *
* PURPOSE: *
* *
* To export our version information to the debugger. *
* *
* INPUTS: *
* *
* NONE. *
* *
* OUTPUTS: *
* *
* Returns - A pointer to the standard version information. *
* *
* IMPLEMENTATION: *
* *
* Just returns a pointer to a static structure. *
* *
***************************************************************************/
#ifdef DEBUGVER
DEBUG_VERSION('T','L',"Local Transport Layer")
#else
RELEASE_VERSION('T','L',"Local Transport Layer")
#endif
DBGVERSIONCHECK()
BOOL DllVersionMatch(HANDLE hMod, LPSTR pType) {
DBGVERSIONPROC pVerProc;
LPAVS pavs;
pVerProc = (DBGVERSIONPROC)GetProcAddress(hMod, DBGVERSIONPROCNAME);
if (!pVerProc) {
return(FALSE); // no version entry point
} else {
pavs = (*pVerProc)();
if ((pType[0] != pavs->rgchType[0] || pType[1] != pavs->rgchType[1]) ||
(Avs.rlvt != pavs->rlvt) ||
(Avs.iRmj != pavs->iRmj)) {
return(FALSE);
}
}
return(TRUE);
}
XOSD FAR PASCAL LOADDS
TLFunc (
TLF wCommand,
HPID hpid,
DWORD wParam,
LONG lParam
)
/*++
Routine Description:
This function contains the dispatch loop for commands comming into
the transport layer. The address of this procedure is exported to
users of the DLL.
Arguments:
wCommand - Supplies the command to be executed.
hpid - Supplies the hpid for which the command is to be executed.
wParam - Supplies information about the command.
lParam - Supplies information about the command.
Return Value:
XOSD error code. xosdNone means that no errors occured. Other error
codes are defined in osdebug\include\od.h.
--*/
{
#ifndef OSDEBUG4
LPGIS lpgis;
#endif
char * lpsz;
XOSD xosd = xosdNone;
Unreferenced( hpid );
switch ( wCommand ) {
#ifndef OSDEBUG4
case tlfGlobalInit:
TLCallBack = (TLCALLBACKTYPE) lParam;
break;
case tlfGlobalDestroy:
break;
case tlfSetUIStruct: /* not used for local case */
break;
#endif
case tlfRegisterDBF:
lpdbf = (LPDBF) lParam;
break;
case tlfInit:
/*
* (LPCH) lParam isn't interesting
* pass the Local DMTLFunc to the debug monitor
*/
lpsz = (char *) lParam;
if ((lpsz[0] == 'D') && (lpsz[1] == 'M') &&
((lpsz[2] == ':') || (lpsz[2] == '='))) {
lpsz = LpszDm = &lpsz[3];
while ((*lpsz != 0) && (*lpsz != ' ')) lpsz++;
if (*lpsz != 0) {
*lpsz = 0;
lpsz++;
}
}
HDm = LoadLibrary(LpszDm);
if (HDm == NULL) {
xosd = xosdUnknown;
break;
}
// Do DM dll version check here
if (! DllVersionMatch(HDm, "DM")) {
xosd = xosdBadVersion;
FreeLibrary(HDm);
break;
}
if ((LpDmInit = (LPDMINIT) GetProcAddress(HDm, "DMInit")) == NULL) {
xosd = xosdUnknown;
FreeLibrary(HDm);
break;
}
if ((LpDmFunc = (LPDMFUNC) GetProcAddress(HDm, "DMFunc")) == NULL) {
xosd = xosdUnknown;
FreeLibrary(HDm);
break;
}
if ((LpDmDllInit = (LPDMDLLINIT) GetProcAddress(HDm, "DmDllInit")) == NULL) {
xosd = xosdUnknown;
FreeLibrary(HDm);
break;
}
#ifdef WIN32
if (LpDmDllInit(lpdbf) == FALSE) {
xosd = xosdUnknown;
FreeLibrary(HDm);
break;
}
#endif
LpDmInit(DMTLFunc, (LPVOID) lpsz);
break;
case tlfDestroy:
FreeLibrary(HDm);
HDm = NULL;
break;
case tlfGetProc:
*((TLFUNCTYPE FAR *) lParam) = TLFunc;
break;
case tlfConnect:
fConEM = TRUE;
fConnected = fConDM;
break;
case tlfDisconnect:
fConDM = fConnected = FALSE;
break;
case tlfSetBuffer:
lpbDM = (LPBYTE) lParam;
ibMaxDM = wParam;
break;
case tlfReply:
if (!fConnected) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
} else {
if ( wParam <= ibMaxEM ) {
_fmemcpy ( lpbEM, (LPBYTE) lParam, wParam );
ibEM = wParam;
} else {
ibEM = 0;
#ifdef OSDEBUG4
xosd = xosdInvalidParameter;
#else
xosd = xosdOverrun;
#endif
}
fReplyEM = TRUE;
}
break;
case tlfDebugPacket:
if ( !fConnected ) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
}
else {
#if DBG
static LPBYTE lpb = NULL;
static DWORD cb = 0;
if (wParam > cb) {
if (lpb != NULL) {
free(lpb);
}
lpb = malloc(wParam);
cb = wParam;
}
memcpy(lpb, (char *) lParam, wParam);
LpDmFunc( wParam, lpb);
#else // DBG
LpDmFunc ( wParam, (LPBYTE) lParam );
#endif // DBG
}
break;
case tlfRequest:
if ( !fConnected ) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
} else {
ibDM = 0;
fReplyDM = FALSE;
#if DBG
{
static LPBYTE lpb = NULL;
static DWORD cb = 0;
if (wParam > cb) {
if (lpb != NULL) {
free(lpb);
}
lpb = malloc(wParam);
cb = wParam;
}
memcpy(lpb, (char *) lParam, wParam);
LpDmFunc( wParam, lpb);
}
#else // DBG
LpDmFunc ( wParam, (LPBYTE) lParam );
#endif // DBG
#ifdef WIN32
while (fReplyDM == FALSE) {
/*
MSG msg;
while( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE ) )
DispatchMessage(&msg);
*/
Sleep(100);
}
#endif
fReplyDM = FALSE;
}
break;
case tlfGetVersion: // Get DM cpu
{
AVS *avs = (AVS*)lParam;
int size = sizeof(DBB) + sizeof(DMINFO);
LPDBB lpdbb = malloc(size);
LPDMINFO lpdmi = (LPDMINFO)(lpdbb->rgbVar);
lpdbb->dmf = dmfGetDmInfo;
lpdbb->hpid = 0;
lpdbb->htid = 0;
LpDmFunc(size, (LPVOID) lpdbb);
avs->mpt = avs->iRup = (USHORT)lpdmi->Processor.Type;
}
xosd = xosdNotRemote;
break;
case tlfGetInfo:
#ifndef OSDEBUG4
lpgis = (LPGIS) lParam;
_fstrcpy(lpgis->rgchInfo, "Local Transport Layer (LOCAL:)");
lpgis->fCanSetup = FALSE;
#endif
break;
case tlfSetup:
break;
default:
assert ( FALSE );
break;
}
return xosd;
} /* TLFunc() */
//
// DMTLFunc is what the debug monitor will call when it has something
// to do.
//
XOSD FAR PASCAL LOADDS
DMTLFunc (
TLF wCommand,
HPID hpid,
DWORD wParam,
LONG lParam
)
{
XOSD xosd = xosdNone;
switch ( wCommand ) {
case tlfInit:
break;
case tlfDestroy:
break;
case tlfConnect:
fConDM = TRUE;
fConnected = fConEM;
break;
case tlfDisconnect:
fConEM = fConnected = FALSE;
break;
case tlfSetBuffer:
lpbEM = (LPBYTE) lParam;
ibMaxEM = wParam;
break;
case tlfReply:
if (!fConnected) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
} else {
if ( wParam <= ibMaxDM ) {
ibDM = wParam;
_fmemcpy ( lpbDM, (LPBYTE) lParam, wParam );
fReplyDM = TRUE;
} else {
ibDM = 0;
}
fReplyDM = TRUE;
}
break;
case tlfDebugPacket:
if (!fConnected) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
} else {
#if DBG
static LPBYTE lpb = NULL;
static DWORD cb = 0;
if (wParam > cb) {
if (lpb != NULL) {
free(lpb);
}
lpb = malloc(wParam);
cb = wParam;
}
memcpy(lpb, (char *) lParam, wParam);
TLCallBack( hpid, wParam, (LONG) lpb);
#else // DBG
TLCallBack ( hpid, wParam, lParam );
#endif // DBG
}
break;
case tlfRequest:
if (!fConnected) {
#ifdef OSDEBUG4
xosd = xosdLineNotConnected;
#else
xosd = xosdIDError;
#endif
} else {
#if DBG
static LPBYTE lpb = NULL;
static DWORD cb = 0;
if (wParam > cb) {
if (lpb != NULL) {
free(lpb);
}
lpb = malloc(wParam);
cb = wParam;
}
memcpy(lpb, (char *) lParam, wParam);
TLCallBack( hpid, wParam, (LONG) lpb);
#else // DBG
TLCallBack ( hpid, wParam, lParam );
#endif // DBG
#ifdef WIN32
while (fReplyEM == FALSE) {
Sleep(100);
}
#endif
fReplyEM = FALSE;
if ( ibEM == 0 ) {
#ifdef OSDEBUG4
xosd = xosdInvalidParameter;
#else
xosd = xosdOverrun;
#endif
}
}
break;
default:
assert ( FALSE );
break;
}
return xosd;
}