WmipQueryAllData
INT64 __fastcall WmipQueryAllData(PVOID Object, _IRP *a2, INT8 a3, _DWORD *a4, UINT64 BufferLength, INT64 a6){
char v9;
void *v10;
int v11;
int v12;
unsigned int v13;
char v14;
unsigned int v15;
int *v16;
INT64 *v17;
__int128 v18;
volatile signed __int64 *v19;
volatile signed __int64 **v20;
int v21;
volatile signed __int64 *v22;
__int64 v23;
UINT64 v24;
_IRP *v25;
int v26;
int *v27;
int v28;
bool v29;
_DWORD *v30;
unsigned int v32;
int v33;
_DWORD *v34;
__int128 v35;
PVOID *Objecta;
int v37;
UINT64 Number;
int *v39;
volatile signed __int64 *v40;
PVOID v41;
char *v42;
PVOID P;
__int64 v44;
_QWORD v45[3];
PIRP Irp;
_DWORD *v47;
INT64 v48[10];
INT64 result[16];
Irp = a2;
v41 = Object;
v45[0] = a6;
v47 = a4;
memset((INT64)result, 0i64);
memset((INT64)v48, 0i64);
v9 = 0;
LOBYTE(v37) = 0;
*(_OWORD *)&v45[1] = 0i64;
if( Object )
{
v11 = ObReferenceObjectByPointer(Object, 1u, WmipGuidObjectType, a3);
}
else
{
v10 = (void *)*((_QWORD *)a4 + 2);
v41 = 0i64;
v11 = ObReferenceObjectByHandle(v10, 1u, WmipGuidObjectType, a3, &v41, 0i64);
}
if( v11 < 0 )
return(unsigned int)v11;
HIDWORD(Number) = 16;
P = result;
v11 = WmipPrepareForWnodeAD((__int64)v41, &v45[1], (int *)&Number + 1, &P, &v37);
if( v11 < 0 )
goto LABEL_35;
v12 = a4[11];
LODWORD(Number) = v12;
if( (_BYTE)v37 )
{
a4[3] = 0;
v35 = *(_OWORD *)&v45[1];
a4[11] = v12 | 0x100;
v11 = 0;
*(_OWORD *)(a4 + 6) = v35;
*(_DWORD *)a6 = 48;
goto LABEL_35;
}
v13 = 0;
v40 = 0i64;
v14 = 0;
v15 = BufferLength;
v16 = a4;
v17 = (INT64 *)P;
v11 = -1073741163;
v39 = a4;
LOBYTE(v37) = 0;
if( !HIDWORD(Number) )
goto LABEL_34;
v18 = *(_OWORD *)&v45[1];
v19 = v40;
v20 = (volatile signed __int64 **)P;
v21 = Number;
v42 = (char *)P;
v44 = HIDWORD(Number);
do
{
v22 = *v20;
v40 = *v20;
if( v9 || v14 || v15 < 0x48 )
{
v15 = 72;
v16 = (int *)v48;
memset((INT64)v48, 0i64);
v22 = v40;
LOBYTE(v37) = 1;
}
*v16 = 48;
HIDWORD(Number) = v22[2] & 3;
v23 = (__int64)v42;
v16[11] = v21 | (HIDWORD(Number) != 0 ? 0x80 : 0);
*(_OWORD *)(v16 + 6) = v18;
v24 = *(unsigned int *)(*(_QWORD *)v23 + 80i64);
v16[3] = 0;
v25 = Irp;
v16[1] = v24;
if( v25 )
{
LODWORD(Objecta) = v15;
v26 = WmipForwardWmiIrp(v25, 0, (unsigned int)v24, v16 + 6, (UINT64)Objecta, v16);
}
else
{
v26 = WmipSendWmiIrp(0, v24, v16 + 6, v15, v16, (IO_STATUS_BLOCK *)&v45[1]);
}
v16[1] = 0;
if( v26 < 0 )
goto LABEL_48;
if( (v16[11] & 0x20) != 0 )
{
if( v16[12] <= v15 )
v26 = -1073741823;
}
else if( !v16[13] )
{
v26 = -1073741163;
}
if( v26 < 0 )
goto LABEL_48;
if( (v16[11] & 0x20) != 0 )
{
v32 = v16[12];
}
else
{
if( !(_BYTE)v37 )
{
if( v19 )
*((_DWORD *)v19 + 3) = (_DWORD)v16 - (_DWORD)v19;
v19 = (volatile signed __int64 *)v16;
if( HIDWORD(Number) )
{
WmipInsertStaticNames(v16, v15, (__int64)v40);
if( (v16[11] & 0x20) != 0 )
{
v9 = 1;
v27 = v16 + 12;
}
else
{
v27 = v16;
}
v28 = *v27;
}
else
{
v28 = *v16;
}
HIDWORD(Number) = v28;
WmipAlign(8ui64, (UINT64 *)((char *)&Number + 4));
v13 += HIDWORD(Number);
if( !v9 && v15 >= HIDWORD(Number) )
{
v15 -= HIDWORD(Number);
v16 = (int *)((char *)v39 + HIDWORD(Number));
v39 = v16;
goto LABEL_29;
}
goto LABEL_47;
}
v32 = *v16;
}
if( v32 < 0x48 )
v32 = 72;
LODWORD(Number) = v32 + v13;
if( HIDWORD(Number) )
{
WmipAlign(4ui64, &Number);
v33 = WmipStaticInstanceNameSize((__int64)v40);
LODWORD(Number) = v33 + Number;
}
WmipAlign(8ui64, &Number);
v13 = Number;
LABEL_47:
v9 = 1;
LABEL_48:
v16 = v39;
LABEL_29:
WmipUnreferenceEntry((__int64)&WmipISChunkInfo, v40);
v14 = v37;
v20 = (volatile signed __int64 **)(v42 + 8);
v29 = v44-- == 1;
v42 += 8;
}
while( !v29 );
v30 = v47;
v17 = (INT64 *)P;
if( v13 )
{
if( v9 )
{
if( v13 <= (unsigned int)BufferLength )
v13 = BufferLength + 64;
v34 = (_DWORD *)v45[0];
*v47 = 56;
v30[11] = 32;
v30[12] = v13;
*v34 = 56;
}
else
{
*(_DWORD *)v45[0] = v13;
}
v11 = 0;
}
LABEL_34:
if( v17 != result && v17 )
ExFreePoolWithTag(v17, 0);
LABEL_35:
HalPutDmaAdapter((PADAPTER_OBJECT)v41);
return(unsigned int)v11;
}Referenced by:
IoWMIQueryAllData
WmipIoControl
WmipQueryAllDataMultiple