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