WmipQueryAllData
NTSTATUS __stdcall WmipQueryAllData(
VOID *GuidObject,
_IRP *Irp,
_KPROCESSOR_MODE AccessMode,
tagWNODE_ALL_DATA *Wnode,
UINT64 OutBufferLen,
UINT64 *RetSize){
INT8 v6;
char v9;
VOID *KernelHandle;
int v11;
ULONG Flags;
unsigned int v13;
UINT8 v14;
unsigned int v15;
tagWNODE_ALL_DATA *v16;
tagInstanceSet **v17;
GUID v18;
tagInstanceSet *v19;
tagInstanceSet **v20;
int v21;
tagInstanceSet *v22;
__int64 v23;
UINT64 v24;
_IRP *v25;
NTSTATUS v26;
tagWNODE_ALL_DATA *p_DataBlockOffset;
ULONG BufferSize;
bool v29;
tagWNODE_ALL_DATA *v30;
unsigned int DataBlockOffset;
int v33;
_DWORD *v34;
GUID v35;
PVOID *Object;
UINT8 InternalGuid[4];
UINT64 Number;
tagWNODE_ALL_DATA *v39;
tagInstanceSet *InstanceSet;
PVOID v41;
tagInstanceSet **v42;
tagInstanceSet **ProviderIdList;
__int64 v44;
_QWORD Guid[3];
_IRP *Irpa;
tagWNODE_ALL_DATA *v47;
char v48[80];
char v49[128];
v6 = AccessMode;
Irpa = Irp;
v41 = GuidObject;
Guid[0] = RetSize;
v47 = Wnode;
memset(v49, 0i64, sizeof(v49));
memset(v48, 0i64, 0x48u);
v9 = 0;
InternalGuid[0] = 0;
*(_OWORD *)&Guid[1] = 0i64;
if( GuidObject )
{
v11 = ObReferenceObjectByPointer(GuidObject, 1ui64, WmipGuidObjectType, v6);
}
else
{
KernelHandle = Wnode->WnodeHeader.KernelHandle;
v41 = 0i64;
v11 = ObReferenceObjectByHandle(KernelHandle, 1ui64, WmipGuidObjectType, v6, &v41, 0i64);
}
if( v11 < 0 )
return v11;
HIDWORD(Number) = 16;
ProviderIdList = (tagInstanceSet **)v49;
v11 = WmipPrepareForWnodeAD(
(_WMIGUIDOBJECT *)v41,
(_GUID *)&Guid[1],
(UINT64 *)((char *)&Number + 4),
&ProviderIdList,
InternalGuid);
if( v11 < 0 )
goto LABEL_35;
Flags = Wnode->WnodeHeader.Flags;
LODWORD(Number) = Flags;
if( InternalGuid[0] )
{
Wnode->WnodeHeader.Linkage = 0;
v35 = *(GUID *)&Guid[1];
Wnode->WnodeHeader.Flags = Flags | 0x100;
v11 = 0;
Wnode->WnodeHeader.Guid = v35;
*(_DWORD *)RetSize = 48;
goto LABEL_35;
}
v13 = 0;
InstanceSet = 0i64;
v14 = 0;
v15 = OutBufferLen;
v16 = Wnode;
v17 = ProviderIdList;
v11 = -1073741163;
v39 = Wnode;
InternalGuid[0] = 0;
if( !HIDWORD(Number) )
goto LABEL_34;
v18 = *(GUID *)&Guid[1];
v19 = InstanceSet;
v20 = ProviderIdList;
v21 = Number;
v42 = ProviderIdList;
v44 = HIDWORD(Number);
do
{
v22 = *v20;
InstanceSet = *v20;
if( v9 || v14 || v15 < 0x48 )
{
v15 = 72;
v16 = (tagWNODE_ALL_DATA *)v48;
memset(v48, 0i64, 0x48u);
v22 = InstanceSet;
InternalGuid[0] = 1;
}
v16->WnodeHeader.BufferSize = 48;
HIDWORD(Number) = v22[4] & 3;
v23 = (__int64)v42;
v16->WnodeHeader.Flags = v21 | (HIDWORD(Number) != 0 ? 0x80 : 0);
v16->WnodeHeader.Guid = v18;
v24 = *(unsigned int *)(*(_QWORD *)v23 + 80i64);
v16->WnodeHeader.Linkage = 0;
v25 = Irpa;
v16->WnodeHeader.ProviderId = v24;
if( v25 )
{
LODWORD(Object) = v15;
v26 = WmipForwardWmiIrp(v25, 0, (unsigned int)v24, &v16->WnodeHeader.Guid, (UINT64)Object, v16);
}
else
{
v26 = WmipSendWmiIrp(0, v24, &v16->WnodeHeader.Guid, v15, v16, (_IO_STATUS_BLOCK *)&Guid[1]);
}
v16->WnodeHeader.ProviderId = 0;
if( v26 < 0 )
goto LABEL_48;
if( (v16->WnodeHeader.Flags & 0x20) != 0 )
{
if( v16->DataBlockOffset <= v15 )
v26 = -1073741823;
}
else if( !v16->InstanceCount )
{
v26 = -1073741163;
}
if( v26 < 0 )
goto LABEL_48;
if( (v16->WnodeHeader.Flags & 0x20) != 0 )
{
DataBlockOffset = v16->DataBlockOffset;
}
else
{
if( !InternalGuid[0] )
{
if( v19 )
v19[3] = (_DWORD)v16 - (_DWORD)v19;
v19 = (tagInstanceSet *)v16;
if( HIDWORD(Number) )
{
WmipInsertStaticNames(v16, v15, InstanceSet);
if( (v16->WnodeHeader.Flags & 0x20) != 0 )
{
v9 = 1;
p_DataBlockOffset = (tagWNODE_ALL_DATA *)&v16->DataBlockOffset;
}
else
{
p_DataBlockOffset = v16;
}
BufferSize = p_DataBlockOffset->WnodeHeader.BufferSize;
}
else
{
BufferSize = v16->WnodeHeader.BufferSize;
}
HIDWORD(Number) = BufferSize;
WmipAlign(8ui64, (UINT64 *)((char *)&Number + 4));
v13 += HIDWORD(Number);
if( !v9 && v15 >= HIDWORD(Number) )
{
v15 -= HIDWORD(Number);
v16 = (tagWNODE_ALL_DATA *)((char *)v39 + HIDWORD(Number));
v39 = v16;
goto LABEL_29;
}
goto LABEL_47;
}
DataBlockOffset = v16->WnodeHeader.BufferSize;
}
if( DataBlockOffset < 0x48 )
DataBlockOffset = 72;
LODWORD(Number) = DataBlockOffset + v13;
if( HIDWORD(Number) )
{
WmipAlign(4ui64, &Number);
v33 = WmipStaticInstanceNameSize(InstanceSet);
LODWORD(Number) = v33 + Number;
}
WmipAlign(8ui64, &Number);
v13 = Number;
LABEL_47:
v9 = 1;
LABEL_48:
v16 = v39;
LABEL_29:
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, (volatile signed __int64 *)InstanceSet);
v14 = InternalGuid[0];
v20 = v42 + 1;
v29 = v44-- == 1;
++v42;
}
while( !v29 );
v30 = v47;
v17 = ProviderIdList;
if( v13 )
{
if( v9 )
{
if( v13 <= (unsigned int)OutBufferLen )
v13 = OutBufferLen + 64;
v34 = (_DWORD *)Guid[0];
v47->WnodeHeader.BufferSize = 56;
v30->WnodeHeader.Flags = 32;
v30->DataBlockOffset = v13;
*v34 = 56;
}
else
{
*(_DWORD *)Guid[0] = v13;
}
v11 = 0;
}
LABEL_34:
if( v17 != (tagInstanceSet **)v49 && v17 )
ExFreePoolWithTag(v17, 0);
LABEL_35:
HalPutDmaAdapter((PADAPTER_OBJECT)v41);
return v11;
}Referenced by:
IoWMIQueryAllData
WmipIoControl
WmipQueryAllDataMultiple