371 lines
13 KiB
C
371 lines
13 KiB
C
|
/*++ 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_
|