WmipQueryAllDataMultiple
__int64 __fastcall WmipQueryAllDataMultiple(
unsigned int a1,
__int64 a2,
_IRP *a3,
CHAR a4,
tagWNODE_ALL_DATA *Wnode,
UINT64 a6,
__int64 a7,
__int64 a8){
tagWNODE_ALL_DATA *v9;
__int64 v10;
int v11;
__int64 v12;
VOID **PoolWithTag;
VOID **v14;
VOID **v15;
ULONG v16;
char v17;
tagWNODE_ALL_DATA *v18;
tagWNODE_ALL_DATA *v19;
tagWNODE_ALL_DATA *v20;
unsigned int v21;
_WMIGUIDOBJECT **v22;
char *v23;
int v24;
_KPROCESSOR_MODE v26;
bool v27;
_WMIGUIDOBJECT *v28;
ULONG Flags;
int DataBlockOffset;
__int64 Linkage;
__int64 v32;
int v33;
UINT64 OutBufferLen;
UINT64 RetSize;
tagWNODE_ALL_DATA *v37;
ULONG v38;
__int64 v39;
_WMIGUIDOBJECT *GuidObject;
__int64 v41;
VOID **v42;
__int64 v43;
_IRP *Irp;
tagWNODE_ALL_DATA *v45;
_DWORD *v46;
char v47[80];
v9 = Wnode;
v39 = a2;
Irp = a3;
v46 = (_DWORD *)a8;
v45 = Wnode;
memset(v47, 0i64, 0x48u);
v10 = v39;
v11 = 0;
RetSize = 0i64;
v38 = 0;
GuidObject = 0i64;
if( v39 )
{
v14 = 0i64;
v42 = 0i64;
}
else
{
a1 = *(_DWORD *)a7;
v12 = *(unsigned int *)a7;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 8 * v12, 1885957463i64);
v42 = PoolWithTag;
v14 = PoolWithTag;
if( !PoolWithTag )
return 3221225626i64;
if( a1 )
{
v15 = PoolWithTag;
do
{
*v15 = *(VOID **)((char *)v15 + a7 - (_QWORD)PoolWithTag + 8);
++v15;
--v12;
}
while( v12 );
}
v10 = v39;
}
v16 = 0;
v17 = 0;
v18 = 0i64;
v19 = Wnode;
v37 = Wnode;
v20 = Wnode;
if( !a1 )
goto LABEL_26;
v21 = a6;
v22 = (_WMIGUIDOBJECT **)v10;
v43 = (__int64)v14 - v10;
v23 = (char *)v14 - v10;
v41 = a1;
do
{
if( v20 == (tagWNODE_ALL_DATA *)v47 || v21 < 0x48 )
{
v20 = (tagWNODE_ALL_DATA *)v47;
v24 = 72;
v18 = 0i64;
}
else
{
v20 = v19;
v24 = v21;
}
memset(v20, 0i64, 0x48u);
v27 = v39 == 0;
v20->WnodeHeader.Flags = 1;
v20->WnodeHeader.BufferSize = 48;
if( v27 )
{
v20->WnodeHeader.TimeStamp.QuadPart = *(LONGLONG *)((char *)v22 + (_QWORD)v23);
v28 = GuidObject;
}
else
{
v28 = *v22;
GuidObject = *v22;
}
LOBYTE(v26) = a4;
LODWORD(OutBufferLen) = v24;
if( WmipQueryAllData(v28, Irp, v26, v20, OutBufferLen, &RetSize) < 0 )
goto LABEL_23;
Flags = v20->WnodeHeader.Flags;
if( (Flags & 0x100) != 0 )
goto LABEL_23;
++HIDWORD(RetSize);
if( (Flags & 0x20) != 0 )
{
DataBlockOffset = v20->DataBlockOffset;
v20 = (tagWNODE_ALL_DATA *)v47;
LABEL_22:
v17 = 1;
v16 += (DataBlockOffset + 7) & 0xFFFFFFF8;
LABEL_23:
v19 = v37;
goto LABEL_24;
}
if( v20 == (tagWNODE_ALL_DATA *)v47 )
{
DataBlockOffset = RetSize;
goto LABEL_22;
}
if( v18 )
v18->WnodeHeader.Linkage = v38;
Linkage = v20->WnodeHeader.Linkage;
v18 = v20;
while( (_DWORD)Linkage )
{
v18 = (tagWNODE_ALL_DATA *)((char *)v18 + Linkage);
Linkage = v18->WnodeHeader.Linkage;
}
v32 = ((_DWORD)RetSize + 7) & 0xFFFFFFF8;
v19 = (tagWNODE_ALL_DATA *)((char *)v37 + v32);
v16 += v32;
v21 -= v32;
v37 = v19;
v38 = (_DWORD)v19 - (_DWORD)v18;
LABEL_24:
++v22;
--v41;
}
while( v41 );
v14 = v42;
v9 = v45;
v11 = HIDWORD(RetSize);
LABEL_26:
if( v14 )
ExFreePoolWithTag(v14, 0);
if( !v11 )
return 3221226133i64;
if( v17 )
{
v33 = 56;
v9->WnodeHeader.Flags = 32;
v9->WnodeHeader.BufferSize = 56;
v9->DataBlockOffset = v16;
}
else
{
v33 = v16;
}
*v46 = v33;
return 0i64;
}Referenced by:
IoWMIQueryAllDataMultiple
WmipIoControl