00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "ntos.h"
00022
#include "seopaque.h"
00023
#include <zwapi.h>
00024
00025
00026
00027
00028
00029
00030
struct _OBJECT_HEADER;
00031
struct _OBJECT_BODY_HEADER;
00032
00033
00034
00035
00036
00037
#ifdef POOL_TAGGING
00038
#define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,' bO')
00039
#define ExAllocatePoolWithQuota(a,b) ExAllocatePoolWithQuotaTag(a,b,' bO')
00040
#endif
00041
00042
00043
00044
00045
00046
#if DBG
00047
#define ObpBeginTypeSpecificCallOut( IRQL ) (IRQL)=KeGetCurrentIrql()
00048
#define ObpEndTypeSpecificCallOut( IRQL, str, ot, o ) { \
00049
if ((IRQL)!=KeGetCurrentIrql()) { \
00050
DbgPrint( "OB: ObjectType: %wZ Procedure: %s Object: %08x\n", &ot->Name, str, o ); \
00051
DbgPrint( " Returned at %x IRQL, but was called at %x IRQL\n", KeGetCurrentIrql(), IRQL ); \
00052
DbgBreakPoint(); \
00053
} \
00054
}
00055
#else
00056 #define ObpBeginTypeSpecificCallOut( IRQL )
00057 #define ObpEndTypeSpecificCallOut( IRQL, str, ot, o )
00058
#endif // DBG
00059
00060
00061
00062
00063
00064
#if DBG
00065
#define ObpValidateIrql( str ) \
00066
if (KeGetCurrentIrql() > APC_LEVEL) { \
00067
DbgPrint( "OB: %s called at IRQL %d\n", (str), KeGetCurrentIrql() ); \
00068
DbgBreakPoint(); \
00069
}
00070
#else
00071 #define ObpValidateIrql( str )
00072
#endif // DBG
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 KSPIN_LOCK
ObpLock;
00088 KEVENT ObpDefaultObject;
00089 WORK_QUEUE_ITEM ObpRemoveObjectWorkItem;
00090 PSINGLE_LIST_ENTRY
ObpRemoveObjectQueue;
00091
00092
00093
00094
00095
00096
00097
00098 KSPIN_LOCK
ObpDeviceMapLock;
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
#ifdef MPSAFE_HANDLE_COUNT_CHECK
00110
00111
VOID
00112
FASTCALL
00113
ObpIncrPointerCount (
00114 IN
POBJECT_HEADER ObjectHeader
00115 );
00116
00117
VOID
00118
FASTCALL
00119
ObpDecrPointerCount (
00120 IN
POBJECT_HEADER ObjectHeader
00121 );
00122
00123 BOOLEAN
00124
FASTCALL
00125
ObpDecrPointerCountWithResult (
00126 IN
POBJECT_HEADER ObjectHeader
00127 );
00128
00129
VOID
00130
FASTCALL
00131
ObpIncrHandleCount (
00132 IN
POBJECT_HEADER ObjectHeader
00133 );
00134
00135 BOOLEAN
00136
FASTCALL
00137
ObpDecrHandleCount (
00138 IN
POBJECT_HEADER ObjectHeader
00139 );
00140
00141
#else
00142
00143 #define ObpIncrPointerCount(np) InterlockedIncrement( &np->PointerCount )
00144 #define ObpDecrPointerCount(np) InterlockedDecrement( &np->PointerCount )
00145 #define ObpDecrPointerCountWithResult(np) (InterlockedDecrement( &np->PointerCount ) == 0)
00146
00147 #define ObpIncrHandleCount(np) InterlockedIncrement( &np->HandleCount )
00148 #define ObpDecrHandleCount(np) (InterlockedDecrement( &np->HandleCount ) == 0)
00149
00150
#endif // MPSAVE_HANDLE_COUNT_CHECK
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163 #define ObpEnterObjectTypeMutex(_ObjectType) { \
00164
ObpValidateIrql("ObpEnterObjectTypeMutex"); \
00165
KeEnterCriticalRegion(); \
00166
ExAcquireResourceExclusiveLite(&(_ObjectType)->Mutex, TRUE); \
00167
}
00168
00169
00170
00171
00172
00173
00174
00175
00176 #define ObpLeaveObjectTypeMutex(_ObjectType) { \
00177
ExReleaseResource(&(_ObjectType)->Mutex); \
00178
KeLeaveCriticalRegion(); \
00179
ObpValidateIrql("ObpLeaveObjectTypeMutex"); \
00180
}
00181
00182
00183
00184
00185
00186
00187
00188
00189 #define ObpEnterRootDirectoryMutex() { \
00190
ObpValidateIrql("ObpEnterRootDirectoryMutex"); \
00191
KeEnterCriticalRegion(); \
00192
ExAcquireResourceExclusiveLite(&ObpRootDirectoryMutex, TRUE); \
00193
}
00194
00195
00196
00197
00198
00199
00200
00201
00202 #define ObpLeaveRootDirectoryMutex() { \
00203
ExReleaseResource(&ObpRootDirectoryMutex); \
00204
KeLeaveCriticalRegion(); \
00205
ObpValidateIrql("ObpLeaveRootDirectoryMutex"); \
00206
}
00207
00208
00209
00210
00211
00212
00213 #define ObpGetObjectTable() (PsGetCurrentProcess()->ObjectTable)
00214
00215
00216
00217
00218
00219
00220
00221 #define ObpCentralizedSecurity(_ObjectType) \
00222
((_ObjectType)->TypeInfo.SecurityProcedure == SeDefaultObjectMethod)
00223
00224
00225
00226
00227
00228 #define OBP_MAX_DEFINED_OBJECT_TYPES 24
00229 POBJECT_TYPE ObpObjectTypes[
OBP_MAX_DEFINED_OBJECT_TYPES ];
00230
00231
00232
00233
00234
00235
00236
00237
00238
#if i386 && !FPO
00239
ACCESS_MASK
00240 ObpTranslateGrantedAccessIndex (
00241 USHORT GrantedAccessIndex
00242 );
00243
00244
USHORT
00245 ObpComputeGrantedAccessIndex (
00246 ACCESS_MASK GrantedAccess
00247 );
00248
00249
USHORT ObpCurCachedGrantedAccessIndex;
00250
USHORT ObpMaxCachedGrantedAccessIndex;
00251 PACCESS_MASK ObpCachedGrantedAccesses;
00252
#endif // i386 && !FPO
00253
00254
00255
00256
00257
00258
00259
00260
00261 #define OBJ_PROTECT_CLOSE 0x1
00262
00263
00264
00265
00266
00267
#if (OBJ_INHERIT != 0x2)
00268
00269
#error Object inheritance bit definition conflicts
00270
00271
#endif
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282 #define OBJ_AUDIT_OBJECT_CLOSE 0x00000004L
00283
00284
00285
00286
00287
00288
00289 #define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE | OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE)
00290
00291
00292
00293
00294
00295
00296
00297
00298 typedef struct _SECURITY_DESCRIPTOR_HEADER {
00299
00300 LIST_ENTRY
Link;
00301 ULONG
RefCount;
00302 ULONG
FullHash;
00303 QUAD
SecurityDescriptor;
00304
00305 }
SECURITY_DESCRIPTOR_HEADER, *
PSECURITY_DESCRIPTOR_HEADER;
00306
00307
00308
00309
00310
00311 #define SD_TO_SD_HEADER(_sd) \
00312
CONTAINING_RECORD( (_sd), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor )
00313
00314
00315
00316
00317
00318 #define LINK_TO_SD_HEADER(_link) \
00319
CONTAINING_RECORD( (_link), SECURITY_DESCRIPTOR_HEADER, Link )
00320
00321
00322
00323
00324
00325 #define NEXT_SDHEADER(_sdh) ( \
00326
(_sdh)->Link.Flink == NULL ? NULL : \
00327
CONTAINING_RECORD( (_sdh)->Link.Flink, SECURITY_DESCRIPTOR_HEADER, Link ) \
00328
)
00329
00330 #define PREV_SDHEADER(_sdh) ( \
00331
(sdh)->Link.Blink == NULL ? NULL : \
00332
CONTAINING_RECORD( (sdh)->Link.Blink, SECURITY_DESCRIPTOR_HEADER, Link ) \
00333
)
00334
00335
00336
00337
00338
00339 #define SECURITY_DESCRIPTOR_CACHE_ENTRIES 256
00340
00341
00342
00343
00344
00345
VOID
00346
ObpAcquireDescriptorCacheWriteLock (
00347 VOID
00348 );
00349
00350
00351
VOID
00352
ObpAcquireDescriptorCacheReadLock (
00353 VOID
00354 );
00355
00356
VOID
00357
ObpReleaseDescriptorCacheLock (
00358 VOID
00359 );
00360
00361
00362
00363
00364
00365
00366 POBJECT_TYPE ObpTypeObjectType;
00367 POBJECT_TYPE ObpDirectoryObjectType;
00368 POBJECT_TYPE ObpSymbolicLinkObjectType;
00369 POBJECT_TYPE ObpDeviceMapObjectType;
00370 POBJECT_DIRECTORY ObpRootDirectoryObject;
00371 POBJECT_DIRECTORY ObpTypeDirectoryObject;
00372
00373 ULARGE_INTEGER
ObpDosDevicesShortNamePrefix;
00374 ULARGE_INTEGER
ObpDosDevicesShortNameRoot;
00375 UNICODE_STRING
ObpDosDevicesShortName;
00376
00377 ERESOURCE ObpRootDirectoryMutex;
00378 ERESOURCE SecurityDescriptorCacheLock;
00379
00380
00381
00382
00383
00384 NPAGED_LOOKASIDE_LIST ObpCreateInfoLookasideList;
00385
00386
00387
00388
00389
00390 #define OBJECT_NAME_BUFFER_SIZE 248
00391
00392 NPAGED_LOOKASIDE_LIST ObpNameBufferLookasideList;
00393
00394
00395
00396
00397
00398
00399 PHANDLE_TABLE ObpKernelHandleTable;
00400
00401
00402
00403
00404
00405
00406
00407
00408 #define KERNEL_HANDLE_MASK ((ULONG_PTR)((LONG)0x80000000))
00409
00410 #define IsKernelHandle(H,M) \
00411
(((KERNEL_HANDLE_MASK & (ULONG_PTR)(H)) == KERNEL_HANDLE_MASK) && \
00412
((M) == KernelMode) && \
00413
((H) != NtCurrentThread()) && \
00414
((H) != NtCurrentProcess()))
00415
00416 #define EncodeKernelHandle(H) (HANDLE)(KERNEL_HANDLE_MASK | (ULONG_PTR)(H))
00417
00418 #define DecodeKernelHandle(H) (HANDLE)(KERNEL_HANDLE_MASK ^ (ULONG_PTR)(H))
00419
00420
00421
00422
00423
00424 #define ObpIsOverflow(A,B) ((A) > ((A) + (B)))
00425
00426
00427
00428
00429
00430
00431 #define ObpFreeObjectCreateInformation(_ObjectCreateInfo) { \
00432
ObpReleaseObjectCreateInformation((_ObjectCreateInfo)); \
00433
ObpFreeObjectCreateInfoBuffer((_ObjectCreateInfo)); \
00434
}
00435
00436 #define ObpReleaseObjectCreateInformation(_ObjectCreateInfo) { \
00437
if ((_ObjectCreateInfo)->SecurityDescriptor != NULL) { \
00438
SeReleaseSecurityDescriptor((_ObjectCreateInfo)->SecurityDescriptor, \
00439
(_ObjectCreateInfo)->ProbeMode, \
00440
TRUE); \
00441
(_ObjectCreateInfo)->SecurityDescriptor = NULL; \
00442
} \
00443
}
00444
00445
NTSTATUS
00446
ObpCaptureObjectCreateInformation (
00447 IN
POBJECT_TYPE ObjectType OPTIONAL,
00448 IN KPROCESSOR_MODE ProbeMode,
00449 IN POBJECT_ATTRIBUTES ObjectAttributes,
00450 OUT PUNICODE_STRING CapturedObjectName,
00451 IN
POBJECT_CREATE_INFORMATION ObjectCreateInfo,
00452 IN LOGICAL UseLookaside
00453 );
00454
00455
NTSTATUS
00456
ObpCaptureObjectName (
00457 IN KPROCESSOR_MODE ProbeMode,
00458 IN PUNICODE_STRING ObjectName,
00459 IN OUT PUNICODE_STRING CapturedObjectName,
00460 IN LOGICAL UseLookaside
00461 );
00462
00463 PWCHAR
00464
ObpAllocateObjectNameBuffer (
00465 IN ULONG Length,
00466 IN LOGICAL UseLookaside,
00467 IN OUT PUNICODE_STRING ObjectName
00468 );
00469
00470
VOID
00471
FASTCALL
00472
ObpFreeObjectNameBuffer (
00473 IN PUNICODE_STRING ObjectName
00474 );
00475
00476
NTSTATUS
00477
ObpAllocateObject (
00478 IN
POBJECT_CREATE_INFORMATION ObjectCreateInfo,
00479 IN KPROCESSOR_MODE OwnershipMode,
00480 IN
POBJECT_TYPE ObjectType,
00481 IN PUNICODE_STRING ObjectName,
00482 IN ULONG ObjectBodySize,
00483 OUT
POBJECT_HEADER *ReturnedObjectHeader
00484 );
00485
00486
00487
VOID
00488
FASTCALL
00489
ObpFreeObject (
00490 IN PVOID Object
00491 );
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519 #define ObpAllocateObjectCreateInfoBuffer() \
00520
(POBJECT_CREATE_INFORMATION)ExAllocateFromPPNPagedLookasideList(LookasideCreateInfoList)
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543
00544
00545
00546
00547 #define ObpFreeObjectCreateInfoBuffer(ObjectCreateInfo) \
00548
ExFreeToPPNPagedLookasideList(LookasideCreateInfoList, ObjectCreateInfo)
00549
00550
00551
00552
00553
00554
00555
NTSTATUS
00556
ObpParseSymbolicLink (
00557 IN PVOID ParseObject,
00558 IN PVOID ObjectType,
00559 IN
PACCESS_STATE AccessState,
00560 IN KPROCESSOR_MODE AccessMode,
00561 IN ULONG Attributes,
00562 IN OUT PUNICODE_STRING CompleteName,
00563 IN OUT PUNICODE_STRING RemainingName,
00564 IN OUT PVOID Context OPTIONAL,
00565 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
00566 OUT PVOID *Object
00567 );
00568
00569
VOID
00570
ObpDeleteSymbolicLink (
00571 IN PVOID Object
00572 );
00573
00574
VOID
00575
ObpCreateSymbolicLinkName (
00576
POBJECT_SYMBOLIC_LINK SymbolicLink
00577 );
00578
00579
VOID
00580
ObpDeleteSymbolicLinkName (
00581
POBJECT_SYMBOLIC_LINK SymbolicLink
00582 );
00583
00584
00585
00586
00587
00588
00589 PVOID
00590
ObpLookupDirectoryEntry (
00591 IN
POBJECT_DIRECTORY Directory,
00592 IN PUNICODE_STRING Name,
00593 IN ULONG Attributes
00594 );
00595
00596
00597 BOOLEAN
00598
ObpInsertDirectoryEntry (
00599 IN
POBJECT_DIRECTORY Directory,
00600 IN PVOID Object
00601 );
00602
00603
00604 BOOLEAN
00605
ObpDeleteDirectoryEntry (
00606 IN
POBJECT_DIRECTORY Directory
00607 );
00608
00609
00610
NTSTATUS
00611
ObpLookupObjectName (
00612 IN HANDLE RootDirectoryHandle,
00613 IN PUNICODE_STRING ObjectName,
00614 IN ULONG Attributes,
00615 IN
POBJECT_TYPE ObjectType,
00616 IN KPROCESSOR_MODE AccessMode,
00617 IN PVOID ParseContext OPTIONAL,
00618 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL,
00619 IN PVOID InsertObject OPTIONAL,
00620 IN OUT
PACCESS_STATE AccessState,
00621 OUT PBOOLEAN DirectoryLocked,
00622 OUT PVOID *FoundObject
00623 );
00624
00625
VOID
00626
ObpUnlockObjectDirectoryPath (
00627 IN
POBJECT_DIRECTORY LockedDirectory
00628 );
00629
00630
00631
00632
00633
00634
00635
00636
VOID
00637
ObpDeleteNameCheck (
00638 IN PVOID Object,
00639 IN BOOLEAN TypeMutexHeld
00640 );
00641
00642
00643
VOID
00644
ObpProcessRemoveObjectQueue (
00645 PVOID Parameter
00646 );
00647
00648
VOID
00649
ObpRemoveObjectRoutine (
00650 PVOID Object
00651 );
00652
00653
00654
00655
00656
00657
00658
00659
POBJECT_HANDLE_COUNT_ENTRY
00660
ObpInsertHandleCount (
00661
POBJECT_HEADER ObjectHeader
00662 );
00663
00664
NTSTATUS
00665
ObpIncrementHandleCount (
00666 OB_OPEN_REASON OpenReason,
00667
PEPROCESS Process,
00668 PVOID Object,
00669
POBJECT_TYPE ObjectType,
00670
PACCESS_STATE AccessState OPTIONAL,
00671 KPROCESSOR_MODE AccessMode,
00672 ULONG Attributes
00673 );
00674
00675
00676
VOID
00677
ObpDecrementHandleCount (
00678
PEPROCESS Process,
00679
POBJECT_HEADER ObjectHeader,
00680
POBJECT_TYPE ObjectType,
00681 ACCESS_MASK GrantedAccess
00682 );
00683
00684
NTSTATUS
00685
ObpCreateHandle (
00686 IN OB_OPEN_REASON OpenReason,
00687 IN PVOID Object,
00688 IN
POBJECT_TYPE ExpectedObjectType OPTIONAL,
00689 IN
PACCESS_STATE AccessState,
00690 IN ULONG ObjectPointerBias OPTIONAL,
00691 IN ULONG Attributes,
00692 IN BOOLEAN DirectoryLocked,
00693 IN KPROCESSOR_MODE AccessMode,
00694 OUT PVOID *ReferencedNewObject OPTIONAL,
00695 OUT PHANDLE Handle
00696 );
00697
00698
NTSTATUS
00699
ObpIncrementUnnamedHandleCount (
00700 PACCESS_MASK DesiredAccess,
00701
PEPROCESS Process,
00702 PVOID Object,
00703
POBJECT_TYPE ObjectType,
00704 KPROCESSOR_MODE AccessMode,
00705 ULONG Attributes
00706 );
00707
00708
00709
NTSTATUS
00710
ObpCreateUnnamedHandle (
00711 IN PVOID Object,
00712 IN ACCESS_MASK DesiredAccess,
00713 IN ULONG ObjectPointerBias OPTIONAL,
00714 IN ULONG Attributes,
00715 IN KPROCESSOR_MODE AccessMode,
00716 OUT PVOID *ReferencedNewObject OPTIONAL,
00717 OUT PHANDLE Handle
00718 );
00719
00720
NTSTATUS
00721
ObpChargeQuotaForObject (
00722 IN
POBJECT_HEADER ObjectHeader,
00723 IN
POBJECT_TYPE ObjectType,
00724 OUT PBOOLEAN NewObject
00725 );
00726
00727
NTSTATUS
00728
ObpValidateDesiredAccess (
00729 IN ACCESS_MASK DesiredAccess
00730 );
00731
00732
00733
00734
00735
00736
00737 BOOLEAN
00738
ObpCheckPseudoHandleAccess (
00739 IN PVOID Object,
00740 IN ACCESS_MASK DesiredAccess,
00741 OUT PNTSTATUS AccessStatus,
00742 IN BOOLEAN TypeMutexLocked
00743 );
00744
00745
00746 BOOLEAN
00747
ObpCheckTraverseAccess (
00748 IN PVOID DirectoryObject,
00749 IN ACCESS_MASK TraverseAccess,
00750 IN
PACCESS_STATE AccessState OPTIONAL,
00751 IN BOOLEAN TypeMutexLocked,
00752 IN KPROCESSOR_MODE PreviousMode,
00753 OUT PNTSTATUS AccessStatus
00754 );
00755
00756 BOOLEAN
00757
ObpCheckObjectReference (
00758 IN PVOID Object,
00759 IN OUT
PACCESS_STATE AccessState,
00760 IN BOOLEAN TypeMutexLocked,
00761 IN KPROCESSOR_MODE AccessMode,
00762 OUT PNTSTATUS AccessStatus
00763 );
00764
00765
00766
00767
00768
00769
00770
NTSTATUS
00771
ObpInitSecurityDescriptorCache (
00772 VOID
00773 );
00774
00775 ULONG
00776
ObpHashSecurityDescriptor (
00777 PSECURITY_DESCRIPTOR SecurityDescriptor
00778 );
00779
00780 ULONG
00781
ObpHashBuffer (
00782 PVOID Data,
00783 ULONG Length
00784 );
00785
00786
NTSTATUS
00787
ObpLogSecurityDescriptor (
00788 IN PSECURITY_DESCRIPTOR InputSecurityDescriptor,
00789 OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor
00790 );
00791
00792
00793
PSECURITY_DESCRIPTOR_HEADER
00794
ObpCreateCacheEntry (
00795 PSECURITY_DESCRIPTOR InputSecurityDescriptor,
00796 ULONG FullHash
00797 );
00798
00799
00800 PSECURITY_DESCRIPTOR
00801
ObpReferenceSecurityDescriptor (
00802 PVOID Object
00803 );
00804
00805
VOID
00806
ObpDereferenceSecurityDescriptor (
00807 PSECURITY_DESCRIPTOR SecurityDescriptor
00808 );
00809
00810
VOID
00811
ObpDestroySecurityDescriptorHeader (
00812 IN PSECURITY_DESCRIPTOR_HEADER Header
00813 );
00814
00815 BOOLEAN
00816
ObpCompareSecurityDescriptors (
00817 IN PSECURITY_DESCRIPTOR SD1,
00818 IN PSECURITY_DESCRIPTOR SD2
00819 );
00820
00821
NTSTATUS
00822
ObpValidateAccessMask (
00823
PACCESS_STATE AccessState
00824 );
00825
00826