PiDevCfgResolveMultiSzValue
INT64 __stdcall PiDevCfgResolveMultiSzValue(
UINT64 ValueType,
UINT64 ValueSize,
PVOID ValueData,
UINT64 ValueModifiers,
PVOID KeyHandle,
WCHAR *ValueName,
UINT64 *ValueSizeResult,
PVOID *ValueDataResult){
UINT8 *v8;
UINT64 v9;
int v10;
UINT8 *v11;
int v12;
unsigned int *v13;
UINT8 v14;
NTSTATUS RegistryValue;
unsigned int v16;
unsigned int v17;
UINT8 *v18;
WCHAR v19;
UINT8 v20;
unsigned int v21;
int v22;
WCHAR *v23;
__int64 v24;
unsigned int v25;
WCHAR v27;
const WCHAR *v28;
int v29;
WCHAR v30;
UINT8 v31;
bool v32;
unsigned int v33;
unsigned int v34;
UINT8 *PoolWithTag;
unsigned int v36;
unsigned int v37;
PVOID P;
void *Src[2];
struct _UNICODE_STRING DestinationString;
int v41;
v41 = ValueType;
v8 = 0i64;
v9 = (unsigned int)ValueSize;
P = 0i64;
v10 = ValueModifiers;
v11 = (UINT8 *)ValueData;
*(_DWORD *)ValueSizeResult = 0;
v12 = ValueType;
v13 = 0i64;
DestinationString = 0i64;
*(_OWORD *)Src = 0i64;
*ValueDataResult = 0i64;
if( !(_DWORD)ValueType )
goto LABEL_58;
if( (unsigned int)ValueType <= 2 )
{
v14 = PnpValidateStringData((PWCHAR)ValueData, (unsigned int)ValueSize);
}
else
{
if( (_DWORD)ValueType != 7 )
goto LABEL_58;
v14 = PnpValidateMultiSzData((PWCHAR)ValueData, (unsigned int)ValueSize);
}
if( !v14 )
return(unsigned int)-1073741823;
RegistryValue = IopGetRegistryValue(KeyHandle, ValueName, 0i64, (KEY_VALUE_FULL_INFORMATION **)&P);
v13 = (unsigned int *)P;
v16 = RegistryValue;
v36 = RegistryValue;
if( RegistryValue < 0 )
{
if( RegistryValue == -1073741772 )
{
v16 = 0;
if( (v10 & 0x40000) == 0 )
{
v17 = 0;
goto LABEL_24;
}
v34 = v9 + 2;
if( v12 == 7 )
v34 = v9;
v17 = v34;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v34, 0x63647050ui64);
v8 = PoolWithTag;
if( PoolWithTag )
{
memmove(PoolWithTag, v11, v9);
goto LABEL_24;
}
v13 = (unsigned int *)P;
v16 = -1073741670;
}
goto LABEL_27;
}
if( !PnpValidateRegistryMultiSz((KEY_VALUE_FULL_INFORMATION *)P) )
{
LABEL_58:
v16 = -1073741823;
goto LABEL_27;
}
if( (v10 & 0x40000) != 0 )
{
v17 = v13[3];
Src[0] = (char *)v13 + v13[2];
if( !v17 )
v17 = 2;
v18 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v17 + (unsigned int)v9, 0x63647050ui64);
v21 = 0;
v8 = v18;
if( v18 )
{
if( v17 > 2 )
{
memmove(v18, (UINT8 *)Src[0], v17);
v21 = v17 - 2;
}
v22 = v10 & 0x20000;
v37 = v21;
if( v41 != 7 )
{
if( v22 || v17 == 2 || !PnpMultiSzContainsString((PWCHAR)Src[0], (PWCHAR)v11, v19, v20) )
{
memmove(&v8[v37], v11, v9);
v17 += v9;
}
goto LABEL_24;
}
if( v22 )
{
memmove(&v8[v21], v11, v9);
v17 = v17 + v9 - 2;
goto LABEL_24;
}
if( !*(_WORD *)v11 )
{
LABEL_24:
if( v8 )
*(_WORD *)&v8[2 * ((unsigned __int64)v17 >> 1) - 2] = 0;
*(_DWORD *)ValueSizeResult = v17;
*ValueDataResult = v8;
goto LABEL_27;
}
v23 = (WCHAR *)Src[0];
do
{
v24 = -1i64;
do
++v24;
while( *(_WORD *)&v11[2 * v24] );
v25 = 2 * v24 + 2;
if( !PnpMultiSzContainsString(v23, (PWCHAR)v11, v19, v20) )
{
memmove(&v8[v37], v11, v25);
v37 += v25;
v17 += v25;
}
v11 += 2 * ((unsigned __int64)v25 >> 1);
}
while( *(_WORD *)v11 );
LABEL_23:
v13 = (unsigned int *)P;
goto LABEL_24;
}
}
else
{
v8 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v13[3], 0x63647050ui64);
if( v8 )
{
if( v12 != 7 )
RtlInitUnicodeString(&DestinationString, (PCWSTR)v11, v27);
v17 = 2;
v28 = (const WCHAR *)((char *)v13 + v13[2]);
if( !*v28 )
goto LABEL_24;
v29 = 0;
do
{
RtlInitUnicodeString((PUNICODE_STRING)Src, v28, v27);
if( v41 == 7 )
v32 = PnpMultiSzContainsString((PWCHAR)v11, (PWCHAR)Src[1], v30, v31) == 0i64;
else
v32 = RtlEqualUnicodeString(&DestinationString, (UNICODE_STRING *)Src, 1u) == 0;
if( v32 )
{
v33 = LOWORD(Src[0]) + 2;
memmove(&v8[v29], (UINT8 *)Src[1], v33);
v29 += v33;
v17 += v33;
}
v28 += ((unsigned __int64)LOWORD(Src[0]) >> 1) + 1;
}
while( *v28 );
v16 = v36;
goto LABEL_23;
}
}
v16 = -1073741670;
LABEL_27:
if( v13 )
ExFreePoolWithTag(v13, 0);
return v16;
}Referenced by:
PiDevCfgCopyDeviceKey