/*++ Copyright (c) 1999 Microsoft Corporation Module Name: regenum.h Abstract: Set of APIs to enumerate the local registry using Win32 APIs. Author: 20-Oct-1999 Ovidiu Temereanca (ovidiut) - File creation. Revision History: --*/ // // Types // #define REGENUM_ALL_SUBLEVELS 0xFFFFFFFF #define REG_ATTRIBUTE_KEY 0x00000001 #define REG_ATTRIBUTE_VALUE 0x00000002 // // Root enumeration structures // typedef struct { PCSTR RegRootName; HKEY RegRootHandle; UINT Index; } REGROOT_ENUMA, *PREGROOT_ENUMA; typedef struct { PCWSTR RegRootName; HKEY RegRootHandle; UINT Index; } REGROOT_ENUMW, *PREGROOT_ENUMW; // // Key/Values enumeration structures // typedef enum { RECF_SKIPKEY = 0x0001, RECF_SKIPSUBKEYS = 0x0002, RECF_SKIPVALUES = 0x0004, } REGENUM_CONTROLFLAGS; typedef enum { REIF_RETURN_KEYS = 0x0001, REIF_VALUES_FIRST = 0x0002, REIF_DEPTH_FIRST = 0x0004, REIF_USE_EXCLUSIONS = 0x0008, } REGENUMINFOFLAGS; typedef enum { RNS_ENUM_INIT, RNS_VALUE_FIRST, RNS_VALUE_NEXT, RNS_VALUE_DONE, RNS_SUBKEY_FIRST, RNS_SUBKEY_NEXT, RNS_SUBKEY_DONE, RNS_ENUM_DONE } RNS_ENUM_STATE; typedef enum { RES_ROOT_FIRST, RES_ROOT_NEXT, RES_ROOT_DONE } RES_ROOT_STATE; typedef enum { RNF_RETURN_KEYS = 0x0001, RNF_KEYNAME_MATCHES = 0x0002, RNF_VALUENAME_INVALID = 0x0004, RNF_VALUEDATA_INVALID = 0x0008, } REGNODE_FLAGS; typedef struct { PCSTR KeyName; HKEY KeyHandle; DWORD ValueCount; PSTR ValueName; DWORD ValueLengthMax; DWORD ValueType; PBYTE ValueData; DWORD ValueDataSize; DWORD ValueDataSizeMax; DWORD SubKeyCount; PSTR SubKeyName; DWORD SubKeyLengthMax; DWORD SubKeyIndex; DWORD ValueIndex; DWORD EnumState; DWORD Flags; DWORD SubLevel; } REGNODEA, *PREGNODEA; typedef struct { PCWSTR KeyName; HKEY KeyHandle; DWORD ValueCount; PWSTR ValueName; DWORD ValueLengthMax; DWORD ValueType; PBYTE ValueData; DWORD ValueDataSize; DWORD ValueDataSizeMax; DWORD SubKeyCount; PWSTR SubKeyName; DWORD SubKeyLengthMax; DWORD SubKeyIndex; DWORD ValueIndex; DWORD EnumState; DWORD Flags; DWORD SubLevel; } REGNODEW, *PREGNODEW; typedef BOOL (*RPE_ERROR_CALLBACKA)(PREGNODEA); typedef struct { POBSPARSEDPATTERNA RegPattern; DWORD Flags; DWORD RootLevel; DWORD MaxSubLevel; RPE_ERROR_CALLBACKA CallbackOnError; } REGENUMINFOA, *PREGENUMINFOA; typedef BOOL (*RPE_ERROR_CALLBACKW)(PREGNODEW); typedef struct { POBSPARSEDPATTERNW RegPattern; DWORD Flags; DWORD RootLevel; DWORD MaxSubLevel; RPE_ERROR_CALLBACKW CallbackOnError; } REGENUMINFOW, *PREGENUMINFOW; typedef struct { PCSTR EncodedFullName; PCSTR Name; PCSTR Location; CHAR NativeFullName[MAX_MBCHAR_PATH]; PBYTE CurrentValueData; DWORD CurrentValueType; HKEY CurrentKeyHandle; DWORD CurrentLevel; DWORD Attributes; // // Private members // DWORD ControlFlags; REGENUMINFOA RegEnumInfo; GROWBUFFER RegNodes; DWORD RootState; PREGROOT_ENUMA RootEnum; PREGNODEA LastNode; PSTR RegNameAppendPos; PSTR LastWackPtr; } REGTREE_ENUMA, *PREGTREE_ENUMA; typedef struct { PCWSTR EncodedFullName; PCWSTR Name; PCWSTR Location; WCHAR NativeFullName[MAX_WCHAR_PATH]; PBYTE CurrentValueData; DWORD CurrentValueType; HKEY CurrentKeyHandle; DWORD CurrentLevel; DWORD Attributes; // // Private members // DWORD ControlFlags; REGENUMINFOW RegEnumInfo; GROWBUFFER RegNodes; DWORD RootState; PREGROOT_ENUMW RootEnum; PREGNODEW LastNode; PWSTR RegNameAppendPos; PWSTR LastWackPtr; } REGTREE_ENUMW, *PREGTREE_ENUMW; // // API // BOOL RegEnumInitialize ( VOID ); VOID RegEnumTerminate ( VOID ); BOOL RegEnumDefaultCallbackA ( IN PREGNODEA RegNode OPTIONAL ); BOOL RegEnumDefaultCallbackW ( IN PREGNODEW RegNode OPTIONAL ); BOOL EnumFirstRegRootA ( OUT PREGROOT_ENUMA EnumPtr ); BOOL EnumFirstRegRootW ( OUT PREGROOT_ENUMW EnumPtr ); BOOL EnumNextRegRootA ( IN OUT PREGROOT_ENUMA EnumPtr ); BOOL EnumNextRegRootW ( IN OUT PREGROOT_ENUMW EnumPtr ); BOOL EnumFirstRegObjectInTreeExA ( OUT PREGTREE_ENUMA RegEnum, IN PCSTR EncodedRegPattern, IN BOOL EnumKeyNames, IN BOOL ValuesFirst, IN BOOL DepthFirst, IN DWORD MaxSubLevel, IN BOOL UseExclusions, IN RPE_ERROR_CALLBACKA CallbackOnError OPTIONAL ); #define EnumFirstRegObjectInTreeA(e,p) EnumFirstRegObjectInTreeExA(e,p,TRUE,TRUE,TRUE,REGENUM_ALL_SUBLEVELS,FALSE,RegEnumDefaultCallbackA) BOOL EnumFirstRegObjectInTreeExW ( OUT PREGTREE_ENUMW RegEnum, IN PCWSTR EncodedKeyPattern, IN BOOL EnumKeyNames, IN BOOL ValuesFirst, IN BOOL DepthFirst, IN DWORD MaxSubLevel, IN BOOL UseExclusions, IN RPE_ERROR_CALLBACKW CallbackOnError OPTIONAL ); #define EnumFirstRegObjectInTreeW(e,p) EnumFirstRegObjectInTreeExW(e,p,TRUE,TRUE,TRUE,REGENUM_ALL_SUBLEVELS,FALSE,RegEnumDefaultCallbackW) BOOL EnumNextRegObjectInTreeA ( IN OUT PREGTREE_ENUMA RegEnum ); BOOL EnumNextRegObjectInTreeW ( IN OUT PREGTREE_ENUMW RegEnum ); VOID AbortEnumRegObjectInTreeA ( IN OUT PREGTREE_ENUMA RegEnum ); VOID AbortEnumRegObjectInTreeW ( IN OUT PREGTREE_ENUMW RegEnum ); // // Macros // #ifdef UNICODE #define RegEnumDefaultCallback RegEnumDefaultCallbackW #define REGROOT_ENUM REGROOT_ENUMW #define EnumFirstRegRoot EnumFirstRegRootW #define EnumNextRegRoot EnumNextRegRootW #define REGNODE REGNODEW #define PREGNODE PREGNODEW #define RPE_ERROR_CALLBACK RPE_ERROR_CALLBACKW #define REGENUMINFO REGENUMINFOW #define PREGENUMINFO PREGENUMINFOW #define REGTREE_ENUM REGTREE_ENUMW #define PREGTREE_ENUM PREGTREE_ENUMW #define EnumFirstRegObjectInTree EnumFirstRegObjectInTreeW #define EnumFirstRegObjectInTreeEx EnumFirstRegObjectInTreeExW #define EnumNextRegObjectInTree EnumNextRegObjectInTreeW #define AbortEnumRegObjectInTree AbortEnumRegObjectInTreeW #else #define RegEnumDefaultCallback RegEnumDefaultCallbackA #define REGROOT_ENUM REGROOT_ENUMA #define EnumFirstRegRoot EnumFirstRegRootA #define EnumNextRegRoot EnumNextRegRootA #define REGNODE REGNODEA #define PREGNODE PREGNODEA #define RPE_ERROR_CALLBACK RPE_ERROR_CALLBACKA #define REGENUMINFO REGENUMINFOA #define PREGENUMINFO PREGENUMINFOA #define REGTREE_ENUM REGTREE_ENUMA #define PREGTREE_ENUM PREGTREE_ENUMA #define EnumFirstRegObjectInTree EnumFirstRegObjectInTreeA #define EnumFirstRegObjectInTreeEx EnumFirstRegObjectInTreeExA #define EnumNextRegObjectInTree EnumNextRegObjectInTreeA #define AbortEnumRegObjectInTree AbortEnumRegObjectInTreeA #endif