VfSuspectDriversGetVerifierInformation

NTSTATUS __stdcall VfSuspectDriversGetVerifierInformation(
        PVOID SystemVerifierInformation,
        UINT64 SystemInformationLength,
        UINT64 *ReturnedLength,
        PVOID UserModeBuffer,
        UINT64 GetAdditionalCounters){
  char *v6; 
  unsigned int v7; 
  NTSTATUS v8; 
  _VF_SUSPECT_DRIVER_ENTRY *Flink; 
  _VF_SUSPECT_DRIVER_ENTRY *v10; 
  UINT64 Length; 
  __int64 *v12; 
  __int64 v13; 
  char v14; 
  int v15; 
  __int64 v16; 
  __int64 v17; 
  __int16 v18; 
  UINT8 *v19; 
  INT64 v21[2]; 
  __int64 v22[2]; 
  int v23; 
  int v24; 
  unsigned int v26; 
  _VF_SUSPECT_DRIVER_ENTRY *v27; 
  v26 = SystemInformationLength;
  v6 = (char *)SystemVerifierInformation;
  *(_DWORD *)ReturnedLength = 0;
  v7 = 0;
  v8 = 0;
  VfDriverLock((INT64)SystemVerifierInformation, SystemInformationLength, (INT64)ReturnedLength);
  Flink = VfSuspectDriversList;
  if( VfSuspectDriversList != (_VF_SUSPECT_DRIVER_ENTRY *)&VfSuspectDriversList )
  {
    while( 1 )
    {
      v10 = Flink;
      v6 += v7;
      v27 = Flink;
      Flink = (_VF_SUSPECT_DRIVER_ENTRY *)Flink->Links.Flink;
      Length = v10->BaseName.Length;
      v7 = (Length + ((_DWORD)GetAdditionalCounters != 0 ? 281 : 153)) & 0xFFFFFFF8;
      *(_DWORD *)ReturnedLength += v7;
      if( *(_DWORD *)ReturnedLength > v26 )
        break;
      *(_DWORD *)v6 = v7;
      v12 = &VfRuleClasses;
      *((_DWORD *)v6 + 1) = MmVerifierData;
      v13 = 2i64;
      do
      {
        *(_DWORD *)((char *)v12 + v6 - (char *)&VfRuleClasses + 8) = *(_DWORD *)v12;
        v12 = (__int64 *)((char *)v12 + 4);
        --v13;
      }
      while( v13 );
      v14 = VfClearanceFlag;
      *((_DWORD *)v6 + 4) = VfTriageContext;
      *((_DWORD *)v6 + 5) = ViVerifyAllDrivers & 1 | *((_DWORD *)v6 + 5) & 0xFFFFFFFC | (2 * (v14 & 1));
      *((_DWORD *)v6 + 10) = dword_140C2A624;
      *((_DWORD *)v6 + 11) = dword_140C2A628;
      *((_DWORD *)v6 + 23) = dword_140C2A658;
      *((_DWORD *)v6 + 12) = dword_140C2A62C;
      *((_DWORD *)v6 + 13) = dword_140C2A630;
      *((_DWORD *)v6 + 14) = dword_140C2A634;
      *((_DWORD *)v6 + 15) = dword_140C2A638;
      *((_DWORD *)v6 + 16) = dword_140C2A63C;
      *((_DWORD *)v6 + 17) = dword_140C2A640;
      *((_DWORD *)v6 + 18) = dword_140C2A644;
      *((_DWORD *)v6 + 19) = dword_140C2A648;
      *((_DWORD *)v6 + 20) = dword_140C2A64C;
      *((_DWORD *)v6 + 21) = v10->Loads;
      *((_DWORD *)v6 + 22) = v10->Unloads;
      if( v10->Loads <= v10->Unloads )
      {
        VfTargetDriversGetZeroCounters(v6, GetAdditionalCounters);
      }
      else
      {
        *(_OWORD *)v21 = 0i64;
        v24 = 0;
        VfTargetDriversGetZeroCounters(v6, GetAdditionalCounters);
        v22[0] = v16;
        v22[1] = (__int64)v6;
        v23 = GetAdditionalCounters;
        VfAvlInitializeLockContext((INT64)v21, (unsigned int)(v15 + 1));
        VfAvlEnumerateNodes(
          v17,
          (__int64)v21,
          (unsigned int(__fastcall *)(PVOID, __int64))ViTargetAddCountersCallback,
          (__int64)v22);
        VfAvlCleanupLockContext((INT64)v21);
        v18 = 2;
      }
      *((_WORD *)v6 + 12) = Length;
      *((_WORD *)v6 + 13) = v18 + Length;
      v19 = (UINT8 *)&v6[(_DWORD)GetAdditionalCounters != 0 ? 272 : 144];
      *((_QWORD *)v6 + 4) = v19;
      memmove(v19, (UINT8 *)v27->BaseName.Buffer, Length);
      *(_WORD *)(*((_QWORD *)v6 + 4) + 2 * (Length >> 1)) = 0;
      *((_QWORD *)v6 + 4) += (_BYTE *)UserModeBuffer - (_BYTE *)SystemVerifierInformation;
      if( Flink == (_VF_SUSPECT_DRIVER_ENTRY *)&VfSuspectDriversList )
        goto LABEL_11;
    }
    v8 = -1073741820;
  }
LABEL_11:
  ViDriversLoadLockOwner = 0i64;
  KeReleaseMutex(&ViDriversLoadLock, 0);
  if( v8 >= 0 )
    *(_DWORD *)v6 = 0;
  return v8;
}

Referenced by:

VfGetVerifierInformation