ObpMarkDirectoryObjectsTemporary
NTSTATUS __stdcall ObpMarkDirectoryObjectsTemporary(PADAPTER_OBJECT DmaAdapter){
__int64 v2;
PADAPTER_OBJECT v3;
PADAPTER_OBJECT v4;
_QWORD *v5;
_QWORD *p_Version;
NTSTATUS result;
struct _DMA_ADAPTER *v8;
char v9;
struct _DMA_ADAPTER *v10;
char *v11;
_ETHREAD *CurrentThread;
_OBJECT_TYPE *v13;
_QWORD *v14;
_ETHREAD *v15;
__int64 v16;
ULONG_PTR BugCheckParameter2;
_QWORD *v18;
_OBP_LOOKUP_CONTEXT v19[2];
struct _DMA_ADAPTER *DmaAdaptera;
PADAPTER_OBJECT v21;
PADAPTER_OBJECT v22;
v19[0].LockStateSignature = -60876;
*(&v19[0].LockStateSignature + 1) = 0;
memset(v19, 0, 32);
ObpLockDirectoryExclusive(v19, (_OBJECT_DIRECTORY *)DmaAdapter);
v2 = 37i64;
v22 = DmaAdapter;
v16 = 37i64;
v3 = DmaAdapter;
v4 = DmaAdapter;
v21 = DmaAdapter;
do
{
v5 = *(_QWORD **)&v3->Version;
p_Version = &v4->Version;
if( *(_QWORD *)&v3->Version )
{
do
{
v8 = (struct _DMA_ADAPTER *)v5[1];
v9 = 0;
v18 = p_Version;
DmaAdaptera = v8;
v10 = v8 - 3;
if( (BYTE2(v8[-2].DmaOperations) & 2) != 0 )
v11 = (char *)v10 - *((unsigned __int8 *)ObpInfoMaskToOffset + (BYTE2(v8[-2].DmaOperations) & 3));
else
v11 = 0i64;
ObfReferenceObject(v8);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
BugCheckParameter2 = (ULONG_PTR)&v10[1];
ExAcquirePushLockExclusiveEx((UINT64)&v10[1], 0i64);
BYTE3(v10[1].DmaOperations) &= ~0x10u;
if( !v10->DmaOperations && !*((_DWORD *)v11 + 6) )
{
v13 = (_OBJECT_TYPE *)ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ LOBYTE(v10[1].DmaOperations) ^ (unsigned __int64)BYTE1(v10)];
if( v13 == ObpSymbolicLinkObjectType )
ObpDeleteSymbolicLinkName((__int64)&v10[3]);
v14 = v5;
*p_Version = *v5;
v5 = (_QWORD *)*v5;
if( v13 == ObpDirectoryObjectType )
{
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
ExAcquirePushLockExclusiveEx((UINT64)&ObpPendingObjectDirectoryListLock, 0i64);
*v14 = ObpPendingObjectDirectoryList;
ObpPendingObjectDirectoryList = v14;
ExReleasePushLockEx((UINT64)&ObpPendingObjectDirectoryListLock, 0i64);
KeLeaveCriticalRegion();
}
else
{
HalPutDmaAdapter(DmaAdaptera);
ExFreePoolWithTag(v14, 0);
}
*(_QWORD *)v11 = 0i64;
HalPutDmaAdapter(DmaAdapter);
v9 = 1;
}
p_Version = v5;
ExReleasePushLockEx(BugCheckParameter2, 0i64);
KeLeaveCriticalRegion();
HalPutDmaAdapter(DmaAdaptera);
if( !v9 )
v5 = (_QWORD *)*v5;
if( v9 )
p_Version = v18;
}
while( v5 );
v3 = v22;
v4 = v21;
v2 = v16;
}
v4 = (PADAPTER_OBJECT)((char *)v4 + 8);
v3 = (PADAPTER_OBJECT)((char *)v3 + 8);
--v2;
v21 = v4;
v16 = v2;
v22 = v3;
}
while( v2 );
ObpUnlockDirectory((INT64)DmaAdapter, (INT64)v19);
return result;
}Referenced by:
ObpMarkDirectoryTreeTemporary