RtlpQueryRegistryDirect
NTSTATUS __stdcall RtlpQueryRegistryDirect(UINT64 ValueType, PVOID ValueData, UINT64 ValueLength, PVOID Destination){
unsigned __int16 v4;
int v7;
UINT8 *v8;
unsigned __int64 v10;
UINT8 *StringRoutine;
UINT64 v12;
v4 = ValueLength;
v7 = ValueType;
if( (unsigned int)(ValueType - 1) > 1 && (_DWORD)ValueType != 7 )
{
if( (unsigned int)ValueLength <= 4 )
{
if( Destination == ValueData || !(_DWORD)ValueLength )
return 0;
goto LABEL_6;
}
v10 = *(unsigned int *)Destination;
if( (v10 & 0x80000000) == 0i64 )
{
ValueLength = (unsigned int)ValueLength;
if( v10 >= (unsigned __int64)(unsigned int)ValueLength + 8 )
{
*(_DWORD *)Destination = ValueLength;
v8 = (UINT8 *)Destination + 8;
*((_DWORD *)Destination + 1) = v7;
goto LABEL_7;
}
}
else if( -(int)v10 >= (unsigned int)ValueLength )
{
LABEL_6:
ValueLength = (unsigned int)ValueLength;
v8 = (UINT8 *)Destination;
LABEL_7:
memmove(v8, (UINT8 *)ValueData, ValueLength);
return 0;
}
return -1073741789;
}
if( (unsigned int)ValueLength > 0xFFFE )
v4 = -2;
StringRoutine = (UINT8 *)*((_QWORD *)Destination + 1);
if( StringRoutine )
{
if( v4 > *((_WORD *)Destination + 1) )
return -1073741789;
v12 = v4;
LABEL_17:
memmove(StringRoutine, (UINT8 *)ValueData, v12);
*(_WORD *)Destination = v4 - 2;
return 0;
}
v12 = v4;
StringRoutine = (UINT8 *)ExpAllocateStringRoutine(v4);
*((_QWORD *)Destination + 1) = StringRoutine;
if( StringRoutine )
{
*((_WORD *)Destination + 1) = v4;
goto LABEL_17;
}
return -1073741801;
}Referenced by:
RtlpCallQueryRegistryRoutine