|
|
/*++
Copyright (c) 1992 Microsoft Corporation
Module Name:
regecls.h
Abstract:
This file contains declarations for data structures needed for enumerating keys under HKEY_CLASSES_ROOT
Author:
Adam Edwards (adamed) 14-Nov-1997
Notes:
--*/
#ifdef LOCAL
#if !defined(_REGECLS_H_)
#define _REGECLS_H_
#include "regstate.h"
#define ENUM_DEFAULT_KEY_NAME_SIZE 128
#define ENUM_DEFAULT_CLASS_SIZE 128
//
// Constants for controlling the direction of enumeration
//
enum { ENUM_DIRECTION_BACKWARD = 0, ENUM_DIRECTION_FORWARD = 1, ENUM_DIRECTION_IGNORE = 2 };
//
// Constants specifying the physical location of a key being
// enumerated
//
enum { ENUM_LOCATION_USER = 1, ENUM_LOCATION_MACHINE = 2, ENUM_LOCATION_NONE = 3 };
//
// Structure for holding the state of an enumeration on a
// user or machine subtree
//
typedef struct _EnumSubtreeState { PKEY_NODE_INFORMATION pKeyInfo; // structure holding information about a key
ULONG cbKeyInfo; // size of pKeyInfo
DWORD iSubKey; // which key we need to ask the kernel for
BOOL Finished; // TRUE means we are done enumerating this subtree
union { KEY_NODE_INFORMATION; // Force the buffer to be aligned.
BYTE KeyInfoBuffer[ sizeof( KEY_NODE_INFORMATION ) + ENUM_DEFAULT_KEY_NAME_SIZE + ENUM_DEFAULT_CLASS_SIZE ];
}; } EnumSubtreeState;
//
// Structure for holding the state of enumeration for a registry key
// This structure persists in between calls to RegEnumKeyEx
//
typedef struct _EnumState {
StateObject Object; unsigned Direction : 1; unsigned LastLocation : 2; unsigned fClassesRoot : 1; HKEY hKey; HKEY hkUserKey; HKEY hkMachineKey; DWORD dwLastRequest; DWORD dwThreadId; EnumSubtreeState UserState; EnumSubtreeState MachineState;
} EnumState;
typedef struct _KeyStateList {
StateObject Object; StateObjectList StateList; EnumState RootState;
} KeyStateList;
typedef StateObjectList ThreadList;
VOID KeyStateListInit(KeyStateList* pStateList); VOID KeyStateListDestroy(StateObject* pObject);
//
// Hash table for storing enumeration states. This table is indexed
// by (key handle, thread id).
//
typedef struct _EnumTable {
BOOLEAN bCriticalSectionInitialized; RTL_CRITICAL_SECTION CriticalSection; ThreadList ThreadEnumList;
} EnumTable;
//
// Declaration of instance of enumeration table
//
extern EnumTable gClassesEnumTable;
//
// Prototypes for winreg client -- cleanup, init
//
BOOL InitializeClassesEnumTable(); BOOL CleanupClassesEnumTable(BOOL fThisThreadOnly);
//
// functions for managing enumeration state table
//
NTSTATUS EnumTableInit(EnumTable* pEnumTable);
enum { ENUM_TABLE_REMOVEKEY_CRITERIA_THISTHREAD = 1, ENUM_TABLE_REMOVEKEY_CRITERIA_ANYTHREAD = 2 };
NTSTATUS EnumTableClear(EnumTable* pEnumTable, DWORD dwCriteria);
DWORD EnumTableHashKey( EnumTable* pEnumTable, HKEY hKey);
NTSTATUS EnumTableAddKey( EnumTable* pEnumTable, HKEY hKey, DWORD dwFirstSubKey, EnumState** ppEnumState, EnumState** ppRootState);
NTSTATUS EnumTableRemoveKey( EnumTable* pEnumTable, HKEY hKey, DWORD dwCriteria);
NTSTATUS EnumTableGetNextEnum( EnumTable* pEnumTable, HKEY hKey, DWORD dwSubkey, KEY_INFORMATION_CLASS KeyInformationClass, PVOID pKeyInfo, DWORD cbKeyInfo, LPDWORD pcbKeyInfo);
NTSTATUS EnumTableGetKeyState( EnumTable* pEnumTable, HKEY hKey, DWORD dwSubkey, EnumState** ppEnumState, EnumState** ppRootState, LPDWORD pcbKeyInfo);
NTSTATUS EnumTableFindKeyState( EnumTable* pEnumTable, HKEY hKey, EnumState** ppEnumState);
void EnumTableUpdateRootState( EnumTable* pEnumTable, EnumState* pRootState, EnumState* pEnumState, BOOL fResetState);
NTSTATUS EnumTableGetRootState( EnumTable* pEnumTable, EnumState** ppRootState);
//
// functions to manage enumeration subtrees
//
void EnumSubtreeStateClear(EnumSubtreeState* pTreeState);
NTSTATUS EnumSubtreeStateCopyKeyInfo( EnumSubtreeState* pTreeState, KEY_INFORMATION_CLASS KeyInformationClass, PVOID pDestKeyinfo, ULONG cbDestKeyInfo, PULONG pcbResult);
//
// functions for managing key enumeration state
//
NTSTATUS EnumStateInit( EnumState* pEnumState, HKEY hKey, DWORD dwFirstSubKey, DWORD dwDirection, SKeySemantics* pKeySemantics);
NTSTATUS EnumStateGetNextEnum( EnumState* pEnumState, DWORD dwSubkey, KEY_INFORMATION_CLASS KeyInformationClass, PVOID pKeyInfo, DWORD cbKeyInfo, LPDWORD pcbKeyInfo, BOOL* pfFreeState);
NTSTATUS EnumStateSetLimits( EnumState* pEnumState, DWORD dwSubKey, LPDWORD pdwStart, LPDWORD pdwLimit, PLONG plIncrement);
NTSTATUS EnumStateChooseNext( EnumState* pEnumState, DWORD dwSubKey, DWORD dwStart, DWORD dwLimit, LONG lIncrement, EnumSubtreeState** ppTreeState);
NTSTATUS EnumStateCompareSubtrees( EnumState* pEnumState, LONG lIncrement, EnumSubtreeState** ppSubtree);
VOID EnumStateClear(EnumState* pEnumState); VOID EnumStateDestroy(StateObject* pObject);
BOOL EnumStateIsEmpty(EnumState* pEnumState);
NTSTATUS EnumStateCopy( EnumState* pDestState, EnumState* pEnumState);
//
// Utility functions
//
NTSTATUS EnumClassKey( HKEY hKey, EnumSubtreeState* pTreeState);
NTSTATUS GetSubKeyCount( HKEY hkClassKey, LPDWORD pdwUserSubKeys);
NTSTATUS ClassKeyCountSubKeys( HKEY hKey, HKEY hkUser, HKEY hkMachine, DWORD cMax, LPDWORD pcSubKeys);
__inline BOOL IsRootKey(SKeySemantics* pKeySemantics) { return pKeySemantics->_fClassRegParent; }
#endif // !defined(_REGECLS_H_)
#endif // LOCAL
|