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.
|
|
/***************************************************************************
* VER.C * * Code specific to the DLL version of VER which contains the Windows * procedures necessary to make it work * ***************************************************************************/
#include "verpriv.h"
#include <diamondd.h>
#include "mydiam.h"
/* LibMain
* Called by DLL startup code. * Initializes VER.DLL. */
#ifdef LOG_DATA
typedef struct { DWORD idThd; char szMsg[4]; DWORD dwLine; DWORD dwData; } LOGLINE;
typedef LOGLINE *PLOGLINE;
#define CLOG_MAX 16384
LOGLINE llLogBuff[CLOG_MAX]; int illLogPtr = 0; CRITICAL_SECTION csLog;
void LogThisData( DWORD id, char *szMsg, DWORD dwLine, DWORD dwData ) { PLOGLINE pll;
EnterCriticalSection(&csLog); pll = &llLogBuff[illLogPtr++]; if (illLogPtr >= CLOG_MAX) illLogPtr = 0; LeaveCriticalSection(&csLog);
pll->idThd = id; pll->dwData = dwData; pll->dwLine = dwLine; CopyMemory( pll->szMsg, szMsg, sizeof(pll->szMsg) ); } #endif
HANDLE hInst; extern HINSTANCE hLz32; extern HINSTANCE hCabinet;
DWORD itlsDiamondContext = ITLS_ERROR; // Init to Error Condition
INT APIENTRY LibMain( HANDLE hInstance, DWORD dwReason, LPVOID lp ) { PDIAMOND_CONTEXT pdcx;
UNREFERENCED_PARAMETER(lp);
hInst = hInstance;
#ifdef LOG_DATA
{ TCHAR szBuffer[80]; swprintf( szBuffer, TEXT("thd[0x%08ld]: Attached to version.dll for %ld\n"), GetCurrentThreadId(), dwReason ); OutputDebugString(szBuffer); } #endif
switch (dwReason) {
case DLL_PROCESS_ATTACH:
#ifdef LOG_DATA
InitializeCriticalSection(&csLog); #endif
#ifdef LOG_DATA
{ TCHAR szBuffer[MAX_PATH]; OutputDebugString(TEXT(">>>version.c: compiled ") TEXT(__DATE__) TEXT(" ") TEXT(__TIME__) TEXT("\n")); OutputDebugString(TEXT("\tProcess ")); GetModuleFileName(NULL, szBuffer, sizeof(szBuffer) / sizeof(TCHAR)); OutputDebugString(szBuffer); OutputDebugString(TEXT(" attached\n")); } #endif
itlsDiamondContext = TlsAlloc();
// Fall through to Thread Attach, since for some reason
// the DLL_PROCESS_ATTACH thread does not call DLL_THREAD_ATTACH
case DLL_THREAD_ATTACH: if (GotDmdTlsSlot()) TlsSetValue(itlsDiamondContext, NULL);
break;
case DLL_PROCESS_DETACH:
if (GotDmdTlsSlot()) { TlsFree(itlsDiamondContext); } if (hLz32) { FreeLibrary(hLz32); }
if (hCabinet) { FreeLibrary(hCabinet); } break; }
/* Return success */ return 1; }
|