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