ViDdiDispatchWmiQueryAllData
NTSTATUS __stdcall ViDdiDispatchWmiQueryAllData(_DEVICE_OBJECT *DeviceObject, _IRP *Irp){
_IO_STACK_LOCATION *CurrentStackLocation;
NTSTATUS result;
unsigned int v6;
unsigned int *DeviceExtension;
__int64 v8;
int v9;
unsigned int v10;
int v11;
NTSTATUS v12;
unsigned int v13;
UINT64 TotalRequiredSize;
UINT64 InstanceCount;
UINT64 DataBlockOffset;
UINT64 OffsetInstanceNameOffsets;
CurrentStackLocation = Irp->Tail.CurrentStackLocation;
LODWORD(OffsetInstanceNameOffsets) = 0;
LODWORD(InstanceCount) = 0;
LODWORD(DataBlockOffset) = 0;
LODWORD(TotalRequiredSize) = 0;
if( (_DEVICE_OBJECT *)CurrentStackLocation->Parameters.SecurityContext != DeviceObject )
return -1073741637;
if( RtlCompareMemory(*(const VOID **)&CurrentStackLocation->Parameters.Options, &GUID_VERIFIER_WMI_INTERFACE, 16) != (_SIZE_T *)16 )
return -1073741163;
v6 = *(_DWORD *)&CurrentStackLocation->Parameters.FileAttributes;
DeviceExtension = (unsigned int *)DeviceObject->DeviceExtension;
if( v6 < 0x38 )
return -1073741789;
v8 = *(_QWORD *)&CurrentStackLocation->Parameters.EaLength;
*(_QWORD *)(v8 + 16) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
result = VfIrpLogLockDatabase(*DeviceExtension);
if( result >= 0 )
{
v9 = VfIrpLogRetrieveWmiData(
*DeviceExtension,
0i64,
&OffsetInstanceNameOffsets,
&InstanceCount,
&DataBlockOffset,
&TotalRequiredSize);
if( v9 < 0 )
{
VfIrpLogUnlockDatabase(*DeviceExtension);
return v9;
}
v10 = TotalRequiredSize + 72;
LODWORD(TotalRequiredSize) = v10;
if( v10 <= v6 )
{
v11 = InstanceCount;
if( (_DWORD)InstanceCount )
{
v12 = VfIrpLogRetrieveWmiData(
*DeviceExtension,
(UINT8 *)v8,
&OffsetInstanceNameOffsets,
&InstanceCount,
&DataBlockOffset,
&TotalRequiredSize);
v11 = InstanceCount;
v9 = v12;
v10 = TotalRequiredSize;
}
VfIrpLogUnlockDatabase(*DeviceExtension);
if( v9 < 0 )
return v9;
if( v11 )
{
*(_DWORD *)v8 = 72;
v10 = 72;
*(_DWORD *)(v8 + 60) = 0;
*(_DWORD *)(v8 + 48) = 0;
*(_DWORD *)(v8 + 56) = 0;
}
else
{
v13 = *(_DWORD *)(v8 + 44) & 0xFFFFFFEF;
*(_DWORD *)v8 = v10;
*(_DWORD *)(v8 + 44) = v13 | 1;
*(_DWORD *)(v8 + 48) = DataBlockOffset;
*(_DWORD *)(v8 + 56) = OffsetInstanceNameOffsets;
}
*(_DWORD *)(v8 + 52) = 0;
Irp->IoStatus.Information = v10;
}
else
{
VfIrpLogUnlockDatabase(*DeviceExtension);
*(_DWORD *)(v8 + 44) |= 0x20u;
*(_DWORD *)(v8 + 48) = v10;
Irp->IoStatus.Information = 56i64;
}
return 0;
}
return result;
}Referenced by:
ViDdiDispatchWmi