WmipQueryWmiDataBlock
NTSTATUS __stdcall WmipQueryWmiDataBlock(
_DEVICE_OBJECT *DeviceObject,
_IRP *Irp,
UINT64 GuidIndex,
UINT64 InstanceIndex,
UINT64 InstanceCount,
UINT64 *InstanceLengthArray,
UINT64 BufferAvail,
UINT8 *Buffer){
SMBIOSVERSIONINFO *v8;
NTSTATUS DeviceInstanceName;
UINT64 *v10;
int v11;
size_t v12;
UINT8 *v13;
int v14;
UINT8 *v15;
NTSTATUS SMBiosEventlog;
int v18;
int v19;
int v20;
_REGENTRY *v21;
_UNICODE_STRING *v22;
_REGENTRY *v23;
void *v24;
size_t v25;
wchar_t *v26;
__int64 v27;
_REGENTRY *RegEntryByDevice;
_UNICODE_STRING *v29;
void *v30;
int v31;
__int64 Length;
__int64 v33;
wchar_t *v34;
_WORD *v35;
UINT64 BufferUsed;
CHAR v37;
UINT64 BufferSize;
_SYSID_1394 *SysId1394;
_UNICODE_STRING InstanceName;
_SYSID_UUID *SysIdUuid;
_IRP *Irpa;
__int64 v43;
int v44;
unsigned __int64 *p_TrapFrame;
UINT64 *p_BufferSize;
int v47;
__int64 v48;
int v49;
_M128A *p_Xmm13;
__int64 v51;
int v52;
__int64 v53;
int v54;
const wchar_t *v55;
_SYSID_1394 **p_SysId1394;
int v57;
__int64 v58;
int v59;
v8 = (SMBIOSVERSIONINFO *)Buffer;
DeviceInstanceName = 0;
v10 = InstanceLengthArray;
v11 = GuidIndex;
Irpa = Irp;
v12 = 0;
v13 = 0i64;
switch( (_DWORD)GuidIndex )
{
case 0:
InstanceName = 0i64;
RegEntryByDevice = WmipFindRegEntryByDevice(DeviceObject);
SysIdUuid = (_SYSID_UUID *)RegEntryByDevice;
v23 = RegEntryByDevice;
if( !RegEntryByDevice )
goto LABEL_44;
v30 = (void *)*((_QWORD *)RegEntryByDevice + 3);
if( v30 )
{
DeviceInstanceName = IoGetDeviceInstanceName(v30, &InstanceName, v29);
if( DeviceInstanceName >= 0 )
{
v31 = InstanceName.Length + 2;
v12 = v31 + (InstanceCount - 1) * ((InstanceName.Length + 9) & 0xFFFFFFF8);
LODWORD(BufferSize) = v12;
if( v12 <= (unsigned int)BufferAvail )
{
memset(Buffer, 0i64, v12);
if( (_DWORD)InstanceCount )
{
Length = InstanceName.Length;
v33 = (unsigned int)InstanceCount;
do
{
v34 = InstanceName.Buffer;
*(_DWORD *)v10 = v31;
v35 = (_WORD *)((unsigned __int64)&v8[1].DMIBiosRevision & 0xFFFFFFFFFFFFFFF8ui64);
v10 = (UINT64 *)((char *)v10 + 4);
*v35++ = Length;
memmove(v35, v34, Length);
v8 = (SMBIOSVERSIONINFO *)((char *)v35 + Length);
--v33;
}
while( v33 );
v12 = BufferSize;
v23 = (_REGENTRY *)SysIdUuid;
}
goto LABEL_40;
}
goto LABEL_39;
}
LABEL_41:
DeviceInstanceName = -1073741163;
goto LABEL_43;
}
LABEL_42:
DeviceInstanceName = -1073741823;
goto LABEL_43;
case 1:
InstanceName = 0i64;
v21 = WmipFindRegEntryByDevice(DeviceObject);
v23 = v21;
if( !v21 )
goto LABEL_44;
v24 = (void *)*((_QWORD *)v21 + 3);
if( v24 )
{
DeviceInstanceName = IoGetDeviceInstanceName(v24, &InstanceName, v22);
if( DeviceInstanceName >= 0 )
{
v25 = InstanceName.Length;
v12 = InstanceName.Length + 10;
if( v12 <= (unsigned int)BufferAvail )
{
v26 = InstanceName.Buffer;
*(_DWORD *)Buffer = 1;
*(_DWORD *)InstanceLengthArray = v12;
v27 = v25;
*((_WORD *)Buffer + 2) = v25 + 4;
memmove(Buffer + 6, v26, v25);
*(_DWORD *)&Buffer[v27 + 6] = 3145823;
LABEL_40:
RtlFreeAnsiString(&InstanceName);
LABEL_43:
WmipUnreferenceRegEntry(v23);
goto LABEL_10;
}
LABEL_39:
DeviceInstanceName = -1073741789;
goto LABEL_40;
}
goto LABEL_41;
}
goto LABEL_42;
case 2:
BufferSize = 0i64;
v47 = 0x4000000;
v44 = 292;
p_TrapFrame = &ExceptionFrame.TrapFrame;
v49 = 292;
p_BufferSize = &BufferSize;
v52 = 0x4000000;
p_Xmm13 = &ExceptionFrame._Xmm13;
v51 = (__int64)&BufferSize + 4;
v55 = L"Capabilities";
v54 = 292;
v57 = 0x4000000;
p_SysId1394 = &SysId1394;
LODWORD(SysId1394) = 0;
v43 = 0i64;
v48 = 0i64;
v53 = 0i64;
v58 = 0i64;
v59 = 0;
v37 = 1;
LOBYTE(v20) = RtlpQueryRegistryValues(0i64, (_KEXCEPTION_FRAME *)&ExceptionFrame._Rbx);
if( v20 < 0 )
goto LABEL_44;
v12 = 12;
if( (unsigned int)BufferAvail >= 0xC )
{
*(_QWORD *)Buffer = BufferSize;
*((_DWORD *)Buffer + 2) = (_DWORD)SysId1394;
goto LABEL_9;
}
goto LABEL_25;
}
if( (_DWORD)GuidIndex != 3 )
{
if( (unsigned int)GuidIndex > 5 )
{
if( (_DWORD)GuidIndex == 6 )
{
HIDWORD(BufferSize) = BufferAvail;
SMBiosEventlog = WmipGetSMBiosEventlog(
(UINT8 *)((unsigned __int64)Buffer & -(__int64)((_DWORD)BufferAvail != 0)),
(UINT64 *)((char *)&BufferSize + 4));
v12 = HIDWORD(BufferSize);
DeviceInstanceName = SMBiosEventlog;
if( SMBiosEventlog < 0 )
goto LABEL_10;
goto LABEL_9;
}
LABEL_44:
DeviceInstanceName = -1073741163;
goto LABEL_10;
}
SysIdUuid = 0i64;
BufferSize = 0i64;
SysId1394 = 0i64;
DeviceInstanceName = WmipGetSysIds(&SysIdUuid, &BufferSize, &SysId1394, (UINT64 *)((char *)&BufferSize + 4));
if( DeviceInstanceName < 0 )
goto LABEL_10;
if( v11 == 5 )
{
v18 = HIDWORD(BufferSize);
Irp = (_IRP *)SysId1394;
v19 = 8 * HIDWORD(BufferSize);
}
else
{
v18 = BufferSize;
Irp = (_IRP *)SysIdUuid;
v19 = 16 * BufferSize;
}
v12 = v19 + 4;
if( (unsigned int)BufferAvail >= v12 )
{
*(_DWORD *)InstanceLengthArray = v12;
*(_DWORD *)Buffer = v18;
memmove(Buffer + 4, Irp, v12 - 4);
DeviceInstanceName = 0;
goto LABEL_10;
}
LABEL_25:
DeviceInstanceName = -1073741789;
goto LABEL_10;
}
if( (unsigned int)BufferAvail < 8 )
{
v15 = 0i64;
v8 = 0i64;
v14 = 0;
}
else
{
v13 = Buffer + 4;
v14 = BufferAvail - 8;
v15 = Buffer + 8;
}
LODWORD(BufferSize) = v14;
DeviceInstanceName = WmipGetSMBiosTableData(v15, &BufferSize, v8);
v12 = BufferSize + 8;
if( DeviceInstanceName >= 0 )
{
*(_DWORD *)v13 = BufferSize;
LABEL_9:
*(_DWORD *)InstanceLengthArray = v12;
}
LABEL_10:
LODWORD(BufferUsed) = v12;
return IoWMICompleteRequest(
(_WMILIB_INFO *)&DeviceObject->Type,
(_DEVICE_OBJECT *)Irp,
Irpa,
(unsigned int)DeviceInstanceName,
BufferUsed,
v37);
}Referenced by:
IoWMISystemControl