Reactos
at master 660 lines 13 kB view raw
1/* 2* PROJECT: ReactOS Kernel 3* LICENSE: GPL - See COPYING in the top level directory 4* FILE: ntoskrnl/include/internal/ob.h 5* PURPOSE: Internal header for the Object Manager 6* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 7*/ 8 9// 10// Define this if you want debugging support 11// 12#define _OB_DEBUG_ 0x00 13 14// 15// These define the Debug Masks Supported 16// 17#define OB_HANDLE_DEBUG 0x01 18#define OB_NAMESPACE_DEBUG 0x02 19#define OB_SECURITY_DEBUG 0x04 20#define OB_REFERENCE_DEBUG 0x08 21#define OB_CALLBACK_DEBUG 0x10 22 23// 24// Debug/Tracing support 25// 26#if _OB_DEBUG_ 27#ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented 28#define OBTRACE DbgPrintEx 29#else 30#define OBTRACE(x, ...) \ 31 if (x & ObpTraceLevel) DbgPrint(__VA_ARGS__) 32#endif 33#else 34#define OBTRACE(x, fmt, ...) DPRINT(fmt, ##__VA_ARGS__) 35#endif 36 37// 38// Mask to detect GENERIC_XXX access masks being used 39// 40#define GENERIC_ACCESS \ 41 (GENERIC_READ | \ 42 GENERIC_WRITE | \ 43 GENERIC_EXECUTE | \ 44 GENERIC_ALL) 45 46// 47// Handle Bit Flags 48// 49#define OBJ_PROTECT_CLOSE 0x01 50//#define OBJ_INHERIT 0x02 51#define OBJ_AUDIT_OBJECT_CLOSE 0x04 52#define OBJ_HANDLE_ATTRIBUTES (OBJ_PROTECT_CLOSE |\ 53 OBJ_INHERIT | \ 54 OBJ_AUDIT_OBJECT_CLOSE) 55 56// 57// Handle Access Protection Close Flag 58// 59#define ObpAccessProtectCloseBit 0x02000000L 60 61// 62// System Process Quota Block 63// 64#define OBP_SYSTEM_PROCESS_QUOTA ((PEPROCESS_QUOTA_BLOCK)(ULONG_PTR)1) 65 66// 67// Identifies a Kernel Handle 68// 69#ifdef _WIN64 70#define KERNEL_HANDLE_FLAG 0xFFFFFFFF80000000ULL 71#else 72#define KERNEL_HANDLE_FLAG 0x80000000 73#endif 74#define ObpIsKernelHandle(Handle, ProcessorMode) \ 75 ((((ULONG_PTR)(Handle) & KERNEL_HANDLE_FLAG) == KERNEL_HANDLE_FLAG) && \ 76 ((ProcessorMode) == KernelMode) && \ 77 ((Handle) != NtCurrentProcess()) && \ 78 ((Handle) != NtCurrentThread())) 79 80// 81// Converts to and from a Kernel Handle to a normal handle 82// 83#define ObKernelHandleToHandle(Handle) \ 84 (HANDLE)((ULONG_PTR)(Handle) & ~KERNEL_HANDLE_FLAG) 85#define ObMarkHandleAsKernelHandle(Handle) \ 86 (HANDLE)((ULONG_PTR)(Handle) | KERNEL_HANDLE_FLAG) 87 88// 89// Converts from an EXHANDLE object to a POBJECT_HEADER 90// 91#define ObpGetHandleObject(x) \ 92 ((POBJECT_HEADER)((ULONG_PTR)x->Object & ~OBJ_HANDLE_ATTRIBUTES)) 93 94// 95// Recovers the security descriptor from a cached security descriptor header 96// 97#define ObpGetHeaderForSd(x) \ 98 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, SecurityDescriptor) 99 100// 101// Recovers the security descriptor from a cached security descriptor list entry 102// 103#define ObpGetHeaderForEntry(x) \ 104 CONTAINING_RECORD((x), SECURITY_DESCRIPTOR_HEADER, Link) 105 106// 107// Context Structures for Ex*Handle Callbacks 108// 109typedef struct _OBP_SET_HANDLE_ATTRIBUTES_CONTEXT 110{ 111 KPROCESSOR_MODE PreviousMode; 112 OBJECT_HANDLE_ATTRIBUTE_INFORMATION Information; 113} OBP_SET_HANDLE_ATTRIBUTES_CONTEXT, *POBP_SET_HANDLE_ATTRIBUTES_CONTEXT; 114 115typedef struct _OBP_CLOSE_HANDLE_CONTEXT 116{ 117 PHANDLE_TABLE HandleTable; 118 KPROCESSOR_MODE AccessMode; 119} OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT; 120 121typedef struct _OBP_FIND_HANDLE_DATA 122{ 123 POBJECT_HEADER ObjectHeader; 124 POBJECT_TYPE ObjectType; 125 POBJECT_HANDLE_INFORMATION HandleInformation; 126} OBP_FIND_HANDLE_DATA, *POBP_FIND_HANDLE_DATA; 127 128// 129// Cached Security Descriptor Header 130// 131typedef struct _SECURITY_DESCRIPTOR_HEADER 132{ 133 LIST_ENTRY Link; 134 ULONG RefCount; 135 ULONG FullHash; 136 QUAD SecurityDescriptor; 137} SECURITY_DESCRIPTOR_HEADER, *PSECURITY_DESCRIPTOR_HEADER; 138 139// 140// Cached Security Descriptor List 141// 142typedef struct _OB_SD_CACHE_LIST 143{ 144 EX_PUSH_LOCK PushLock; 145 LIST_ENTRY Head; 146} OB_SD_CACHE_LIST, *POB_SD_CACHE_LIST; 147 148// 149// Structure for quick-compare of a DOS Device path 150// 151typedef union 152{ 153 WCHAR Name[sizeof(ULARGE_INTEGER) / sizeof(WCHAR)]; 154 ULARGE_INTEGER Alignment; 155} ALIGNEDNAME; 156 157// 158// Private Temporary Buffer for Lookup Routines 159// 160#define TAG_OB_TEMP_STORAGE 'tSbO' 161typedef struct _OB_TEMP_BUFFER 162{ 163 ACCESS_STATE LocalAccessState; 164 OBJECT_CREATE_INFORMATION ObjectCreateInfo; 165 OBP_LOOKUP_CONTEXT LookupContext; 166 AUX_ACCESS_DATA AuxData; 167} OB_TEMP_BUFFER, *POB_TEMP_BUFFER; 168 169// 170// Startup and Shutdown Functions 171// 172CODE_SEG("INIT") 173BOOLEAN 174NTAPI 175ObInitSystem( 176 VOID 177); 178 179VOID 180NTAPI 181ObShutdownSystem( 182 VOID 183); 184 185// 186// Directory Namespace Functions 187// 188BOOLEAN 189NTAPI 190ObpDeleteEntryDirectory( 191 IN POBP_LOOKUP_CONTEXT Context 192); 193 194BOOLEAN 195NTAPI 196ObpInsertEntryDirectory( 197 IN POBJECT_DIRECTORY Parent, 198 IN POBP_LOOKUP_CONTEXT Context, 199 IN POBJECT_HEADER ObjectHeader 200); 201 202PVOID 203NTAPI 204ObpLookupEntryDirectory( 205 IN POBJECT_DIRECTORY Directory, 206 IN PUNICODE_STRING Name, 207 IN ULONG Attributes, 208 IN BOOLEAN SearchShadow, 209 IN POBP_LOOKUP_CONTEXT Context 210); 211 212// 213// Symbolic Link Functions 214// 215VOID 216NTAPI 217ObpDeleteSymbolicLink( 218 IN PVOID ObjectBody 219); 220 221NTSTATUS 222NTAPI 223ObpParseSymbolicLink( 224 IN PVOID ParsedObject, 225 IN PVOID ObjectType, 226 IN OUT PACCESS_STATE AccessState, 227 IN KPROCESSOR_MODE AccessMode, 228 IN ULONG Attributes, 229 IN OUT PUNICODE_STRING FullPath, 230 IN OUT PUNICODE_STRING RemainingName, 231 IN OUT PVOID Context OPTIONAL, 232 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, 233 OUT PVOID *NextObject 234); 235 236VOID 237NTAPI 238ObpCreateSymbolicLinkName( 239 IN POBJECT_SYMBOLIC_LINK SymbolicLink 240); 241 242VOID 243NTAPI 244ObpDeleteSymbolicLinkName( 245 IN POBJECT_SYMBOLIC_LINK SymbolicLink 246); 247 248// 249// Process/Handle Table Init/Rundown 250// 251NTSTATUS 252NTAPI 253ObInitProcess( 254 IN PEPROCESS Parent OPTIONAL, 255 IN PEPROCESS Process 256); 257 258PHANDLE_TABLE 259NTAPI 260ObReferenceProcessHandleTable( 261 IN PEPROCESS Process 262); 263 264VOID 265NTAPI 266ObDereferenceProcessHandleTable( 267 IN PEPROCESS Process 268); 269 270VOID 271NTAPI 272ObKillProcess( 273 IN PEPROCESS Process 274); 275 276// 277// Object Lookup Functions 278// 279NTSTATUS 280NTAPI 281ObpLookupObjectName( 282 IN HANDLE RootHandle OPTIONAL, 283 IN OUT PUNICODE_STRING ObjectName, 284 IN ULONG Attributes, 285 IN POBJECT_TYPE ObjectType, 286 IN KPROCESSOR_MODE AccessMode, 287 IN OUT PVOID ParseContext, 288 IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, 289 IN PVOID InsertObject OPTIONAL, 290 IN OUT PACCESS_STATE AccessState, 291 OUT POBP_LOOKUP_CONTEXT LookupContext, 292 OUT PVOID *FoundObject 293); 294 295// 296// Object Attribute Functions 297// 298BOOLEAN 299NTAPI 300ObpSetHandleAttributes( 301 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry, 302 IN ULONG_PTR Context 303); 304 305NTSTATUS 306NTAPI 307ObQueryDeviceMapInformation( 308 _In_opt_ PEPROCESS Process, 309 _Out_ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo, 310 _In_ ULONG Flags 311); 312 313// 314// Object Lifetime Functions 315// 316VOID 317NTAPI 318ObpDeleteObject( 319 IN PVOID Object, 320 IN BOOLEAN CalledFromWorkerThread 321); 322 323LONG 324FASTCALL 325ObDereferenceObjectEx( 326 IN PVOID Object, 327 IN LONG Count 328); 329 330LONG 331FASTCALL 332ObReferenceObjectEx( 333 IN PVOID Object, 334 IN LONG Count 335); 336 337BOOLEAN 338FASTCALL 339ObReferenceObjectSafe( 340 IN PVOID Object 341); 342 343VOID 344NTAPI 345ObpReapObject( 346 IN PVOID Unused 347); 348 349VOID 350FASTCALL 351ObpSetPermanentObject( 352 IN PVOID ObjectBody, 353 IN BOOLEAN Permanent 354); 355 356VOID 357NTAPI 358ObpDeleteNameCheck( 359 IN PVOID Object 360); 361 362VOID 363NTAPI 364ObClearProcessHandleTable( 365 IN PEPROCESS Process 366); 367 368NTSTATUS 369NTAPI 370ObDuplicateObject( 371 IN PEPROCESS SourceProcess, 372 IN HANDLE SourceHandle, 373 IN PEPROCESS TargetProcess OPTIONAL, 374 IN PHANDLE TargetHandle OPTIONAL, 375 IN ACCESS_MASK DesiredAccess, 376 IN ULONG HandleAttributes, 377 IN ULONG Options, 378 IN KPROCESSOR_MODE PreviousMode 379); 380 381VOID 382NTAPI 383ObFreeObjectCreateInfoBuffer( 384 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo 385); 386 387VOID 388NTAPI 389ObpFreeObjectNameBuffer( 390 IN PUNICODE_STRING Name 391); 392 393VOID 394NTAPI 395ObpDeleteObjectType( 396 IN PVOID Object 397); 398 399NTSTATUS 400NTAPI 401ObReferenceFileObjectForWrite( 402 IN HANDLE Handle, 403 IN KPROCESSOR_MODE AccessMode, 404 OUT PFILE_OBJECT *FileObject, 405 OUT POBJECT_HANDLE_INFORMATION HandleInformation 406); 407 408// 409// DOS Devices Functions 410// 411NTSTATUS 412NTAPI 413ObSetDeviceMap( 414 IN PEPROCESS Process, 415 IN HANDLE DirectoryHandle 416); 417 418NTSTATUS 419NTAPI 420ObSetDirectoryDeviceMap(OUT PDEVICE_MAP * DeviceMap, 421 IN HANDLE DirectoryHandle 422); 423 424VOID 425NTAPI 426ObDereferenceDeviceMap( 427 IN PEPROCESS Process 428); 429 430VOID 431FASTCALL 432ObfDereferenceDeviceMap( 433 IN PDEVICE_MAP DeviceMap 434); 435 436VOID 437NTAPI 438ObInheritDeviceMap( 439 IN PEPROCESS Parent, 440 IN PEPROCESS Process 441); 442 443CODE_SEG("INIT") 444NTSTATUS 445NTAPI 446ObpCreateDosDevicesDirectory( 447 VOID 448); 449 450ULONG 451NTAPI 452ObIsLUIDDeviceMapsEnabled( 453 VOID 454); 455 456PDEVICE_MAP 457NTAPI 458ObpReferenceDeviceMap( 459 VOID 460); 461 462// 463// Security descriptor cache functions 464// 465CODE_SEG("INIT") 466NTSTATUS 467NTAPI 468ObpInitSdCache( 469 VOID 470); 471 472PSECURITY_DESCRIPTOR 473NTAPI 474ObpReferenceSecurityDescriptor( 475 IN POBJECT_HEADER ObjectHeader 476); 477 478// 479// Object Security Routines 480// 481BOOLEAN 482NTAPI 483ObCheckObjectAccess( 484 IN PVOID Object, 485 IN OUT PACCESS_STATE AccessState, 486 IN BOOLEAN LockHeld, 487 IN KPROCESSOR_MODE AccessMode, 488 OUT PNTSTATUS ReturnedStatus 489); 490 491BOOLEAN 492NTAPI 493ObCheckCreateObjectAccess( 494 IN PVOID Object, 495 IN ACCESS_MASK CreateAccess, 496 IN PACCESS_STATE AccessState, 497 IN PUNICODE_STRING ComponentName, 498 IN BOOLEAN LockHeld, 499 IN KPROCESSOR_MODE AccessMode, 500 OUT PNTSTATUS AccessStatus 501); 502 503BOOLEAN 504NTAPI 505ObpCheckTraverseAccess( 506 IN PVOID Object, 507 IN ACCESS_MASK TraverseAccess, 508 IN PACCESS_STATE AccessState OPTIONAL, 509 IN BOOLEAN LockHeld, 510 IN KPROCESSOR_MODE AccessMode, 511 OUT PNTSTATUS AccessStatus 512); 513 514BOOLEAN 515NTAPI 516ObpCheckObjectReference( 517 IN PVOID Object, 518 IN OUT PACCESS_STATE AccessState, 519 IN BOOLEAN LockHeld, 520 IN KPROCESSOR_MODE AccessMode, 521 OUT PNTSTATUS AccessStatus 522); 523 524// 525// Default Object Security Callback Routines 526// 527NTSTATUS 528NTAPI 529ObAssignObjectSecurityDescriptor( 530 IN PVOID Object, 531 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, 532 IN POOL_TYPE PoolType 533); 534 535NTSTATUS 536NTAPI 537ObDeassignSecurity( 538 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor 539); 540 541NTSTATUS 542NTAPI 543ObQuerySecurityDescriptorInfo( 544 IN PVOID Object, 545 IN PSECURITY_INFORMATION SecurityInformation, 546 OUT PSECURITY_DESCRIPTOR SecurityDescriptor, 547 IN OUT PULONG Length, 548 IN PSECURITY_DESCRIPTOR *OutputSecurityDescriptor 549); 550 551NTSTATUS 552NTAPI 553ObSetSecurityDescriptorInfo( 554 IN PVOID Object, 555 IN PSECURITY_INFORMATION SecurityInformation, 556 IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor, 557 IN OUT PSECURITY_DESCRIPTOR *OutputSecurityDescriptor, 558 IN POOL_TYPE PoolType, 559 IN PGENERIC_MAPPING GenericMapping 560); 561 562// 563// Executive Fast Referencing Functions 564// 565VOID 566FASTCALL 567ObInitializeFastReference( 568 IN PEX_FAST_REF FastRef, 569 IN PVOID Object 570); 571 572PVOID 573FASTCALL 574ObFastReplaceObject( 575 IN PEX_FAST_REF FastRef, 576 IN PVOID Object 577); 578 579PVOID 580FASTCALL 581ObFastReferenceObject( 582 IN PEX_FAST_REF FastRef 583); 584 585PVOID 586FASTCALL 587ObFastReferenceObjectLocked( 588 IN PEX_FAST_REF FastRef 589); 590 591VOID 592FASTCALL 593ObFastDereferenceObject( 594 IN PEX_FAST_REF FastRef, 595 IN PVOID Object 596); 597 598// 599// Object Create and Object Name Capture Functions 600// 601NTSTATUS 602NTAPI 603ObpCaptureObjectName( 604 IN PUNICODE_STRING CapturedName, 605 IN PUNICODE_STRING ObjectName, 606 IN KPROCESSOR_MODE AccessMode, 607 IN BOOLEAN AllocateFromLookaside 608); 609 610NTSTATUS 611NTAPI 612ObpCaptureObjectCreateInformation( 613 IN POBJECT_ATTRIBUTES ObjectAttributes, 614 IN KPROCESSOR_MODE AccessMode, 615 IN KPROCESSOR_MODE CreatorMode, 616 IN BOOLEAN AllocateFromLookaside, 617 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo, 618 OUT PUNICODE_STRING ObjectName 619); 620 621// 622// Miscellanea 623// 624ULONG 625NTAPI 626ObGetProcessHandleCount( 627 IN PEPROCESS Process 628); 629 630// 631// Global data inside the Object Manager 632// 633extern ULONG ObpTraceLevel; 634extern KEVENT ObpDefaultObject; 635extern KGUARDED_MUTEX ObpDeviceMapLock; 636extern POBJECT_TYPE ObpTypeObjectType; 637extern POBJECT_TYPE ObpDirectoryObjectType; 638extern POBJECT_TYPE ObpSymbolicLinkObjectType; 639extern POBJECT_DIRECTORY ObpRootDirectoryObject; 640extern POBJECT_DIRECTORY ObpTypeDirectoryObject; 641extern PHANDLE_TABLE ObpKernelHandleTable; 642extern WORK_QUEUE_ITEM ObpReaperWorkItem; 643extern volatile PVOID ObpReaperList; 644extern GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList; 645extern BOOLEAN IoCountOperations; 646extern ALIGNEDNAME ObpDosDevicesShortNamePrefix; 647extern ALIGNEDNAME ObpDosDevicesShortNameRoot; 648extern UNICODE_STRING ObpDosDevicesShortName; 649extern WCHAR ObpUnsecureGlobalNamesBuffer[128]; 650extern ULONG ObpUnsecureGlobalNamesLength; 651extern ULONG ObpCaseInsensitive; 652extern ULONG ObpObjectSecurityMode; 653extern ULONG ObpProtectionMode; 654extern ULONG ObpLUIDDeviceMapsDisabled; 655extern ULONG ObpLUIDDeviceMapsEnabled; 656 657// 658// Inlined Functions 659// 660#include "ob_x.h"