windows-nt/Source/XPSP1/NT/base/ntos/inc/cm.h

371 lines
13 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++ 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_