PiCMEnumerateSubKeys

VOID __fastcall PiCMEnumerateSubKeys(
        VOID *IoctlInputBuffer,
        UINT64 IoctlInputBufferSize,
        VOID *IoctlOutputBuffer,
        UINT64 IoctlOutputBufferSize){
  UINT64 *BytesUsed; 
  unsigned int v5; 
  char *PoolWithTag; 
  __int64 v8; 
  unsigned int v9; 
  int v10; 
  int CachedContextBaseKey; 
  unsigned int v12; 
  unsigned int v13; 
  int v14; 
  int v15; 
  UINT64 v16; 
  UINT64 ExpectedOutputSize; 
  UINT64 IoctlOutputBufferSizea; 
  HANDLE KeyHandle; 
  INT64 v20[2]; 
  UINT64 v21; 
  unsigned int v22; 
  UINT64 *v23; 
  BytesUsed = v23;
  KeyHandle = 0i64;
  v5 = IoctlOutputBufferSize;
  v22 = 0;
  LODWORD(v23) = 0;
  *(_DWORD *)BytesUsed = 0;
  *(_OWORD *)v20 = 0i64;
  LODWORD(v21) = 0;
  PoolWithTag = 0i64;
  if( (int)PiCMCaptureEnumerateInputData(
              (UINT64)IoctlInputBuffer,
              IoctlInputBufferSize,
              (INT64)IoctlOutputBuffer,
              (INT64)v20) >= 0 )
  {
    if( HIDWORD(v20[0]) )
    {
LABEL_3:
      v8 = 3221225485i64;
      goto LABEL_4;
    }
    if( IoctlOutputBuffer && v5 >= 0x14 )
    {
      v9 = v5 - 20;
      if( v5 - 20 < 2 )
        goto LABEL_3;
      PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, v9, 0x34706E50ui64);
      if( !PoolWithTag )
      {
        v8 = 3221225626i64;
        goto LABEL_4;
      }
      v22 = v9 >> 1;
      switch( LODWORD(v20[1]) )
      {
        case 1:
          v10 = 5;
          break;
        case 2:
          v10 = 7;
          break;
        case 3:
          v10 = 8;
          break;
        default:
          goto LABEL_3;
      }
      CachedContextBaseKey = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, v10, (__int64 *)&KeyHandle);
      v8 = (unsigned int)CachedContextBaseKey;
      if( CachedContextBaseKey < 0 )
        goto LABEL_4;
      v12 = HIDWORD(v20[1]);
      v13 = RegRtlEnumKey(KeyHandle, HIDWORD(v20[1]), PoolWithTag, &v22);
      v8 = v13;
      if( v13 == -2147483622 )
      {
        if( LODWORD(v20[1]) != 3 )
          goto LABEL_4;
        if( !CmIsStateSeparationEnabled() )
          goto LABEL_4;
        v14 = PnpCtxRegQueryInfoKey(v8, KeyHandle, &v23, 0i64, 0i64, 0i64, 0i64);
        v8 = (unsigned int)v14;
        if( v14 < 0 )
          goto LABEL_4;
        if( v12 < (unsigned int)v23 )
        {
          v8 = 3221225701i64;
          goto LABEL_4;
        }
        v15 = PnpCtxGetCachedContextBaseKey(PiPnpRtlCtx, 9, (__int64 *)&KeyHandle);
        v8 = (unsigned int)v15;
        if( v15 < 0 )
          goto LABEL_4;
        v8 = (unsigned int)RegRtlEnumKey(KeyHandle, v12 - (unsigned int)v23, PoolWithTag, &v22);
      }
    }
    else
    {
      v8 = 3221225485i64;
    }
    if( (int)v8 >= 0 )
    {
      LODWORD(IoctlOutputBufferSizea) = v5;
      LODWORD(ExpectedOutputSize) = v21;
      LODWORD(v16) = 2 * v22;
      PiCMReturnBufferResultData(
        v8,
        2 * v22,
        0i64,
        (UINT8 *)PoolWithTag,
        v16,
        ExpectedOutputSize,
        IoctlOutputBuffer,
        IoctlOutputBufferSizea,
        BytesUsed);
LABEL_5:
      if( PoolWithTag )
        ExFreePoolWithTag(PoolWithTag, 0x34706E50u);
      return;
    }
LABEL_4:
    LODWORD(IoctlOutputBufferSizea) = v5;
    LODWORD(ExpectedOutputSize) = v21;
    LODWORD(v16) = 0;
    PiCMReturnBufferResultData(
      v8,
      2 * v22,
      0i64,
      0i64,
      v16,
      ExpectedOutputSize,
      IoctlOutputBuffer,
      IoctlOutputBufferSizea,
      BytesUsed);
    goto LABEL_5;
  }
}

Referenced by:

No references.