AslEnvVarQuery
NTSTATUS __stdcall AslEnvVarQuery(
PWCHAR Environment,
PWCHAR Name,
UINT64 NameLength,
PWCHAR Value,
UINT64 ValueLength,
UINT64 *ReturnLength){
WCHAR *v6;
NTSTATUS v7;
WCHAR *NtSystemRoot;
UINT64 v12;
UINT64 v14;
WCHAR *v15;
PWCHAR i;
UINT16 *v17;
UINT16 v18;
__int16 v19;
int v20;
PWCHAR v21;
__int64 v22;
UINT8 *v23;
unsigned __int64 v24;
v6 = &Name[NameLength];
v7 = 0;
if( NameLength < 0xA || wcsnicmp(Name, L"systemroot", 0xAui64) )
{
if( Environment )
{
while( *Environment )
{
v15 = Environment;
for( i = Name; i < v6; ++i )
{
if( !*Environment )
break;
NLS_UPCASE(*Environment);
v18 = NLS_UPCASE(*v17);
if( v19 != v18 )
break;
++Environment;
}
if( i == v6 && *Environment == 61 )
{
v20 = 1;
LABEL_21:
v21 = Environment;
if( *Environment )
{
v22 = 0i64;
do
{
if( (__int64)(v22 & 0xFFFFFFFFFFFFFFFEui64) >= 65534 )
break;
++Environment;
v22 += 2i64;
}
while( *Environment );
}
if( v20 )
{
v23 = (UINT8 *)(v21 + 1);
v24 = ((char *)Environment - (char *)v23) >> 1;
if( v24 < ValueLength )
{
memmove((UINT8 *)Value, v23, 2 * v24);
Value[v24] = 0;
}
else
{
if( Value && ValueLength )
*Value = 0;
v7 = -1073741789;
++v24;
}
*ReturnLength = v24;
return v7;
}
}
else
{
v20 = 0;
while( *Environment )
{
if( *Environment == 61 && Environment != v15 )
goto LABEL_21;
++Environment;
}
}
++Environment;
}
}
return -1073741568;
}
else
{
NtSystemRoot = RtlGetNtSystemRoot();
v12 = -1i64;
do
++v12;
while( NtSystemRoot[v12] );
if( v12 < ValueLength )
{
*ReturnLength = v12;
v14 = v12;
memmove((UINT8 *)Value, (UINT8 *)NtSystemRoot, v14 * 2);
Value[v14] = 0;
}
else
{
if( Value && ValueLength )
*Value = 0;
v7 = -1073741789;
*ReturnLength = v12 + 1;
}
}
return v7;
}Referenced by:
AslEnvExpandStrings