Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

cmp.h

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1991 Microsoft Corporation 00004 00005 Module Name: 00006 00007 cmp.h 00008 00009 Abstract: 00010 00011 This module contains the private (internal) header file for the 00012 configuration manager. 00013 00014 Author: 00015 00016 Bryan M. Willman (bryanwi) 10-Sep-91 00017 00018 Environment: 00019 00020 Kernel mode only. 00021 00022 Revision History: 00023 00024 13-Jan-99 Dragos C. Sambotin (dragoss) - factoring the data structure declarations 00025 in \nt\private\ntos\inc\cmdata.h :: to be available from outside. 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 // CM data structure declarations 00041 // file location: \nt\private\ntos\inc 00042 #include "cmdata.h" 00043 00044 // this is to catch twice deletion of an entry from a list 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 // tracing registry calls support 00062 #define _WMI_TRACING_REGISTRYCALLS 00063 #ifdef _WMI_TRACING_REGISTRYCALLS 00064 00065 //NTSTATUS 00066 //CmpWmiFireEvent( 00067 // IN NTSTATUS Status, 00068 // IN HANDLE KeyHandle, 00069 // IN LONGLONG ElapsedTime, 00070 // IN PUNICODE_STRING KeyName, 00071 // IN UCHAR Type 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 //#define _WRITE_PROTECTED_VALUE_CACHE 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 //#define _WRITE_PROTECTED_REGISTRY_POOL 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 // Pool Tag 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 // Extra Tags for cache. 00195 // We may want to merge these tags later. 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 // A variable so can turn on/off certain performance features. 00219 // 00220 extern ULONG CmpCacheOnFlag; 00221 00222 #define CM_CACHE_FAKE_KEY 0x00000001 // Create Fake key KCB 00223 00224 // 00225 // This lock protects the KCB cache, including the KCB structures, 00226 // NameBlock and Value Index. 00227 // 00228 00229 extern FAST_MUTEX CmpKcbLock; 00230 #define LOCK_KCB_TREE() ExAcquireFastMutexUnsafe(&CmpKcbLock) 00231 #define UNLOCK_KCB_TREE() ExReleaseFastMutexUnsafe(&CmpKcbLock) 00232 00233 // 00234 // Logging. CmLogLevel <= level 00235 // CmLogSelect anded bit mask select 00236 // 00237 00238 // 00239 // Logging Levels: 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 // Logging selection sets: 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 // KeBugCheckEx() is not available to boot code. 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 // misc stuff 00407 // 00408 00409 extern UNICODE_STRING CmRegistrySystemCloneName; 00410 00411 // 00412 // Determines whether the Current Control Set used during booting 00413 // is cloned in order to fully preserve it for being saved 00414 // as the LKG Control Set. 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 // Tuning and control constants 00427 // 00428 #define CM_MAX_STASH 1024*1024 // If size of data for a set 00429 // is bigger than this, 00430 00431 #define CM_MAX_REASONABLE_VALUES 100 // If number of values for a 00432 // key is greater than this, 00433 // round up value list size 00434 00435 00436 // 00437 // Limit on the number of layers of hive there may be. We allow only 00438 // the master hive and hives directly linked into it for now, for currently 00439 // value is always 2.. 00440 // 00441 00442 #define MAX_HIVE_LAYERS 2 00443 00444 00445 // 00446 // structure used to create and sort ordered list of drivers to be loaded. 00447 // This is also used by the OS Loader when loading the boot drivers. 00448 // (Particularly the ErrorControl field) 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 // extern for object type pointer 00461 // 00462 00463 extern POBJECT_TYPE CmpKeyObjectType; 00464 00465 00466 // 00467 // Miscelaneous Hash routines 00468 // 00469 #define RNDM_CONSTANT 314159269 /* default value for "scrambling constant" */ 00470 #define RNDM_PRIME 1000000007 /* prime number, also used for scrambling */ 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 // CM_KEY_BODY 00479 // 00480 // Same structure used for KEY_ROOT and KEY objects. This is the 00481 // Cm defined part of the object. 00482 // 00483 // This object represents an open instance, several of them could refer 00484 // to a single key control block. 00485 // 00486 #define KEY_BODY_TYPE 0x6b793032 // "ky02" 00487 00488 struct _CM_NOTIFY_BLOCK; //forward 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; // the owner process 00495 #ifdef KCB_TO_KEYBODY_LINK 00496 LIST_ENTRY KeyBodyList; // key_nodes using the same kcb 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 // CM_POST_KEY_BODY 00536 // 00537 // A post block can have attached a keybody which has to be dereferenced 00538 // when the post block goes out of scope. This structure allows the 00539 // implementation of keybody "delayed dereferencing". (see CmpPostNotify for comments) 00540 // 00541 00542 typedef struct _CM_POST_KEY_BODY { 00543 LIST_ENTRY KeyBodyList; 00544 struct _CM_KEY_BODY *KeyBody; // this key body object 00545 } CM_POST_KEY_BODY, *PCM_POST_KEY_BODY; 00546 00547 00548 // 00549 // CM_NOTIFY_BLOCK 00550 // 00551 // A notify block tracks an active notification waiting for notification. 00552 // Any one open instance (CM_KEY_BODY) will refer to at most one 00553 // notify block. A given key control block may have as many notify 00554 // blocks refering to it as there are CM_KEY_BODYs refering to it. 00555 // Notify blocks are attached to hives and sorted by length of name. 00556 // 00557 00558 typedef struct _CM_NOTIFY_BLOCK { 00559 LIST_ENTRY HiveList; // sorted list of notifies 00560 PCM_KEY_CONTROL_BLOCK KeyControlBlock; // Open instance notify is on 00561 struct _CM_KEY_BODY *KeyBody; // our owning key handle object 00562 ULONG Filter; // Events of interest 00563 LIST_ENTRY PostList; // Posts to fill 00564 SECURITY_SUBJECT_CONTEXT SubjectContext; // Security stuff 00565 BOOLEAN WatchTree; 00566 BOOLEAN NotifyPending; 00567 } CM_NOTIFY_BLOCK, *PCM_NOTIFY_BLOCK; 00568 00569 // 00570 // CM_POST_BLOCK 00571 // 00572 // Whenever a notify call is made, a post block is created and attached 00573 // to the notify block. Each time an event is posted against the notify, 00574 // the waiter described by the post block is signaled. (i.e. APC enqueued, 00575 // event signalled, etc.) 00576 // 00577 00578 // 00579 // The NotifyType ULONG is a combination of POST_BLOCK_TYPE enum and flags 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; // slave notifications that are attached to this notification 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 // Usefull macros to manipulate the NotifyType field in CM_POST_BLOCK 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 // This lock protects the PostList(s) in Notification objects. 00638 // It is used to prevent attempts for simultaneous changes of 00639 // CancelPostList list in PostBlocks 00640 // 00641 00642 extern FAST_MUTEX CmpPostLock; 00643 #define LOCK_POST_LIST() ExAcquireFastMutexUnsafe(&CmpPostLock) 00644 #define UNLOCK_POST_LIST() ExReleaseFastMutexUnsafe(&CmpPostLock) 00645 00646 // ----- Cm version of Hive structure (CMHIVE) ----- 00647 // 00648 typedef struct _CMHIVE { 00649 HHIVE Hive; 00650 HANDLE FileHandles[HFILE_TYPE_MAX]; 00651 LIST_ENTRY NotifyList; 00652 LIST_ENTRY HiveList; // Used to find hives at shutdown 00653 PFAST_MUTEX HiveLock; // Used to synchronize operations on the hive (NotifyList and Flush) 00654 } CMHIVE, *PCMHIVE; 00655 00656 // 00657 // Hive locking support 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 // Macros 00668 // 00669 00670 // 00671 // ----- CM_KEY_NODE ----- 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 // ----- CM_KEY_VALUE ----- 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 // Communication area 00703 // 00704 // 00705 // Protocol (server side): 00706 // Wait for StartRegistryCommand event 00707 // read message, do work 00708 // signal EndRegistryCommand event 00709 // 00710 // Protocal (client side): 00711 // Acquire RegistryCommandMutex 00712 // write message 00713 // signal StartRegistryCommand 00714 // wait for EndRegistryCommand 00715 // Release RegistryCommandMutex 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 // WARNNOTE: Why do we have such a random structure? 00733 // change this to pass a pointer to a function specific struct 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; // needed to avoid recursivity deadlock with ZwCreate calls calling back into registry 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 // ----- Procedure Prototypes ----- 00760 // 00761 00762 // 00763 // Configuration Manager private procedure prototypes 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 // Wrappers 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 // Configuration Manager CM level registry functions 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 // Procedures private to CM 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 // security functions (cmse.c) 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 // Access to the registry is serialized by a shared resource, CmpRegistryLock. 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 // BOOLEAN 01306 // CmpCopyTree( 01307 // PHHIVE SourceHive, 01308 // HCELL_INDEX SourceCell, 01309 // PHHIVE TargetHive, 01310 // HCELL_INDEX TargetCell 01311 // ); 01312 // 01313 01314 #define CmpCopyTree(s,c,t,l) CmpCopySyncTree(s,c,t,l,FALSE,Copy) 01315 01316 // 01317 // BOOLEAN 01318 // CmpCopyTreeEx( 01319 // PHHIVE SourceHive, 01320 // HCELL_INDEX SourceCell, 01321 // PHHIVE TargetHive, 01322 // HCELL_INDEX TargetCell, 01323 // BOOLEAN CopyVolatile 01324 // ); 01325 // 01326 01327 #define CmpCopyTreeEx(s,c,t,l,f) CmpCopySyncTree(s,c,t,l,f,Copy) 01328 01329 // 01330 // BOOLEAN 01331 // CmpSyncTrees( 01332 // PHHIVE SourceHive, 01333 // HCELL_INDEX SourceCell, 01334 // PHHIVE TargetHive, 01335 // HCELL_INDEX TargetCell, 01336 // BOOLEAN CopyVolatile); 01337 // 01338 01339 #define CmpSyncTrees(s,c,t,l,f) CmpCopySyncTree(s,c,t,l,f,Sync) 01340 01341 01342 // 01343 // BOOLEAN 01344 // CmpMergeTrees( 01345 // PHHIVE SourceHive, 01346 // HCELL_INDEX SourceCell, 01347 // PHHIVE TargetHive, 01348 // HCELL_INDEX TargetCell); 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 //PCM_POST_BLOCK 01467 //CmpAllocateMasterPostBlock( 01468 // IN POST_BLOCK_TYPE BlockType 01469 // ); 01470 // 01471 #define CmpAllocateMasterPostBlock(b) CmpAllocatePostBlock(b,REG_NOTIFY_MASTER_POST,NULL,NULL) 01472 01473 // 01474 //PCM_POST_BLOCK 01475 //CmpAllocateSlavePostBlock( 01476 // IN POST_BLOCK_TYPE BlockType, 01477 // IN PCM_KEY_BODY KeyBody, 01478 // IN PCM_POST_BLOCK MasterBlock 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 // checkout procedure 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 // cmboot - functions for determining driver load lists 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 // Alias table key names in IDConfigDB 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 // Entries in the alias tables (value names) 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 // Entries in the profile tables. 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 // Entries for the root Hardware Profiles key. 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 // List structure used in config manager init 01604 // 01605 01606 typedef struct _HIVE_LIST_ENTRY { 01607 PWSTR Name; 01608 PWSTR BaseName; // MACHINE or USER 01609 PCMHIVE CmHive; 01610 ULONG Flags; 01611 } HIVE_LIST_ENTRY, *PHIVE_LIST_ENTRY; 01612 01613 // 01614 // structure definitions shared with the boot loader 01615 // to select the hardware profile. 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, // Set to -1 for none. 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 // Routines for handling registry compressed names 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 // ----- CACHED_DATA ----- 01866 // 01867 // When values are not cached, List in ValueCache is the Hive cell index to the value list. 01868 // When they are cached, List will be pointer to the allocation. We distinguish them by 01869 // marking the lowest bit in the variable to indicate it is a cached allocation. 01870 // 01871 // Note that the cell index for value list 01872 // is stored in the cached allocation. It is not used now but may be in further performance 01873 // optimization. 01874 // 01875 // When value key and vaule data are cached, there is only one allocation for both. 01876 // Value data is appended that the end of value key. DataCacheType indicates 01877 // whether data is cached and ValueKeySize tells how big is the value key (so 01878 // we can calculate the address of cached value data) 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 // Utility macro to set the fields of an IO_STATUS_BLOCK. On sundown, 32bit processes 02004 // will pass in a 32bit Iosb, and 64bit processes will pass in a 64bit Iosb. 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

Generated on Sat May 15 19:39:28 2004 for test by doxygen 1.3.7