mirror of https://github.com/tongzx/nt5src
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.
257 lines
4.3 KiB
257 lines
4.3 KiB
/*++
|
|
|
|
Copyright (c) 1997-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
main.c
|
|
|
|
Abstract:
|
|
|
|
WMI dll main file
|
|
|
|
Author:
|
|
|
|
16-Jan-1997 AlanWar
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#define INITGUID
|
|
#include "wmiump.h"
|
|
#include "evntrace.h"
|
|
#include <rpc.h>
|
|
|
|
#ifndef MEMPHIS
|
|
RTL_CRITICAL_SECTION PMCritSect;
|
|
PVOID WmipProcessHeap;
|
|
HANDLE WmipDeviceHandle;
|
|
#else
|
|
HANDLE PMMutex;
|
|
#endif
|
|
|
|
extern HANDLE WmipWin32Event;
|
|
|
|
HMODULE WmipDllHandle;
|
|
|
|
void WmipDeinitializeDll(
|
|
void
|
|
);
|
|
|
|
void WmipDeinitializeAccess(
|
|
PTCHAR *RpcStringBinding
|
|
);
|
|
|
|
ULONG WmipInitializeDll(
|
|
void
|
|
);
|
|
|
|
HINSTANCE DllInstanceHandle;
|
|
|
|
extern HANDLE WmipKMHandle;
|
|
|
|
BOOLEAN
|
|
WmiDllInitialize(
|
|
IN PVOID DllBase,
|
|
IN ULONG Reason,
|
|
IN PCONTEXT Context OPTIONAL
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This function implements Win32 base dll initialization.
|
|
|
|
Arguments:
|
|
|
|
DllHandle -
|
|
|
|
Reason - attach\detach
|
|
|
|
Context - Not Used
|
|
|
|
Return Value:
|
|
|
|
STATUS_SUCCESS
|
|
|
|
--*/
|
|
{
|
|
ULONG Status = ERROR_SUCCESS;
|
|
ULONG Foo;
|
|
|
|
DllInstanceHandle = (HINSTANCE)DllBase;
|
|
|
|
if (Reason == DLL_PROCESS_ATTACH)
|
|
{
|
|
#if DBG
|
|
Foo = WmipLoggingEnabled ? 1 : 0;
|
|
WmipGetRegistryValue(LoggingEnableValueText,
|
|
&Foo);
|
|
WmipLoggingEnabled = (Foo == 0) ? FALSE : TRUE;
|
|
#endif
|
|
Status = WmipInitializeDll();
|
|
|
|
} else if (Reason == DLL_PROCESS_DETACH) {
|
|
|
|
#ifndef MEMPHIS
|
|
// Flush out UM buffers to logfile
|
|
//
|
|
#if 0
|
|
WmipFlushUmLoggerBuffer();
|
|
#endif
|
|
#endif
|
|
//
|
|
// DOn't need to clean up if process is exiting
|
|
if (Context == NULL)
|
|
{
|
|
WmipDeinitializeDll();
|
|
}
|
|
|
|
if (WmipKMHandle != (HANDLE)NULL)
|
|
{
|
|
CloseHandle(WmipKMHandle);
|
|
}
|
|
}
|
|
|
|
return(Status == ERROR_SUCCESS);
|
|
}
|
|
|
|
|
|
ULONG WmipInitializeDll(
|
|
void
|
|
)
|
|
/*+++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
Return Value:
|
|
|
|
---*/
|
|
{
|
|
|
|
#ifdef MEMPHIS
|
|
PMMutex = CreateMutex(NULL, FALSE, NULL);
|
|
if (PMMutex == NULL)
|
|
{
|
|
return(GetLastError());
|
|
}
|
|
#else
|
|
ULONG Status;
|
|
|
|
Status = RtlInitializeCriticalSection(&PMCritSect);
|
|
|
|
if (! NT_SUCCESS(Status))
|
|
{
|
|
return(RtlNtStatusToDosError(Status));
|
|
}
|
|
|
|
#endif
|
|
|
|
return(ERROR_SUCCESS);
|
|
}
|
|
|
|
#ifndef MEMPHIS
|
|
VOID
|
|
WmipCreateHeap(
|
|
void
|
|
)
|
|
{
|
|
WmipEnterPMCritSection();
|
|
|
|
if (WmipProcessHeap == NULL)
|
|
{
|
|
WmipProcessHeap = RtlCreateHeap(HEAP_GROWABLE,
|
|
NULL,
|
|
DLLRESERVEDHEAPSIZE,
|
|
DLLCOMMITHEAPSIZE,
|
|
NULL,
|
|
NULL);
|
|
|
|
if (WmipProcessHeap == NULL)
|
|
{
|
|
WmipDebugPrint(("WMI: Cannot create WmipProcessHeap, using process default\n"));
|
|
WmipProcessHeap = RtlProcessHeap();
|
|
}
|
|
}
|
|
|
|
WmipLeavePMCritSection();
|
|
}
|
|
#endif
|
|
|
|
void WmipDeinitializeDll(
|
|
void
|
|
)
|
|
/*+++
|
|
|
|
Routine Description:
|
|
|
|
Arguments:
|
|
|
|
Return Value:
|
|
|
|
---*/
|
|
{
|
|
#ifdef MEMPHIS
|
|
CloseHandle(PMMutex);
|
|
#else
|
|
RtlDeleteCriticalSection(&PMCritSect);
|
|
if ((WmipProcessHeap != NULL) &&
|
|
(WmipProcessHeap != RtlProcessHeap()))
|
|
|
|
{
|
|
RtlDestroyHeap(WmipProcessHeap);
|
|
}
|
|
if (WmipDeviceHandle != NULL)
|
|
{
|
|
CloseHandle(WmipDeviceHandle);
|
|
}
|
|
#endif
|
|
if (WmipWin32Event != NULL)
|
|
{
|
|
CloseHandle(WmipWin32Event);
|
|
}
|
|
}
|
|
|
|
|
|
#if DBG
|
|
|
|
void WmipGetRegistryValue(
|
|
TCHAR *ValueName,
|
|
PULONG Value
|
|
)
|
|
{
|
|
HKEY Key;
|
|
DWORD Type;
|
|
DWORD ValueSize;
|
|
ULONG Status;
|
|
|
|
Status = RegOpenKey(HKEY_LOCAL_MACHINE,
|
|
WmiRegKeyText,
|
|
&Key);
|
|
|
|
if (Status == ERROR_SUCCESS)
|
|
{
|
|
ValueSize = sizeof(ULONG);
|
|
Status = RegQueryValueEx(Key,
|
|
ValueName,
|
|
NULL,
|
|
&Type,
|
|
(LPBYTE)Value,
|
|
&ValueSize);
|
|
|
|
if ((Status == ERROR_SUCCESS) &&
|
|
(Type == REG_DWORD))
|
|
{
|
|
WmipDebugPrint(("WMI: %ws from registry is %d\n",
|
|
ValueName,
|
|
*Value));
|
|
}
|
|
RegCloseKey(Key);
|
|
}
|
|
}
|
|
|
|
#endif
|