PfSnGetFileInformation
NTSTATUS __stdcall PfSnGetFileInformation(PFSN_TRACE_HEADER *Trace, _FILE_OBJECT *FileObject){
NTSTATUS v2;
void *FsContext;
UINT8 v4;
int v7;
PFSN_TRACE_HEADER *v8;
PFSN_TRACE_HEADER *v9;
unsigned __int64 v10;
__int64 v11;
unsigned __int64 v12;
int v14;
unsigned __int64 v15;
VOID **PoolWithTag;
UINT64 v17;
unsigned __int8 v18;
__int64 v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
unsigned __int64 v23;
__int64 v24;
UINT64 v25;
BOOL v26;
int v27;
UINT64 v28;
unsigned __int8 v29;
v2 = 0;
FsContext = FileObject->FsContext;
v4 = 0;
v7 = 0;
if( (FileObject->DeviceObject->Characteristics & 0x10) != 0 )
return -1073741637;
v8 = Trace + 122;
v9 = Trace + 130;
if( v8 >= v9 )
{
LABEL_5:
v10 = (unsigned __int64)(Trace + 130);
v29 = ExAcquireSpinLockShared((INT64 *)Trace + 72);
v11 = *((_QWORD *)Trace + 66);
v12 = *((_QWORD *)Trace + 65);
if( (v11 & 1) != 0 )
{
if( v12 )
v12 ^= v10;
else
v12 = 0i64;
}
v14 = v11 & 1;
while( v12 )
{
if( *(_QWORD *)(v12 + 24) > (unsigned __int64)FsContext )
{
v15 = *(_QWORD *)v12;
if( v14 && v15 )
{
v12 ^= v15;
continue;
}
}
else
{
if( *(_QWORD *)(v12 + 24) >= (unsigned __int64)FsContext )
break;
v15 = *(_QWORD *)(v12 + 8);
if( v14 && v15 )
{
v12 ^= v15;
continue;
}
}
v12 = v15;
}
ExReleaseSpinLockSharedFromDpcLevel(Trace + 144);
__writecr8(v29);
if( v12 )
{
*(_QWORD *)&Trace[2 * (++*((_BYTE *)Trace + 580) & 3) + 122] = FsContext;
return 0;
}
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x30ui64, 1850762051i64);
v17 = (UINT64)PoolWithTag;
if( !PoolWithTag )
{
if( (Trace[121] & 2) == 0 )
_InterlockedOr16((volatile signed __int16 *)Trace + 242, 2u);
return -1073741670;
}
*(_OWORD *)PoolWithTag = 0i64;
*((_OWORD *)PoolWithTag + 1) = 0i64;
*((_OWORD *)PoolWithTag + 2) = 0i64;
ObfReferenceObjectWithTag(FileObject, 0x746C6644ui64);
*(_QWORD *)(v17 + 40) = FileObject;
*(_QWORD *)(v17 + 24) = FsContext;
v18 = ExAcquireSpinLockExclusive((INT64 *)Trace + 72);
v19 = *((_QWORD *)Trace + 66);
v20 = *(_QWORD *)v10;
v21 = v18;
if( (v19 & 1) != 0 )
{
if( v20 )
v20 ^= v10;
else
v20 = 0i64;
}
v22 = v19 & 1;
if( !v20 )
{
LABEL_34:
if( !*((_QWORD *)Trace + 71) )
{
v4 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)Trace + 45);
if( !v4 )
{
v2 = -1073741431;
LABEL_30:
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)Trace + 72);
__writecr8(v21);
HalPutDmaAdapter(*(PADAPTER_OBJECT *)(v17 + 40));
ExFreePoolWithTag((PVOID)v17, 0);
return v2;
}
*((_QWORD *)Trace + 71) = Trace;
*((_QWORD *)Trace + 70) = PfSnNameQueryWorker;
v7 = 1;
*((_QWORD *)Trace + 68) = 0i64;
}
*(_QWORD *)(v17 + 32) = *((_QWORD *)Trace + 67);
*((_QWORD *)Trace + 67) = v17 + 32;
v24 = *((_QWORD *)Trace + 66);
v25 = *(_QWORD *)v10;
if( (v24 & 1) != 0 )
{
if( v25 )
v25 ^= v10;
else
v25 = 0i64;
}
v26 = 0;
v27 = v24 & 1;
if( v25 )
{
while( 1 )
{
if( *(_QWORD *)(v25 + 24) > (unsigned __int64)FsContext )
{
v28 = *(_QWORD *)v25;
if( v27 )
{
if( !v28 )
break;
v28 ^= v25;
}
if( !v28 )
break;
}
else
{
v28 = *(_QWORD *)(v25 + 8);
if( v27 )
{
if( !v28 )
goto LABEL_57;
v28 ^= v25;
}
if( !v28 )
{
LABEL_57:
v26 = 1;
break;
}
}
v25 = v28;
}
}
RtlRbInsertNodeEx((UINT64 *)Trace + 65, v25, v26, v17);
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)Trace + 72);
__writecr8(v21);
if( v7 )
{
v4 = 0;
ExQueueWorkItem((PWORK_QUEUE_ITEM)Trace + 17, DelayedWorkQueue);
}
*(_QWORD *)&Trace[2 * (++*((_BYTE *)Trace + 580) & 3) + 122] = FsContext;
if( v4 )
ExReleaseRundownProtection((_EX_RUNDOWN_REF *)Trace + 45);
return 0;
}
while( 1 )
{
if( *(_QWORD *)(v20 + 24) > (unsigned __int64)FsContext )
{
v23 = *(_QWORD *)v20;
if( v22 && v23 )
{
v20 ^= v23;
goto LABEL_33;
}
}
else
{
if( *(_QWORD *)(v20 + 24) >= (unsigned __int64)FsContext )
goto LABEL_30;
v23 = *(_QWORD *)(v20 + 8);
if( v22 && v23 )
{
v20 ^= v23;
goto LABEL_33;
}
}
v20 = v23;
LABEL_33:
if( !v20 )
goto LABEL_34;
}
}
while( *(void **)v8 != FsContext )
{
v8 += 2;
if( v8 >= v9 )
goto LABEL_5;
}
return 0;
}Referenced by:
MiCompleteProtoPteFault
PfSnLogPageFaultCommon