/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) 1989 Microsoft Corporation Module Name: cm.h Abstract: This module contains the internal structure definitions and APIs used by the NT configuration management system, including the registry. Author: Bryan M. Willman (bryanwi) 28-Aug-91 Revision History: --*/ #ifndef _CM_ #define _CM_ // // Define Names used to access the regsitry // extern UNICODE_STRING CmRegistryRootName; // \REGISTRY extern UNICODE_STRING CmRegistryMachineName; // \REGISTRY\MACHINE extern UNICODE_STRING CmRegistryMachineHardwareName; // \REGISTRY\MACHINE\HARDWARE extern UNICODE_STRING CmRegistryMachineHardwareDescriptionName; // \REGISTRY\MACHINE\HARDWARE\DESCRIPTION extern UNICODE_STRING CmRegistryMachineHardwareDescriptionSystemName; // \REGISTRY\MACHINE\HARDWARE\DESCRIPTION\SYSTEM extern UNICODE_STRING CmRegistryMachineHardwareDeviceMapName; // \REGISTRY\MACHINE\HARDWARE\DEVICEMAP extern UNICODE_STRING CmRegistryMachineHardwareResourceMapName; // \REGISTRY\MACHINE\HARDWARE\RESOURCEMAP extern UNICODE_STRING CmRegistryMachineHardwareOwnerMapName; // \REGISTRY\MACHINE\HARDWARE\OWNERMAP extern UNICODE_STRING CmRegistryMachineSystemName; // \REGISTRY\MACHINE\SYSTEM extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSet; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetEnumName; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\ENUM extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetEnumRootName; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\ENUM\ROOT extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetServices; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetHardwareProfilesCurrent; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\HARDWARE PROFILES\CURRENT extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetControlClass; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\CLASS extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetControlSafeBoot; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\SAFEBOOT extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetControlSessionManagerMemoryManagement; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\SESSION MANAGER\MEMORY MANAGEMENT extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetControlBootLog; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\BOOTLOG extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetServicesEventLog; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES\EVENTLOG extern UNICODE_STRING CmRegistryUserName; // \REGISTRY\USER #ifdef _WANT_MACHINE_IDENTIFICATION extern UNICODE_STRING CmRegistryMachineSystemCurrentControlSetControlBiosInfo; // \REGISTRY\MACHINE\SYSTEM\CURRENTCONTROLSET\CONTROL\BIOSINFO #endif // // The following strings will be used as the keynames for registry // nodes. // The associated enumerated type is CONFIGURATION_TYPE in arc.h // extern UNICODE_STRING CmTypeName[]; extern const PWSTR CmTypeString[]; // // CmpClassString - contains strings which are used as the class // strings in the keynode. // The associated enumerated type is CONFIGURATION_CLASS in arc.h // extern UNICODE_STRING CmClassName[]; extern const PWSTR CmClassString[]; // begin_ntosp // // Define structure of boot driver list. // typedef struct _BOOT_DRIVER_LIST_ENTRY { LIST_ENTRY Link; UNICODE_STRING FilePath; UNICODE_STRING RegistryPath; PKLDR_DATA_TABLE_ENTRY LdrEntry; } BOOT_DRIVER_LIST_ENTRY, *PBOOT_DRIVER_LIST_ENTRY; // end_ntosp PHANDLE CmGetSystemDriverList( VOID ); BOOLEAN CmInitSystem1( IN PLOADER_PARAMETER_BLOCK LoaderBlock ); BOOLEAN CmInitSystem2( VOID ); VOID CmNotifyRunDown( PETHREAD Thread ); VOID CmShutdownSystem( VOID ); VOID CmBootLastKnownGood( ULONG ErrorLevel ); BOOLEAN CmIsLastKnownGoodBoot( VOID ); // // Stuctures and definitions for use with CmGetSystemControlValues // // // NOTES: // KeyPath is relative to currentcontrolset. So, if the variable // of interest is // "\registry\machine\system\currentcontrolset\control\fruit\apple:x" // the entry is // { L"fruit\\apple", // L"x", // &Xbuffer, // sizeof(ULONG), // &Xtype // } // // *BufferLength is available space on input // on output: // -1 = no such key or value // 0 = key and value exist, but have 0 length data // > input = buffer too small, filled to available space, // value is actual size of data in registry // <= input = number of bytes copied out // typedef struct _CM_SYSTEM_CONTROL_VECTOR { PWSTR KeyPath; // path name relative to // current control set PWSTR ValueName; // name of value entry PVOID Buffer; // data goes here PULONG BufferLength; // IN: space allocated // OUT: space used, -1 for no such // key or value, 0 for key/value // found but has 0 length data // if NULL pointer, assume 4 bytes // (reg DWORD) available and do not // report actual size PULONG Type; // return type of found data, may // be NULL } CM_SYSTEM_CONTROL_VECTOR, *PCM_SYSTEM_CONTROL_VECTOR; VOID CmGetSystemControlValues( PVOID SystemHiveBuffer, PCM_SYSTEM_CONTROL_VECTOR ControlVector ); VOID CmQueryRegistryQuotaInformation( IN PSYSTEM_REGISTRY_QUOTA_INFORMATION RegistryQuotaInformation ); VOID CmSetRegistryQuotaInformation( IN PSYSTEM_REGISTRY_QUOTA_INFORMATION RegistryQuotaInformation ); typedef VOID (*PCM_TRACE_NOTIFY_ROUTINE)( IN NTSTATUS Status, IN PVOID Kcb, IN LONGLONG ElapsedTime, IN ULONG Index, IN PUNICODE_STRING KeyName, IN UCHAR Type ); NTSTATUS CmSetTraceNotifyRoutine( IN PCM_TRACE_NOTIFY_ROUTINE NotifyRoutine, IN BOOLEAN Remove ); NTSTATUS CmPrefetchHivePages( IN PUNICODE_STRING FullHivePath, IN OUT PREAD_LIST ReadList ); VOID CmSetLazyFlushState(BOOLEAN Enable); // begin_ntddk begin_wdm // // Registry kernel mode callbacks // // // Hook selector // typedef enum _REG_NOTIFY_CLASS { RegNtDeleteKey, RegNtSetValueKey, RegNtDeleteValueKey, RegNtSetInformationKey, RegNtRenameKey, RegNtEnumerateKey, RegNtEnumerateValueKey, RegNtQueryKey, RegNtQueryValueKey, RegNtQueryMultipleValueKey, RegNtPreCreateKey, RegNtPostCreateKey, RegNtPreOpenKey, RegNtPostOpenKey, RegNtKeyHandleClose } REG_NOTIFY_CLASS; // // Parameter description for each notify class // typedef struct _REG_DELETE_KEY_INFORMATION { PVOID Object; // IN } REG_DELETE_KEY_INFORMATION, *PREG_DELETE_KEY_INFORMATION; typedef struct _REG_SET_VALUE_KEY_INFORMATION { PVOID Object; // IN PUNICODE_STRING ValueName; // IN ULONG TitleIndex; // IN ULONG Type; // IN PVOID Data; // IN ULONG DataSize; // IN } REG_SET_VALUE_KEY_INFORMATION, *PREG_SET_VALUE_KEY_INFORMATION; typedef struct _REG_DELETE_VALUE_KEY_INFORMATION { PVOID Object; // IN PUNICODE_STRING ValueName; // IN } REG_DELETE_VALUE_KEY_INFORMATION, *PREG_DELETE_VALUE_KEY_INFORMATION; typedef struct _REG_SET_INFORMATION_KEY_INFORMATION { PVOID Object; // IN KEY_SET_INFORMATION_CLASS KeySetInformationClass; // IN PVOID KeySetInformation; // IN ULONG KeySetInformationLength;// IN } REG_SET_INFORMATION_KEY_INFORMATION, *PREG_SET_INFORMATION_KEY_INFORMATION; typedef struct _REG_ENUMERATE_KEY_INFORMATION { PVOID Object; // IN ULONG Index; // IN KEY_INFORMATION_CLASS KeyInformationClass; // IN PVOID KeyInformation; // IN ULONG Length; // IN PULONG ResultLength; // OUT } REG_ENUMERATE_KEY_INFORMATION, *PREG_ENUMERATE_KEY_INFORMATION; typedef struct _REG_ENUMERATE_VALUE_KEY_INFORMATION { PVOID Object; // IN ULONG Index; // IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; // IN PVOID KeyValueInformation; // IN ULONG Length; // IN PULONG ResultLength; // OUT } REG_ENUMERATE_VALUE_KEY_INFORMATION, *PREG_ENUMERATE_VALUE_KEY_INFORMATION; typedef struct _REG_QUERY_KEY_INFORMATION { PVOID Object; // IN KEY_INFORMATION_CLASS KeyInformationClass; // IN PVOID KeyInformation; // IN ULONG Length; // IN PULONG ResultLength; // OUT } REG_QUERY_KEY_INFORMATION, *PREG_QUERY_KEY_INFORMATION; typedef struct _REG_QUERY_VALUE_KEY_INFORMATION { PVOID Object; // IN PUNICODE_STRING ValueName; // IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass; // IN PVOID KeyValueInformation; // IN ULONG Length; // IN PULONG ResultLength; // OUT } REG_QUERY_VALUE_KEY_INFORMATION, *PREG_QUERY_VALUE_KEY_INFORMATION; typedef struct _REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION { PVOID Object; // IN PKEY_VALUE_ENTRY ValueEntries; // IN ULONG EntryCount; // IN PVOID ValueBuffer; // IN PULONG BufferLength; // IN OUT PULONG RequiredBufferLength; // OUT } REG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION, *PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION; typedef struct _REG_RENAME_KEY_INFORMATION { PVOID Object; // IN PUNICODE_STRING NewName; // IN } REG_RENAME_KEY_INFORMATION, *PREG_RENAME_KEY_INFORMATION; typedef struct _REG_PRE_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; // IN } REG_PRE_CREATE_KEY_INFORMATION, REG_PRE_OPEN_KEY_INFORMATION,*PREG_PRE_CREATE_KEY_INFORMATION, *PREG_PRE_OPEN_KEY_INFORMATION;; typedef struct _REG_POST_CREATE_KEY_INFORMATION { PUNICODE_STRING CompleteName; // IN PVOID Object; // IN NTSTATUS Status; // IN } REG_POST_CREATE_KEY_INFORMATION,REG_POST_OPEN_KEY_INFORMATION, *PREG_POST_CREATE_KEY_INFORMATION, *PREG_POST_OPEN_KEY_INFORMATION; typedef struct _REG_KEY_HANDLE_CLOSE_INFORMATION { PVOID Object; // IN } REG_KEY_HANDLE_CLOSE_INFORMATION, *PREG_KEY_HANDLE_CLOSE_INFORMATION; NTSTATUS CmRegisterCallback(IN PEX_CALLBACK_FUNCTION Function, IN PVOID Context, IN OUT PLARGE_INTEGER Cookie ); NTSTATUS CmUnRegisterCallback(IN LARGE_INTEGER Cookie); // end_ntddk end_wdm // // PnP private API // typedef VOID (*PCM_HYSTERESIS_CALLBACK)(PVOID Ref, ULONG Level); ULONG CmRegisterSystemHiveLimitCallback( ULONG Low, ULONG High, PVOID Ref, PCM_HYSTERESIS_CALLBACK Callback ); #endif // _CM_