131 lines
2.8 KiB
C
131 lines
2.8 KiB
C
|
/***************************************************************************
|
||
|
* 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;
|
||
|
}
|