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 // 109 typedef 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 115 typedef struct _OBP_CLOSE_HANDLE_CONTEXT 116 { 117 PHANDLE_TABLE HandleTable; 118 KPROCESSOR_MODE AccessMode; 119 } OBP_CLOSE_HANDLE_CONTEXT, *POBP_CLOSE_HANDLE_CONTEXT; 120 121 typedef 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 // 131 typedef 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 // 142 typedef 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 // 151 typedef 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' 161 typedef 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 // 172 CODE_SEG("INIT") 173 BOOLEAN 174 NTAPI 175 ObInitSystem( 176 VOID 177 ); 178 179 VOID 180 NTAPI 181 ObShutdownSystem( 182 VOID 183 ); 184 185 // 186 // Directory Namespace Functions 187 // 188 BOOLEAN 189 NTAPI 190 ObpDeleteEntryDirectory( 191 IN POBP_LOOKUP_CONTEXT Context 192 ); 193 194 BOOLEAN 195 NTAPI 196 ObpInsertEntryDirectory( 197 IN POBJECT_DIRECTORY Parent, 198 IN POBP_LOOKUP_CONTEXT Context, 199 IN POBJECT_HEADER ObjectHeader 200 ); 201 202 PVOID 203 NTAPI 204 ObpLookupEntryDirectory( 205 IN POBJECT_DIRECTORY Directory, 206 IN PUNICODE_STRING Name, 207 IN ULONG Attributes, 208 IN UCHAR SearchShadow, 209 IN POBP_LOOKUP_CONTEXT Context 210 ); 211 212 // 213 // Symbolic Link Functions 214 // 215 VOID 216 NTAPI 217 ObpDeleteSymbolicLink( 218 IN PVOID ObjectBody 219 ); 220 221 NTSTATUS 222 NTAPI 223 ObpParseSymbolicLink( 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 236 VOID 237 NTAPI 238 ObpCreateSymbolicLinkName( 239 IN POBJECT_SYMBOLIC_LINK SymbolicLink 240 ); 241 242 VOID 243 NTAPI 244 ObpDeleteSymbolicLinkName( 245 IN POBJECT_SYMBOLIC_LINK SymbolicLink 246 ); 247 248 // 249 // Process/Handle Table Init/Rundown 250 // 251 NTSTATUS 252 NTAPI 253 ObInitProcess( 254 IN PEPROCESS Parent OPTIONAL, 255 IN PEPROCESS Process 256 ); 257 258 PHANDLE_TABLE 259 NTAPI 260 ObReferenceProcessHandleTable( 261 IN PEPROCESS Process 262 ); 263 264 VOID 265 NTAPI 266 ObDereferenceProcessHandleTable( 267 IN PEPROCESS Process 268 ); 269 270 VOID 271 NTAPI 272 ObKillProcess( 273 IN PEPROCESS Process 274 ); 275 276 // 277 // Object Lookup Functions 278 // 279 NTSTATUS 280 NTAPI 281 ObpLookupObjectName( 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 // 298 BOOLEAN 299 NTAPI 300 ObpSetHandleAttributes( 301 IN OUT PHANDLE_TABLE_ENTRY HandleTableEntry, 302 IN ULONG_PTR Context 303 ); 304 305 NTSTATUS 306 NTAPI 307 ObQueryDeviceMapInformation( 308 _In_opt_ PEPROCESS Process, 309 _Out_ PPROCESS_DEVICEMAP_INFORMATION DeviceMapInfo, 310 _In_ ULONG Flags 311 ); 312 313 // 314 // Object Lifetime Functions 315 // 316 VOID 317 NTAPI 318 ObpDeleteObject( 319 IN PVOID Object, 320 IN BOOLEAN CalledFromWorkerThread 321 ); 322 323 LONG 324 FASTCALL 325 ObDereferenceObjectEx( 326 IN PVOID Object, 327 IN LONG Count 328 ); 329 330 LONG 331 FASTCALL 332 ObReferenceObjectEx( 333 IN PVOID Object, 334 IN LONG Count 335 ); 336 337 BOOLEAN 338 FASTCALL 339 ObReferenceObjectSafe( 340 IN PVOID Object 341 ); 342 343 VOID 344 NTAPI 345 ObpReapObject( 346 IN PVOID Unused 347 ); 348 349 VOID 350 FASTCALL 351 ObpSetPermanentObject( 352 IN PVOID ObjectBody, 353 IN BOOLEAN Permanent 354 ); 355 356 VOID 357 NTAPI 358 ObpDeleteNameCheck( 359 IN PVOID Object 360 ); 361 362 VOID 363 NTAPI 364 ObClearProcessHandleTable( 365 IN PEPROCESS Process 366 ); 367 368 NTSTATUS 369 NTAPI 370 ObDuplicateObject( 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 381 VOID 382 NTAPI 383 ObFreeObjectCreateInfoBuffer( 384 IN POBJECT_CREATE_INFORMATION ObjectCreateInfo 385 ); 386 387 VOID 388 NTAPI 389 ObpFreeObjectNameBuffer( 390 IN PUNICODE_STRING Name 391 ); 392 393 VOID 394 NTAPI 395 ObpDeleteObjectType( 396 IN PVOID Object 397 ); 398 399 NTSTATUS 400 NTAPI 401 ObReferenceFileObjectForWrite( 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 // 411 NTSTATUS 412 NTAPI 413 ObSetDeviceMap( 414 IN PEPROCESS Process, 415 IN HANDLE DirectoryHandle 416 ); 417 418 NTSTATUS 419 NTAPI 420 ObSetDirectoryDeviceMap(OUT PDEVICE_MAP * DeviceMap, 421 IN HANDLE DirectoryHandle 422 ); 423 424 VOID 425 NTAPI 426 ObDereferenceDeviceMap( 427 IN PEPROCESS Process 428 ); 429 430 VOID 431 FASTCALL 432 ObfDereferenceDeviceMap( 433 IN PDEVICE_MAP DeviceMap 434 ); 435 436 VOID 437 NTAPI 438 ObInheritDeviceMap( 439 IN PEPROCESS Parent, 440 IN PEPROCESS Process 441 ); 442 443 CODE_SEG("INIT") 444 NTSTATUS 445 NTAPI 446 ObpCreateDosDevicesDirectory( 447 VOID 448 ); 449 450 ULONG 451 NTAPI 452 ObIsLUIDDeviceMapsEnabled( 453 VOID 454 ); 455 456 PDEVICE_MAP 457 NTAPI 458 ObpReferenceDeviceMap( 459 VOID 460 ); 461 462 // 463 // Security descriptor cache functions 464 // 465 CODE_SEG("INIT") 466 NTSTATUS 467 NTAPI 468 ObpInitSdCache( 469 VOID 470 ); 471 472 PSECURITY_DESCRIPTOR 473 NTAPI 474 ObpReferenceSecurityDescriptor( 475 IN POBJECT_HEADER ObjectHeader 476 ); 477 478 // 479 // Object Security Routines 480 // 481 BOOLEAN 482 NTAPI 483 ObCheckObjectAccess( 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 491 BOOLEAN 492 NTAPI 493 ObCheckCreateObjectAccess( 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 503 BOOLEAN 504 NTAPI 505 ObpCheckTraverseAccess( 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 514 BOOLEAN 515 NTAPI 516 ObpCheckObjectReference( 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 // 527 NTSTATUS 528 NTAPI 529 ObAssignObjectSecurityDescriptor( 530 IN PVOID Object, 531 IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, 532 IN POOL_TYPE PoolType 533 ); 534 535 NTSTATUS 536 NTAPI 537 ObDeassignSecurity( 538 IN OUT PSECURITY_DESCRIPTOR *SecurityDescriptor 539 ); 540 541 NTSTATUS 542 NTAPI 543 ObQuerySecurityDescriptorInfo( 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 551 NTSTATUS 552 NTAPI 553 ObSetSecurityDescriptorInfo( 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 // 565 VOID 566 FASTCALL 567 ObInitializeFastReference( 568 IN PEX_FAST_REF FastRef, 569 IN PVOID Object 570 ); 571 572 PVOID 573 FASTCALL 574 ObFastReplaceObject( 575 IN PEX_FAST_REF FastRef, 576 IN PVOID Object 577 ); 578 579 PVOID 580 FASTCALL 581 ObFastReferenceObject( 582 IN PEX_FAST_REF FastRef 583 ); 584 585 PVOID 586 FASTCALL 587 ObFastReferenceObjectLocked( 588 IN PEX_FAST_REF FastRef 589 ); 590 591 VOID 592 FASTCALL 593 ObFastDereferenceObject( 594 IN PEX_FAST_REF FastRef, 595 IN PVOID Object 596 ); 597 598 // 599 // Object Create and Object Name Capture Functions 600 // 601 NTSTATUS 602 NTAPI 603 ObpCaptureObjectName( 604 IN PUNICODE_STRING CapturedName, 605 IN PUNICODE_STRING ObjectName, 606 IN KPROCESSOR_MODE AccessMode, 607 IN BOOLEAN AllocateFromLookaside 608 ); 609 610 NTSTATUS 611 NTAPI 612 ObpCaptureObjectCreateInformation( 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 // 624 ULONG 625 NTAPI 626 ObGetProcessHandleCount( 627 IN PEPROCESS Process 628 ); 629 630 // 631 // Global data inside the Object Manager 632 // 633 extern ULONG ObpTraceLevel; 634 extern KEVENT ObpDefaultObject; 635 extern KGUARDED_MUTEX ObpDeviceMapLock; 636 extern POBJECT_TYPE ObpTypeObjectType; 637 extern POBJECT_TYPE ObpDirectoryObjectType; 638 extern POBJECT_TYPE ObpSymbolicLinkObjectType; 639 extern POBJECT_DIRECTORY ObpRootDirectoryObject; 640 extern POBJECT_DIRECTORY ObpTypeDirectoryObject; 641 extern PHANDLE_TABLE ObpKernelHandleTable; 642 extern WORK_QUEUE_ITEM ObpReaperWorkItem; 643 extern volatile PVOID ObpReaperList; 644 extern GENERAL_LOOKASIDE ObpNameBufferLookasideList, ObpCreateInfoLookasideList; 645 extern BOOLEAN IoCountOperations; 646 extern ALIGNEDNAME ObpDosDevicesShortNamePrefix; 647 extern ALIGNEDNAME ObpDosDevicesShortNameRoot; 648 extern UNICODE_STRING ObpDosDevicesShortName; 649 extern WCHAR ObpUnsecureGlobalNamesBuffer[128]; 650 extern ULONG ObpUnsecureGlobalNamesLength; 651 extern ULONG ObpObjectSecurityMode; 652 extern ULONG ObpProtectionMode; 653 extern ULONG ObpLUIDDeviceMapsDisabled; 654 extern ULONG ObpLUIDDeviceMapsEnabled; 655 656 // 657 // Inlined Functions 658 // 659 #include "ob_x.h" 660