180 lines
3.5 KiB
C
180 lines
3.5 KiB
C
/*++
|
|
|
|
Copyright (c) 1991 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
vrdll.c
|
|
|
|
Abstract:
|
|
|
|
Initialization for VdmRedir as DLL
|
|
|
|
Contents:
|
|
VrDllInitialize
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 11-May-1992
|
|
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
#if DBG
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#endif
|
|
|
|
#include <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
#include <windows.h>
|
|
#include <vrnmpipe.h>
|
|
#include <vrinit.h>
|
|
#include "vrdebug.h"
|
|
|
|
//
|
|
// external data
|
|
//
|
|
|
|
//
|
|
// external functions
|
|
//
|
|
|
|
extern
|
|
VOID
|
|
TerminateDlcEmulation(
|
|
VOID
|
|
);
|
|
|
|
|
|
#if DBG
|
|
FILE* hVrDebugLog = NULL;
|
|
#endif
|
|
|
|
BOOLEAN
|
|
VrDllInitialize(
|
|
IN PVOID DllHandle,
|
|
IN ULONG Reason,
|
|
IN PCONTEXT Context OPTIONAL
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Gets control as a process or thread attaches/detaches from VdmRedir DLL.
|
|
Always returns success
|
|
|
|
Arguments:
|
|
|
|
DllHandle -
|
|
Reason -
|
|
Context -
|
|
|
|
Return Value:
|
|
|
|
BOOLEAN
|
|
TRUE
|
|
|
|
--*/
|
|
|
|
{
|
|
BOOL ok = TRUE;
|
|
|
|
#if DBG
|
|
if (Reason == DLL_PROCESS_ATTACH) {
|
|
|
|
//
|
|
// a little run-time diagnostication, madam?
|
|
//
|
|
|
|
LPSTR ptr;
|
|
|
|
//
|
|
// override VrDebugFlags from VR environment variable
|
|
//
|
|
|
|
if (ptr = getenv("VR")) {
|
|
if (!_strnicmp(ptr, "0x", 2)) {
|
|
ptr += 2;
|
|
}
|
|
for (VrDebugFlags = 0; isxdigit(*ptr); ++ptr) {
|
|
VrDebugFlags = VrDebugFlags * 16
|
|
+ (*ptr
|
|
- ('0' + ((*ptr <= '9') ? 0
|
|
: ((islower(*ptr) ? 'a' : 'A') - ('9' + 1)))));
|
|
}
|
|
IF_DEBUG(DLL) {
|
|
DBGPRINT("Setting VrDebugFlags to %#08x from environment variable (VR)\n", VrDebugFlags);
|
|
}
|
|
}
|
|
IF_DEBUG(TO_FILE) {
|
|
if ((hVrDebugLog = fopen(VRDEBUG_FILE, "w+")) == NULL) {
|
|
VrDebugFlags &= ~DEBUG_TO_FILE;
|
|
} else {
|
|
|
|
char currentDirectory[256];
|
|
int n;
|
|
|
|
currentDirectory[0] = 0;
|
|
if (n = GetCurrentDirectory(sizeof(currentDirectory), currentDirectory)) {
|
|
if (currentDirectory[n-1] == '\\') {
|
|
currentDirectory[n-1] = 0;
|
|
}
|
|
}
|
|
DbgPrint("Writing debug output to %s\\" VRDEBUG_FILE "\n", currentDirectory);
|
|
}
|
|
}
|
|
IF_DEBUG(DLL) {
|
|
DBGPRINT("VrDllInitialize: process %d Attaching\n", GetCurrentProcessId());
|
|
}
|
|
} else if (Reason == DLL_PROCESS_DETACH) {
|
|
IF_DEBUG(DLL) {
|
|
DBGPRINT("VrDllInitialize: process %d Detaching\n", GetCurrentProcessId());
|
|
}
|
|
if (hVrDebugLog) {
|
|
fclose(hVrDebugLog);
|
|
}
|
|
} else {
|
|
IF_DEBUG(DLL) {
|
|
DBGPRINT("VrDllInitialize: Thread %d.%d %staching\n",
|
|
GetCurrentProcessId(),
|
|
GetCurrentThreadId(),
|
|
(Reason == DLL_THREAD_ATTACH) ? "At" : "De"
|
|
);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
if (Reason == DLL_PROCESS_ATTACH) {
|
|
|
|
//
|
|
// we now perform initialization at load time due to deferred loading
|
|
// of VdmRedir.DLL
|
|
//
|
|
|
|
ok = VrInitialize();
|
|
} else if (Reason == DLL_PROCESS_DETACH) {
|
|
|
|
//
|
|
// clean up resources
|
|
//
|
|
|
|
VrUninitialize();
|
|
TerminateDlcEmulation();
|
|
ok = TRUE;
|
|
}
|
|
|
|
//
|
|
// basically, nothing to do
|
|
//
|
|
|
|
return (BOOLEAN)ok;
|
|
}
|