CmFcManagerQueryFeatureConfigurationSectionInformation
INT64 __fastcall CmFcManagerQueryFeatureConfigurationSectionInformation(INT64 a1, _QWORD *a2, INT64 *a3, INT8 a4){
_ETHREAD *CurrentThread;
INT64 v8;
INT64 *v9;
NTSTATUS v10;
unsigned int v11;
__int64 v12;
PVOID *v13;
unsigned int i;
__int128 *v15;
INT64 *v16;
__int64 v17;
PVOID *v18;
PADAPTER_OBJECT *v19;
__int128 v21;
__int64 v22;
INT64 result;
char v24;
char v25;
v22 = 0i64;
v21 = 0i64;
memset((INT64)&result, 0i64);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&RunOnce, 0i64);
v8 = qword_140C47E98;
v9 = &qword_140C47EA8;
v10 = 0;
v11 = 0;
v12 = 3i64;
do
{
if( *a2 < (unsigned __int64)*v9 )
CmFcpCopySectionState((INT64)(&result + 3 * v11), (INT64)(&CmFcSystemManager + 12 * v11 + 20));
++v11;
++a2;
v9 += 3;
}
while( v11 < 3 );
if( _InterlockedCompareExchange64((volatile signed __int64 *)&RunOnce, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&RunOnce);
KeAbPostRelease(&RunOnce);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
v13 = (PVOID *)&v24;
for( i = 0; i < 3; ++i )
{
if( *v13 )
{
v10 = ObOpenObjectByPointer(*v13, a4 == 0 ? 0x200 : 0, 0i64, 4u, MmSectionObjectType, a4, (PHANDLE)&v21 + i);
if( v10 < 0 )
goto LABEL_12;
v10 = 0;
}
v13 += 3;
}
memset((INT64)a3, 0i64);
*a3 = v8;
v15 = &v21;
v16 = a3 + 3;
v17 = 3i64;
do
{
*(v16 - 2) = *(INT64 *)((char *)v16 + (char *)&result - (char *)a3 - 24);
*v16 = *(INT64 *)((char *)v16 + &v25 - (char *)a3 - 24);
v16 += 3;
*(v16 - 4) = *(_QWORD *)v15;
*(_QWORD *)v15 = 0i64;
v15 = (__int128 *)((char *)v15 + 8);
--v17;
}
while( v17 );
LABEL_12:
v18 = (PVOID *)&v21;
v19 = (PADAPTER_OBJECT *)&v24;
do
{
if( *v19 )
HalPutDmaAdapter(*v19);
if( *v18 )
ObCloseHandle(*v18, a4);
v19 += 3;
++v18;
--v12;
}
while( v12 );
return(unsigned int)v10;
}Referenced by:
CmQueryFeatureConfigurationSections