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

obp.h

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1989 Microsoft Corporation 00004 00005 Module Name: 00006 00007 obp.h 00008 00009 Abstract: 00010 00011 Private include file for the OB subcomponent of the NTOS project 00012 00013 Author: 00014 00015 Steve Wood (stevewo) 31-Mar-1989 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #include "ntos.h" 00022 #include "seopaque.h" 00023 #include <zwapi.h> 00024 00025 // 00026 // The Object Header structures are private, but are defined in ob.h 00027 // so that various macros can directly access header fields. 00028 // 00029 00030 struct _OBJECT_HEADER; 00031 struct _OBJECT_BODY_HEADER; 00032 00033 // 00034 // Setup default pool tags 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 // Define some macros that will verify that our callbacks don't give us a bad irql 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 // Define some more macros to validate the current irql 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 // This global spinlock guards the following fields: 00077 // 00078 // OBJECT_HEADER.PointerCount, 00079 // OBJECT_HEADER.HandleCount, 00080 // CachedGrantedAccess Variables, 00081 // ObpRemoveObjectQueue 00082 // 00083 // The spinlock is never held longer than is necessary to modify or read the field. 00084 // Only the following routines are used to increment and decrement these counts. 00085 // 00086 00087 KSPIN_LOCK ObpLock; 00088 KEVENT ObpDefaultObject; 00089 WORK_QUEUE_ITEM ObpRemoveObjectWorkItem; 00090 PSINGLE_LIST_ENTRY ObpRemoveObjectQueue; 00091 00092 // 00093 // This global lock is used to protect the device map tear down and build up 00094 // We can no longer use an individual lock in the device map itself because 00095 // that wasn't sufficient to protect the device map itself. 00096 // 00097 00098 KSPIN_LOCK ObpDeviceMapLock; 00099 00100 // 00101 // Define the following if you want to build a system where the handle count 00102 // is verified to always be greater than or equal to pointer count. Useful 00103 // for catching drivers that over-deref object pointers, but too slow for shipping 00104 // system. 00105 // 00106 00107 // #define MPSAFE_HANDLE_COUNT_CHECK 1 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 // Define macros to acquire and release an object type fast mutex. 00155 // 00156 // 00157 // VOID 00158 // ObpEnterObjectTypeMutex ( 00159 // IN POBJECT_TYPE ObjectType 00160 // ) 00161 // 00162 00163 #define ObpEnterObjectTypeMutex(_ObjectType) { \ 00164 ObpValidateIrql("ObpEnterObjectTypeMutex"); \ 00165 KeEnterCriticalRegion(); \ 00166 ExAcquireResourceExclusiveLite(&(_ObjectType)->Mutex, TRUE); \ 00167 } 00168 00169 // 00170 // VOID 00171 // ObpLeaveObjectTypeMutex ( 00172 // IN POBJECT_TYPE ObjectType 00173 // ) 00174 // 00175 00176 #define ObpLeaveObjectTypeMutex(_ObjectType) { \ 00177 ExReleaseResource(&(_ObjectType)->Mutex); \ 00178 KeLeaveCriticalRegion(); \ 00179 ObpValidateIrql("ObpLeaveObjectTypeMutex"); \ 00180 } 00181 00182 // 00183 // VOID 00184 // ObpEnterRootDirectoryMutex ( 00185 // VOID 00186 // ) 00187 // 00188 00189 #define ObpEnterRootDirectoryMutex() { \ 00190 ObpValidateIrql("ObpEnterRootDirectoryMutex"); \ 00191 KeEnterCriticalRegion(); \ 00192 ExAcquireResourceExclusiveLite(&ObpRootDirectoryMutex, TRUE); \ 00193 } 00194 00195 // 00196 // VOID 00197 // ObpLeaveRootDirectoryMutex ( 00198 // VOID 00199 // ) 00200 // 00201 00202 #define ObpLeaveRootDirectoryMutex() { \ 00203 ExReleaseResource(&ObpRootDirectoryMutex); \ 00204 KeLeaveCriticalRegion(); \ 00205 ObpValidateIrql("ObpLeaveRootDirectoryMutex"); \ 00206 } 00207 00208 00209 // 00210 // A Macro to return the object table for the current process 00211 // 00212 00213 #define ObpGetObjectTable() (PsGetCurrentProcess()->ObjectTable) 00214 00215 // 00216 // Macro to test whether or not the object manager is responsible for 00217 // an object's security descriptor, or if the object has its own 00218 // security management routines. 00219 // 00220 00221 #define ObpCentralizedSecurity(_ObjectType) \ 00222 ((_ObjectType)->TypeInfo.SecurityProcedure == SeDefaultObjectMethod) 00223 00224 // 00225 // Declare a global table of object types. 00226 // 00227 00228 #define OBP_MAX_DEFINED_OBJECT_TYPES 24 00229 POBJECT_TYPE ObpObjectTypes[ OBP_MAX_DEFINED_OBJECT_TYPES ]; 00230 00231 00232 // 00233 // This is some special purpose code to keep a table of access masks correlated with 00234 // back traces. If used these routines replace the GrantedAccess mask in the 00235 // preceding object table entry with a granted access index and a call back index. 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 // The three low order bits of the object table entry are used for handle 00256 // attributes. 00257 // 00258 // Define the bit mask for the protect from close handle attribute. 00259 // 00260 00261 #define OBJ_PROTECT_CLOSE 0x1 00262 00263 // 00264 // The bit mask for inherit MUST be 0x2. 00265 // 00266 00267 #if (OBJ_INHERIT != 0x2) 00268 00269 #error Object inheritance bit definition conflicts 00270 00271 #endif 00272 00273 // 00274 // Define the bit mask for the generate audit on close attribute. 00275 // 00276 // When a handle to an object with security is created, audit routines will 00277 // be called to perform any auditing that may be required. The audit routines 00278 // will return a boolean indicating whether or not audits should be generated 00279 // on close. 00280 // 00281 00282 #define OBJ_AUDIT_OBJECT_CLOSE 0x00000004L 00283 00284 // 00285 // The following three bits are available for handle attributes in the 00286 // Object field of an ObjectTableEntry. 00287 // 00288 00289 #define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE | OBJ_INHERIT | OBJ_AUDIT_OBJECT_CLOSE) 00290 00291 00292 // 00293 // Security Descriptor Cache 00294 // 00295 // Cache entry header. 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 // Macro to convert a security descriptor into its security descriptor header 00309 // 00310 00311 #define SD_TO_SD_HEADER(_sd) \ 00312 CONTAINING_RECORD( (_sd), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor ) 00313 00314 // 00315 // Macro to convert a header link into its security descriptor header 00316 // 00317 00318 #define LINK_TO_SD_HEADER(_link) \ 00319 CONTAINING_RECORD( (_link), SECURITY_DESCRIPTOR_HEADER, Link ) 00320 00321 // 00322 // Macros to traverse a list of security descriptors forwards and backwards 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 // Number of minor hash entries 00337 // 00338 00339 #define SECURITY_DESCRIPTOR_CACHE_ENTRIES 256 00340 00341 // 00342 // Routines to protect the security descriptor cache 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 // Global data 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 // Define date structures for the object creation information region. 00382 // 00383 00384 NPAGED_LOOKASIDE_LIST ObpCreateInfoLookasideList; 00385 00386 // 00387 // Define data structures for the object name buffer lookaside list. 00388 // 00389 00390 #define OBJECT_NAME_BUFFER_SIZE 248 00391 00392 NPAGED_LOOKASIDE_LIST ObpNameBufferLookasideList; 00393 00394 // 00395 // There is one global kernel handle table accessed via negative handle 00396 // and only in kernel mode 00397 // 00398 00399 PHANDLE_TABLE ObpKernelHandleTable; 00400 00401 // 00402 // The following macros are used to test and manipulate special kernel 00403 // handles. A kernel handle is just a regular handle with its sign 00404 // bit set. But must exclude -1 and -2 values which are the current 00405 // process and current thread constants. 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 // Test macro for overflow 00422 // 00423 00424 #define ObpIsOverflow(A,B) ((A) > ((A) + (B))) 00425 00426 00427 // 00428 // Internal Entry Points defined in obcreate.c and some associated macros 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 POBJECT_CREATE_INFORMATION 00497 ObpAllocateObjectCreateInfoBuffer ( 00498 VOID 00499 ) 00500 00501 Routine Description: 00502 00503 This function allocates a created information buffer. 00504 00505 N.B. This function is nonpageable. 00506 00507 Arguments: 00508 00509 None. 00510 00511 Return Value: 00512 00513 If the allocation is successful, then the address of the allocated 00514 create information buffer is is returned as the function value. 00515 Otherwise, a value of NULL is returned. 00516 00517 --*/ 00518 00519 #define ObpAllocateObjectCreateInfoBuffer() \ 00520 (POBJECT_CREATE_INFORMATION)ExAllocateFromPPNPagedLookasideList(LookasideCreateInfoList) 00521 00522 00523 /*++ 00524 00525 VOID 00526 FASTCALL 00527 ObpFreeObjectCreateInfoBuffer ( 00528 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo 00529 ) 00530 00531 Routine Description: 00532 00533 This function frees a create information buffer. 00534 00535 N.B. This function is nonpageable. 00536 00537 Arguments: 00538 00539 ObjectCreateInfo - Supplies a pointer to a create information buffer. 00540 00541 Return Value: 00542 00543 None. 00544 00545 --*/ 00546 00547 #define ObpFreeObjectCreateInfoBuffer(ObjectCreateInfo) \ 00548 ExFreeToPPNPagedLookasideList(LookasideCreateInfoList, ObjectCreateInfo) 00549 00550 00551 // 00552 // Internal Entry Points defined in oblink.c 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 // Internal Entry Points defined in obdir.c 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 // Internal entry points defined in obref.c 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 // Internal entry points defined in obhandle.c 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 // Internal entry points defined in obse.c 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 // Internal entry points defined in obsdata.c 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 

Generated on Sat May 15 19:41:05 2004 for test by doxygen 1.3.7