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