WmipQuerySetExecuteSI
INT64 __fastcall WmipQuerySetExecuteSI(
_ADAPTER_OBJECT *DmaAdapter,
IRP *Irp,
KPROCESSOR_MODE AccessMode,
UINT8 a4,
INT64 a5,
UINT64 BufferLength,
INT64 a7){
_DWORD *v7;
__int64 v11;
ACCESS_MASK v12;
int v13;
NTSTATUS v14;
int v15;
INT64 *v16;
UINT64 v17;
int v18;
unsigned __int64 *p_Information;
__int64 v20;
volatile signed __int64 **v21;
void *v23;
UINT64 v24;
int v25;
unsigned __int64 *v26;
PVOID *Object;
BYTE v28;
char v29[7];
PVOID v30;
_DWORD *v31;
PVOID P;
IO_STATUS_BLOCK Iosb;
INT64 result[16];
v7 = (_DWORD *)a7;
v31 = (_DWORD *)a7;
v11 = a4;
memset((INT64)result, 0i64);
v12 = *((_DWORD *)DesiredAccessForFunction + v11);
v13 = 0;
v29[0] = 0;
v28 = 0;
Iosb = 0i64;
if( DmaAdapter )
{
v14 = ObReferenceObjectByPointer(DmaAdapter, v12, WmipGuidObjectType, AccessMode);
}
else
{
v23 = *(void **)(a5 + 16);
v30 = 0i64;
v14 = ObReferenceObjectByHandle(v23, v12, WmipGuidObjectType, AccessMode, &v30, 0i64);
DmaAdapter = (_ADAPTER_OBJECT *)v30;
}
v15 = v14;
if( v14 < 0 )
return(unsigned int)v15;
LODWORD(v30) = 16;
P = result;
v15 = WmipPrepareWnodeSI((INT64)DmaAdapter, a5, (UINT64 *)&v30, &P, (BYTE *)v29, &v28);
if( v15 >= 0 )
{
if( v28 )
{
*(_DWORD *)(a5 + 44) |= 0x100u;
*(_DWORD *)a5 = 48;
*((_QWORD *)Irp + 7) = 48i64;
}
else if( v29[0] )
{
if( (_BYTE)v11 == 3 || (v15 = -1073741162, (_BYTE)v11 == 9) )
v15 = -1073741161;
v16 = (INT64 *)P;
if( (_DWORD)v30 )
{
while( 1 )
{
v17 = *(unsigned int *)(v16[v13] + 80);
*(_DWORD *)(a5 + 4) = v17;
if( Irp )
{
LODWORD(Object) = BufferLength;
v18 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v17, (VOID *)(a5 + 24), (UINT64)Object, (VOID *)a5);
p_Information = (unsigned __int64 *)((char *)Irp + 56);
}
else
{
v18 = WmipSendWmiIrp(v11, v17, (VOID *)(a5 + 24), (unsigned int)BufferLength, (VOID *)a5, &Iosb);
p_Information = &Iosb.Information;
}
if( v18 >= 0 )
*v31 = *(_DWORD *)p_Information;
if( (unsigned int)(v18 + 1073741163) > 1 )
break;
if( ++v13 >= (unsigned int)v30 )
goto LABEL_18;
}
v15 = v18;
LABEL_18:
v20 = (unsigned int)v30;
v21 = (volatile signed __int64 **)v16;
do
{
WmipUnreferenceEntry((__int64)&WmipISChunkInfo, *v21++);
--v20;
}
while( v20 );
}
if( v16 != result && v16 )
ExFreePoolWithTag(v16, 0);
v7 = v31;
}
else
{
v24 = *(unsigned int *)(a5 + 4);
if( Irp )
{
LODWORD(Object) = BufferLength;
v25 = WmipForwardWmiIrp(Irp, v11, (unsigned int)v24, (VOID *)(a5 + 24), (UINT64)Object, (VOID *)a5);
v26 = (unsigned __int64 *)((char *)Irp + 56);
}
else
{
v25 = WmipSendWmiIrp(v11, v24, (VOID *)(a5 + 24), (unsigned int)BufferLength, (VOID *)a5, &Iosb);
v26 = &Iosb.Information;
}
v15 = v25;
if( v25 < 0 )
{
LABEL_25:
*(_DWORD *)(a5 + 4) = 0;
goto LABEL_26;
}
*(_DWORD *)a7 = *(_DWORD *)v26;
}
if( v15 >= 0 && *v7 > (unsigned int)BufferLength )
v15 = -1073741811;
goto LABEL_25;
}
LABEL_26:
if( DmaAdapter )
HalPutDmaAdapter((PADAPTER_OBJECT)DmaAdapter);
return(unsigned int)v15;
}Referenced by:
IoWMIExecuteMethod
IoWMIQuerySingleInstance
IoWMISetSingleInstance
IoWMISetSingleItem
WmipIoControl
WmipQuerySingleMultiple