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