RegRtlEnumKeyWithCallback

__int64 __fastcall RegRtlEnumKeyWithCallback(HANDLE KeyHandle, __int64 a2, __int64 a3){
  int v3; 
  void *v5; 
  unsigned int v7; 
  unsigned __int64 v8; 
  char *v9; 
  unsigned int v10; 
  int v11; 
  int v12; 
  VOID *PoolWithTag; 
  VOID *v15; 
  unsigned int v16; 
  unsigned __int64 HighLimit; 
  UINT64 LowLimit[2]; 
  char v19; 
  v3 = 0;
  v16 = 0;
  HighLimit = 0i64;
  v5 = 0i64;
  LowLimit[0] = 0i64;
  IoGetStackLimits(LowLimit, &HighLimit);
  if( (unsigned __int64)&LowLimit[-1] - LowLimit[0] < 0x400 )
    return(unsigned int)-1073741670;
  if( (unsigned int)RegRtlQueryInfoKey(KeyHandle, 0i64, &v16, 0i64, 0i64, 0i64) )
  {
    LODWORD(v8) = 0;
  }
  else
  {
    v7 = v16;
    if( v16 )
    {
      if( v16 + 1 < v16 )
      {
        v3 = -1073741675;
        v7 = -1;
      }
      else
      {
        v7 = v16 + 1;
      }
      if( v3 < 0 )
        return(unsigned int)v3;
      v3 = 0;
    }
    v8 = 2i64 * v7;
    if( v8 > 0xFFFFFFFF )
      return(unsigned int)-1073741675;
  }
  if( (unsigned int)v8 > 0x50 )
  {
    PoolWithTag = ExAllocatePoolWithTag(PagedPool, (unsigned int)v8, 0x4C474552ui64);
    v5 = PoolWithTag;
    if( !PoolWithTag )
      return(unsigned int)-1073741801;
    v9 = (char *)PoolWithTag;
  }
  else
  {
    v9 = &v19;
    LODWORD(v8) = 80;
  }
  v10 = 0;
  while( 1 )
  {
    v16 = (unsigned int)v8 >> 1;
    v11 = RegRtlEnumKey(KeyHandle, v10, v9, &v16);
    if( v11 == -2147483622 )
      break;
    if( v11 == -1073741444 )
    {
      v3 = 0;
      break;
    }
    if( v11 == -1073741789 )
    {
      v8 = 2i64 * v16;
      if( v8 > 0xFFFFFFFF )
      {
        v3 = -1073741675;
        break;
      }
      v3 = 0;
      if( v5 )
        ExFreePoolWithTag(v5, 0);
      v15 = ExAllocatePoolWithTag(PagedPool, (unsigned int)v8, 0x4C474552ui64);
      v5 = v15;
      if( !v15 )
        return(unsigned int)-1073741801;
      v9 = (char *)v15;
    }
    else
    {
      v3 = 0;
      if( v11 )
      {
        v3 = v11;
        break;
      }
      *(_WORD *)&v9[2 * ((unsigned __int64)(unsigned int)v8 >> 1) - 2] = 0;
      v12 = SysCtxInternalEnumSubkeyCallback((__int64)KeyHandle, (__int64)v9, a3);
      if( v12 )
      {
        if( v12 == 1 )
        {
          v10 = 0;
        }
        else if( v12 != 2 )
        {
          if( v12 == 3 )
            v3 = -1073741248;
          else
            v3 = -1073741595;
          break;
        }
      }
      else
      {
        ++v10;
      }
      if( v12 == 2 )
        break;
    }
  }
  if( v5 )
    ExFreePoolWithTag(v5, 0);
  return(unsigned int)v3;
}

Referenced by:

PnpCtxRegEnumKeyWithCallback