00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#ifndef _CMP_
00029
#define _CMP_
00030
00031
#include "ntos.h"
00032
#include "hive.h"
00033
#include "wchar.h"
00034
#include "zwapi.h"
00035
#include <stdio.h>
00036
#include <profiles.h>
00037
00038
00039
00040
00041
00042
#include "cmdata.h"
00043
00044
00045 #define _CM_ENTRYLIST_MANIPULATION
00046
#ifdef _CM_ENTRYLIST_MANIPULATION
00047
00048 #define CmpRemoveEntryList(a) \
00049
if(((a)->Flink != NULL) && ((a)->Blink != NULL) ) { \
00050
RemoveEntryList(a); \
00051
(a)->Flink = (a)->Blink = NULL; \
00052
}
00053
00054 #define CmpClearListEntry(a) (a)->Flink = (a)->Blink = NULL
00055
00056
#else
00057
#define CmpRemoveEntryList(a) RemoveEntryList(a)
00058
#define CmpClearListEntry(a) //nothing
00059
#endif
00060
00061
00062 #define _WMI_TRACING_REGISTRYCALLS
00063
#ifdef _WMI_TRACING_REGISTRYCALLS
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 extern ULONG
WmiUsePerfClock;
00074 extern PCM_TRACE_NOTIFY_ROUTINE CmpTraceRoutine;
00075
00076 #define CmpWmiFireEvent(Status,KeyHandle,ElapsedTime,KeyName,Type) \
00077
{ \
00078
PCM_TRACE_NOTIFY_ROUTINE TraceRoutine = CmpTraceRoutine; \
00079
if( TraceRoutine != NULL ) { \
00080
(*TraceRoutine)(Status,KeyHandle,ElapsedTime,KeyName,Type); \
00081
} \
00082
}
00083
00084 #define StartWmiCmTrace()\
00085
LARGE_INTEGER StartSystemTime;\
00086
LARGE_INTEGER EndSystemTime;\
00087
if (CmpTraceRoutine) {\
00088
if (WmiUsePerfClock) {\
00089
StartSystemTime = KeQueryPerformanceCounter(NULL);\
00090
}\
00091
else {\
00092
KeQuerySystemTime(&StartSystemTime);\
00093
}\
00094
}
00095
00096
00097 #define EndWmiCmTrace(Status,Handle,KeyName,Type)\
00098
if (CmpTraceRoutine) {\
00099
try {\
00100
if (WmiUsePerfClock) {\
00101
EndSystemTime = KeQueryPerformanceCounter(NULL);\
00102
}\
00103
else {\
00104
KeQuerySystemTime(&EndSystemTime);\
00105
}\
00106
CmpWmiFireEvent(Status,Handle,EndSystemTime.QuadPart - StartSystemTime.QuadPart,KeyName,Type);\
00107
} except (EXCEPTION_EXECUTE_HANDLER) {\
00108
}\
00109
}
00110
00111
#else
00112
#define StartWmiCmTrace() //nothing
00113
#define EndWmiCmTrace(Status,Handle,KeyName,Type) //nothing
00114
#endif
00115
00116
00117
#ifdef _WRITE_PROTECTED_VALUE_CACHE
00118
00119
#define CmpMakeSpecialPoolReadOnly(PoolAddress) \
00120
{ \
00121
if( !MmProtectSpecialPool( (PVOID) PoolAddress, PAGE_READONLY) ) \
00122
KdPrint(("[CmpMakeSpecialPoolReadOnly]: Failed to Mark SpecialPool %lx as ReadOnly", PoolAddress )); \
00123
}
00124
00125
#define CmpMakeSpecialPoolReadWrite(PoolAddress) \
00126
{ \
00127
if( !MmProtectSpecialPool( (PVOID) PoolAddress, PAGE_READWRITE) ) { \
00128
KdPrint(("[CmpMakeSpecialPoolReadWrite]: Failed to Mark SpecialPool %lx as ReadWrite", PoolAddress )); \
00129
} \
00130
}
00131
#define CmpMakeValueCacheReadOnly(ValueCached,PoolAddress) \
00132
if(ValueCached) { \
00133
CmpMakeSpecialPoolReadOnly( PoolAddress );\
00134
}
00135
00136
#define CmpMakeValueCacheReadWrite(ValueCached,PoolAddress) \
00137
if(ValueCached) { \
00138
CmpMakeSpecialPoolReadWrite( PoolAddress );\
00139
}
00140
00141
#else
00142 #define CmpMakeSpecialPoolReadOnly(a) //nothing
00143 #define CmpMakeSpecialPoolReadWrite(a) //nothing
00144 #define CmpMakeValueCacheReadOnly(a,b) //nothing
00145 #define CmpMakeValueCacheReadWrite(a,b) //nothing
00146
#endif
00147
00148
00149
00150
#ifdef _WRITE_PROTECTED_REGISTRY_POOL
00151
00152
VOID
00153
HvpMarkBinReadWrite(
00154
PHHIVE Hive,
00155 HCELL_INDEX Cell
00156 );
00157
00158
VOID
00159
HvpChangeBinAllocation(
00160
PHBIN Bin,
00161 BOOLEAN ReadOnly
00162 );
00163
00164
VOID
00165
CmpMarkAllBinsReadOnly(
00166
PHHIVE Hive
00167 );
00168
00169
#else
00170 #define HvpChangeBinAllocation(a,b) //nothing
00171 #define HvpMarkBinReadWrite(a,b) //nothing
00172 #define CmpMarkAllBinsReadOnly(a) //nothing
00173
#endif
00174
00175
#ifdef POOL_TAGGING
00176
00177
00178
00179
#define CM_POOL_TAG ' MC'
00180
#define CM_KCB_TAG 'bkMC'
00181
#define CM_POSTBLOCK_TAG 'bpMC'
00182
#define CM_NOTIFYBLOCK_TAG 'bnMC'
00183
#define CM_POSTEVENT_TAG 'epMC'
00184
#define CM_POSTAPC_TAG 'apMC'
00185
00186
#ifdef _WANT_MACHINE_IDENTIFICATION
00187
00188
#define CM_PARSEINI_TAG 'ipMC'
00189
#define CM_GENINST_TAG 'igMC'
00190
00191
#endif
00192
00193
00194
00195
00196
00197
#define CM_CACHE_VALUE_INDEX_TAG 'IVMC'
00198
#define CM_CACHE_VALUE_TAG 'aVMC'
00199
#define CM_CACHE_INDEX_TAG 'nIMC'
00200
#define CM_CACHE_VALUE_DATA_TAG 'aDMC'
00201
#define CM_NAME_TAG 'bNMC'
00202
00203
00204
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,CM_POOL_TAG)
00205
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,CM_POOL_TAG)
00206
00207 PVOID
00208
CmpAllocateTag(
00209 ULONG Size,
00210 BOOLEAN UseForIo,
00211 ULONG Tag
00212 );
00213
#else
00214 #define CmpAllocateTag(a,b,c) CmpAllocate(a,b)
00215
#endif
00216
00217
00218
00219
00220 extern ULONG
CmpCacheOnFlag;
00221
00222 #define CM_CACHE_FAKE_KEY 0x00000001 // Create Fake key KCB
00223
00224
00225
00226
00227
00228
00229 extern FAST_MUTEX CmpKcbLock;
00230 #define LOCK_KCB_TREE() ExAcquireFastMutexUnsafe(&CmpKcbLock)
00231 #define UNLOCK_KCB_TREE() ExReleaseFastMutexUnsafe(&CmpKcbLock)
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242 #define CML_BUGCHECK 1
00243 #define CML_API 2
00244 #define CML_API_ARGS 3
00245 #define CML_WORKER 4
00246 #define CML_MAJOR 5
00247 #define CML_MINOR 6
00248 #define CML_FLOW 7
00249 #define CML_BIN 8
00250
00251
00252
00253
00254
00255 #define CMS_MAP 0x00000001
00256 #define CMS_INIT 0x00000002
00257 #define CMS_NTAPI 0x00000004
00258 #define CMS_HIVE 0x00000008
00259 #define CMS_IO 0x00000010
00260 #define CMS_PARSE 0x00000020
00261 #define CMS_SAVRES 0x00000040
00262 #define CMS_CM 0x00000080
00263 #define CMS_SEC 0x00000100
00264 #define CMS_POOL 0x00000200
00265 #define CMS_LOCKING 0x00000400
00266 #define CMS_NOTIFY 0x00000800
00267 #define CMS_EXCEPTION 0x00001000
00268 #define CMS_INDEX 0x00002000
00269 #define CMS_BIN_MAP 0x00004000
00270
00271 #define CMS_MAP_ERROR 0x00010000
00272 #define CMS_INIT_ERROR 0x00020000
00273 #define CMS_NTAPI_ERROR 0x00040000
00274 #define CMS_HIVE_ERROR 0x00080000
00275 #define CMS_IO_ERROR 0x00100000
00276 #define CMS_PARSE_ERROR 0x00200000
00277 #define CMS_SAVRES_ERROR 0x00400000
00278 #define CMS_CM_ERROR 0x00800000
00279 #define CMS_SEC_ERROR 0x01000000
00280 #define CMS_POOL_ERROR 0x02000000
00281 #define CMS_LOCKING_ERROR 0x04000000
00282 #define CMS_NOTIFY_ERROR 0x08000000
00283 #define CMS_INDEX_ERROR 0x10000000
00284
00285
00286 #define CMS_DEFAULT ((~(CMS_MAP)) & 0xffffffff)
00287
00288
#if DBG
00289
extern ULONG
CmLogLevel;
00290
extern ULONG
CmLogSelect;
00291
#define CMLOG(level, select) if ((level <= CmLogLevel) && ((select) & CmLogSelect))
00292
#else
00293 #define CMLOG(level, select) if (0) {}
00294
#endif
00295
00296
00297 #define REGCHECKING 1
00298
00299
#if DBG
00300
00301
#if REGCHECKING
00302
#define DCmCheckRegistry(a) if(HvHiveChecking) ASSERT(CmCheckRegistry(a, FALSE) == 0)
00303
#else
00304
#define DCmCheckRegistry(a)
00305
#endif
00306
00307
#else
00308 #define DCmCheckRegistry(a)
00309
#endif
00310
00311 #define REGISTRY_LOCK_CHECKING
00312
00313
#ifdef REGISTRY_LOCK_CHECKING
00314
ULONG
00315
CmpCheckLockExceptionFilter(
00316 IN PEXCEPTION_POINTERS ExceptionPointers
00317 );
00318
00319 #define BEGIN_LOCK_CHECKPOINT \
00320
{ \
00321
ULONG LockCountBefore,LockCountAfter; \
00322
LockCountBefore = ExIsResourceAcquiredShared(&CmpRegistryLock); \
00323
LockCountBefore += ExIsResourceAcquiredExclusive(&CmpRegistryLock); \
00324
try {
00325 #define END_LOCK_CHECKPOINT \
00326
} except(CmpCheckLockExceptionFilter(GetExceptionInformation())) {} \
00327
LockCountAfter = ExIsResourceAcquiredShared(&CmpRegistryLock); \
00328
LockCountAfter += ExIsResourceAcquiredExclusive(&CmpRegistryLock); \
00329
if( LockCountBefore != LockCountAfter ) { \
00330
KeBugCheckEx(REGISTRY_ERROR,13,LockCountBefore,LockCountAfter,0); \
00331
} \
00332
}
00333
00334
#else
00335
#define BEGIN_LOCK_CHECKPOINT
00336
#define END_LOCK_CHECKPOINT
00337
#endif
00338
00339
#if DBG
00340
#define ASSERT_CM_LOCK_OWNED() \
00341
ASSERT(CmpTestRegistryLock() == TRUE)
00342
#define ASSERT_CM_LOCK_OWNED_EXCLUSIVE() \
00343
ASSERT(CmpTestRegistryLockExclusive() == TRUE)
00344
#else
00345 #define ASSERT_CM_LOCK_OWNED()
00346 #define ASSERT_CM_LOCK_OWNED_EXCLUSIVE()
00347
#endif
00348
00349
#if DBG
00350
#define ASSERT_PASSIVE_LEVEL() \
00351
{ \
00352
KIRQL Irql; \
00353
Irql = KeGetCurrentIrql(); \
00354
if( KeGetCurrentIrql() != PASSIVE_LEVEL ) { \
00355
DbgPrint("ASSERT_PASSIVE_LEVEL failed ... Irql = %lu\n",Irql); \
00356
ASSERT( FALSE ); \
00357
} \
00358
}
00359
#else
00360 #define ASSERT_PASSIVE_LEVEL()
00361
#endif
00362
00363
#if defined(_CM_LDR_)
00364
00365
00366
00367
00368
00369
#define CM_BUGCHECK( Code, Parm1, Parm2, Parm3, Parm4 ) ASSERT(FALSE)
00370
00371
#else
00372
00373 #define CM_BUGCHECK( Code, Parm1, Parm2, Parm3, Parm4 ) \
00374
KeBugCheckEx( Code, Parm1, Parm2, Parm3, Parm4 )
00375
00376
#endif
00377
00378 #define VALIDATE_CELL_MAP(LINE,Map,Hive,Address) \
00379
if( Map == NULL ) { \
00380
CM_BUGCHECK (REGISTRY_ERROR,11,(ULONG_PTR)(Hive),(ULONG)(Address),(ULONG)(LINE)) ; \
00381
}
00382
00383
#if DBG
00384
VOID
00385
SepDumpSecurityDescriptor(
00386 IN PSECURITY_DESCRIPTOR SecurityDescriptor,
00387 IN PSZ TitleString
00388 );
00389
00390
extern BOOLEAN SepDumpSD;
00391
00392
#define CmpDumpSecurityDescriptor(x,y) \
00393
{ \
00394
SepDumpSD=TRUE; \
00395
SepDumpSecurityDescriptor(x, y); \
00396
SepDumpSD=FALSE; \
00397
}
00398
#else
00399
00400 #define CmpDumpSecurityDescriptor(x,y)
00401
00402
#endif
00403
00404
00405
00406
00407
00408
00409 extern UNICODE_STRING
CmRegistrySystemCloneName;
00410
00411
00412
00413
00414
00415
00416
00417 #define CLONE_CONTROL_SET FALSE
00418
00419
00420 #define NUMBER_TYPES (MaximumType + 1)
00421
00422 #define CM_WRAP_LIMIT 0x7fffffff
00423
00424
00425
00426
00427
00428 #define CM_MAX_STASH 1024*1024 // If size of data for a set
00429
00430
00431 #define CM_MAX_REASONABLE_VALUES 100 // If number of values for a
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442 #define MAX_HIVE_LAYERS 2
00443
00444
00445
00446
00447
00448
00449
00450
00451 typedef struct _BOOT_DRIVER_NODE {
00452 BOOT_DRIVER_LIST_ENTRY ListEntry;
00453 UNICODE_STRING
Group;
00454 UNICODE_STRING
Name;
00455 ULONG
Tag;
00456 ULONG
ErrorControl;
00457 }
BOOT_DRIVER_NODE, *
PBOOT_DRIVER_NODE;
00458
00459
00460
00461
00462
00463 extern POBJECT_TYPE CmpKeyObjectType;
00464
00465
00466
00467
00468
00469 #define RNDM_CONSTANT 314159269
00470 #define RNDM_PRIME 1000000007
00471
00472 #define HASH_KEY(_convkey_) ((RNDM_CONSTANT * (_convkey_)) % RNDM_PRIME)
00473
00474 #define GET_HASH_INDEX(Key) HASH_KEY(Key) % CmpHashTableSize
00475 #define GET_HASH_ENTRY(Table, Key) Table[GET_HASH_INDEX(Key)]
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486 #define KEY_BODY_TYPE 0x6b793032 // "ky02"
00487
00488
struct _CM_NOTIFY_BLOCK;
00489
00490 typedef struct _CM_KEY_BODY {
00491 ULONG
Type;
00492 PCM_KEY_CONTROL_BLOCK KeyControlBlock;
00493 struct _CM_NOTIFY_BLOCK *
NotifyBlock;
00494 PEPROCESS Process;
00495
#ifdef KCB_TO_KEYBODY_LINK
00496
LIST_ENTRY KeyBodyList;
00497
#endif
00498
}
CM_KEY_BODY, *
PCM_KEY_BODY;
00499
00500
00501
#ifdef KCB_TO_KEYBODY_LINK
00502
00503
#define INIT_KCB_KEYBODY_LIST(kcb) \
00504
LOCK_KCB_TREE(); \
00505
InitializeListHead(&(kcb->KeyBodyListHead)); \
00506
UNLOCK_KCB_TREE()
00507
00508
#define ASSERT_KEYBODY_LIST_EMPTY(kcb) ASSERT(IsListEmpty(&(kcb->KeyBodyListHead)) == TRUE)
00509
00510
#define ENLIST_KEYBODY_IN_KEYBODY_LIST(KeyBody) \
00511
ASSERT( KeyBody->KeyControlBlock != NULL ); \
00512
LOCK_KCB_TREE(); \
00513
InsertTailList(&(KeyBody->KeyControlBlock->KeyBodyListHead),&(KeyBody->KeyBodyList)); \
00514
UNLOCK_KCB_TREE()
00515
00516
#define DELIST_KEYBODY_FROM_KEYBODY_LIST(KeyBody) \
00517
ASSERT( KeyBody->KeyControlBlock != NULL ); \
00518
ASSERT(IsListEmpty(&(KeyBody->KeyControlBlock->KeyBodyListHead)) == FALSE); \
00519
LOCK_KCB_TREE(); \
00520
RemoveEntryList(&(KeyBody->KeyBodyList)); \
00521
UNLOCK_KCB_TREE()
00522
00523
#else
00524 #define INIT_KCB_KEYBODY_LIST(kcb) //nothing
00525 #define ASSERT_KEYBODY_LIST_EMPTY(kcb) //nothing
00526 #define ENLIST_KEYBODY_IN_KEYBODY_LIST(KeyBody) //nothing
00527 #define DELIST_KEYBODY_FROM_KEYBODY_LIST(KeyBody) //nothing
00528
#endif
00529
00530 #define ASSERT_KEY_OBJECT(x) ASSERT(((PCM_KEY_BODY)x)->Type == KEY_BODY_TYPE)
00531 #define ASSERT_NODE(x) ASSERT(((PCM_KEY_NODE)x)->Signature == CM_KEY_NODE_SIGNATURE)
00532 #define ASSERT_SECURITY(x) ASSERT(((PCM_KEY_SECURITY)x)->Signature == CM_KEY_SECURITY_SIGNATURE)
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542 typedef struct _CM_POST_KEY_BODY {
00543 LIST_ENTRY
KeyBodyList;
00544 struct _CM_KEY_BODY *
KeyBody;
00545 }
CM_POST_KEY_BODY, *
PCM_POST_KEY_BODY;
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558 typedef struct _CM_NOTIFY_BLOCK {
00559 LIST_ENTRY
HiveList;
00560 PCM_KEY_CONTROL_BLOCK KeyControlBlock;
00561 struct _CM_KEY_BODY *
KeyBody;
00562 ULONG
Filter;
00563 LIST_ENTRY
PostList;
00564 SECURITY_SUBJECT_CONTEXT SubjectContext;
00565 BOOLEAN
WatchTree;
00566 BOOLEAN
NotifyPending;
00567 }
CM_NOTIFY_BLOCK, *
PCM_NOTIFY_BLOCK;
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582 typedef enum _POST_BLOCK_TYPE {
00583
PostSynchronous = 1,
00584
PostAsyncUser = 2,
00585
PostAsyncKernel = 3
00586 }
POST_BLOCK_TYPE;
00587
00588 typedef struct _CM_SYNC_POST_BLOCK {
00589 PKEVENT SystemEvent;
00590 NTSTATUS Status;
00591 }
CM_SYNC_POST_BLOCK, *
PCM_SYNC_POST_BLOCK;
00592
00593 typedef struct _CM_ASYNC_USER_POST_BLOCK {
00594 PKEVENT UserEvent;
00595 PKAPC Apc;
00596 PIO_STATUS_BLOCK
IoStatusBlock;
00597 }
CM_ASYNC_USER_POST_BLOCK, *
PCM_ASYNC_USER_POST_BLOCK;
00598
00599 typedef struct _CM_ASYNC_KERNEL_POST_BLOCK {
00600 PKEVENT Event;
00601 PWORK_QUEUE_ITEM WorkItem;
00602 WORK_QUEUE_TYPE QueueType;
00603 }
CM_ASYNC_KERNEL_POST_BLOCK, *
PCM_ASYNC_KERNEL_POST_BLOCK;
00604
00605 typedef union _CM_POST_BLOCK_UNION {
00606 CM_SYNC_POST_BLOCK Sync;
00607 CM_ASYNC_USER_POST_BLOCK AsyncUser;
00608 CM_ASYNC_KERNEL_POST_BLOCK AsyncKernel;
00609 }
CM_POST_BLOCK_UNION, *
PCM_POST_BLOCK_UNION;
00610
00611 typedef struct _CM_POST_BLOCK {
00612
#if DBG
00613
BOOLEAN TraceIntoDebugger;
00614
#endif
00615 LIST_ENTRY
NotifyList;
00616 LIST_ENTRY
ThreadList;
00617 LIST_ENTRY
CancelPostList;
00618 struct _CM_POST_KEY_BODY *
PostKeyBody;
00619 ULONG
NotifyType;
00620 PCM_POST_BLOCK_UNION u;
00621 }
CM_POST_BLOCK, *
PCM_POST_BLOCK;
00622
00623 #define REG_NOTIFY_POST_TYPE_MASK (0x0000FFFFL) // mask for finding out the type of the post block
00624
00625 #define REG_NOTIFY_MASTER_POST (0x00010000L) // The current post block is a master one
00626
00627
00628
00629
00630 #define PostBlockType(_post_) ((POST_BLOCK_TYPE)( ((_post_)->NotifyType) & REG_NOTIFY_POST_TYPE_MASK ))
00631
00632 #define IsMasterPostBlock(_post_) ( ((_post_)->NotifyType) & REG_NOTIFY_MASTER_POST )
00633 #define SetMasterPostBlockFlag(_post_) ( ((_post_)->NotifyType) |= REG_NOTIFY_MASTER_POST )
00634 #define ClearMasterPostBlockFlag(_post_) ( ((_post_)->NotifyType) &= ~REG_NOTIFY_MASTER_POST )
00635
00636
00637
00638
00639
00640
00641
00642 extern FAST_MUTEX CmpPostLock;
00643 #define LOCK_POST_LIST() ExAcquireFastMutexUnsafe(&CmpPostLock)
00644 #define UNLOCK_POST_LIST() ExReleaseFastMutexUnsafe(&CmpPostLock)
00645
00646
00647
00648 typedef struct _CMHIVE {
00649 HHIVE Hive;
00650 HANDLE
FileHandles[
HFILE_TYPE_MAX];
00651 LIST_ENTRY
NotifyList;
00652 LIST_ENTRY
HiveList;
00653 PFAST_MUTEX HiveLock;
00654 }
CMHIVE, *
PCMHIVE;
00655
00656
00657
00658
00659
00660 #define CmLockHive(_hive_) ASSERT( (_hive_)->HiveLock );\
00661
ExAcquireFastMutexUnsafe((_hive_)->HiveLock)
00662 #define CmUnlockHive(_hive_) ASSERT( (_hive_)->HiveLock );\
00663
ExReleaseFastMutexUnsafe((_hive_)->HiveLock)
00664
00665
00666
00667
00668
00669
00670
00671
00672
00673 #define CmpHKeyNameLen(Key) \
00674
(((Key)->Flags & KEY_COMP_NAME) ? \
00675
CmpCompressedNameSize((Key)->Name,(Key)->NameLength) : \
00676
(Key)->NameLength)
00677
00678 #define CmpNcbNameLen(Ncb) \
00679
(((Ncb)->Compressed) ? \
00680
CmpCompressedNameSize((Ncb)->Name,(Ncb)->NameLength) : \
00681
(Ncb)->NameLength)
00682
00683 #define CmpHKeyNodeSize(Hive, KeyName) \
00684
(FIELD_OFFSET(CM_KEY_NODE, Name) + CmpNameSize(Hive, KeyName))
00685
00686
00687
00688
00689
00690
00691
00692 #define CmpValueNameLen(Value) \
00693
(((Value)->Flags & VALUE_COMP_NAME) ? \
00694
CmpCompressedNameSize((Value)->Name,(Value)->NameLength) : \
00695
(Value)->NameLength)
00696
00697 #define CmpHKeyValueSize(Hive, ValueName) \
00698
(FIELD_OFFSET(CM_KEY_VALUE, Name) + CmpNameSize(Hive, ValueName))
00699
00700
00701
00702
00703
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715
00716
00717
00718
00719 #define REG_CMD_INIT 1
00720 #define REG_CMD_FLUSH_KEY 2
00721 #define REG_CMD_FILE_SET_SIZE 3
00722 #define REG_CMD_HIVE_OPEN 4
00723 #define REG_CMD_HIVE_CLOSE 5
00724 #define REG_CMD_SHUTDOWN 6
00725 #define REG_CMD_RENAME_HIVE 7
00726 #define REG_CMD_ADD_HIVE_LIST 8
00727 #define REG_CMD_REMOVE_HIVE_LIST 9
00728 #define REG_CMD_REFRESH_HIVE 10
00729 #define REG_CMD_HIVE_READ 11
00730
00731
00732
00733
00734
00735
00736
00737 typedef struct _REGISTRY_COMMAND {
00738 ULONG
Command;
00739 PHHIVE Hive;
00740 HCELL_INDEX Cell;
00741 ULONG
FileType;
00742 ULONG
FileSize;
00743 NTSTATUS Status;
00744 POBJECT_ATTRIBUTES
FileAttributes;
00745 PCMHIVE CmHive;
00746 PVOID
Buffer;
00747 PVOID
Offset;
00748 BOOLEAN
Allocate;
00749 BOOLEAN
SetupBoot;
00750 BOOLEAN
RegistryLockAquired;
00751 PUNICODE_STRING
NewName;
00752 POBJECT_NAME_INFORMATION
OldName;
00753 ULONG
NameInfoLength;
00754 PSECURITY_CLIENT_CONTEXT ImpersonationContext;
00755 }
REGISTRY_COMMAND, *
PREGISTRY_COMMAND;
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766 #define REG_OPTION_PREDEF_HANDLE (0x00000008L)
00767 #define REG_PREDEF_HANDLE_MASK (0x80000000L)
00768
00769 typedef struct _CM_PARSE_CONTEXT {
00770 ULONG
TitleIndex;
00771 UNICODE_STRING
Class;
00772 ULONG
CreateOptions;
00773 ULONG
Disposition;
00774 BOOLEAN
CreateLink;
00775 CM_KEY_REFERENCE ChildHive;
00776 HANDLE
PredefinedHandle;
00777 }
CM_PARSE_CONTEXT, *
PCM_PARSE_CONTEXT;
00778
00779
NTSTATUS
00780
CmpParseKey(
00781 IN PVOID ParseObject,
00782 IN PVOID ObjectType,
00783 IN OUT
PACCESS_STATE AccessState,
00784 IN KPROCESSOR_MODE AccessMode,
00785 IN ULONG Attributes,
00786 IN OUT PUNICODE_STRING CompleteName,
00787 IN OUT PUNICODE_STRING RemainingName,
00788 IN OUT PVOID Context OPTIONAL,
00789 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
00790 OUT PVOID *Object
00791 );
00792
00793
NTSTATUS
00794
CmpDoCreate(
00795 IN
PHHIVE Hive,
00796 IN HCELL_INDEX Cell,
00797 IN
PACCESS_STATE AccessState,
00798 IN PUNICODE_STRING Name,
00799 IN KPROCESSOR_MODE AccessMode,
00800 IN PCM_PARSE_CONTEXT Context,
00801 IN
PCM_KEY_CONTROL_BLOCK ParentKcb,
00802 OUT PVOID *Object
00803 );
00804
00805
NTSTATUS
00806
CmpDoCreateChild(
00807 IN
PHHIVE Hive,
00808 IN HCELL_INDEX ParentCell,
00809 IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
00810 IN
PACCESS_STATE AccessState,
00811 IN PUNICODE_STRING Name,
00812 IN KPROCESSOR_MODE AccessMode,
00813 IN PCM_PARSE_CONTEXT Context,
00814 IN
PCM_KEY_CONTROL_BLOCK ParentKcb,
00815 IN USHORT Flags,
00816 OUT PHCELL_INDEX KeyCell,
00817 OUT PVOID *Object
00818 );
00819
00820
NTSTATUS
00821
CmpQueryKeyName(
00822 IN PVOID Object,
00823 IN BOOLEAN HasObjectName,
00824 OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
00825 IN ULONG Length,
00826 OUT PULONG ReturnLength
00827 );
00828
00829
VOID
00830
CmpDeleteKeyObject(
00831 IN PVOID Object
00832 );
00833
00834
VOID
00835
CmpCloseKeyObject(
00836 IN
PEPROCESS Process OPTIONAL,
00837 IN PVOID Object,
00838 IN ACCESS_MASK GrantedAccess,
00839 IN ULONG ProcessHandleCount,
00840 IN ULONG SystemHandleCount
00841 );
00842
00843
NTSTATUS
00844
CmpSecurityMethod (
00845 IN PVOID Object,
00846 IN
SECURITY_OPERATION_CODE OperationCode,
00847 IN PSECURITY_INFORMATION SecurityInformation,
00848 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
00849 IN OUT PULONG CapturedLength,
00850 IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
00851 IN POOL_TYPE PoolType,
00852 IN PGENERIC_MAPPING GenericMapping
00853 );
00854
00855 #define KCB_WORKER_CONTINUE 0
00856 #define KCB_WORKER_DONE 1
00857 #define KCB_WORKER_DELETE 2
00858
00859
typedef
00860 ULONG
00861 (*PKCB_WORKER_ROUTINE) (
00862
PCM_KEY_CONTROL_BLOCK Current,
00863 PVOID
Context1,
00864 PVOID
Context2
00865 );
00866
00867
00868
VOID
00869
CmpSearchKeyControlBlockTree(
00870
PKCB_WORKER_ROUTINE WorkerRoutine,
00871 PVOID Context1,
00872 PVOID Context2
00873 );
00874
00875
00876
00877
00878
00879 PVOID
00880
CmpAllocate(
00881 ULONG Size,
00882 BOOLEAN UseForIo
00883 );
00884
00885
VOID
00886
CmpFree(
00887 PVOID MemoryBlock,
00888 ULONG GlobalQuotaSize
00889 );
00890
00891 BOOLEAN
00892
CmpFileSetSize(
00893
PHHIVE Hive,
00894 ULONG FileType,
00895 ULONG FileSize
00896 );
00897
00898
NTSTATUS
00899
CmpDoFileSetSize(
00900
PHHIVE Hive,
00901 ULONG FileType,
00902 ULONG FileSize
00903 );
00904
00905 BOOLEAN
00906
CmpFileWrite(
00907
PHHIVE Hive,
00908 ULONG FileType,
00909
PCMP_OFFSET_ARRAY offsetArray,
00910 ULONG offsetArrayCount,
00911 PULONG FileOffset
00912 );
00913
00914 BOOLEAN
00915
CmpFileRead (
00916
PHHIVE Hive,
00917 ULONG FileType,
00918 PULONG FileOffset,
00919 PVOID DataBuffer,
00920 ULONG DataLength
00921 );
00922
00923 BOOLEAN
00924
CmpFileFlush (
00925
PHHIVE Hive,
00926 ULONG FileType
00927 );
00928
00929
NTSTATUS
00930
CmpCreateEvent(
00931 IN EVENT_TYPE eventType,
00932 OUT PHANDLE eventHandle,
00933 OUT
PKEVENT *event
00934 );
00935
00936
00937
00938
00939
00940
00941
NTSTATUS
00942
CmDeleteKey(
00943 IN PCM_KEY_BODY KeyBody
00944 );
00945
00946
NTSTATUS
00947
CmDeleteValueKey(
00948 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
00949 IN UNICODE_STRING ValueName
00950 );
00951
00952
NTSTATUS
00953
CmEnumerateKey(
00954 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
00955 IN ULONG Index,
00956 IN KEY_INFORMATION_CLASS KeyInformationClass,
00957 IN PVOID KeyInformation,
00958 IN ULONG Length,
00959 IN PULONG ResultLength
00960 );
00961
00962
NTSTATUS
00963
CmEnumerateValueKey(
00964 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
00965 IN ULONG Index,
00966 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
00967 IN PVOID KeyValueInformation,
00968 IN ULONG Length,
00969 IN PULONG ResultLength
00970 );
00971
00972
NTSTATUS
00973
CmFlushKey(
00974 IN
PHHIVE Hive,
00975 IN HCELL_INDEX Cell
00976 );
00977
00978
NTSTATUS
00979
CmQueryKey(
00980 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
00981 IN KEY_INFORMATION_CLASS KeyInformationClass,
00982 IN PVOID KeyInformation,
00983 IN ULONG Length,
00984 IN PULONG ResultLength
00985 );
00986
00987
NTSTATUS
00988
CmQueryValueKey(
00989 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
00990 IN UNICODE_STRING ValueName,
00991 IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
00992 IN PVOID KeyValueInformation,
00993 IN ULONG Length,
00994 IN PULONG ResultLength
00995 );
00996
00997
NTSTATUS
00998
CmQueryMultipleValueKey(
00999 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01000 IN PKEY_VALUE_ENTRY ValueEntries,
01001 IN ULONG EntryCount,
01002 IN PVOID ValueBuffer,
01003 IN OUT PULONG BufferLength,
01004 IN OPTIONAL PULONG ResultLength
01005 );
01006
01007
NTSTATUS
01008
CmRenameValueKey(
01009 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01010 IN UNICODE_STRING SourceValueName,
01011 IN UNICODE_STRING TargetValueName,
01012 IN ULONG TargetIndex
01013 );
01014
01015
NTSTATUS
01016
CmReplaceKey(
01017 IN
PHHIVE Hive,
01018 IN HCELL_INDEX Cell,
01019 IN PUNICODE_STRING NewHiveName,
01020 IN PUNICODE_STRING OldFileName
01021 );
01022
01023
NTSTATUS
01024
CmRestoreKey(
01025 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01026 IN HANDLE FileHandle,
01027 IN ULONG Flags
01028 );
01029
01030
NTSTATUS
01031
CmSaveKey(
01032 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01033 IN HANDLE FileHandle
01034 );
01035
01036
NTSTATUS
01037
CmSaveMergedKeys(
01038 IN
PCM_KEY_CONTROL_BLOCK HighPrecedenceKcb,
01039 IN
PCM_KEY_CONTROL_BLOCK LowPrecedenceKcb,
01040 IN HANDLE FileHandle
01041 );
01042
01043
NTSTATUS
01044
CmSetValueKey(
01045 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01046 IN PUNICODE_STRING ValueName,
01047 IN ULONG Type,
01048 IN PVOID Data,
01049 IN ULONG DataSize
01050 );
01051
01052
NTSTATUS
01053
CmSetLastWriteTimeKey(
01054 IN
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01055 IN PLARGE_INTEGER LastWriteTime
01056 );
01057
01058
NTSTATUS
01059
CmpNotifyChangeKey(
01060 IN PCM_KEY_BODY KeyBody,
01061 IN PCM_POST_BLOCK PostBlock,
01062 IN ULONG CompletionFilter,
01063 IN BOOLEAN WatchTree,
01064 IN PVOID Buffer,
01065 IN ULONG BufferSize,
01066 IN PCM_POST_BLOCK MasterPostBlock
01067 );
01068
01069
NTSTATUS
01070
CmLoadKey(
01071 IN POBJECT_ATTRIBUTES TargetKey,
01072 IN POBJECT_ATTRIBUTES SourceFile,
01073 IN ULONG Flags
01074 );
01075
01076
NTSTATUS
01077
CmUnloadKey(
01078 IN
PHHIVE Hive,
01079 IN HCELL_INDEX Cell,
01080 IN
PCM_KEY_CONTROL_BLOCK Kcb
01081 );
01082
01083
01084
01085
01086
01087 BOOLEAN
01088
CmpMarkKeyDirty(
01089
PHHIVE Hive,
01090 HCELL_INDEX Cell
01091 );
01092
01093 BOOLEAN
01094
CmpDoFlushAll(
01095 VOID
01096 );
01097
01098 extern BOOLEAN
CmpLazyFlushPending;
01099
01100
VOID
01101
CmpLazyFlush(
01102 VOID
01103 );
01104
01105
VOID
01106
CmpQuotaWarningWorker(
01107 IN PVOID WorkItem
01108 );
01109
01110
VOID
01111
CmpComputeGlobalQuotaAllowed(
01112 VOID
01113 );
01114
01115 BOOLEAN
01116
CmpClaimGlobalQuota(
01117 IN ULONG Size
01118 );
01119
01120
VOID
01121
CmpReleaseGlobalQuota(
01122 IN ULONG Size
01123 );
01124
01125
VOID
01126
CmpSetGlobalQuotaAllowed(
01127 VOID
01128 );
01129
01130
01131
01132
01133
01134
NTSTATUS
01135
CmpAssignSecurityDescriptor(
01136 IN
PHHIVE Hive,
01137 IN HCELL_INDEX Cell,
01138 IN
PCM_KEY_NODE Node,
01139 IN PSECURITY_DESCRIPTOR SecurityDescriptor
01140 );
01141
01142 BOOLEAN
01143
CmpCheckCreateAccess(
01144 IN PUNICODE_STRING RelativeName,
01145 IN PSECURITY_DESCRIPTOR Descriptor,
01146 IN
PACCESS_STATE AccessState,
01147 IN KPROCESSOR_MODE PreviousMode,
01148 IN ACCESS_MASK AdditionalAccess,
01149 OUT PNTSTATUS AccessStatus
01150 );
01151
01152 BOOLEAN
01153
CmpCheckNotifyAccess(
01154 IN PCM_NOTIFY_BLOCK NotifyBlock,
01155 IN
PHHIVE Hive,
01156 IN
PCM_KEY_NODE Node
01157 );
01158
01159 PSECURITY_DESCRIPTOR
01160
CmpHiveRootSecurityDescriptor(
01161 VOID
01162 );
01163
01164
VOID
01165
CmpFreeSecurityDescriptor(
01166 IN
PHHIVE Hive,
01167 IN HCELL_INDEX Cell
01168 );
01169
01170
01171
01172
01173
01174 extern ERESOURCE CmpRegistryLock;
01175
01176
#if 0
01177
#define CmpLockRegistry() KeEnterCriticalRegion(); \
01178
ExAcquireResourceShared(&CmpRegistryLock, TRUE)
01179
01180
#define CmpLockRegistryExclusive() KeEnterCriticalRegion(); \
01181
ExAcquireResourceExclusive(&CmpRegistryLock,TRUE)
01182
01183
#else
01184
VOID
01185
CmpLockRegistryExclusive(
01186 VOID
01187 );
01188
VOID
01189
CmpLockRegistry(
01190 VOID
01191 );
01192
#endif
01193
BOOLEAN
01194
CmpIsLastKnownGoodBoot(
01195 VOID
01196 );
01197
01198
VOID
01199
CmpUnlockRegistry(
01200 );
01201
01202
#if DBG
01203
BOOLEAN
01204
CmpTestRegistryLock(
01205 VOID
01206 );
01207 BOOLEAN
01208
CmpTestRegistryLockExclusive(
01209 VOID
01210 );
01211
#endif
01212
01213
NTSTATUS
01214
CmpQueryKeyData(
01215
PHHIVE Hive,
01216
PCM_KEY_NODE Node,
01217 KEY_INFORMATION_CLASS KeyInformationClass,
01218 PVOID KeyInformation,
01219 ULONG Length,
01220 PULONG ResultLength
01221 );
01222
01223
01224
VOID
01225
CmpFreeKeyBody(
01226
PHHIVE Hive,
01227 HCELL_INDEX Cell
01228 );
01229
01230
VOID
01231
CmpFreeValue(
01232
PHHIVE Hive,
01233 HCELL_INDEX Cell
01234 );
01235
01236
HCELL_INDEX
01237
CmpFindValueByName(
01238
PHHIVE Hive,
01239
PCM_KEY_NODE KeyNode,
01240 PUNICODE_STRING Name
01241 );
01242
01243 #define CmpFindValueByName(h,k,n) CmpFindNameInList(h,&((k)->ValueList),n,NULL,NULL)
01244
01245
NTSTATUS
01246
CmpDeleteChildByName(
01247
PHHIVE Hive,
01248 HCELL_INDEX Cell,
01249 UNICODE_STRING Name,
01250 PHCELL_INDEX ChildCell
01251 );
01252
01253
NTSTATUS
01254
CmpFreeKeyByCell(
01255
PHHIVE Hive,
01256 HCELL_INDEX Cell,
01257 BOOLEAN Unlink
01258 );
01259
01260
HCELL_INDEX
01261
CmpFindNameInList(
01262 IN
PHHIVE Hive,
01263 IN
PCHILD_LIST ChildList,
01264 IN PUNICODE_STRING Name,
01265 IN OPTIONAL
PCELL_DATA *ChildAddress,
01266 IN OPTIONAL PULONG ChildIndex
01267 );
01268
01269
HCELL_INDEX
01270
CmpCopyCell(
01271
PHHIVE SourceHive,
01272 HCELL_INDEX SourceCell,
01273
PHHIVE TargetHive,
01274 HSTORAGE_TYPE Type
01275 );
01276
01277
HCELL_INDEX
01278
CmpCopyValue(
01279
PHHIVE SourceHive,
01280 HCELL_INDEX SourceValueCell,
01281
PHHIVE TargetHive,
01282 HSTORAGE_TYPE Type
01283 );
01284
01285
HCELL_INDEX
01286
CmpCopyKeyPartial(
01287
PHHIVE SourceHive,
01288 HCELL_INDEX SourceKeyCell,
01289
PHHIVE TargetHive,
01290 HCELL_INDEX Parent,
01291 BOOLEAN CopyValues
01292 );
01293
01294 BOOLEAN
01295
CmpCopySyncTree(
01296
PHHIVE SourceHive,
01297 HCELL_INDEX SourceCell,
01298
PHHIVE TargetHive,
01299 HCELL_INDEX TargetCell,
01300 BOOLEAN CopyVolatile,
01301 CMP_COPY_TYPE CopyType
01302 );
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314 #define CmpCopyTree(s,c,t,l) CmpCopySyncTree(s,c,t,l,FALSE,Copy)
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327 #define CmpCopyTreeEx(s,c,t,l,f) CmpCopySyncTree(s,c,t,l,f,Copy)
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339 #define CmpSyncTrees(s,c,t,l,f) CmpCopySyncTree(s,c,t,l,f,Sync)
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351 #define CmpMergeTrees(s,c,t,l) CmpCopySyncTree(s,c,t,l,FALSE,Merge)
01352
01353
VOID
01354
CmpDeleteTree(
01355
PHHIVE Hive,
01356 HCELL_INDEX Cell
01357 );
01358
01359
VOID
01360
CmpSetVersionData(
01361 VOID
01362 );
01363
01364
NTSTATUS
01365
CmpInitializeHardwareConfiguration(
01366 IN
PLOADER_PARAMETER_BLOCK LoaderBlock
01367 );
01368
01369
NTSTATUS
01370
CmpInitializeMachineDependentConfiguration(
01371 IN
PLOADER_PARAMETER_BLOCK LoaderBlock
01372 );
01373
01374
NTSTATUS
01375
CmpInitializeRegistryNode(
01376 IN
PCONFIGURATION_COMPONENT_DATA CurrentEntry,
01377 IN HANDLE ParentHandle,
01378 OUT PHANDLE NewHandle,
01379 IN INTERFACE_TYPE InterfaceType,
01380 IN ULONG BusNumber,
01381 IN PUSHORT DeviceIndexTable
01382 );
01383
01384
NTSTATUS
01385
CmpInitializeHive(
01386 PCMHIVE *CmHive,
01387 ULONG OperationType,
01388 ULONG HiveFlags,
01389 ULONG FileType,
01390 PVOID HiveData OPTIONAL,
01391 HANDLE Primary,
01392 HANDLE Alternate,
01393 HANDLE Log,
01394 HANDLE External,
01395 PUNICODE_STRING FileName
01396 );
01397
01398 BOOLEAN
01399
CmpDestroyHive(
01400 IN
PHHIVE Hive,
01401 IN HCELL_INDEX Cell
01402 );
01403
01404
VOID
01405
CmpInitializeRegistryNames(
01406 VOID
01407 );
01408
01409
VOID
01410
CmpInitializeCache(
01411 VOID
01412 );
01413
01414
PCM_KEY_CONTROL_BLOCK
01415
CmpCreateKeyControlBlock(
01416
PHHIVE Hive,
01417 HCELL_INDEX Cell,
01418
PCM_KEY_NODE Node,
01419
PCM_KEY_CONTROL_BLOCK ParentKcb,
01420 BOOLEAN FakeKey,
01421 PUNICODE_STRING KeyName
01422 );
01423
01424 ULONG
01425
CmpSearchForOpenSubKeys(
01426 IN
PCM_KEY_CONTROL_BLOCK SearchKey,
01427 IN SUBKEY_SEARCH_TYPE SearchType
01428 );
01429
01430
VOID
01431
CmpDereferenceKeyControlBlock(
01432
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01433 );
01434
01435
VOID
01436
CmpRemoveKeyControlBlock(
01437
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01438 );
01439
01440
VOID
01441
CmpReportNotify(
01442
PCM_KEY_CONTROL_BLOCK KeyControlBlock,
01443
PHHIVE Hive,
01444 HCELL_INDEX Cell,
01445 ULONG NotifyMask
01446 );
01447
01448
VOID
01449
CmpPostNotify(
01450 PCM_NOTIFY_BLOCK NotifyBlock,
01451 PUNICODE_STRING Name OPTIONAL,
01452 ULONG Filter,
01453 NTSTATUS Status,
01454 PLIST_ENTRY ExternalKeyDeref OPTIONAL
01455 );
01456
01457
PCM_POST_BLOCK
01458
CmpAllocatePostBlock(
01459 IN POST_BLOCK_TYPE BlockType,
01460 IN ULONG PostFlags,
01461 IN PCM_KEY_BODY KeyBody,
01462 IN PCM_POST_BLOCK MasterBlock
01463 );
01464
01465
01466
01467
01468
01469
01470
01471 #define CmpAllocateMasterPostBlock(b) CmpAllocatePostBlock(b,REG_NOTIFY_MASTER_POST,NULL,NULL)
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481 #define CmpAllocateSlavePostBlock(b,k,m) CmpAllocatePostBlock(b,0,k,m)
01482
01483
VOID
01484
CmpFreePostBlock(
01485 IN PCM_POST_BLOCK PostBlock
01486 );
01487
01488
VOID
01489
CmpPostApc(
01490
struct _KAPC *Apc,
01491 PKNORMAL_ROUTINE *NormalRoutine,
01492 PVOID *NormalContext,
01493 PVOID *SystemArgument1,
01494 PVOID *SystemArgument2
01495 );
01496
01497
VOID
01498
CmpFlushNotify(
01499 PCM_KEY_BODY KeyBody
01500 );
01501
01502
VOID
01503
CmpPostApcRunDown(
01504
struct _KAPC *Apc
01505 );
01506
01507
NTSTATUS
01508
CmpOpenHiveFiles(
01509 PUNICODE_STRING BaseName,
01510 PWSTR Extension OPTIONAL,
01511 PHANDLE Primary,
01512 PHANDLE Secondary,
01513 PULONG PrimaryDisposition,
01514 PULONG SecondaryDispoition,
01515 BOOLEAN CreateAllowed,
01516 BOOLEAN MarkAsSystemHive,
01517 PULONG ClusterSize
01518 );
01519
01520
NTSTATUS
01521
CmpLinkHiveToMaster(
01522 PUNICODE_STRING LinkName,
01523 HANDLE RootDirectory,
01524 PCMHIVE CmHive,
01525 BOOLEAN Allocate,
01526 PSECURITY_DESCRIPTOR SecurityDescriptor
01527 );
01528
01529
VOID
01530
CmpWorker(
01531 IN OUT PREGISTRY_COMMAND Command
01532 );
01533
01534
NTSTATUS
01535
CmpSaveBootControlSet(
01536 IN USHORT ControlSetNum
01537 );
01538
01539
01540
01541
01542
01543
01544 ULONG
01545
CmCheckRegistry(
01546 PCMHIVE CmHive,
01547 BOOLEAN Clean
01548 );
01549
01550 BOOLEAN
01551
CmpValidateHiveSecurityDescriptors(
01552 IN
PHHIVE Hive
01553 );
01554
01555 #define SetUsed(Hive, Cell) \
01556
{ \
01557
PCELL_DATA p; \
01558
p = HvGetCell(Hive, Cell); \
01559
CmpUsedStorage += HvGetCellSize(Hive, p); \
01560
}
01561
01562
01563
01564
01565
01566 #define CM_HARDWARE_PROFILE_STR_DATABASE L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\IDConfigDB"
01567 #define CM_HARDWARE_PROFILE_STR_CCS_HWPROFILE L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles"
01568 #define CM_HARDWARE_PROFILE_STR_CCS_CURRENT L"\\Registry\\Machine\\System\\CurrentControlSet\\Hardware Profiles\\Current"
01569
01570
01571
01572 #define CM_HARDWARE_PROFILE_STR_ALIAS L"Alias"
01573 #define CM_HARDWARE_PROFILE_STR_ACPI_ALIAS L"AcpiAlias"
01574 #define CM_HARDWARE_PROFILE_STR_HARDWARE_PROFILES L"Hardware Profiles"
01575
01576
01577
01578
01579 #define CM_HARDWARE_PROFILE_STR_DOCKING_STATE L"DockingState"
01580 #define CM_HARDWARE_PROFILE_STR_CAPABILITIES L"Capabilities"
01581 #define CM_HARDWARE_PROFILE_STR_DOCKID L"DockID"
01582 #define CM_HARDWARE_PROFILE_STR_SERIAL_NUMBER L"SerialNumber"
01583 #define CM_HARDWARE_PROFILE_STR_ACPI_SERIAL_NUMBER L"AcpiSerialNumber"
01584 #define CM_HARDWARE_PROFILE_STR_PROFILE_NUMBER L"ProfileNumber"
01585 #define CM_HARDWARE_PROFILE_STR_ALIASABLE L"Aliasable"
01586 #define CM_HARDWARE_PROFILE_STR_CLONED L"Cloned"
01587
01588
01589
01590 #define CM_HARDWARE_PROFILE_STR_PRISTINE L"Pristine"
01591 #define CM_HARDWARE_PROFILE_STR_PREFERENCE_ORDER L"PreferenceOrder"
01592 #define CM_HARDWARE_PROFILE_STR_FRIENDLY_NAME L"FriendlyName"
01593 #define CM_HARDWARE_PROFILE_STR_CURRENT_DOCK_INFO L"CurrentDockInfo"
01594 #define CM_HARDWARE_PROFILE_STR_HW_PROFILE_GUID L"HwProfileGuid"
01595
01596
01597
01598 #define CM_HARDWARE_PROFILE_STR_DOCKED L"Docked"
01599 #define CM_HARDWARE_PROFILE_STR_UNDOCKED L"Undocked"
01600 #define CM_HARDWARE_PROFILE_STR_UNKNOWN L"Unknown"
01601
01602
01603
01604
01605
01606 typedef struct _HIVE_LIST_ENTRY {
01607 PWSTR
Name;
01608 PWSTR
BaseName;
01609 PCMHIVE CmHive;
01610 ULONG
Flags;
01611 }
HIVE_LIST_ENTRY, *
PHIVE_LIST_ENTRY;
01612
01613
01614
01615
01616
01617 typedef struct _CM_HARDWARE_PROFILE {
01618 ULONG
NameLength;
01619 PWSTR
FriendlyName;
01620 ULONG
PreferenceOrder;
01621 ULONG
Id;
01622 ULONG
Flags;
01623 }
CM_HARDWARE_PROFILE, *
PCM_HARDWARE_PROFILE;
01624
01625 #define CM_HP_FLAGS_ALIASABLE 1
01626 #define CM_HP_FLAGS_TRUE_MATCH 2
01627 #define CM_HP_FLAGS_PRISTINE 4
01628 #define CM_HP_FLAGS_DUPLICATE 8
01629
01630 typedef struct _CM_HARDWARE_PROFILE_LIST {
01631 ULONG
MaxProfileCount;
01632 ULONG
CurrentProfileCount;
01633 CM_HARDWARE_PROFILE Profile[1];
01634 }
CM_HARDWARE_PROFILE_LIST, *
PCM_HARDWARE_PROFILE_LIST;
01635
01636 typedef struct _CM_HARDWARE_PROFILE_ALIAS {
01637 ULONG
ProfileNumber;
01638 ULONG
DockState;
01639 ULONG
DockID;
01640 ULONG
SerialNumber;
01641 }
CM_HARDWARE_PROFILE_ALIAS, *
PCM_HARDWARE_PROFILE_ALIAS;
01642
01643 typedef struct _CM_HARDWARE_PROFILE_ALIAS_LIST {
01644 ULONG
MaxAliasCount;
01645 ULONG
CurrentAliasCount;
01646 CM_HARDWARE_PROFILE_ALIAS Alias[1];
01647 }
CM_HARDWARE_PROFILE_ALIAS_LIST, *
PCM_HARDWARE_PROFILE_ALIAS_LIST;
01648
01649 typedef struct _CM_HARDWARE_PROFILE_ACPI_ALIAS {
01650 ULONG
ProfileNumber;
01651 ULONG
DockState;
01652 ULONG
SerialLength;
01653 PCHAR
SerialNumber;
01654 }
CM_HARDWARE_PROFILE_ACPI_ALIAS, *
PCM_HARDWARE_PROFILE_ACPI_ALIAS;
01655
01656 typedef struct _CM_HARDWARE_PROFILE_ACPI_ALIAS_LIST {
01657 ULONG
MaxAliasCount;
01658 ULONG
CurrentAliasCount;
01659 CM_HARDWARE_PROFILE_ACPI_ALIAS Alias[1];
01660 }
CM_HARDWARE_PROFILE_ACPI_ALIAS_LIST, *
PCM_HARDWARE_PROFILE_ACPI_ALIAS_LIST;
01661
01662
HCELL_INDEX
01663
CmpFindControlSet(
01664 IN
PHHIVE SystemHive,
01665 IN HCELL_INDEX RootCell,
01666 IN PUNICODE_STRING SelectName,
01667 OUT PBOOLEAN AutoSelect
01668 );
01669
01670 BOOLEAN
01671
CmpFindDrivers(
01672 IN
PHHIVE Hive,
01673 IN HCELL_INDEX ControlSet,
01674 IN SERVICE_LOAD_TYPE LoadType,
01675 IN PWSTR BootFileSystem OPTIONAL,
01676 IN PLIST_ENTRY DriverListHead
01677 );
01678
01679 BOOLEAN
01680
CmpFindNLSData(
01681 IN
PHHIVE Hive,
01682 IN HCELL_INDEX ControlSet,
01683 OUT PUNICODE_STRING AnsiFilename,
01684 OUT PUNICODE_STRING OemFilename,
01685 OUT PUNICODE_STRING CaseTableFilename,
01686 OUT PUNICODE_STRING OemHalFilename
01687 );
01688
01689
HCELL_INDEX
01690
CmpFindProfileOption(
01691 IN
PHHIVE Hive,
01692 IN HCELL_INDEX ControlSet,
01693 OUT PCM_HARDWARE_PROFILE_LIST *ProfileList,
01694 OUT PCM_HARDWARE_PROFILE_ALIAS_LIST *AliasList,
01695 OUT PULONG Timeout
01696 );
01697
01698
VOID
01699
CmpSetCurrentProfile(
01700 IN
PHHIVE Hive,
01701 IN HCELL_INDEX ControlSet,
01702 IN PCM_HARDWARE_PROFILE Profile
01703 );
01704
01705 BOOLEAN
01706
CmpResolveDriverDependencies(
01707 IN PLIST_ENTRY DriverListHead
01708 );
01709
01710 BOOLEAN
01711
CmpSortDriverList(
01712 IN
PHHIVE Hive,
01713 IN HCELL_INDEX ControlSet,
01714 IN PLIST_ENTRY DriverListHead
01715 );
01716
01717
HCELL_INDEX
01718
CmpFindSubKeyByName(
01719
PHHIVE Hive,
01720
PCM_KEY_NODE Parent,
01721 PUNICODE_STRING SearchName
01722 );
01723
01724
HCELL_INDEX
01725
CmpFindSubKeyByNumber(
01726
PHHIVE Hive,
01727
PCM_KEY_NODE Parent,
01728 ULONG Number
01729 );
01730
01731 BOOLEAN
01732
CmpAddSubKey(
01733
PHHIVE Hive,
01734 HCELL_INDEX Parent,
01735 HCELL_INDEX Child
01736 );
01737
01738 BOOLEAN
01739
CmpMarkIndexDirty(
01740
PHHIVE Hive,
01741 HCELL_INDEX ParentKey,
01742 HCELL_INDEX TargetKey
01743 );
01744
01745 BOOLEAN
01746
CmpRemoveSubKey(
01747
PHHIVE Hive,
01748 HCELL_INDEX ParentKey,
01749 HCELL_INDEX TargetKey
01750 );
01751
01752 BOOLEAN
01753
CmpGetNextName(
01754 IN OUT PUNICODE_STRING RemainingName,
01755 OUT PUNICODE_STRING NextName,
01756 OUT PBOOLEAN Last
01757 );
01758
01759
NTSTATUS
01760
CmpAddToHiveFileList(
01761 PCMHIVE CmHive
01762 );
01763
01764
VOID
01765
CmpRemoveFromHiveFileList(
01766 );
01767
01768
NTSTATUS
01769
CmpInitHiveFromFile(
01770 IN PUNICODE_STRING FileName,
01771 IN ULONG HiveFlags,
01772 OUT PCMHIVE *CmHive,
01773 IN OUT PBOOLEAN Allocate,
01774 IN OUT PBOOLEAN RegistryLocked
01775 );
01776
01777
NTSTATUS
01778
CmpCloneHwProfile (
01779 IN HANDLE IDConfigDB,
01780 IN HANDLE Parent,
01781 IN HANDLE OldProfile,
01782 IN ULONG OldProfileNumber,
01783 IN USHORT DockingState,
01784 OUT PHANDLE NewProfile,
01785 OUT PULONG NewProfileNumber
01786 );
01787
01788
NTSTATUS
01789
CmpCreateHwProfileFriendlyName (
01790 IN HANDLE IDConfigDB,
01791 IN ULONG DockingState,
01792 IN ULONG NewProfileNumber,
01793 OUT PUNICODE_STRING FriendlyName
01794 );
01795
01796
typedef
01797
NTSTATUS
01798 (*PCM_ACPI_SELECTION_ROUTINE) (
01799 IN
PCM_HARDWARE_PROFILE_LIST ProfileList,
01800 OUT PULONG ProfileIndexToUse,
01801 IN PVOID Context
01802 );
01803
01804
NTSTATUS
01805
CmSetAcpiHwProfile (
01806 IN
PPROFILE_ACPI_DOCKING_STATE DockState,
01807 IN
PCM_ACPI_SELECTION_ROUTINE,
01808 IN PVOID Context,
01809 OUT PHANDLE NewProfile,
01810 OUT PBOOLEAN ProfileChanged
01811 );
01812
01813
NTSTATUS
01814
CmpAddAcpiAliasEntry (
01815 IN HANDLE IDConfigDB,
01816 IN
PPROFILE_ACPI_DOCKING_STATE NewDockState,
01817 IN ULONG ProfileNumber,
01818 IN PWCHAR nameBuffer,
01819 IN PVOID valueBuffer,
01820 IN ULONG valueBufferLength,
01821 IN BOOLEAN PreventDuplication
01822 );
01823
01824
01825
01826
01827
USHORT
01828
CmpNameSize(
01829 IN
PHHIVE Hive,
01830 IN PUNICODE_STRING Name
01831 );
01832
01833
USHORT
01834
CmpCopyName(
01835 IN
PHHIVE Hive,
01836 IN PWCHAR Destination,
01837 IN PUNICODE_STRING Source
01838 );
01839
01840
VOID
01841
CmpCopyCompressedName(
01842 IN PWCHAR Destination,
01843 IN ULONG DestinationLength,
01844 IN PWCHAR Source,
01845 IN ULONG SourceLength
01846 );
01847
01848 LONG
01849
CmpCompareCompressedName(
01850 IN PUNICODE_STRING SearchName,
01851 IN PWCHAR CompressedName,
01852 IN ULONG NameLength
01853 );
01854
01855
USHORT
01856
CmpCompressedNameSize(
01857 IN PWCHAR Name,
01858 IN ULONG Length
01859 );
01860
01861
01862
#endif
01863
01864
01865
01866
01867
01868
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882
PCM_NAME_CONTROL_BLOCK
01883
CmpGetNameControlBlock(
01884 PUNICODE_STRING NodeName
01885 );
01886
01887
VOID
01888
CmpDereferenceKeyControlBlockWithLock(
01889
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01890 );
01891
01892
VOID
01893
CmpCleanUpSubKeyInfo(
01894
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01895 );
01896
01897
VOID
01898
CmpCleanUpKcbValueCache(
01899
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01900 );
01901
01902
VOID
01903
CmpCleanUpKcbCacheWithLock(
01904
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01905 );
01906
01907
VOID
01908
CmpRemoveFromDelayedClose(
01909 IN
PCM_KEY_CONTROL_BLOCK kcb
01910 );
01911
01912 PUNICODE_STRING
01913
CmpConstructName(
01914
PCM_KEY_CONTROL_BLOCK kcb
01915 );
01916
01917
PCELL_DATA
01918
CmpGetValueListFromCache(
01919 IN
PHHIVE Hive,
01920 IN
PCACHED_CHILD_LIST ChildList,
01921 IN OUT BOOLEAN *IndexCached
01922 );
01923
01924
PCM_KEY_VALUE
01925
CmpGetValueKeyFromCache(
01926 IN
PHHIVE Hive,
01927 IN
PCELL_DATA List,
01928 IN ULONG Index,
01929 OUT
PPCM_CACHED_VALUE *ContainingList,
01930 IN BOOLEAN IndexCached,
01931 OUT BOOLEAN *ValueCached
01932 );
01933
01934
PCM_KEY_VALUE
01935
CmpFindValueByNameFromCache(
01936 IN
PHHIVE Hive,
01937 IN
PCACHED_CHILD_LIST ChildList,
01938 IN PUNICODE_STRING Name,
01939 OUT
PPCM_CACHED_VALUE *ContainingList,
01940 OUT ULONG *Index,
01941 OUT BOOLEAN *ValueCached
01942 );
01943
01944
NTSTATUS
01945
CmpQueryKeyValueData(
01946
PHHIVE Hive,
01947
PCM_CACHED_VALUE *ContainingList,
01948
PCM_KEY_VALUE ValueKey,
01949 BOOLEAN ValueCached,
01950 KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
01951 PVOID KeyValueInformation,
01952 ULONG Length,
01953 PULONG ResultLength
01954 );
01955
01956 BOOLEAN
01957
CmpReferenceKeyControlBlock(
01958
PCM_KEY_CONTROL_BLOCK KeyControlBlock
01959 );
01960
01961
VOID
01962
CmpInitializeKeyNameString(
PCM_KEY_NODE Cell,
01963 PUNICODE_STRING KeyName,
01964 WCHAR *NameBuffer
01965 );
01966
01967
VOID
01968
CmpInitializeValueNameString(
PCM_KEY_VALUE Cell,
01969 PUNICODE_STRING ValueName,
01970 WCHAR *NameBuffer
01971 );
01972
01973
#ifdef KCB_TO_KEYBODY_LINK
01974
VOID
01975 CmpFlushNotifiesOnKeyBodyList(
01976 IN
PCM_KEY_CONTROL_BLOCK kcb
01977 );
01978
01979
#endif
01980
01981 extern ULONG
CmpHashTableSize;
01982 extern PCM_KEY_HASH *
CmpCacheTable;
01983
01984
#ifdef _WANT_MACHINE_IDENTIFICATION
01985
01986 BOOLEAN
01987 CmpGetBiosDateFromRegistry(
01988 IN
PHHIVE Hive,
01989 IN HCELL_INDEX ControlSet,
01990 OUT PUNICODE_STRING Date
01991 );
01992
01993 BOOLEAN
01994 CmpGetBiosinfoFileNameFromRegistry(
01995 IN
PHHIVE Hive,
01996 IN HCELL_INDEX ControlSet,
01997 OUT PUNICODE_STRING InfName
01998 );
01999
02000
02001
#endif
02002
02003
02004
02005
#if defined(_WIN64)
02006
02007
#define CmpSetIoStatus(Iosb, s, i, UseIosb32) \
02008
if ((UseIosb32)) { \
02009
((PIO_STATUS_BLOCK32)(Iosb))->Status = (NTSTATUS)(s); \
02010
((PIO_STATUS_BLOCK32)(Iosb))->Information = (ULONG)(i); \
02011
} \
02012
else { \
02013
(Iosb)->Status = (s); \
02014
(Iosb)->Information = (i); \
02015
} \
02016
02017
#else
02018
02019 #define CmpSetIoStatus(Iosb, s, i, UseIosb32) \
02020
(Iosb)->Status = (s); \
02021
(Iosb)->Information = (i); \
02022
02023
#endif
02024
02025