506 lines
9.6 KiB
C
506 lines
9.6 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
init.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module provides the main cluster initialization.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Vert (jvert) 6/5/1996
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include "clusrtl.h"
|
||
|
|
||
|
#define MEM_LEAKS 1
|
||
|
#define EVENT_LEAKS 1
|
||
|
#define KEY_LEAKS 1
|
||
|
|
||
|
|
||
|
#define HEAP_SIGNATURE 'PAEH'
|
||
|
|
||
|
typedef struct _MEM_HDR {
|
||
|
DWORD Signature;
|
||
|
PVOID CallersAddress;
|
||
|
PVOID CallersCaller;
|
||
|
} MEM_HDR, *PMEM_HDR;
|
||
|
|
||
|
#ifdef MEM_LEAKS
|
||
|
|
||
|
HLOCAL
|
||
|
WINAPI
|
||
|
CheckLocalAlloc(
|
||
|
UINT uFlags,
|
||
|
UINT uBytes
|
||
|
)
|
||
|
{
|
||
|
HLOCAL memory;
|
||
|
PMEM_HDR memHdr;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
|
||
|
memHdr = LocalAlloc( uFlags, uBytes + sizeof(MEM_HDR) );
|
||
|
if ( !memHdr ) {
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
memHdr->Signature = HEAP_SIGNATURE;
|
||
|
memHdr->CallersAddress = callersAddress;
|
||
|
memHdr->CallersCaller = callersCaller;
|
||
|
|
||
|
return(memHdr+1);
|
||
|
}
|
||
|
|
||
|
|
||
|
HLOCAL
|
||
|
WINAPI
|
||
|
CheckLocalFree(
|
||
|
HLOCAL hMem
|
||
|
)
|
||
|
{
|
||
|
PMEM_HDR memHdr = hMem;
|
||
|
|
||
|
if ( memHdr ) {
|
||
|
--memHdr;
|
||
|
if ( memHdr->Signature != HEAP_SIGNATURE ) {
|
||
|
memHdr++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return( LocalFree(memHdr) );
|
||
|
}
|
||
|
|
||
|
#endif // MEM_LEAKS
|
||
|
|
||
|
#ifdef EVENT_LEAKS
|
||
|
|
||
|
//WINBASEAPI
|
||
|
HANDLE
|
||
|
WINAPI
|
||
|
CheckCreateEventA(
|
||
|
LPSECURITY_ATTRIBUTES lpEventAttributes,
|
||
|
BOOL bManualReset,
|
||
|
BOOL bInitialState,
|
||
|
LPCSTR lpName
|
||
|
)
|
||
|
{
|
||
|
HANDLE handle;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
handle = CreateEventA(
|
||
|
lpEventAttributes,
|
||
|
bManualReset,
|
||
|
bInitialState,
|
||
|
lpName
|
||
|
);
|
||
|
|
||
|
ClRtlLogPrint( "[TEST] CreateEvent returns handle %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
handle,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
|
||
|
return(handle);
|
||
|
|
||
|
} // CheckCreateEventA
|
||
|
|
||
|
|
||
|
//WINBASEAPI
|
||
|
HANDLE
|
||
|
WINAPI
|
||
|
CheckCreateEventW(
|
||
|
LPSECURITY_ATTRIBUTES lpEventAttributes,
|
||
|
BOOL bManualReset,
|
||
|
BOOL bInitialState,
|
||
|
LPCWSTR lpName
|
||
|
)
|
||
|
{
|
||
|
HANDLE handle;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
handle = CreateEventW(
|
||
|
lpEventAttributes,
|
||
|
bManualReset,
|
||
|
bInitialState,
|
||
|
lpName
|
||
|
);
|
||
|
|
||
|
ClRtlLogPrint( "[TEST] CreateEventW returns handle %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
handle,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
|
||
|
return(handle);
|
||
|
|
||
|
} // CheckCreateEventW
|
||
|
|
||
|
#endif // EVENT_LEAKS
|
||
|
|
||
|
#ifdef KEY_LEAKS
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegOpenKeyA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegOpenKeyA(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegOpenKey returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegOpenKeyA
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegOpenKeyW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegOpenKeyW(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegOpenKeyW returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegOpenKeyW
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegOpenKeyExA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey,
|
||
|
DWORD ulOptions,
|
||
|
REGSAM samDesired,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegOpenKeyExA(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
ulOptions,
|
||
|
samDesired,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegOpenKeyEx returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegOpenKeyExA
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegOpenKeyExW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey,
|
||
|
DWORD ulOptions,
|
||
|
REGSAM samDesired,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegOpenKeyExW(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
ulOptions,
|
||
|
samDesired,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegOpenKeyExW returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegOpenKeyExW
|
||
|
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegCreateKeyA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegCreateKeyA(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegCreateKey returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegCreateKeyA
|
||
|
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegCreateKeyW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey,
|
||
|
PHKEY phkResult
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegCreateKeyW(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
phkResult
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegCreateKeyW returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegCreateKeyW
|
||
|
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegCreateKeyExA(
|
||
|
HKEY hKey,
|
||
|
LPCSTR lpSubKey,
|
||
|
DWORD Reserved,
|
||
|
LPSTR lpClass,
|
||
|
DWORD dwOptions,
|
||
|
REGSAM samDesired,
|
||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||
|
PHKEY phkResult,
|
||
|
LPDWORD lpdwDisposition
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegCreateKeyExA(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
Reserved,
|
||
|
lpClass,
|
||
|
dwOptions,
|
||
|
samDesired,
|
||
|
lpSecurityAttributes,
|
||
|
phkResult,
|
||
|
lpdwDisposition
|
||
|
);
|
||
|
|
||
|
if ( status ) {
|
||
|
ClRtlLogPrint( "[TEST] RegCreateKeyEx returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
}
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegCreateKeyExA
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegCreateKeyExW(
|
||
|
HKEY hKey,
|
||
|
LPCWSTR lpSubKey,
|
||
|
DWORD Reserved,
|
||
|
LPWSTR lpClass,
|
||
|
DWORD dwOptions,
|
||
|
REGSAM samDesired,
|
||
|
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||
|
PHKEY phkResult,
|
||
|
LPDWORD lpdwDisposition
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
status = RegCreateKeyExW(
|
||
|
hKey,
|
||
|
lpSubKey,
|
||
|
Reserved,
|
||
|
lpClass,
|
||
|
dwOptions,
|
||
|
samDesired,
|
||
|
lpSecurityAttributes,
|
||
|
phkResult,
|
||
|
lpdwDisposition
|
||
|
);
|
||
|
|
||
|
ClRtlLogPrint( "[TEST] RegCreateKeyExW returns key %1!lx!, called from %2!lx! and %3!lx!\n",
|
||
|
*phkResult,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegCreateKeyExW
|
||
|
|
||
|
|
||
|
//WINADVAPI
|
||
|
LONG
|
||
|
APIENTRY
|
||
|
CheckRegCloseKey(
|
||
|
HKEY hKey
|
||
|
)
|
||
|
{
|
||
|
LONG status;
|
||
|
PVOID callersAddress;
|
||
|
PVOID callersCaller;
|
||
|
|
||
|
RtlGetCallersAddress(
|
||
|
&callersAddress,
|
||
|
&callersCaller );
|
||
|
|
||
|
ClRtlLogPrint( "[TEST] RegCloseKey for handle %1!lx! called from %2!lx! and %3!lx!\n",
|
||
|
hKey,
|
||
|
callersAddress,
|
||
|
callersCaller );
|
||
|
|
||
|
|
||
|
status = RegCloseKey(
|
||
|
hKey
|
||
|
);
|
||
|
|
||
|
return(status);
|
||
|
|
||
|
} // CheckRegCloseKey
|
||
|
|
||
|
|
||
|
|
||
|
#endif // KEY_LEAKS
|
||
|
|