ReactOS 0.4.17-dev-470-gf9e3448
obref.c File Reference
#include <ntoskrnl.h>
#include <debug.h>
Include dependency graph for obref.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

BOOLEAN FASTCALL ObReferenceObjectSafe (IN PVOID Object)
 
VOID NTAPI ObpDeferObjectDeletion (IN POBJECT_HEADER Header)
 
LONG FASTCALL ObReferenceObjectEx (IN PVOID Object, IN LONG Count)
 
LONG FASTCALL ObDereferenceObjectEx (IN PVOID Object, IN LONG Count)
 
VOID FASTCALL ObInitializeFastReference (IN PEX_FAST_REF FastRef, IN PVOID Object OPTIONAL)
 
PVOID FASTCALL ObFastReferenceObjectLocked (IN PEX_FAST_REF FastRef)
 
PVOID FASTCALL ObFastReferenceObject (IN PEX_FAST_REF FastRef)
 
VOID FASTCALL ObFastDereferenceObject (IN PEX_FAST_REF FastRef, IN PVOID Object)
 
PVOID FASTCALL ObFastReplaceObject (IN PEX_FAST_REF FastRef, PVOID Object)
 
NTSTATUS NTAPI ObReferenceFileObjectForWrite (IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode, OUT PFILE_OBJECT *FileObject, OUT POBJECT_HANDLE_INFORMATION HandleInformation)
 
LONG_PTR FASTCALL ObfReferenceObject (IN PVOID Object)
 
LONG_PTR FASTCALL ObfDereferenceObject (IN PVOID Object)
 
VOID NTAPI ObDereferenceObjectDeferDelete (IN PVOID Object)
 
VOID NTAPI ObDereferenceObject (IN PVOID Object)
 
NTSTATUS NTAPI ObReferenceObjectByPointer (IN PVOID Object, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode)
 
NTSTATUS NTAPI ObReferenceObjectByName (IN PUNICODE_STRING ObjectPath, IN ULONG Attributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, OUT PVOID *ObjectPtr)
 
NTSTATUS NTAPI ObReferenceObjectByHandle (IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 15 of file obref.c.

Function Documentation

◆ ObDereferenceObject()

VOID NTAPI ObDereferenceObject ( IN PVOID  Object)

Definition at line 372 of file obref.c.

373{
374 /* Call the fastcall function */
376}
LONG_PTR FASTCALL ObfDereferenceObject(IN PVOID Object)
Definition: obref.c:317
_Must_inspect_result_ _In_ WDFCOLLECTION _In_ WDFOBJECT Object

◆ ObDereferenceObjectDeferDelete()

VOID NTAPI ObDereferenceObjectDeferDelete ( IN PVOID  Object)

Definition at line 357 of file obref.c.

358{
360
361 /* Check whether the object can now be deleted. */
362 if (!InterlockedDecrementSizeT(&Header->PointerCount))
363 {
364 /* Add us to the deferred deletion list */
366 }
367}
Definition: Header.h:9
#define InterlockedDecrementSizeT(a)
Definition: interlocked.h:168
#define OBJECT_TO_OBJECT_HEADER(o)
Definition: obtypes.h:111
VOID NTAPI ObpDeferObjectDeletion(IN POBJECT_HEADER Header)
Definition: obref.c:53

Referenced by CmpDoCreate(), CmpDoCreateChild(), CmpFlushNotifiesOnKeyBodyList(), IopCompleteRequest(), and ObpDereferenceNameInfo().

◆ ObDereferenceObjectEx()

LONG FASTCALL ObDereferenceObjectEx ( IN PVOID  Object,
IN LONG  Count 
)

Definition at line 88 of file obref.c.

90{
92 LONG_PTR NewCount;
93
94 /* Extract the object header */
96
97 /* Check whether the object can now be deleted. */
98 NewCount = InterlockedExchangeAddSizeT(&Header->PointerCount, -Count) - Count;
99 if (!NewCount) ObpDeferObjectDeletion(Header);
100
101 /* Return the current count */
102 return NewCount;
103}
#define InterlockedExchangeAddSizeT(a, b)
Definition: interlocked.h:211
__int3264 LONG_PTR
Definition: mstsclib_h.h:276
int Count
Definition: noreturn.cpp:7

Referenced by ExpTimerApcKernelRoutine(), ExTimerRundown(), NtCancelTimer(), NtSetTimer(), ObFastReferenceObject(), ObFastReplaceObject(), and PspCreateThread().

◆ ObFastDereferenceObject()

VOID FASTCALL ObFastDereferenceObject ( IN PEX_FAST_REF  FastRef,
IN PVOID  Object 
)

Definition at line 167 of file obref.c.

169{
170 /* Release a fast reference. If this failed, use the slow path */
172}
FORCEINLINE BOOLEAN ExReleaseFastReference(IN PEX_FAST_REF FastRef, IN PVOID Object)
Definition: ex.h:688
#define ObDereferenceObject
Definition: obfuncs.h:203

Referenced by PsImpersonateClient(), PspCreateProcess(), PspCreateThread(), PspExitThread(), PspInitializeProcessSecurity(), PspSetPrimaryToken(), SeIsTokenChild(), SeIsTokenSibling(), SepImpersonateAnonymousToken(), SepOpenThreadToken(), and SeReleaseSubjectContext().

◆ ObFastReferenceObject()

PVOID FASTCALL ObFastReferenceObject ( IN PEX_FAST_REF  FastRef)

Definition at line 132 of file obref.c.

133{
134 EX_FAST_REF OldValue;
137
138 /* Reference the object and get it pointer */
139 OldValue = ExAcquireFastReference(FastRef);
141
142 /* Check how many references are left */
143 Count = ExGetCountFastReference(OldValue);
144
145 /* Check if the reference count is over 1 */
146 if (Count > 1) return Object;
147
148 /* Check if the reference count has reached 0 */
149 if (!Count) return NULL;
150
151 /* Otherwise, reference the object 7 times */
153
154 /* Now update the reference count */
155 if (!ExInsertFastReference(FastRef, Object))
156 {
157 /* We failed: completely dereference the object */
159 }
160
161 /* Return the Object */
162 return Object;
163}
#define NULL
Definition: types.h:112
#define MAX_FAST_REFS
Definition: ex.h:136
FORCEINLINE ULONG ExGetCountFastReference(IN EX_FAST_REF FastRef)
Definition: ex.h:591
FORCEINLINE BOOLEAN ExInsertFastReference(IN OUT PEX_FAST_REF FastRef, IN PVOID Object)
Definition: ex.h:649
FORCEINLINE PVOID ExGetObjectFastReference(IN EX_FAST_REF FastRef)
Definition: ex.h:583
FORCEINLINE EX_FAST_REF ExAcquireFastReference(IN OUT PEX_FAST_REF FastRef)
Definition: ex.h:620
LONG FASTCALL ObDereferenceObjectEx(IN PVOID Object, IN LONG Count)
Definition: obref.c:88
LONG FASTCALL ObReferenceObjectEx(IN PVOID Object, IN LONG Count)
Definition: obref.c:77
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by PsReferenceEffectiveToken(), and PsReferencePrimaryToken().

◆ ObFastReferenceObjectLocked()

PVOID FASTCALL ObFastReferenceObjectLocked ( IN PEX_FAST_REF  FastRef)

Definition at line 119 of file obref.c.

120{
122 EX_FAST_REF OldValue = *FastRef;
123
124 /* Get the object and reference it slowly */
127 return Object;
128}
#define ObReferenceObject
Definition: obfuncs.h:204

Referenced by PsReferenceEffectiveToken(), and PsReferencePrimaryToken().

◆ ObFastReplaceObject()

PVOID FASTCALL ObFastReplaceObject ( IN PEX_FAST_REF  FastRef,
PVOID  Object 
)

Definition at line 176 of file obref.c.

178{
179 EX_FAST_REF OldValue;
180 PVOID OldObject;
181 ULONG Count;
182
183 /* Check if we were given an object and reference it 7 times */
185
186 /* Do the swap */
187 OldValue = ExSwapFastReference(FastRef, Object);
188 OldObject = ExGetObjectFastReference(OldValue);
189
190 /* Check if we had an active object and dereference it */
191 Count = ExGetCountFastReference(OldValue);
192 if ((OldObject) && (Count)) ObDereferenceObjectEx(OldObject, Count);
193
194 /* Return the old object */
195 return OldObject;
196}
FORCEINLINE EX_FAST_REF ExSwapFastReference(IN PEX_FAST_REF FastRef, IN PVOID Object)
Definition: ex.h:723
uint32_t ULONG
Definition: typedefs.h:59

◆ ObfDereferenceObject()

LONG_PTR FASTCALL ObfDereferenceObject ( IN PVOID  Object)

Definition at line 317 of file obref.c.

318{
320 LONG_PTR NewCount;
321
322 /* Extract the object header */
324
325 if (Header->PointerCount < Header->HandleCount)
326 {
327 DPRINT1("Misbehaving object: %wZ\n", &Header->Type->Name);
328 return Header->PointerCount;
329 }
330
331 /* Check whether the object can now be deleted. */
332 NewCount = InterlockedDecrementSizeT(&Header->PointerCount);
333 if (!NewCount)
334 {
335 /* Sanity check */
336 ASSERT(Header->HandleCount == 0);
337
338 /* Check if APCs are still active */
340 {
341 /* Remove the object */
343 }
344 else
345 {
346 /* Add us to the deferred deletion list */
348 }
349 }
350
351 /* Return the new count */
352 return NewCount;
353}
#define DPRINT1
Definition: precomp.h:8
#define FALSE
Definition: types.h:117
#define ASSERT(a)
Definition: mode.c:44
BOOLEAN NTAPI KeAreAllApcsDisabled(VOID)
Definition: apc.c:985
VOID NTAPI ObpDeleteObject(IN PVOID Object, IN BOOLEAN CalledFromWorkerThread)
Definition: oblife.c:147

Referenced by ObDereferenceObject().

◆ ObfReferenceObject()

LONG_PTR FASTCALL ObfReferenceObject ( IN PVOID  Object)

Definition at line 307 of file obref.c.

308{
309 ASSERT(Object);
310
311 /* Get the header and increment the reference count */
313}
#define InterlockedIncrementSizeT(a)
Definition: interlocked.h:235

◆ ObInitializeFastReference()

VOID FASTCALL ObInitializeFastReference ( IN PEX_FAST_REF  FastRef,
IN PVOID Object  OPTIONAL 
)

Definition at line 107 of file obref.c.

109{
110 /* Check if we were given an object and reference it 7 times */
112
113 /* Setup the fast reference */
115}
FORCEINLINE VOID ExInitializeFastReference(OUT PEX_FAST_REF FastRef, IN OPTIONAL PVOID Object)
Definition: ex.h:599

Referenced by PspInitializeProcessSecurity(), SeAssignPrimaryToken(), and SepInitializationPhase0().

◆ ObpDeferObjectDeletion()

VOID NTAPI ObpDeferObjectDeletion ( IN POBJECT_HEADER  Header)

Definition at line 53 of file obref.c.

54{
56
57 /* Loop while trying to update the list */
58 do
59 {
60 /* Get the current entry */
62
63 /* Link our object to the list */
64 Header->NextToFree = Entry;
65
66 /* Update the list */
68 Header,
69 Entry) != Entry);
70
71 /* Queue the work item if needed */
73}
#define InterlockedCompareExchangePointer
Definition: interlocked.h:144
volatile PVOID ObpReaperList
Definition: oblife.c:29
WORK_QUEUE_ITEM ObpReaperWorkItem
Definition: oblife.c:28
Entry
Definition: section.c:5216
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
Definition: work.c:723
@ CriticalWorkQueue
Definition: extypes.h:189

Referenced by ObDereferenceObjectDeferDelete(), ObDereferenceObjectEx(), and ObfDereferenceObject().

◆ ObReferenceFileObjectForWrite()

NTSTATUS NTAPI ObReferenceFileObjectForWrite ( IN HANDLE  Handle,
IN KPROCESSOR_MODE  AccessMode,
OUT PFILE_OBJECT FileObject,
OUT POBJECT_HANDLE_INFORMATION  HandleInformation 
)

Definition at line 200 of file obref.c.

204{
207 POBJECT_HEADER ObjectHeader;
208 PHANDLE_TABLE_ENTRY HandleEntry;
210
211 /* Assume failure */
212 *FileObject = NULL;
213
214 /* Check if this is a special handle */
215 if (HandleToLong(Handle) < 0)
216 {
217 /* Make sure we have a valid kernel handle */
219 {
221 }
222
223 /* Use the kernel handle table and get the actual handle value */
226 }
227 else
228 {
229 /* Otherwise use this process's handle table */
230 HandleTable = PsGetCurrentProcess()->ObjectTable;
231 }
232
235
236 /* Get the handle entry */
238 if (HandleEntry)
239 {
240 /* Get the object header and validate the type*/
241 ObjectHeader = ObpGetHandleObject(HandleEntry);
242
243 /* Get the desired access from the file object */
245 &DesiredAccess)))
246 {
248 }
249 else
250 {
251 /* Extract the granted access from the handle entry */
253 {
254 /* FIXME: Translate granted access */
255 GrantedAccess = HandleEntry->GrantedAccess;
256 }
257 else
258 {
259 GrantedAccess = HandleEntry->GrantedAccess & ~ObpAccessProtectCloseBit;
260 }
261
262 /* FIXME: Get handle information for audit */
263
264 HandleInformation->GrantedAccess = GrantedAccess;
265
266 HandleInformation->HandleAttributes = HandleEntry->ObAttributes & OBJ_HANDLE_ATTRIBUTES;
267
268 /* Do granted and desired access match? */
270 {
271 /* FIXME: Audit access if required */
272
273 /* Reference the object directly since we have its header */
275
276 /* Unlock the handle */
279
280 *FileObject = (PFILE_OBJECT)&ObjectHeader->Body;
281
282 /* Return success */
284 return STATUS_SUCCESS;
285 }
286
287 /* No match, deny write access */
289
291 }
292 }
293 else
294 {
296 }
297
298 /* Return failure status */
300 return Status;
301}
LONG NTSTATUS
Definition: precomp.h:26
#define HandleToLong(h)
Definition: basetsd.h:74
#define STATUS_INVALID_HANDLE
Definition: d3dkmdt.h:40
#define STATUS_OBJECT_TYPE_MISMATCH
Definition: d3dkmdt.h:46
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define BooleanFlagOn(F, SF)
Definition: ext2fs.h:183
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:24
static XMS_HANDLE HandleTable[XMS_MAX_HANDLES]
Definition: himem.c:83
#define FLG_KERNEL_STACK_TRACE_DB
Definition: pstypes.h:63
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
#define KernelMode
Definition: asm.h:38
ULONG ACCESS_MASK
Definition: nt_native.h:40
#define NtCurrentProcess()
Definition: nt_native.h:1660
PHANDLE_TABLE_ENTRY NTAPI ExMapHandleToPointer(IN PHANDLE_TABLE HandleTable, IN HANDLE Handle)
Definition: handle.c:1046
VOID NTAPI ExUnlockHandleTableEntry(IN PHANDLE_TABLE HandleTable, IN PHANDLE_TABLE_ENTRY HandleTableEntry)
Definition: handle.c:923
ULONG NtGlobalFlag
Definition: init.c:54
NTSTATUS NTAPI IoComputeDesiredAccessFileObject(IN PFILE_OBJECT FileObject, IN PACCESS_MASK DesiredAccess)
Definition: util.c:26
#define OBJ_HANDLE_ATTRIBUTES
Definition: ob.h:52
PHANDLE_TABLE ObpKernelHandleTable
Definition: obhandle.c:20
#define ObpGetHandleObject(x)
Definition: ob.h:91
#define ObKernelHandleToHandle(Handle)
Definition: ob.h:83
#define STATUS_SUCCESS
Definition: shellext.h:65
Definition: extypes.h:767
ULONG GrantedAccess
Definition: extypes.h:777
ULONG_PTR ObAttributes
Definition: extypes.h:771
LONG_PTR PointerCount
Definition: obtypes.h:487
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
Definition: wdfdevice.h:550
#define NtCurrentThread()
Definition: winternl.h:5372
* PFILE_OBJECT
Definition: iotypes.h:1998
_In_ PEPROCESS _In_ KPROCESSOR_MODE AccessMode
Definition: mmfuncs.h:396
_In_ ACCESS_MASK _In_opt_ POBJECT_TYPE _In_ KPROCESSOR_MODE _Out_ PVOID _Out_opt_ POBJECT_HANDLE_INFORMATION HandleInformation
Definition: obfuncs.h:44
#define PsGetCurrentProcess
Definition: psfuncs.h:17
_In_ PSECURITY_SUBJECT_CONTEXT _In_ BOOLEAN _In_ ACCESS_MASK _In_ ACCESS_MASK _Outptr_opt_ PPRIVILEGE_SET _In_ PGENERIC_MAPPING _In_ KPROCESSOR_MODE _Out_ PACCESS_MASK GrantedAccess
Definition: sefuncs.h:20

Referenced by NtWriteFile().

◆ ObReferenceObjectByHandle()

NTSTATUS NTAPI ObReferenceObjectByHandle ( IN HANDLE  Handle,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_TYPE  ObjectType,
IN KPROCESSOR_MODE  AccessMode,
OUT PVOID Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation  OPTIONAL 
)

Definition at line 493 of file obref.c.

499{
500 PHANDLE_TABLE_ENTRY HandleEntry;
501 POBJECT_HEADER ObjectHeader;
504 PEPROCESS CurrentProcess;
506 PETHREAD CurrentThread;
508 PAGED_CODE();
509
510 /* Assume failure */
511 *Object = NULL;
512
513 /* Check if this is a special handle */
514 if (HandleToLong(Handle) < 0)
515 {
516 /* Check if this is the current process */
517 if (Handle == NtCurrentProcess())
518 {
519 /* Check if this is the right object type */
520 if ((ObjectType == PsProcessType) || !(ObjectType))
521 {
522 /* Get the current process and granted access */
523 CurrentProcess = PsGetCurrentProcess();
524 GrantedAccess = CurrentProcess->GrantedAccess;
525
526 /* Validate access */
527 /* ~GrantedAccess = RefusedAccess.*/
528 /* ~GrantedAccess & DesiredAccess = list of refused bits. */
529 /* !(~GrantedAccess & DesiredAccess) == TRUE means ALL requested rights are granted */
530 if ((AccessMode == KernelMode) ||
532 {
533 /* Check if the caller wanted handle information */
535 {
536 /* Return it */
537 HandleInformation->HandleAttributes = 0;
538 HandleInformation->GrantedAccess = GrantedAccess;
539 }
540
541 /* Reference ourselves */
542 ObjectHeader = OBJECT_TO_OBJECT_HEADER(CurrentProcess);
543 InterlockedExchangeAddSizeT(&ObjectHeader->PointerCount, 1);
544
545 /* Return the pointer */
546 *Object = CurrentProcess;
547 ASSERT(*Object != NULL);
549 }
550 else
551 {
552 /* Access denied */
554 }
555 }
556 else
557 {
558 /* The caller used this special handle value with a non-process type */
560 }
561
562 /* Return the status */
563 return Status;
564 }
565 else if (Handle == NtCurrentThread())
566 {
567 /* Check if this is the right object type */
568 if ((ObjectType == PsThreadType) || !(ObjectType))
569 {
570 /* Get the current process and granted access */
571 CurrentThread = PsGetCurrentThread();
572 GrantedAccess = CurrentThread->GrantedAccess;
573
574 /* Validate access */
575 /* ~GrantedAccess = RefusedAccess.*/
576 /* ~GrantedAccess & DesiredAccess = list of refused bits. */
577 /* !(~GrantedAccess & DesiredAccess) == TRUE means ALL requested rights are granted */
578 if ((AccessMode == KernelMode) ||
580 {
581 /* Check if the caller wanted handle information */
583 {
584 /* Return it */
585 HandleInformation->HandleAttributes = 0;
586 HandleInformation->GrantedAccess = GrantedAccess;
587 }
588
589 /* Reference ourselves */
590 ObjectHeader = OBJECT_TO_OBJECT_HEADER(CurrentThread);
591 InterlockedExchangeAddSizeT(&ObjectHeader->PointerCount, 1);
592
593 /* Return the pointer */
594 *Object = CurrentThread;
595 ASSERT(*Object != NULL);
597 }
598 else
599 {
600 /* Access denied */
602 }
603 }
604 else
605 {
606 /* The caller used this special handle value with a non-process type */
608 }
609
610 /* Return the status */
611 return Status;
612 }
613 else if (AccessMode == KernelMode)
614 {
615 /* Use the kernel handle table and get the actual handle value */
618 }
619 else
620 {
621 /* Invalid access, fail */
623 }
624 }
625 else
626 {
627 /* Otherwise use this process's handle table */
628 HandleTable = PsGetCurrentProcess()->ObjectTable;
629 }
630
631 /* Enter a critical region while we touch the handle table */
634
635 /* Get the handle entry */
637 if (HandleEntry)
638 {
639 /* Get the object header and validate the type*/
640 ObjectHeader = ObpGetHandleObject(HandleEntry);
641 if (!(ObjectType) || (ObjectType == ObjectHeader->Type))
642 {
643 /* Get the granted access and validate it */
644 GrantedAccess = HandleEntry->GrantedAccess;
645
646 /* Validate access */
647 /* ~GrantedAccess = RefusedAccess.*/
648 /* ~GrantedAccess & DesiredAccess = list of refused bits. */
649 /* !(~GrantedAccess & DesiredAccess) == TRUE means ALL requested rights are granted */
650 if ((AccessMode == KernelMode) ||
652 {
653 /* Reference the object directly since we have its header */
655
656 /* Mask out the internal attributes */
658
659 /* Check if the caller wants handle information */
661 {
662 /* Fill out the information */
663 HandleInformation->HandleAttributes = Attributes;
664 HandleInformation->GrantedAccess = GrantedAccess;
665 }
666
667 /* Return the pointer */
668 *Object = &ObjectHeader->Body;
669
670 /* Unlock the handle */
673
674 /* Return success */
675 ASSERT(*Object != NULL);
676 return STATUS_SUCCESS;
677 }
678 else
679 {
680 /* Requested access failed */
681 DPRINT("Rights not granted: %x\n", ~GrantedAccess & DesiredAccess);
683 }
684 }
685 else
686 {
687 /* Invalid object type */
689 }
690
691 /* Unlock the entry */
693 }
694 else
695 {
696 /* Invalid handle */
698 }
699
700 /* Return failure status */
702 *Object = NULL;
703 return Status;
704}
#define PAGED_CODE()
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
ObjectType
Definition: metafile.c:88
POBJECT_TYPE PsProcessType
Definition: process.c:20
POBJECT_TYPE PsThreadType
Definition: thread.c:20
#define DPRINT
Definition: sndvol32.h:73
POBJECT_TYPE Type
Definition: obtypes.h:493
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes

Referenced by _IRQL_requires_max_(), _Success_(), add_device(), AdvancedErrorChecks(), AfdAccept(), AfdEnumEvents(), AfdEventSelect(), AtaFdoCreatePortThread(), BasicBehaviorChecks(), BehaviorChecks(), BroadcastOpen(), CmGetSystemDriverList(), CmpConvertHandleToKernelHandle(), CmpCreateEvent(), CmpCreateRegistryRoot(), CmpIsHiveAlreadyLoaded(), CmpLinkHiveToMaster(), CompBattGetDeviceObjectPointer(), Control(), create_snapshot(), CreateGreenFdo(), CreateMixerPinAndSetFormat(), FxSystemThread::CreateThread(), DispTdiAssociateAddress(), DriverEntry(), duplicate_extents(), EngMapEvent(), ExCreateCallback(), ExpCreateWorkerThread(), ExpInitializeWorkerThreads(), ExpInitNls(), Ext2InvalidateVolumes(), FsRtlTest_OpenTestDirectory(), FsRtlTest_OpenTestFile(), GetObjectType(), IKsPin_PinMasterClock(), InitCsrApiPort(), InitThreadCallback(), IntCreateDesktop(), IntGdiAddFontResourceSingle(), IntInitWin32PowerManagement(), IntResolveDesktop(), IntValidateDesktopHandle(), IntValidateWindowStationHandle(), IntVerifyKeyboardFileHandle(), invalidate_volumes(), IoCreateDriver(), IopCreateEvent(), IopDeviceFsIoControl(), IopGetDeviceObjectPointer(), IopInitializeDriverModule(), IopMarkBootPartition(), IopOpenLinkOrRenameTarget(), KernelModeTest(), KmtStartThread(), KspEnableEvent(), LockHandles(), LpcpCopyRequestData(), MiCreateMemoryEvent(), MiQueryMemoryBasicInformation(), MiQueryMemorySectionName(), MmCreateArm3Section(), MmCreateSection(), MmLoadSystemImage(), MountMgrVolumeMountPointChanged(), Mx::MxReferenceObjectByHandle(), nfs41_DeleteConnection(), NtAdjustGroupsToken(), NtAdjustPrivilegesToken(), NtAlertResumeThread(), NtAlertThread(), NtAllocateVirtualMemory(), NtAssignProcessToJobObject(), NtCancelIoFile(), NtCancelTimer(), NtClearEvent(), NtCompareTokens(), NtCompleteConnectPort(), NtCreatePagingFile(), NtCreateProfile(), NtDebugActiveProcess(), NtDebugContinue(), NtDeleteKey(), NtDeleteValueKey(), NtDuplicateObject(), NtDuplicateToken(), NtEnumerateKey(), NtEnumerateValueKey(), NtExtendSection(), NtFilterToken(), NtFlushBuffersFile(), NtFlushInstructionCache(), NtFlushKey(), NtFlushVirtualMemory(), NtFreeVirtualMemory(), NtGetContextThread(), NtGetWriteWatch(), NtImpersonateAnonymousToken(), NtImpersonateClientOfPort(), NtImpersonateThread(), NtIsProcessInJob(), NtLoadKeyEx(), NtLockFile(), NtLockVirtualMemory(), NtMakePermanentObject(), NtMakeTemporaryObject(), NtMapViewOfSection(), NtNotifyChangeDirectoryFile(), NtOpenObjectAuditAlarm(), NtOpenThreadTokenEx(), NtPrivilegeCheck(), NtPrivilegedServiceAuditAlarm(), NtProtectVirtualMemory(), NtPulseEvent(), NtQueryDirectoryFile(), NtQueryDirectoryObject(), NtQueryEvent(), NtQueryInformationFile(), NtQueryInformationJobObject(), NtQueryInformationProcess(), NtQueryInformationThread(), NtQueryInformationToken(), NtQueryIoCompletion(), NtQueryKey(), NtQueryMutant(), NtQueryObject(), NtQueryOpenSubKeys(), NtQuerySection(), NtQuerySecurityObject(), NtQuerySemaphore(), NtQuerySymbolicLinkObject(), NtQueryTimer(), NtQueryValueKey(), NtQueryVolumeInformationFile(), NtQueueApcThreadEx(), NtReadFile(), NtReadVirtualMemory(), NtRegisterThreadTerminatePort(), NtReleaseMutant(), NtReleaseSemaphore(), NtRemoveIoCompletion(), NtRemoveProcessDebug(), NtReplyPort(), NtReplyWaitReceivePortEx(), NtRequestPort(), NtRequestWaitReplyPort(), NtResetEvent(), NtResetWriteWatch(), NtResumeProcess(), NtResumeThread(), NtSaveKeyEx(), NtSaveMergedKeys(), NtSecureConnectPort(), NtSetContextThread(), NtSetDefaultHardErrorPort(), NtSetEvent(), NtSetEventBoostPriority(), NtSetHighEventPair(), NtSetHighWaitLowEventPair(), NtSetInformationDebugObject(), NtSetInformationFile(), NtSetInformationJobObject(), NtSetInformationObject(), NtSetInformationProcess(), NtSetInformationThread(), NtSetInformationToken(), NtSetIoCompletion(), NtSetLowEventPair(), NtSetLowWaitHighEventPair(), NtSetSecurityObject(), NtSetTimer(), NtSetValueKey(), NtSetVolumeInformationFile(), NtSignalAndWaitForSingleObject(), NtStartProfile(), NtStopProfile(), NtSuspendProcess(), NtSuspendThread(), NtTerminateJobObject(), NtTerminateProcess(), NtTerminateThread(), NtUnloadKey2(), NtUnlockFile(), NtUnlockVirtualMemory(), NtUnmapViewOfSection(), NtUserConsoleControl(), NtUserGetGuiResources(), NtUserGetObjectInformation(), NtUserGetThreadDesktop(), NtUserProcessConnect(), NtUserQueryInformationThread(), NtUserResolveDesktop(), NtUserSetInformationThread(), NtUserWaitForInputIdle(), NtWaitForDebugEvent(), NtWaitForSingleObject(), NtWaitHighEventPair(), NtWaitLowEventPair(), NtWriteFile(), NtWriteVirtualMemory(), ObInitSystem(), ObpLookupObjectName(), ObSetDeviceMap(), ObSetDirectoryDeviceMap(), ObtCreateObjectTypes(), OpenDevice(), OpenInputDevice(), FxIoTargetRemote::OpenTargetHandle(), PageFileBehaviorChecks(), Pin_fnDeviceIoControl(), Pin_fnWrite(), PopAddRemoveSysCapsCallback(), PsAssignImpersonationToken(), PsLocateSystemDll(), PsOpenTokenOfProcess(), PspAssignPrimaryToken(), PspCreateProcess(), PspCreateThread(), PspInitPhase0(), PspSetPrimaryToken(), RegisterUncProvider(), send_subvol(), SepAccessCheck(), SepAccessCheckAndAuditAlarm(), SepOpenThreadToken(), START_TEST(), StartThread(), SystemProcessTest(), TdiOpenDevice(), TdiUnload(), TestEventConcurrent(), TestIoCreateFile(), TestObRootSecurity(), TestProviderInfo(), TestReference(), TestSharedCacheMap(), TestSymlinks(), TestTcpConnect(), UDFCommonDeviceControl(), UDFInvalidateVolumes(), UserSetProcessWindowStation(), VerifyEventWaitable(), VfatSetRenameInformation(), VfdCreateDevice(), VfdOpenImage(), ViMountImage(), WdmAudControlDeviceState(), WdmAudControlOpenMixer(), WdmAudFrameSize(), WdmAudOpenSysAudioDevices(), WdmAudReadWrite(), WdmAudResetStream(), and WskSocket().

◆ ObReferenceObjectByName()

NTSTATUS NTAPI ObReferenceObjectByName ( IN PUNICODE_STRING  ObjectPath,
IN ULONG  Attributes,
IN PACCESS_STATE  PassedAccessState,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_TYPE  ObjectType,
IN KPROCESSOR_MODE  AccessMode,
IN OUT PVOID  ParseContext,
OUT PVOID ObjectPtr 
)

Definition at line 408 of file obref.c.

416{
417 PVOID Object = NULL;
421 AUX_ACCESS_DATA AuxData;
423 PAGED_CODE();
424
425 /* Fail quickly */
426 if (!ObjectPath) return STATUS_OBJECT_NAME_INVALID;
427
428 /* Capture the name */
430 if (!NT_SUCCESS(Status)) return Status;
431
432 /* We also need a valid name after capture */
433 if (!ObjectName.Length) return STATUS_OBJECT_NAME_INVALID;
434
435 /* Check if we didn't get an access state */
437 {
438 /* Use our built-in access state */
441 &AuxData,
443 &ObjectType->TypeInfo.GenericMapping);
444 if (!NT_SUCCESS(Status)) goto Quickie;
445 }
446
447 /* Find the object */
448 *ObjectPtr = NULL;
450 &ObjectName,
454 ParseContext,
455 NULL,
456 NULL,
458 &Context,
459 &Object);
460
461 /* Cleanup after lookup */
463
464 /* Check if the lookup succeeded */
465 if (NT_SUCCESS(Status))
466 {
467 /* Check if access is allowed */
470 FALSE,
472 &Status))
473 {
474 /* Return the object */
475 *ObjectPtr = Object;
476 }
477 }
478
479 /* Free the access state */
481 {
483 }
484
485Quickie:
486 /* Free the captured name if we had one, and return status */
488 return Status;
489}
#define TRUE
Definition: types.h:120
VOID NTAPI SeDeleteAccessState(_In_ PACCESS_STATE AccessState)
Deletes an allocated access state from the memory.
Definition: access.c:150
NTSTATUS NTAPI SeCreateAccessState(_Out_ PACCESS_STATE AccessState, _Out_ __drv_aliasesMem PAUX_ACCESS_DATA AuxData, _In_ ACCESS_MASK Access, _In_ PGENERIC_MAPPING GenericMapping)
Creates an access state.
Definition: access.c:121
NTSTATUS NTAPI ObpCaptureObjectName(IN PUNICODE_STRING CapturedName, IN PUNICODE_STRING ObjectName, IN KPROCESSOR_MODE AccessMode, IN BOOLEAN AllocateFromLookaside)
BOOLEAN NTAPI ObpCheckObjectReference(IN PVOID Object, IN OUT PACCESS_STATE AccessState, IN BOOLEAN LockHeld, IN KPROCESSOR_MODE AccessMode, OUT PNTSTATUS AccessStatus)
Definition: obsecure.c:340
VOID NTAPI ObpFreeObjectNameBuffer(IN PUNICODE_STRING Name)
Definition: oblife.c:346
NTSTATUS NTAPI ObpLookupObjectName(IN HANDLE RootHandle OPTIONAL, IN OUT PUNICODE_STRING ObjectName, IN ULONG Attributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext, IN PSECURITY_QUALITY_OF_SERVICE SecurityQos OPTIONAL, IN PVOID InsertObject OPTIONAL, IN OUT PACCESS_STATE AccessState, OUT POBP_LOOKUP_CONTEXT LookupContext, OUT PVOID *FoundObject)
Definition: obname.c:446
FORCEINLINE VOID ObpReleaseLookupContext(IN POBP_LOOKUP_CONTEXT Context)
Releases an initialized object directory lookup context. Unlocks it if necessary, and dereferences th...
Definition: ob_x.h:323
_In_ PVOID Context
Definition: storport.h:2269
#define STATUS_OBJECT_NAME_INVALID
Definition: udferr_usr.h:148
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
_Inout_opt_ PACCESS_STATE PassedAccessState
Definition: obfuncs.h:71
_In_opt_ PVOID _In_opt_ PUNICODE_STRING _In_ PSECURITY_DESCRIPTOR _In_ PACCESS_STATE AccessState
Definition: sefuncs.h:417

Referenced by CreateClientPort(), IopGetDriverPathInformation(), IopUnloadDriver(), NtSecureConnectPort(), ObtClose(), PiAttachFilterDriversCallback(), and TestReference().

◆ ObReferenceObjectByPointer()

NTSTATUS NTAPI ObReferenceObjectByPointer ( IN PVOID  Object,
IN ACCESS_MASK  DesiredAccess,
IN POBJECT_TYPE  ObjectType,
IN KPROCESSOR_MODE  AccessMode 
)

Definition at line 380 of file obref.c.

384{
386
387 /* Get the header */
389
390 /*
391 * Validate object type if the call is for UserMode.
392 * NOTE: Unless it's a symbolic link (Caz Yokoyama [MSFT])
393 */
394 if ((Header->Type != ObjectType) && ((AccessMode != KernelMode) ||
396 {
397 /* Invalid type */
399 }
400
401 /* Increment the reference count and return success */
402 InterlockedIncrementSizeT(&Header->PointerCount);
403 return STATUS_SUCCESS;
404}
#define ObpSymbolicLinkObjectType
Definition: ObTypes.c:119

Referenced by CcRosInitializeFileCache(), ClassRetrieveDeviceRelations(), co_UserCreateWindowEx(), DriverEntry(), IoWMIQueryAllData(), MmPageOutPhysicalAddress(), ObOpenObjectByPointer(), ObpLookupObjectName(), ObpParseSymbolicLink(), RxpWorkerThreadDispatcher(), RxSpinUpRequestsDispatcher(), SepImpersonateAnonymousToken(), and TestReference().

◆ ObReferenceObjectEx()

LONG FASTCALL ObReferenceObjectEx ( IN PVOID  Object,
IN LONG  Count 
)

Definition at line 77 of file obref.c.

79{
80 /* Increment the reference count and return the count now */
82 PointerCount,
83 Count) + Count;
84}

Referenced by ObFastReferenceObject(), ObFastReplaceObject(), ObInitializeFastReference(), and PspCreateThread().

◆ ObReferenceObjectSafe()

BOOLEAN FASTCALL ObReferenceObjectSafe ( IN PVOID  Object)

Definition at line 22 of file obref.c.

23{
24 POBJECT_HEADER ObjectHeader;
25 LONG_PTR OldValue, NewValue;
26
27 /* Get the object header */
28 ObjectHeader = OBJECT_TO_OBJECT_HEADER(Object);
29
30 /* Get the current reference count and fail if it's zero */
31 OldValue = ObjectHeader->PointerCount;
32 if (!OldValue) return FALSE;
33
34 /* Start reference loop */
35 do
36 {
37 /* Increase the reference count */
38 NewValue = InterlockedCompareExchangeSizeT(&ObjectHeader->PointerCount,
39 OldValue + 1,
40 OldValue);
41 if (OldValue == NewValue) return TRUE;
42
43 /* Keep looping */
44 OldValue = NewValue;
45 } while (OldValue);
46
47 /* If we got here, then the reference count is now 0 */
48 return FALSE;
49}
#define InterlockedCompareExchangeSizeT(Destination, Exchange, Comperand)
Definition: ex.h:1556

Referenced by _Function_class_(), CmpFlushNotifiesOnKeyBodyList(), NtImpersonateClientOfPort(), NtRequestPort(), PsGetNextProcess(), PsGetNextProcessThread(), PsLookupProcessByProcessId(), PsLookupProcessThreadByCid(), PsLookupThreadByThreadId(), PspExitThread(), and SepCleanupLUIDDeviceMapDirectory().