288 lines
6.4 KiB
C
288 lines
6.4 KiB
C
/*++
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|