Source code of Windows XP (NT5)
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.
|
|
/**************************************************************************
* TOOLHELP.C * * Contains the initalization and deinitialization code for the * TOOLHELP DLL. * **************************************************************************/
#include "toolpriv.h"
#undef VERSION
#include <mmsystem.h>
/* ----- Global variables ----- */ WORD segKernel; WORD wLibInstalled; WORD wTHFlags; HANDLE hMaster; HANDLE hGDIHeap; HANDLE hUserHeap; WORD NEAR *npwExeHead; WORD NEAR *npwTDBHead; WORD NEAR *npwTDBCur; DWORD NEAR *npdwSelTableStart; WORD NEAR *npwSelTableLen; FARPROC lpfnGetUserLocalObjType; FARPROC lpfnFatalExitHook; FARPROC lpfnNotifyHook; LPFNUSUD lpfnUserSeeUserDo; FARPROC lpfnGetFreeSystemResources; FARPROC lpfntimeGetTime; WORD wSel; WORD wLRUCount; char szKernel[] = "KERNEL";
/* ----- Import values ----- */ #define FATALEXITHOOK MAKEINTRESOURCE(318)
#define GETUSERLOCALOBJTYPE MAKEINTRESOURCE(480)
#define USERSEEUSERDO MAKEINTRESOURCE(216)
#define HASGPHANDLER MAKEINTRESOURCE(338)
#define TOOLHELPHOOK MAKEINTRESOURCE(341)
#define GETFREESYSTEMRESOURCES MAKEINTRESOURCE(284)
/* ToolHelpLibMain
* Called by DLL startup code. * Initializes TOOLHELP.DLL. */
int PASCAL ToolHelpLibMain( HANDLE hInstance, WORD wDataSeg, WORD wcbHeapSize, LPSTR lpszCmdLine) { HANDLE hKernel; HANDLE hUser; HANDLE hMMSys;
/* Unless we say otherwise, the library is installed OK */ wLibInstalled = TRUE;
/* Do the KERNEL type-checking. Puts the results in global variables */ KernelType();
/* If the KERNEL check failed (not in PMODE) return that the library did
* not correctly install but allow the load anyway. */ if (!wTHFlags) { wLibInstalled = FALSE;
/* Return success anyway, just fails all API calls */ return 1; }
/* Grab a selector. This is only necessary in Win30StdMode */ if (wTHFlags & TH_WIN30STDMODE) wSel = HelperGrabSelector();
/* Get the User and GDI heap handles if possible */ hKernel = GetModuleHandle((LPSTR)szKernel); hUser = GetModuleHandle("USER"); hUserHeap = UserGdiDGROUP(hUser); hGDIHeap = UserGdiDGROUP(GetModuleHandle("GDI"));
/* Get all the functions we may need. These functions only exist in
* the 3.1 USER and KERNEL. */ if (!(wTHFlags & TH_WIN30)) { /* FatalExit hook */ lpfnFatalExitHook = GetProcAddress(hKernel, FATALEXITHOOK);
/* Internal USER routine to get head of class list */ lpfnUserSeeUserDo = (LPFNUSUD)(FARPROC) GetProcAddress(hUser, USERSEEUSERDO);
/* Identifies objects on USER's local heap */ lpfnGetUserLocalObjType = GetProcAddress(hUser, GETUSERLOCALOBJTYPE);
/* Identifies parameter validation GP faults */ lpfnPV = GetProcAddress(hKernel, HASGPHANDLER);
/* See if the new TOOLHELP KERNEL hook is around */ lpfnNotifyHook = (FARPROC) GetProcAddress(hKernel, TOOLHELPHOOK); if (lpfnNotifyHook) wTHFlags |= TH_GOODPTRACEHOOK;
/* Get the USER system resources function */ lpfnGetFreeSystemResources = (FARPROC) GetProcAddress(hUser, GETFREESYSTEMRESOURCES); }
/* Make sure we don't ever call these in 3.0 */ else { lpfnFatalExitHook = NULL; lpfnUserSeeUserDo = NULL; lpfnGetUserLocalObjType = NULL; lpfnPV = NULL; }
/* Try to get the multimedia system timer function address */ hMMSys = GetModuleHandle("MMSYSTEM"); if (hMMSys) { TIMECAPS tc; UINT (WINAPI* lpfntimeGetDevCaps)( TIMECAPS FAR* lpTimeCaps, UINT wSize);
/* Call the timer API to see if the timer's really installed,
* and if it is, get the address of the get time function */ lpfntimeGetDevCaps = (UINT(WINAPI *)(TIMECAPS FAR *, UINT)) GetProcAddress(hMMSys, MAKEINTRESOURCE(604)); if ((*lpfntimeGetDevCaps)(&tc, sizeof (tc)) == TIMERR_NOERROR) lpfntimeGetTime = GetProcAddress(hMMSys, MAKEINTRESOURCE(607)); }
/* Return success */ return 1; }
|