ExpGetDeviceDataInformation
NTSTATUS __stdcall ExpGetDeviceDataInformation(
_SYSTEM_INFORMATION_CLASS SystemInformationClass,
VOID *SystemInformation,
UINT64 SystemInformationLength,
INT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
VOID *DataBuffer;
int v11;
unsigned int v12;
NTSTATUS DeviceData;
size_t v14;
_UNICODE_STRING SourceString;
_UNICODE_STRING v17;
UINT64 Length[2];
WCHAR *CapturedString;
PWCHAR DataName;
SourceString = 0i64;
v17 = 0i64;
*(_OWORD *)Length = 0i64;
CapturedString = 0i64;
DataName = 0i64;
DataBuffer = 0i64;
if( !SystemInformation || (_DWORD)SystemInformationLength != 48 )
return -1073741820;
if( ((unsigned __int8)SystemInformation & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)SystemInformation + 48 > 0x7FFFFFFF0000i64
|| (char *)SystemInformation + 48 < SystemInformation )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
SourceString = *(_UNICODE_STRING *)SystemInformation;
v17 = (_UNICODE_STRING)*((_OWORD *)SystemInformation + 1);
*(_OWORD *)Length = *((_OWORD *)SystemInformation + 2);
v11 = ExpStringCapture(&CapturedString, &SourceString);
if( v11 >= 0 )
{
if( SystemInformationClass != SystemDeviceDataInformation || (v11 = ExpStringCapture(&DataName, &v17), v11 >= 0) )
{
if( HIDWORD(Length[0]) )
{
if( !Length[1] )
{
v11 = -1073741811;
goto LABEL_21;
}
v12 = HIDWORD(Length[0]);
ProbeForWrite(Length[1], HIDWORD(Length[0]), 2i64);
DataBuffer = ExAllocatePoolWithQuotaTag((POOL_TYPE)9, v12, 0x4E494444ui64);
if( !DataBuffer )
{
v11 = -1073741801;
goto LABEL_21;
}
}
if( SystemInformationClass == SystemDeviceDataInformation )
DeviceData = KseQueryDeviceData(CapturedString, DataName, Length, (UINT64 *)((char *)Length + 4), DataBuffer);
else
DeviceData = KseQueryDeviceDataList(
CapturedString,
(WCHAR *)DataBuffer,
HIDWORD(Length[0]),
(UINT64 *)((char *)Length + 4));
v11 = DeviceData;
v14 = HIDWORD(Length[0]);
*((_QWORD *)SystemInformation + 4) = Length[0];
if( DeviceData >= 0 )
memmove((VOID *)Length[1], DataBuffer, v14);
}
}
LABEL_21:
if( CapturedString )
ExFreePoolWithTag(CapturedString, 0x50535845u);
if( DataName )
ExFreePoolWithTag(DataName, 0x50535845u);
if( DataBuffer )
ExFreePoolWithTag(DataBuffer, 0x4E494444u);
return v11;
}Referenced by:
ExpQuerySystemInformation