ExpCovQueryInformation

__int64 __fastcall ExpCovQueryInformation(unsigned __int64 a1, unsigned int a2, unsigned int *a3){
  unsigned int *v3; 
  UINT64 v4; 
  VOID **PoolWithTag; 
  unsigned __int64 v8; 
  int v9; 
  _ETHREAD *CurrentThread; 
  unsigned int Buffer; 
  VOID **v12; 
  int v13; 
  __int64 v14; 
  VOID *v15; 
  __int64 v16; 
  __int64 *v17; 
  size_t v18; 
  unsigned int v19; 
  unsigned int v20; 
  VOID *v21; 
  _COVERAGE_REQUEST_CODES RequestType; 
  int v23; 
  unsigned __int64 v24; 
  VOID **v25; 
  unsigned int *v26; 
  unsigned int v27; 
  VOID *v28; 
  _UNICODE_STRING ModuleName; 
  _UNICODE_STRING *v30; 
  unsigned __int64 v31; 
  _UNICODE_STRING v32[4]; 
  _OWORD ModuleRequestInfo[4]; 
  UINT8 MD5Hash[16]; 

  v3 = a3;
  v26 = a3;
  v4 = a2;
  v27 = a2;
  v31 = a1;
  memset(v32, 0i64, sizeof(v32));
  ModuleName = 0i64;
  RequestType = CoverageAllModules;
  v24 = 0i64;
  PoolWithTag = 0i64;
  v25 = 0i64;
  LODWORD(v32[3].Buffer) = 64;
  LODWORD(v32[0].Buffer) = v4;
  if( !ExCovMaxPagedPoolToUse )
    return 3221225506i64;
  if( v3 )
    *v3 = 64;
  if( (unsigned int)v4 < 0x40 )
    return 3221225476i64;
  v24 = a1 + 32;
  v8 = a1;
  if( a1 >= 0x7FFFFFFF0000i64 )
    v8 = 0x7FFFFFFF0000i64;
  ModuleRequestInfo[0] = *(_OWORD *)v8;
  ModuleRequestInfo[1] = *(_OWORD *)(v8 + 16);
  ModuleRequestInfo[2] = *(_OWORD *)(v8 + 32);
  ModuleRequestInfo[3] = *(_OWORD *)(v8 + 48);
  BYTE4(v32[0].Buffer) = LODWORD(ModuleRequestInfo[0]) == 1;
  v9 = ExpCovReadRequestBuffer(
         (_COVERAGE_MODULE_REQUEST *)((char *)ModuleRequestInfo + 8),
         &ModuleName,
         MD5Hash,
         &RequestType);
  if( v9 >= 0 )
  {
    *(_DWORD *)&v32[3].Length = RequestType;
    v32[2] = *(_UNICODE_STRING *)MD5Hash;
    if( !ModuleName.Buffer || (v9 = RtlDuplicateUnicodeString(1ui64, &ModuleName, &v32[1]), v9 >= 0) )
    {
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v4, 1920364355i64);
      v25 = PoolWithTag;
      *(_QWORD *)&v32[0].Length = PoolWithTag;
      if( !PoolWithTag )
      {
        v9 = -1073741670;
        goto LABEL_52;
      }
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      v9 = MmEnumerateSystemImages((__int64(__fastcall *)(INT64 *, __int64))ExpCovQueryInfoCallBack, (__int64)v32);
      if( v9 < 0 )
      {
        KeLeaveCriticalRegionThread(KeGetCurrentThread());
        goto LABEL_52;
      }
      ExpCovQueryHypervisorInformation((INT64 *)v32);
      Buffer = (unsigned int)v32[3].Buffer;
      v23 = *(_DWORD *)(&v32[3].MaximumLength + 1);
      if( (unsigned int)v4 >= LODWORD(v32[3].Buffer)
        && (unsigned int)((__int64)(*(_QWORD *)&v32[0].Length - (_QWORD)PoolWithTag) >> 5) )
      {
        v12 = PoolWithTag;
        v13 = *(_DWORD *)(&v32[3].MaximumLength + 1);
        v14 = v24;
        while( v13 )
        {
          v15 = (VOID *)(*((unsigned int *)v12 + 6) + v14 + 32);
          *(_DWORD *)v14 = *(_DWORD *)v12;
          *(_DWORD *)(v14 + 4) = *((_DWORD *)v12 + 1);
          *(_DWORD *)(v14 + 24) = *((_DWORD *)v12 + 6);
          memmove((VOID *)(v14 + 28), (char *)v12 + 28, *((_DWORD *)v12 + 6));
          *(_WORD *)(v14 + 8) = *((_WORD *)v12 + 4);
          *(_WORD *)(v14 + 10) = *((_WORD *)v12 + 5);
          *(_QWORD *)(v14 + 16) = v15;
          memmove(v15, v12[2], *((unsigned __int16 *)v12 + 4));
          v16 = *(unsigned int *)v12;
          v14 += v16;
          v24 = v14;
          v12 = (VOID **)((char *)v12 + v16);
          v13 = --*(_DWORD *)(&v32[3].MaximumLength + 1);
        }
      }
      else
      {
        if( (unsigned int)v4 < LODWORD(v32[3].Buffer) )
          v9 = -1073741820;
        v14 = v24;
      }
      if( LODWORD(ModuleRequestInfo[0]) == 1 )
        ExfAcquirePushLockExclusive((UINT64 *)&WheapDeferredInternalLogsEventLock + 86);
      else
        ExfAcquirePushLockShared((_EX_PUSH_LOCK *)&WheapDeferredInternalLogsEventLock + 86);
      v17 = (__int64 *)*(&WheapDeferredInternalLogsEventLock + 84);
      while( 1 )
      {
        while( 1 )
        {
          if( v17 == (__int64 *)((char *)&WheapDeferredInternalLogsEventLock + 672) )
          {
            ExfReleasePushLock((_EX_PUSH_LOCK *)&WheapDeferredInternalLogsEventLock + 86);
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
            if( v3 )
              *v3 = Buffer;
            *(_DWORD *)(v31 + 4) = v23;
            goto LABEL_52;
          }
          v30 = (_UNICODE_STRING *)v17;
          v28 = (VOID *)v17[7];
          if( v28 )
          {
            if( ExpCovIsUnLoadedModulePresent(
                   (_COVERAGE_UNLOADED_MODULE_ENTRY *)v17,
                   RequestType,
                   &ModuleName,
                   MD5Hash) )
            {
              break;
            }
          }
LABEL_31:
          v17 = (__int64 *)*v17;
        }
        v18 = *((_DWORD *)v17 + 12);
        if( LODWORD(ModuleRequestInfo[0]) != 1 )
          v18 -= *((_DWORD *)v28 + 7);
        if( v18 < 0xFFFFFFE0 )
        {
          v19 = *((unsigned __int16 *)v17 + 16) + v18 + 32;
          if( v19 < 0x20 )
            v19 = -1;
        }
        else
        {
          v19 = -1;
        }
        v20 = v19 + Buffer;
        if( v19 + Buffer >= Buffer )
        {
          Buffer += v19;
          if( v27 >= v20 )
          {
            v28 = (VOID *)(v18 + v14 + 32);
            *(_DWORD *)v14 = v19;
            *(_DWORD *)(v14 + 4) = 0;
            *(_DWORD *)(v14 + 24) = v18;
            memmove((VOID *)(v14 + 28), (const VOID *)v17[7], v18);
            *(_WORD *)(v14 + 8) = *((_WORD *)v17 + 16);
            *(_WORD *)(v14 + 10) = *((_WORD *)v17 + 16);
            v21 = v28;
            *(_QWORD *)(v14 + 16) = v28;
            memmove(v21, (const VOID *)v17[5], *((unsigned __int16 *)v17 + 16));
            v14 += v19;
            v24 = v14;
            if( LODWORD(ModuleRequestInfo[0]) == 1 )
            {
              v17 = (__int64 *)v17[1];
              ExpCovDeleteUnloadedModuleEntry(v30);
            }
            v3 = v26;
          }
          else
          {
            v3 = v26;
            if( v26 )
              *v26 = v20;
            v9 = -1073741820;
          }
          ++v23;
          goto LABEL_31;
        }
        DbgPrintEx(0x7Eu, 2u, "COV: Overflow when calculating total required length for %wZ\n", v17 + 4);
        v17 = (__int64 *)*v17;
        v3 = v26;
      }
    }
  }
LABEL_52:
  if( ModuleName.Buffer )
    RtlFreeAnsiString(&ModuleName);
  if( v32[1].Buffer )
    RtlFreeAnsiString(&v32[1]);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0x72766F43u);
  return(unsigned int)v9;
}

Referenced by:

ExpQuerySystemInformation