RegRtlDeleteTreeInternal

__int64 __fastcall RegRtlDeleteTreeInternal(char *a1, const WCHAR *a2, __int64 a3, char a4){
  unsigned int v4; 
  char *PoolWithTag; 
  unsigned int v8; 
  int v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  int v13; 
  int v14; 
  unsigned int v16; 
  HANDLE Handle; 
  unsigned __int64 HighLimit; 
  unsigned __int64 LowLimit; 
  v4 = 0;
  Handle = 0i64;
  v16 = 0;
  HighLimit = 0i64;
  PoolWithTag = 0i64;
  LowLimit = 0i64;
  v8 = 0;
  IoGetStackLimits(&LowLimit, &HighLimit);
  if( (unsigned __int64)&HighLimit - LowLimit < 0x400 )
  {
    v10 = -1073741670;
    goto LABEL_12;
  }
  v10 = RegRtlOpenKeyTransacted(a1, a2, 0, 0x3001Fu, &Handle, a3);
  if( v10 < 0 )
    goto LABEL_12;
  if( (unsigned int)RegRtlQueryInfoKey(Handle, 0i64, &v16, 0i64, 0i64, 0i64) )
  {
    LODWORD(v12) = 0;
  }
  else
  {
    v11 = v16;
    if( v16 )
    {
      if( v16 + 1 < v16 )
      {
        v10 = -1073741675;
        v11 = -1;
      }
      else
      {
        v10 = 0;
        v11 = v16 + 1;
      }
      if( v10 < 0 )
        goto LABEL_12;
    }
    v12 = 2i64 * v11;
    if( v12 > 0xFFFFFFFF )
    {
      v10 = -1073741675;
      goto LABEL_12;
    }
    v10 = 0;
  }
  if( (_DWORD)v12 )
  {
    PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, (unsigned int)v12, 0x4C474552ui64);
    if( !PoolWithTag )
    {
      v10 = -1073741801;
      goto LABEL_12;
    }
  }
  while( 1 )
  {
    while( 1 )
    {
      v16 = (unsigned int)v12 >> 1;
      v13 = RegRtlEnumKey(Handle, v4, PoolWithTag, &v16);
      if( v13 == -2147483622 || v13 == -1073741444 )
        break;
      if( v13 == -1073741789 )
      {
        v12 = 2i64 * v16;
        if( v12 > 0xFFFFFFFF )
        {
          v10 = -1073741675;
          goto LABEL_12;
        }
        v10 = 0;
        if( PoolWithTag )
          ExFreePoolWithTag(PoolWithTag, 0);
        PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, (unsigned int)v12, 0x4C474552ui64);
        if( !PoolWithTag )
        {
          v10 = -1073741801;
          break;
        }
      }
      else
      {
        if( v13 )
          break;
        *(_WORD *)&PoolWithTag[2 * ((unsigned __int64)(unsigned int)v12 >> 1) - 2] = 0;
        if( (unsigned int)RegRtlDeleteTreeInternal((char *)Handle, (const WCHAR *)PoolWithTag, a3, a4) )
          ++v4;
        else
          v4 = 0;
      }
    }
    if( v10 < 0 )
      goto LABEL_12;
    v14 = RegRtlDeleteKeyTransacted(a1, a2, a3);
    if( v14 != -1073741535 )
      break;
    if( v4 || v8 >= 0xA )
      goto LABEL_42;
    ++v8;
    v4 = 0;
  }
  if( v14 >= 0 )
    goto LABEL_12;
LABEL_42:
  v10 = v14;
LABEL_12:
  if( Handle )
    ZwClose(Handle);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return(unsigned int)v10;
}

Referenced by:

CmDeleteCommonClassRegKeyWorker
CmDeleteDeviceContainerRegKeyWorker
CmDeleteDeviceInterfaceRegKeyWorker
CmDeleteDevicePanelRegKeyWorker
CmDeleteDeviceRegKeyWorker
CmRemoveDeviceFromContainerWorker
CmRemovePanelDeviceWorker
DrvDbDeleteObjectSubKey
PiDevCfgConfigureDevice
PiDevCfgConfigureSoftwareDevices
PiDevCfgCopyDeviceKey
PiDevCfgFreeResolveContext
PiDevCfgInitResolveContext
PiDevCfgResetDeviceDriverSettings
PiDqDeleteUserObject
PipHardwareConfigActivateService
PnpCtxRegDeleteTree
PnpSetPropertyWorker
PpDevCfgProcessDeviceOperations
PpDevCfgProcessDeviceReset
RegRtlDeletePathInternal
RegRtlDeleteTreeInternal