|
|
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
regtrack.c
Abstract:
Routines to track calls to registry APIs. Used for debugging only.
Author:
Jim Schmidt (jimschm) 02-Sept-1997
Revisions:
--*/
#include "pch.h"
#include "migutilp.h"
#include "regp.h"
#ifdef DEBUG
#undef RegOpenKeyExA
#undef RegCreateKeyExA
#undef RegOpenKeyExW
#undef RegCreateKeyExW
#define DBG_REGTRACK "RegTrack"
#define NO_MATCH 0xffffffff
DWORD g_DontCare;
typedef struct { PCSTR File; DWORD Line; HKEY Key; CHAR SubKey[]; } KEYTRACK, *PKEYTRACK;
GROWLIST g_KeyTrackList = GROWLIST_INIT;
DWORD pFindKeyReference ( HKEY Key ) { INT i; DWORD Items; PKEYTRACK KeyTrack;
Items = GrowListGetSize (&g_KeyTrackList);
for (i = (INT) (Items - 1) ; i >= 0 ; i--) { KeyTrack = (PKEYTRACK) GrowListGetItem (&g_KeyTrackList, (DWORD) i);
if (KeyTrack && KeyTrack->Key == Key) { return (DWORD) i; } }
return NO_MATCH; }
VOID AddKeyReferenceA ( HKEY Key, PCSTR SubKey, PCSTR File, DWORD Line ) { PKEYTRACK KeyTrack; DWORD Size;
Size = sizeof (KEYTRACK) + SizeOfString (SubKey);
KeyTrack = (PKEYTRACK) MemAlloc (g_hHeap, 0, Size); KeyTrack->Key = Key; KeyTrack->File = File; KeyTrack->Line = Line; StringCopy (KeyTrack->SubKey, SubKey);
GrowListAppend (&g_KeyTrackList, (PBYTE) KeyTrack, Size);
MemFree (g_hHeap, 0, KeyTrack); }
VOID AddKeyReferenceW ( HKEY Key, PCWSTR SubKey, PCSTR File, DWORD Line ) { PCSTR AnsiSubKey;
AnsiSubKey = ConvertWtoA (SubKey); AddKeyReferenceA (Key, AnsiSubKey, File, Line); FreeConvertedStr (AnsiSubKey); }
BOOL pDelKeyReference ( HKEY Key ) { DWORD Index;
Index = pFindKeyReference (Key); if (Index != NO_MATCH) { GrowListDeleteItem (&g_KeyTrackList, Index); return TRUE; }
return FALSE; }
VOID DumpOpenKeys ( VOID ) { DWORD d; DWORD Items; PKEYTRACK KeyTrack;
Items = GrowListGetSize (&g_KeyTrackList);
if (Items) { DEBUGMSG ((DBG_ERROR, "Unclosed reg keys: %u", Items)); }
for (d = 0 ; d < Items ; d++) { KeyTrack = (PKEYTRACK) GrowListGetItem (&g_KeyTrackList, d); DEBUGMSG ((DBG_REGTRACK, "Open Key: %hs (%hs line %u)", KeyTrack->SubKey, KeyTrack->File, KeyTrack->Line)); } }
VOID RegTrackTerminate ( VOID ) { FreeGrowList (&g_KeyTrackList); }
VOID OurRegOpenRootKeyA ( HKEY Key, PCSTR SubKey, PCSTR File, DWORD Line ) { AddKeyReferenceA (Key, SubKey, File, Line); }
VOID OurRegOpenRootKeyW ( HKEY Key, PCWSTR SubKey, PCSTR File, DWORD Line ) { AddKeyReferenceW (Key, SubKey, File, Line); }
LONG OurRegOpenKeyExA ( HKEY Key, PCSTR SubKey, DWORD Unused, REGSAM SamMask, PHKEY ResultPtr, PCSTR File, DWORD Line ) { LONG rc;
rc = RegOpenKeyExA (Key, SubKey, Unused, SamMask, ResultPtr); if (rc == ERROR_SUCCESS) { AddKeyReferenceA (*ResultPtr, SubKey, File, Line); }
return rc; }
LONG OurRegOpenKeyExW ( HKEY Key, PCWSTR SubKey, DWORD Unused, REGSAM SamMask, PHKEY ResultPtr, PCSTR File, DWORD Line ) { LONG rc;
rc = RegOpenKeyExW (Key, SubKey, Unused, SamMask, ResultPtr);
if (rc == ERROR_SUCCESS) { AddKeyReferenceW (*ResultPtr, SubKey, File, Line); }
return rc; }
LONG OurCloseRegKey ( HKEY Key, PCSTR File, DWORD Line ) { LONG rc;
rc = RealCloseRegKey (Key); if (rc == ERROR_SUCCESS) { if (!pDelKeyReference (Key)) { DEBUGMSG (( DBG_ERROR, "Reg key handle closed via CloseRegKey, but not opened " "with a tracked registry API. %s line %u", File, Line )); } }
return rc; }
LONG OurRegCreateKeyExA ( HKEY Key, PCSTR SubKey, DWORD Reserved, PSTR Class, DWORD Options, REGSAM SamMask, LPSECURITY_ATTRIBUTES SecurityAttribs, PHKEY ResultPtr, PDWORD DispositionPtr, PCSTR File, DWORD Line ) { LONG rc;
rc = RegCreateKeyExA ( Key, SubKey, Reserved, Class, Options, SamMask, SecurityAttribs, ResultPtr, DispositionPtr );
if (rc == ERROR_SUCCESS) { AddKeyReferenceA (*ResultPtr, SubKey, File, Line); }
return rc; }
LONG OurRegCreateKeyExW ( HKEY Key, PCWSTR SubKey, DWORD Reserved, PWSTR Class, DWORD Options, REGSAM SamMask, LPSECURITY_ATTRIBUTES SecurityAttribs, PHKEY ResultPtr, PDWORD DispositionPtr, PCSTR File, DWORD Line ) { LONG rc;
rc = RegCreateKeyExW ( Key, SubKey, Reserved, Class, Options, SamMask, SecurityAttribs, ResultPtr, DispositionPtr );
if (rc == ERROR_SUCCESS) { AddKeyReferenceW (*ResultPtr, SubKey, File, Line); }
return rc; }
#endif
|