VfIrpLogRetrieveWmiData

NTSTATUS __stdcall VfIrpLogRetrieveWmiData(
        UINT64 SiloNumber,
        UINT8 *OutputBuffer,
        UINT64 *OffsetInstanceNameOffsets,
        UINT64 *InstanceCount,
        UINT64 *DataBlockOffset,
        UINT64 *TotalRequiredSize){
  __int64 v6; 
  unsigned __int16 *PoolWithTag; 
  int v10; 
  __int64 *v11; 
  __int64 *v12; 
  __int64 *v13; 
  __int64 v14; 
  UINT8 *v15; 
  UINT8 *v16; 
  NTSTATUS v17; 
  _OBJECT_NAME_INFORMATION *v18; 
  VOID *v19; 
  unsigned __int16 v20; 
  unsigned int v21; 
  __int64 v22; 
  UINT8 *v23; 
  int v24; 
  ULONG v25; 
  UINT8 *v26; 
  ULONG v27; 
  UINT8 *v28; 
  int v29; 
  __int64 *v30; 
  __int64 *v31; 
  __int64 **v32; 
  UINT8 *v33; 
  int v34; 
  unsigned int v35; 
  int v36; 
  UINT8 *v37; 
  UINT64 v38; 
  UINT64 ReturnLength; 
  ULONG Length[2]; 
  int v41; 
  __int64 *v42; 
  UINT8 *v43; 
  __int64 v44; 
  v6 = (unsigned int)SiloNumber;
  LODWORD(ReturnLength) = 0;
  *(_DWORD *)OffsetInstanceNameOffsets = 0;
  *(_DWORD *)InstanceCount = 0;
  *(_DWORD *)DataBlockOffset = 0;
  *(_DWORD *)TotalRequiredSize = 0;
  *(_QWORD *)Length = 16i64;
  PoolWithTag = (unsigned __int16 *)ExAllocatePoolWithTag(PagedPool, 0x10ui64, 0x74496656ui64);
  if( !PoolWithTag )
    return -1073741670;
  v44 = 3 * v6;
  v10 = 0;
  v11 = (__int64 *)(ViIrpLogDatabase + 8 + 24 * v6);
  v12 = (__int64 *)*v11;
  if( (__int64 *)*v11 != v11 )
  {
    v13 = (__int64 *)*v11;
    do
    {
      ++v10;
      v13 = (__int64 *)*v13;
    }
    while( v13 != v11 );
  }
  v42 = (__int64 *)(ViIrpLogDatabase + 8 + 24 * v6);
  v14 = (unsigned int)(8 * v10 + 60 + 4 * v10);
  v15 = &OutputBuffer[8 * v10 + 60];
  v16 = &OutputBuffer[v14];
  v41 = 8 * v10 + 60;
  v17 = 0;
  while( v12 != v11 )
  {
    v17 = ObQueryNameString((VOID *)*(v12 - 1), (_OBJECT_NAME_INFORMATION *)PoolWithTag, Length[0], &ReturnLength);
    if( v17 == -1073741820 )
    {
      ExFreePoolWithTag(PoolWithTag, 0);
      v18 = (_OBJECT_NAME_INFORMATION *)ExAllocatePoolWithTag(PagedPool, (unsigned int)ReturnLength, 0x74496656ui64);
      PoolWithTag = &v18->Name.Length;
      if( !v18 )
        return -1073741670;
      v19 = (VOID *)*(v12 - 1);
      Length[0] = ReturnLength;
      v17 = ObQueryNameString(v19, v18, (unsigned int)ReturnLength, &ReturnLength);
    }
    if( v17 < 0 )
      break;
    v20 = *PoolWithTag;
    if( *PoolWithTag )
    {
      if( OutputBuffer )
      {
        *(_DWORD *)v15 = v14;
        v20 = *PoolWithTag;
      }
      v21 = v20 + 18;
      v43 = v15 + 4;
      v22 = v21 >> 1;
      if( OutputBuffer )
        *(_WORD *)v16 = v21;
      v23 = v16 + 2;
      v24 = v14 + 2;
      if( OutputBuffer )
      {
        *(_OWORD *)v23 = *(_OWORD *)L"VERIFIER";
        memmove(v23 + 16, *((UINT8 **)PoolWithTag + 1), *PoolWithTag);
        *(_WORD *)&v23[2 * (unsigned int)(v22 - 1)] = 0;
      }
      v16 = &v23[2 * v22];
      LODWORD(v14) = v21 + v24;
      v15 = v43;
    }
    else
    {
      *((_DWORD *)v12 + 4) |= 2u;
    }
    v42 = (__int64 *)*v42;
    v12 = (__int64 *)*v42;
  }
  ExFreePoolWithTag(PoolWithTag, 0);
  if( v17 < 0 )
    return v17;
  v25 = (v14 + 7) & 0xFFFFFFF8;
  v26 = OutputBuffer;
  v27 = v25;
  v28 = &OutputBuffer[v25];
  Length[0] = v25;
  v29 = 0;
  v30 = (__int64 *)(ViIrpLogDatabase + 8 * (v44 + 1));
  v31 = (__int64 *)*v30;
  v32 = (__int64 **)v30;
  if( (__int64 *)*v30 != v30 )
  {
    v33 = OutputBuffer + 60;
    do
    {
      v34 = *((_DWORD *)v31 + 4);
      if( (v34 & 2) == 0 )
      {
        ++v29;
        if( (v34 & 1) != 0 )
          v35 = *((_DWORD *)v31 + 6);
        else
          v35 = *((_DWORD *)v31 + 7);
        v36 = 40 * v35;
        if( v26 )
        {
          *(_DWORD *)v33 = v25;
          *((_DWORD *)v33 + 1) = v36 + 8;
          v33 += 8;
          *(_DWORD *)v28 = *((_DWORD *)v31 + 5);
          *((_DWORD *)v28 + 1) = v35;
          v37 = v28 + 8;
          v38 = 40i64 * v35;
          memmove(v37, (UINT8 *)v31 + 32, v38);
          v26 = OutputBuffer;
          v28 = &v37[v38];
        }
        v31 = *v32;
        v25 += v36 + 8;
      }
      v32 = (__int64 **)v31;
      v31 = (__int64 *)*v31;
    }
    while( v31 != v30 );
    v27 = Length[0];
  }
  *(_DWORD *)OffsetInstanceNameOffsets = v41;
  *(_DWORD *)InstanceCount = v29;
  *(_DWORD *)DataBlockOffset = v27;
  *(_DWORD *)TotalRequiredSize = v25;
  return 0;
}

Referenced by:

ViDdiDispatchWmiQueryAllData