NtOpenPrivateNamespace
NTSTATUS __stdcall NtOpenPrivateNamespace(
VOID **NamespaceHandle,
_ACCESS_MASK DesiredAccess,
_OBJECT_ATTRIBUTES *ObjectAttributes,
VOID *BoundaryDescriptor,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
char PreviousMode;
__int64 v11;
NTSTATUS result;
_KSPIN_LOCK *v13;
_ESERVERSILO_GLOBALS *CurrentServerSiloGlobals;
_ETHREAD *CurrentThread;
ULONG_PTR v16;
__int64 *v17;
_ADAPTER_OBJECT *v18;
NTSTATUS v19;
_KPROCESSOR_MODE AccessMode;
unsigned int Attributes;
PVOID P;
VOID *Handle;
P = 0i64;
Handle = 0i64;
PreviousMode = KeGetCurrentThread()->PreviousMode;
Attributes = 0;
if( PreviousMode )
{
v11 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)NamespaceHandle < 0x7FFFFFFF0000i64 )
v11 = (__int64)NamespaceHandle;
*(_QWORD *)v11 = *(_QWORD *)v11;
if( ObjectAttributes )
{
if( ((unsigned __int8)ObjectAttributes & 7) != 0 )
ExRaiseDatatypeMisalignment();
Attributes = ObjectAttributes->Attributes;
}
}
else if( ObjectAttributes )
{
Attributes = ObjectAttributes->Attributes;
}
result = (unsigned int)ObpCaptureBoundaryDescriptor(
(_KNOWN_CONTROLLER_TYPE)BoundaryDescriptor,
(_KNOWN_CONTROLLER_TYPE **)&P);
if( result >= 0 )
{
CurrentServerSiloGlobals = PsGetCurrentServerSiloGlobals(v13);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
v16 = (_DWORD)CurrentServerSiloGlobals + 720;
ExAcquirePushLockExclusiveEx(&CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable.Lock, 0i64);
v17 = ObpLookupNamespaceEntry(
(__int64)&CurrentServerSiloGlobals->ObSiloState.PrivateNamespaceLookupTable,
(__int64)P);
ExFreePoolWithTag(P, 0x534E624Fu);
if( v17 && (v18 = (_ADAPTER_OBJECT *)v17[2]) != 0i64 )
{
ObfReferenceObject(v18);
ExReleasePushLockEx(v16, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
LOBYTE(AccessMode) = PreviousMode;
v19 = ObOpenObjectByPointer(
v18,
Attributes & (PreviousMode != 0 ? 7666 : 73714),
0i64,
DesiredAccess,
DmaAdapter,
AccessMode,
&Handle);
LODWORD(P) = v19;
HalPutDmaAdapter(v18);
*NamespaceHandle = Handle;
return v19;
}
else
{
ExReleasePushLockEx(v16, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return -1073741766;
}
}
return result;
}Referenced by:
No references.