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.
 
 
 
 
 
 

432 lines
14 KiB

/*****************************************************************************
*
* ROUTINES.C
*
* Copyright (C) Microsoft Corporation 1990-1994.
* All Rights reserved.
*
******************************************************************************
*
* Module Intent: Encapuslates routines and data structures used for the
* macro language to find routines.
*
*****************************************************************************/
#include "help.h"
#include "inc\routines.h"
#pragma hdrstop
/*****************************************************************************
* *
* Defines *
* *
*****************************************************************************/
#define SzDLLName(pgbind) ((LPSTR)(pgbind->rgbData+pgbind->ichDLL))
#define SzFunc(pgbind) ((LPSTR)(pgbind->rgbData+pgbind->ichFunc))
#define SzProto(pgbind) ((LPSTR)(pgbind->rgbData+pgbind->ichProto))
#define MAX_BINDDATA 255
static LL llGBind; // Linked list for registered DLLs
/*
chOpenBrace '('
chCloseBrace ')'
chSeparator1 ':'
chSeparator2 ';'
chStartQuote '`'
chEndQuote '\''
chQuote '"'
chEscape '\\'
chParamSep ','
chReturnSep '='
chShortSigned 'i'
chShortUnsigned 'u'
chNearString 's'
chLongSigned 'I'
chLongUnsigned 'U'
chFarString 'S'
chVoid 'v'
*/
static BIND bindLocalExport[] =
{
NULL, NULL, 0, // Invalid table entry
"About", (PSTR) txtZeroLength, (FARPROC) About,
"AddAccelerator", "UUS", (FARPROC) AddAuthorAcc,
"AA", "UUS", (FARPROC) AddAuthorAcc,
"AL", "I=SUSS", (FARPROC) ALink, // 4.0
"Annotate", (PSTR) txtZeroLength, (FARPROC) Annotate,
"AN", (PSTR) txtZeroLength, (FARPROC) Annotate,
"AppendItem", "SSSS", (FARPROC) AppendAuthorItem,
"AI", "SSSS", (FARPROC) AppendAuthorItem,
"Back", "i=", (FARPROC) Back,
"BF", (PSTR) txtZeroLength, (FARPROC) BackFlush, // 4.0
"BookmarkDefine", (PSTR) txtZeroLength, (FARPROC) BookmarkDefine,
"BookmarkMore", (PSTR) txtZeroLength, (FARPROC) BookmarkMore,
"BrowseButtons", (PSTR) txtZeroLength, (FARPROC) BrowseButtons,
"ChangeButtonBinding","SS", (FARPROC) VChgAuthorButtonMacro,
"CBB", "SS", (FARPROC) VChgAuthorButtonMacro,
"ChangeItemBinding", "SS", (FARPROC) ChangeAuthorItem,
"CIB", "SS", (FARPROC) ChangeAuthorItem,
"CheckItem", "S", (FARPROC) CheckAuthorItem,
"CI", "S", (FARPROC) CheckAuthorItem,
"CloseWindow", "S", (FARPROC) CloseWin,
"CW", "S", (FARPROC) CloseWin,
"CE", "SS", (FARPROC) ChangeEnable, // 4.0
// command is an internal macro, not supported by the help compiler
"Command", "U", (FARPROC) Command,
"Contents", (PSTR) txtZeroLength, (FARPROC) Contents,
// REVIEW: Are we SURE that CopyDialog should go to CopySpecial???
"CopyDialog", (PSTR) txtZeroLength, (FARPROC) CopySpecial,
"CopyTopic", (PSTR) txtZeroLength, (FARPROC) doCopy,
"Compare", "I=S", (FARPROC) Compare,
"CS", (PSTR) txtZeroLength, (FARPROC) DestroyAllSecondarys, // 4.0
"CT", (PSTR) txtZeroLength, (FARPROC) doCopy,
"CreateButton", "SSS", (FARPROC) VCreateAuthorButton,
"CB", "SSS", (FARPROC) VCreateAuthorButton,
"DeleteItem", "S", (FARPROC) DeleteAuthorItem,
"DeleteMark", "S", (FARPROC) DeleteMark,
"DestroyButton", "S", (FARPROC) VDestroyAuthorButton,
"DEB", "S", (FARPROC) VDestroyAuthorButton,
"DisableButton", "S", (FARPROC) DisableAuthorButton,
"DB", "S", (FARPROC) DisableAuthorButton,
"DisableItem", "S", (FARPROC) DisableAuthorItem,
"DI", "S", (FARPROC) DisableAuthorItem,
"EnableButton", "S", (FARPROC) EnableAuthorButton,
"EB", "S", (FARPROC) EnableAuthorButton,
"EnableItem", "S", (FARPROC) EnableAuthorItem,
"EndMPrint", (PSTR) txtZeroLength, (FARPROC) EndMPrint, // 4.0
"EI", "S", (FARPROC) EnableAuthorItem,
"EF", "I=SSUS", (FARPROC) ExecFile,
"ExecProgram", "I=SU", (FARPROC) HelpExec,
"EP", "I=SU", (FARPROC) HelpExec,
"Exit", (PSTR) txtZeroLength, (FARPROC) Exit,
"ExtAbleItem", "SU", (FARPROC) AbleAuthorItem,
"ExtInsertItem", "SSSSIU", (FARPROC) ExtInsertAuthorItem,
"ExtInsertMenu", "SSSIU", (FARPROC) ExtInsertAuthorPopup,
"FileOpen", (PSTR) txtZeroLength, (FARPROC) FileOpen,
"FO", (PSTR) txtZeroLength, (FARPROC) FileOpen,
"FE", "I=S", (FARPROC) FileExist,
"Find", (PSTR) txtZeroLength, (FARPROC) Find,
"FD", (PSTR) txtZeroLength, (FARPROC) Finder,
"FloatingMenu", (PSTR) txtZeroLength, (FARPROC) FloatingAuthorMenu,
"FH", "U", (FARPROC) FlushMessageQueue, // 4.0
"FocusWindow", "S", (FARPROC) FocusWin,
"Generate", "UUU", (FARPROC) OldGenerate,
"GotoMark", "S", (FARPROC) GotoMark,
"HelpOn", (PSTR) txtZeroLength, (FARPROC) HelpOn,
"HelpOnTop", (PSTR) txtZeroLength, (FARPROC) HelpOnTop,
"History", (PSTR) txtZeroLength, (FARPROC) History,
"IB", "I=", (FARPROC) IsBook,
"IE", "ISS", (FARPROC) IfThenElse,
"IF", "IS", (FARPROC) IfThen,
"IfThen", "IS", (FARPROC) IfThen,
"IfThenElse", "ISS", (FARPROC) IfThenElse,
"InitMPrint", "I=", (FARPROC) InitMPrint, // 4.0
"InsertItem", "SSSSI", (FARPROC) InsertAuthorItem,
"InsertMenu", "SSU", (FARPROC) InsertAuthorPopup,
"IsMark", "I=S", (FARPROC) FMark,
"NM", "I=S", (FARPROC) FNotMark,
"JumpContents", "S", (FARPROC) FJumpIndex,
"JumpContext", "SU", (FARPROC) FJumpContext,
"JC", "SU", (FARPROC) FJumpContext,
"JumpHash", "SU", (FARPROC) FJumpHash,
"JH", "SU", (FARPROC) FJumpHash,
"JumpHelpOn", (PSTR) txtZeroLength, (FARPROC) FJumpHOH,
"JumpId", "SS", (FARPROC) FJumpId,
"JI", "SS", (FARPROC) FJumpId,
"JumpKeyword", "SS", (FARPROC) FShowKey,
"JK", "SS", (FARPROC) FShowKey,
"JW", "I=SS", (FARPROC) JumpWindow, // 4.0
"KL", "I=SUSS", (FARPROC) KLink, // 4.0
"MPrintHash", "I=SU", (FARPROC) MPrintHash, // 4.0
"MPrintId", "I=SS", (FARPROC) MPrintId, // 4.0
"MU", "", (FARPROC) MenuButton, // 4.0, undocumented
"Next", (PSTR) txtZeroLength, (FARPROC) Next,
"Not", "I=I", (FARPROC) FNot,
"NS", (PSTR) txtZeroLength, (FARPROC) NoShow,
"PopupContext", "SU", (FARPROC) FPopupCtx,
"PC", "SU", (FARPROC) FPopupCtx,
"PopupHash", "SU", (FARPROC) FPopupHash,
"PopupId", "SS", (FARPROC) FPopupId,
"PI", "SS", (FARPROC) FPopupId,
"PositionWindow", "IIIIUS", (FARPROC) PositionWin,
"PW", "IIIIUS", (FARPROC) PositionWin,
"Prev", (PSTR) txtZeroLength, (FARPROC) Prev,
"Print", (PSTR) txtZeroLength, (FARPROC) Print,
"PrinterSetup", (PSTR) txtZeroLength, (FARPROC) PrinterSetup,
"RegisterRoutine", "SSS", (FARPROC) FRegisterDLL,
"RR", "SSS", (FARPROC) FRegisterDLL,
"RemoveAccelerator", "UU", (FARPROC) RemAuthorAcc,
"RA", "UU", (FARPROC) RemAuthorAcc,
"ResetMenu", (PSTR) txtZeroLength, (FARPROC) ResetAuthorMenus,
"SaveMark", "S", (FARPROC) SaveMark,
"Search", (PSTR) txtZeroLength, (FARPROC) Search,
"SetContents", "SU", (FARPROC) FSetIndex,
"SetHelpOnFile", "S", (FARPROC) SetHelpOn,
"SE", "I=SSUSSS", (FARPROC) FShellExecute, // 4.0
"SH", "I=SSIUS", (FARPROC) ShortCut, // 4.0
"SPC", "U", (FARPROC) SetPopupColor, // 4.0
"SW", "S", (FARPROC) ShowInWindow, // 4.0
"Tab", "U", (FARPROC) ShowTab, // 4.0
"Test", "U", (FARPROC) Test, // 4.0
"TC", "I=UU", (FARPROC) TCard, // 4.0
"UncheckItem", "S", (FARPROC) UncheckAuthorItem,
"UI", "S", (FARPROC) UncheckAuthorItem,
#ifdef BINDDRV /* Used for BINDDRV.EXE */
"proc1", "UUUU", proc1,
"proc2", "UUUU", proc2,
"proc3", "UUS", proc3,
"proc4", (PSTR) txtZeroLength, proc4,
"proc5", "SSS", proc5,
"proc20", "IIII", proc1,
"proc21", "IIII", proc2
#endif
};
/*------------------------------------------------------------*\
| This is a semphore for un-interruptable macros
\*------------------------------------------------------------*/
BOOL fMacroFlag;
/**************************************************************\
|
| Routines
|
\**************************************************************/
/*****************************
-
- Name: QprocFindLocalRoutine
*
* Purpose: Finds entry in bind for function
*
* Arguments: sz - Null terminated string containing function name
* pchProto - Buffer to place prototype for function
*
* Returns: Function pointer of routine to call
*
* Method: Simple linear search of table with comparison
*
******************************/
FARPROC STDCALL QprocFindLocalRoutine(PCSTR psz, PSTR pchProto)
{
int i;
for (i = 1; i < sizeof(bindLocalExport) / sizeof(bindLocalExport[0]); i++) {
if (_strcmpi(psz, bindLocalExport[i].szFunc) == 0) {
ASSERT(strlen(bindLocalExport[i].szProto) <= cchMAXPROTO);
strcpy(pchProto, bindLocalExport[i].szProto);
return bindLocalExport[i].lpfn;
}
}
return NULL;
}
/*****************************
*
- Name: QprocFindGlobalRoutine
-
* Purpose: Finds entry in bind for function
*
* Arguments: sz - Null terminated string containing function name
* pchProto - Buffer to place prototype for function
*
* Returns: Link list structure.
* // johnhall -- change made so I can place extra info associated
* // with the return to support either 16 or 32bit dll's.
*
* Method: Lookup in a linked list
*
*****************************/
QGBIND STDCALL QprocFindGlobalRoutine(LPCSTR psz, PSTR pchProto)
{
QGBIND qgbind;
FARPROC lpfn;
HLLN hlln = NULL;
while (hlln = WalkLL(llGBind, hlln)) {
qgbind = (QGBIND) GetLLDataPtr(hlln);
if (!WCmpiSz(psz, SzFunc(qgbind))) {
// Find it normally or thunked.
if (qgbind->lpfn == NULL) {
qgbind->lpfn = FarprocDLLGetEntry(SzDLLName(qgbind),
SzFunc(qgbind), &qgbind->dwTag);
}
// It just ain't here. Delete from list.
if (qgbind->lpfn == NULL) {
DeleteHLLN( llGBind, hlln);
return(NULL);
}
lpfn = qgbind->lpfn;
strcpy(pchProto, SzProto(qgbind));
return qgbind;
}
}
return NULL;
}
/*******************
**
** Name: FRegisterDLL()
**
** Purpose: Makes WinHelp aware of DLLs and DLL entry points
**
** Arguments: qchDLLName - name of the DLL. An extension of
** .EXE or .DLL is assumed.
** qchEntry - exported entry to find in DLL
** qchProto - prototype for the function
**
** Returns: TRUE iff it successfully registers the call
**
*******************/
BOOL STDCALL FRegisterDLL(LPSTR qchDLLName, LPSTR qchFunc, LPSTR qchProto)
{
int cbDLLName;
int cbFunc;
int cbProto;
int cb;
HLLN hlln = NULL;
BYTE szBuf[MAX_BINDDATA+1];
PGBIND pgbind = (PGBIND) szBuf;
if (llGBind == NULL && ((llGBind = LLCreate()) == NULL))
return FALSE;
/*
* Walk the existing list. If the function already exists on the list,
* then simply avoid putting the definition in a second time.
*/
while ((hlln = WalkLL(llGBind, hlln)) != NULL) {
if (!WCmpiSz(qchFunc, SzFunc(((QGBIND) GetLLDataPtr(hlln)))))
return TRUE;
}
cbDLLName = lstrlen(qchDLLName);
cbFunc = lstrlen(qchFunc);
cbProto = lstrlen(qchProto);
if (cbDLLName == 0 || cbFunc == 0)
return FALSE;
cb = sizeof(GBIND) + cbDLLName + cbFunc + cbProto;
if (cb >= MAX_BINDDATA)
return FALSE;
pgbind->lpfn = NULL;
pgbind->ichDLL = 0;
pgbind->ichFunc = (WORD) (cbDLLName + 1);
pgbind->ichProto = (WORD) (cbDLLName + cbFunc + 2);
lstrcpy(SzDLLName(pgbind), qchDLLName);
lstrcpy(SzFunc(pgbind), qchFunc);
lstrcpy(SzProto(pgbind), qchProto);
if (!InsertLL(llGBind, (QV)pgbind, cb))
return FALSE;
return TRUE;
}
/*******************
**
** Name: DiscardDLLList ()
**
** Purpose: Free's the linked list of DLL routines
**
** Arguments: None
**
** Returns: Nothing
**
*******************/
VOID STDCALL DiscardDLLList(void)
{
DestroyLL(llGBind);
llGBind = NULL;
}
/***************************************************************************
*
- Name: FRaiseMacroFlag
-
* Purpose: Sets a semaphore for those macros that shouldn't
* be interrupted by others.
*
* Arguments: none
*
* Returns: TRUE if the semaphore wasn't previously set
*
* Globals Used: fMacroFlag
*
* +++
*
* Notes: This function itself is not re-entrant.
*
***************************************************************************/
BOOL STDCALL FRaiseMacroFlag(void)
{
if (fMacroFlag)
return FALSE;
else
return fMacroFlag = TRUE;
}
/***************************************************************************
*
- Name: ClearMacroFlag
-
* Purpose: Resets a semaphore used by macros that can't be
* interrupted by other macros.
*
* Arguments: none
*
* Returns: nothing
*
* Globals Used: fMacroFlag
*
* +++
*
* Notes: This code makes a critical section wrt FRaiseMacroFlag
*
***************************************************************************/
void STDCALL ClearMacroFlag( void )
{
fMacroFlag = FALSE;
}
VOID STDCALL ShowInWindow(NPSTR nszMember)
{
FM fmTmp = (FM) LocalStrDup(GetCurFilename());
FCloneHde(nszMember, &fmTmp, NULL);
ASSERT(!fmTmp);
// fmTmp will have been deleted by FReplaceHde
}
void STDCALL SetPopupColor(COLORREF clr)
{
clrPopup = clr;
}