WmipQuerySingleMultiple
__int64 __fastcall WmipQuerySingleMultiple(
IRP *a1,
KPROCESSOR_MODE a2,
__int64 a3,
unsigned int a4,
__int64 a5,
unsigned int a6,
__int64 a7,
__int64 a8,
int *a9){
__int64 v9;
int v10;
__int64 v11;
_WORD *PoolWithTag;
_WORD *v13;
int v14;
char v15;
INT64 v16;
char *v17;
unsigned int v18;
unsigned int v19;
unsigned __int16 v20;
unsigned int v21;
INT64 v22;
UINT8 *v23;
int v24;
__int64 i;
__int64 v26;
__int64 v27;
_DWORD *v28;
int v29;
UINT64 BufferLength;
char v32;
unsigned __int16 v34;
int v35;
int v36;
unsigned int v37;
int v38;
INT64 result;
unsigned int v40;
int v41;
unsigned int v42;
unsigned int v43;
void *Src;
__int64 v45;
__int64 v46;
_DWORD *v47;
unsigned int v48;
__int128 v49;
__int64 v50;
PADAPTER_OBJECT DmaAdapter;
PVOID v52;
PVOID v53;
int *v54;
__int64 v55;
PIRP Irp;
__int64 v57;
int *v58;
char P[592];
v37 = a4;
v9 = a3;
v47 = (_DWORD *)a3;
Irp = a1;
v54 = a9;
v58 = a9;
v57 = a3;
v48 = a6;
v46 = a7;
v55 = a8;
v35 = 0;
v41 = 0;
v49 = 0i64;
memset((INT64)P, 0i64);
v10 = 0;
v38 = 0;
v11 = a7;
if( a7 )
{
v13 = 0i64;
v52 = 0i64;
}
else
{
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 24i64 * a6, 0x70696D57ui64);
v13 = PoolWithTag;
v52 = PoolWithTag;
if( PoolWithTag )
memmove((UINT8 *)PoolWithTag, (UINT8 *)(a5 + 8), 24i64 * a6);
else
v10 = -1073741670;
v9 = (__int64)v47;
v11 = v46;
}
if( v10 < 0 )
return(unsigned int)v10;
v14 = 0;
v36 = 0;
v15 = 0;
v32 = 0;
v45 = 0i64;
v16 = v9;
result = v9;
v17 = P;
v53 = P;
v18 = 580;
v43 = 580;
v19 = 0;
DmaAdapter = 0i64;
while( 1 )
{
v42 = v19;
if( v19 >= v48 )
break;
if( v11 )
{
v49 = *(_OWORD *)(v55 + 16i64 * v19);
DmaAdapter = *(PADAPTER_OBJECT *)(v11 + 8i64 * v19);
v50 = 0i64;
Src = (void *)*((_QWORD *)&v49 + 1);
v20 = v49;
}
else
{
v20 = v13[12 * v19 + 4];
LODWORD(v49) = *(_DWORD *)&v13[12 * v19 + 4];
Src = *(void **)&v13[12 * v19 + 8];
*((_QWORD *)&v49 + 1) = Src;
v50 = *(_QWORD *)&v13[12 * v19];
v16 = result;
}
v34 = v20;
v21 = (v20 + 73) & 0xFFFFFFF8;
if( v15 || v37 < v21 )
{
if( v21 > v18 )
{
if( v17 != P )
ExFreePoolWithTag(v17, 0);
v17 = (char *)ExAllocatePoolWithTag(NonPagedPoolNx, v21, 0x70696D57ui64);
v53 = v17;
if( !v17 )
{
v10 = -1073741670;
break;
}
v43 = v21;
}
v22 = (INT64)v17;
v40 = v21;
v45 = 0i64;
v32 = 1;
}
else
{
v22 = v16;
v40 = v37;
}
memset(v22, 0i64);
*(_DWORD *)(v22 + 44) = 2;
*(_DWORD *)v22 = v21;
*(_QWORD *)(v22 + 16) = v50;
*(_DWORD *)(v22 + 48) = 64;
*(_DWORD *)(v22 + 56) = v21;
*(_WORD *)(v22 + 64) = v34;
if( a2 == 1 && v34 )
{
if( (BYTE8(v49) & 1) != 0 )
ExRaiseDatatypeMisalignment();
v23 = (UINT8 *)Src;
if( (unsigned __int64)Src + v34 > 0x7FFFFFFF0000i64 || (char *)Src + v34 < Src )
MEMORY[0x7FFFFFFF0000] = 0;
}
else
{
v23 = (UINT8 *)Src;
}
memmove((UINT8 *)(v22 + 66), v23, v34);
v35 = *(_DWORD *)v22;
LODWORD(BufferLength) = v40;
if( (int)WmipQuerySetExecuteSI((_ADAPTER_OBJECT *)DmaAdapter, Irp, a2, 1u, v22, BufferLength, (INT64)&v35) < 0 )
goto LABEL_37;
v24 = *(_DWORD *)(v22 + 44);
if( (v24 & 0x100) != 0 )
goto LABEL_37;
++v38;
if( (v24 & 0x20) != 0 )
{
v14 += (*(_DWORD *)(v22 + 48) + 7) & 0xFFFFFFF8;
v36 = v14;
v15 = 1;
v32 = 1;
goto LABEL_38;
}
if( v32 )
{
v14 += (v35 + 7) & 0xFFFFFFF8;
v36 = v14;
LABEL_37:
v15 = v32;
LABEL_38:
v16 = result;
goto LABEL_39;
}
if( v45 )
*(_DWORD *)(v45 + 12) = v41;
for( i = v22; ; i += v26 )
{
v45 = i;
v26 = *(unsigned int *)(i + 12);
if( !(_DWORD)v26 )
break;
}
v27 = (v35 + 7) & 0xFFFFFFF8;
v14 += v27;
v36 = v14;
v37 -= v27;
v16 = v27 + result;
result = v16;
v41 = v16 - i;
v15 = 0;
LABEL_39:
v19 = v42 + 1;
v18 = v43;
v11 = v46;
}
v28 = v47;
if( v17 != P )
ExFreePoolWithTag(v17, 0);
if( !v38 )
v10 = -1073741163;
if( v10 >= 0 && v15 )
{
v29 = 56;
*v28 = 56;
v28[11] = 32;
v28[12] = v14;
}
else
{
v29 = v14;
}
*v54 = v29;
if( v13 )
ExFreePoolWithTag(v13, 0);
return(unsigned int)v10;
}Referenced by:
IoWMIQuerySingleInstanceMultiple
WmipIoControl