00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#ifndef __CM_DATA__
00023
#define __CM_DATA__
00024
00025
00026
#include "hivedata.h"
00027
00028
00029
00030
00031
00032
00033 #define MAX_KEY_PATH_LENGTH 65535
00034 #define MAX_KEY_NAME_LENGTH 512 // allow for 256 unicode, as promise
00035 #define MAX_FRIENDLY_NAME_LENGTH 160 // allow for 80 unicode chars in FriendlyNames
00036 #define MAX_KEY_VALUE_NAME_LENGTH 32767 // 32k - sanity limit for value name
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 typedef ULONG
HASH_VALUE;
00053
00054 typedef struct _CM_KEY_HASH {
00055 ULONG
ConvKey;
00056 struct _CM_KEY_HASH *
NextHash;
00057 PHHIVE KeyHive;
00058 HCELL_INDEX KeyCell;
00059 }
CM_KEY_HASH, *
PCM_KEY_HASH;
00060
00061
#ifdef CM_DEBUG_KCB
00062
#define KCB_SIGNATURE 'bKmC'
00063
00064
#define SET_KCB_SIGNATURE(_kcb_,_sig_) (_kcb_)->Signature = (_sig_)
00065
#define ASSERT_KCB(_kcb_) ASSERT((_kcb_)->Signature == KCB_SIGNATURE)
00066
#define ASSERT_KEY_HASH(_keyhash_) ASSERT_KCB(CONTAINING_RECORD((_keyhash_), CM_KEY_CONTROL_BLOCK, KeyHash))
00067
#else
00068 #define SET_KCB_SIGNATURE(_kcb_,_sig_)
00069 #define ASSERT_KCB(_kcb_)
00070 #define ASSERT_KEY_HASH(_keyhash_)
00071
#endif
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 typedef struct _CM_NAME_HASH {
00208 ULONG
ConvKey;
00209 struct _CM_NAME_HASH *
NextHash;
00210 USHORT NameLength;
00211 WCHAR
Name[1] ;
00212 }
CM_NAME_HASH, *
PCM_NAME_HASH;
00213
00214 typedef struct _CM_NAME_CONTROL_BLOCK {
00215 BOOLEAN
Compressed;
00216 USHORT RefCount;
00217
union {
00218 CM_NAME_HASH NameHash;
00219
struct {
00220 ULONG
ConvKey;
00221 struct _CM_KEY_HASH *
NextHash;
00222 USHORT NameLength;
00223 WCHAR
Name[1] ;
00224 };
00225 };
00226 }
CM_NAME_CONTROL_BLOCK, *
PCM_NAME_CONTROL_BLOCK;
00227
00228 typedef struct _CM_INDEX_HINT_BLOCK {
00229 ULONG
Count;
00230 UCHAR
NameHint[1];
00231 }
CM_INDEX_HINT_BLOCK, *
PCM_INDEX_HINT_BLOCK;
00232
00233 typedef struct _CACHED_CHILD_LIST {
00234 ULONG
Count;
00235
union {
00236 ULONG_PTR
ValueList;
00237 struct _CM_KEY_CONTROL_BLOCK *
RealKcb;
00238 };
00239 }
CACHED_CHILD_LIST, *
PCACHED_CHILD_LIST;
00240
00241
00242
00243
00244 #define CM_SUBKEY_HINT_LENGTH 4
00245 #define CM_MAX_CACHE_HINT_SIZE 14
00246
00247
00248
00249
00250
00251 #define CM_KCB_NO_SUBKEY 0x0001 // This key has no subkeys
00252 #define CM_KCB_SUBKEY_ONE 0x0002 // This key has only one subkey and the
00253
00254
00255 #define CM_KCB_SUBKEY_HINT 0x0004
00256 #define CM_KCB_SYM_LINK_FOUND 0x0008
00257 #define CM_KCB_KEY_NON_EXIST 0x0010
00258 #define CM_KCB_NO_DELAY_CLOSE 0x0020
00259
00260 #define CM_KCB_CACHE_MASK (CM_KCB_NO_SUBKEY | \
00261
CM_KCB_KEY_NON_EXIST | \
00262
CM_KCB_SUBKEY_ONE | \
00263
CM_KCB_SUBKEY_HINT)
00264
00265
00266 #define KCB_TO_KEYBODY_LINK
00267
00268 typedef struct _CM_KEY_CONTROL_BLOCK {
00269
#ifdef CM_DEBUG_KCB
00270
ULONG Signature;
00271
#endif
00272 BOOLEAN
Delete;
00273 USHORT RefCount;
00274
union {
00275 CM_KEY_HASH KeyHash;
00276
struct {
00277 ULONG
ConvKey;
00278 struct _CM_KEY_HASH *
NextHash;
00279 PHHIVE KeyHive;
00280 HCELL_INDEX KeyCell;
00281 };
00282 };
00283 USHORT ExtFlags;
00284 USHORT Flags;
00285 struct _CM_KEY_CONTROL_BLOCK *
ParentKcb;
00286 PCM_NAME_CONTROL_BLOCK NameBlock;
00287 HCELL_INDEX Security;
00288 struct _CACHED_CHILD_LIST ValueCache;
00289
union {
00290 PCM_INDEX_HINT_BLOCK IndexHint;
00291 UCHAR NameHint[
CM_SUBKEY_HINT_LENGTH];
00292 };
00293 USHORT DelayedCloseIndex;
00294 USHORT TotalLevels;
00295 struct _CM_KEY_NODE *
KeyNode;
00296
#ifdef KCB_TO_KEYBODY_LINK
00297 LIST_ENTRY
KeyBodyListHead;
00298
#endif
00299
}
CM_KEY_CONTROL_BLOCK, *
PCM_KEY_CONTROL_BLOCK;
00300
00301
00302
00303
00304
00305
00306 typedef enum _NODE_TYPE {
00307
KeyBodyNode,
00308
KeyValueNode
00309 }
NODE_TYPE;
00310
00311
00312 typedef enum _CMP_COPY_TYPE {
00313
Copy,
00314
Sync,
00315
Merge
00316 }
CMP_COPY_TYPE;
00317
00318 typedef enum _SUBKEY_SEARCH_TYPE {
00319
SearchIfExist,
00320
SearchAndDeref,
00321
SearchAndCount
00322 }
SUBKEY_SEARCH_TYPE;
00323
00324
00325
00326
00327
00328
00329
00330
00331 typedef struct _CHILD_LIST {
00332 ULONG
Count;
00333 HCELL_INDEX List;
00334 }
CHILD_LIST, *
PCHILD_LIST;
00335
00336
00337
00338
00339
00340 typedef struct _CM_KEY_REFERENCE {
00341 HCELL_INDEX KeyCell;
00342 PHHIVE KeyHive;
00343 }
CM_KEY_REFERENCE , *
PCM_KEY_REFERENCE;
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369 #define UseFastIndex(Hive) ((Hive)->Version>=3)
00370
00371 #define CM_KEY_INDEX_ROOT 0x6972 // ir
00372 #define CM_KEY_INDEX_LEAF 0x696c // il
00373 #define CM_KEY_FAST_LEAF 0x666c // fl
00374
00375 typedef struct _CM_INDEX {
00376 HCELL_INDEX Cell;
00377 UCHAR
NameHint[4];
00378 }
CM_INDEX, *
PCM_INDEX;
00379
00380 typedef struct _CM_KEY_FAST_INDEX {
00381 USHORT Signature;
00382 USHORT Count;
00383 CM_INDEX List[1];
00384 }
CM_KEY_FAST_INDEX, *
PCM_KEY_FAST_INDEX;
00385
00386 typedef struct _CM_KEY_INDEX {
00387 USHORT Signature;
00388 USHORT Count;
00389 HCELL_INDEX List[1];
00390 }
CM_KEY_INDEX, *
PCM_KEY_INDEX;
00391
00392
00393
00394
00395
00396 #define CM_MAX_INDEX \
00397
( (HBLOCK_SIZE- \
00398
(sizeof(HBIN)+FIELD_OFFSET(HCELL,u)+FIELD_OFFSET(CM_KEY_INDEX,List))) / \
00399
sizeof(HCELL_INDEX) )
00400
00401 #define CM_MAX_LEAF_SIZE ((sizeof(HCELL_INDEX)*CM_MAX_INDEX) + \
00402
(FIELD_OFFSET(CM_KEY_INDEX, List)))
00403
00404
00405
00406
00407
00408 #define CM_MAX_FAST_INDEX \
00409
( (HBLOCK_SIZE- \
00410
(sizeof(HBIN)+FIELD_OFFSET(HCELL,u)+FIELD_OFFSET(CM_KEY_FAST_INDEX,List))) / \
00411
sizeof(CM_INDEX) )
00412
00413 #define CM_MAX_FAST_LEAF_SIZE ((sizeof(CM_INDEX)*CM_MAX_FAST_INDEX) + \
00414
(FIELD_OFFSET(CM_KEY_FAST_INDEX, List)))
00415
00416
00417
00418
00419
00420
00421
00422 #define CM_KEY_NODE_SIGNATURE 0x6b6e // "kn"
00423 #define CM_LINK_NODE_SIGNATURE 0x6b6c // "kl"
00424
00425 #define KEY_VOLATILE 0x0001 // This key (and all its children)
00426
00427
00428 #define KEY_HIVE_EXIT 0x0002 // This key marks a bounary to another
00429
00430
00431
00432
00433
00434 #define KEY_HIVE_ENTRY 0x0004 // This key is the root of a particular
00435
00436
00437 #define KEY_NO_DELETE 0x0008 // This key cannot be deleted, period.
00438
00439 #define KEY_SYM_LINK 0x0010 // This key is really a symbolic link.
00440 #define KEY_COMP_NAME 0x0020 // The name for this key is stored in a
00441
00442 #define KEY_PREDEF_HANDLE 0x0040 // There is no real key backing this,
00443
00444
00445
00446
00447
#pragma pack(4)
00448 typedef struct _CM_KEY_NODE {
00449 USHORT Signature;
00450 USHORT Flags;
00451 LARGE_INTEGER
LastWriteTime;
00452 ULONG
Spare;
00453 HCELL_INDEX Parent;
00454 ULONG
SubKeyCounts[
HTYPE_COUNT];
00455
union {
00456
struct {
00457 HCELL_INDEX SubKeyLists[
HTYPE_COUNT];
00458 CHILD_LIST ValueList;
00459 };
00460 CM_KEY_REFERENCE ChildHiveReference;
00461 };
00462
00463 HCELL_INDEX Security;
00464 HCELL_INDEX Class;
00465 ULONG
MaxNameLen;
00466 ULONG
MaxClassLen;
00467 ULONG
MaxValueNameLen;
00468 ULONG
MaxValueDataLen;
00469
00470 ULONG
WorkVar;
00471
00472
00473
00474
00475 USHORT NameLength;
00476 USHORT ClassLength;
00477 WCHAR
Name[1];
00478 }
CM_KEY_NODE, *
PCM_KEY_NODE;
00479
#pragma pack()
00480
00481
00482
00483
00484
00485 #define CM_KEY_VALUE_SIGNATURE 0x6b76 // "kv"
00486
00487 #define CM_KEY_VALUE_SPECIAL_SIZE 0x80000000 // 2 gig
00488
00489 #define CM_KEY_VALUE_SMALL 4
00490
00491 #define VALUE_COMP_NAME 0x0001 // The name for this value is stored in a
00492
00493
00494 typedef struct _CM_KEY_VALUE {
00495 USHORT Signature;
00496 USHORT NameLength;
00497 ULONG
DataLength;
00498 HCELL_INDEX Data;
00499 ULONG
Type;
00500 USHORT Flags;
00501 USHORT Spare;
00502 WCHAR
Name[1];
00503 }
CM_KEY_VALUE, *
PCM_KEY_VALUE;
00504
00505
00506
00507
00508 #define CmpIsHKeyValueSmall(realsize, size) \
00509
((size >= CM_KEY_VALUE_SPECIAL_SIZE) ? \
00510
((realsize) = size - CM_KEY_VALUE_SPECIAL_SIZE, TRUE) : \
00511
((realsize) = size, FALSE))
00512
00513
00514
00515
00516
00517 #define CM_KEY_SECURITY_SIGNATURE 0x6b73 // "ks"
00518
00519 typedef struct _CM_KEY_SECURITY {
00520 USHORT Signature;
00521 USHORT Reserved;
00522 HCELL_INDEX Flink;
00523 HCELL_INDEX Blink;
00524 ULONG
ReferenceCount;
00525 ULONG
DescriptorLength;
00526 SECURITY_DESCRIPTOR_RELATIVE
Descriptor;
00527 }
CM_KEY_SECURITY, *
PCM_KEY_SECURITY;
00528
00529
00530
00531
00532
00533
00534
00535 typedef struct _CELL_DATA {
00536 union _u {
00537 CM_KEY_NODE KeyNode;
00538 CM_KEY_VALUE KeyValue;
00539 CM_KEY_SECURITY KeySecurity;
00540 CM_KEY_INDEX KeyIndex;
00541 HCELL_INDEX KeyList[1];
00542 WCHAR
KeyString[1];
00543 }
u;
00544 }
CELL_DATA, *
PCELL_DATA;
00545
00546
00547
00548
00549
00550
00551 typedef union _KEY_INFORMATION {
00552 KEY_BASIC_INFORMATION
KeyBasicInformation;
00553 KEY_NODE_INFORMATION
KeyNodeInformation;
00554 KEY_FULL_INFORMATION
KeyFullInformation;
00555 KEY_NAME_INFORMATION
KeyNameInformation;
00556 }
KEY_INFORMATION, *
PKEY_INFORMATION;
00557
00558 typedef union _KEY_VALUE_INFORMATION {
00559 KEY_VALUE_BASIC_INFORMATION
KeyValueBasicInformation;
00560 KEY_VALUE_FULL_INFORMATION
KeyValueFullInformation;
00561 KEY_VALUE_PARTIAL_INFORMATION
KeyValuePartialInformation;
00562 KEY_VALUE_PARTIAL_INFORMATION_ALIGN64
KeyValuePartialInformationAlign64;
00563 }
KEY_VALUE_INFORMATION, *
PKEY_VALUE_INFORMATION;
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585 #define CM_CACHE_DATA_NOT_CACHED 0
00586 #define CM_CACHE_DATA_CACHED 1
00587 #define CM_CACHE_DATA_TOO_BIG 2
00588 #define MAXIMUM_CACHED_DATA 2048 // Maximum data size to be cached.
00589
00590 typedef struct _CM_CACHED_VALUE_INDEX {
00591 HCELL_INDEX CellIndex;
00592
union {
00593 CELL_DATA CellData;
00594 ULONG_PTR
List[1];
00595 } Data;
00596 }
CM_CACHED_VALUE_INDEX, *
PCM_CACHED_VALUE_INDEX;
00597
00598 typedef struct _CM_CACHED_VALUE {
00599 USHORT DataCacheType;
00600 USHORT ValueKeySize;
00601 CM_KEY_VALUE KeyValue;
00602 }
CM_CACHED_VALUE, *
PCM_CACHED_VALUE;
00603
00604 typedef PCM_CACHED_VALUE *
PPCM_CACHED_VALUE;
00605
00606 #define CMP_CELL_CACHED_MASK 1
00607
00608 #define CMP_IS_CELL_CACHED(Cell) (((ULONG_PTR) (Cell) & CMP_CELL_CACHED_MASK) && ((Cell) != (ULONG_PTR) HCELL_NIL))
00609 #define CMP_GET_CACHED_ADDRESS(Cell) (((ULONG_PTR) (Cell)) & ~CMP_CELL_CACHED_MASK)
00610 #define CMP_GET_CACHED_CELLDATA(Cell) (&(((PCM_CACHED_VALUE_INDEX)(((ULONG_PTR) (Cell)) & ~CMP_CELL_CACHED_MASK))->Data.CellData))
00611 #define CMP_GET_CACHED_KEYVALUE(Cell) (&(((PCM_CACHED_VALUE)(((ULONG_PTR) (Cell)) & ~CMP_CELL_CACHED_MASK))->KeyValue))
00612 #define CMP_GET_CACHED_CELL(Cell) (((PCM_CACHED_ENTRY)(((ULONG_PTR) (Cell)) & ~CMP_CELL_CACHED_MASK))->CellIndex)
00613 #define CMP_MARK_CELL_CACHED(Cell) (((ULONG_PTR) (Cell)) | CMP_CELL_CACHED_MASK)
00614
00615 #define CMP_GET_CACHED_CELL_INDEX(Cell) (PtrToUlong((PVOID) (Cell)))
00616
00617
00618
#endif //__CM_DATA__
00619
00620