IoWMIExecuteMethod
INT64 __stdcall IoWMIExecuteMethod(
PVOID DataBlockObject,
UNICODE_STRING *InstanceName,
UINT64 MethodId,
UINT64 InBufferSize,
UINT64 *OutBufferSize,
UINT8 *InOutBuffer){
UINT64 *v6;
int v7;
UINT64 v9;
unsigned int v11;
int v12;
_QWORD *a5;
int SetExecuteSI;
int v15;
int v16;
int v17;
UINT8 *v18;
unsigned int v19;
UINT8 *v21;
UINT64 BufferLength;
UINT64 InstanceNameOffset;
PVOID P;
UINT64 a7;
v6 = OutBufferSize;
LODWORD(a7) = 0;
v7 = MethodId;
InstanceNameOffset = 0i64;
v9 = *(unsigned int *)OutBufferSize;
P = 0i64;
v11 = InBufferSize;
if( (unsigned int)InBufferSize > (unsigned int)v9 )
v9 = (unsigned int)InBufferSize;
v12 = WmipAllocateSingleInstanceWnode(
0x44ui64,
InstanceName,
v9,
&InstanceNameOffset,
(UINT64 *)((char *)&InstanceNameOffset + 4),
&a7,
&P);
a5 = P;
SetExecuteSI = v12;
if( v12 >= 0 )
{
v15 = InstanceNameOffset;
v16 = a7;
*((_DWORD *)P + 11) = 0x8000;
a5[2] = 0i64;
*(_DWORD *)a5 = v16;
*((_DWORD *)a5 + 3) = 0;
*((_DWORD *)a5 + 14) = v7;
v17 = HIDWORD(InstanceNameOffset);
*((_DWORD *)a5 + 12) = v15;
*((_DWORD *)a5 + 15) = v17;
*((_DWORD *)a5 + 16) = v11;
v18 = (UINT8 *)a5 + *((unsigned int *)a5 + 12);
*(_WORD *)v18 = InstanceName->Length;
memmove(v18 + 2, (UINT8 *)InstanceName->Buffer, InstanceName->Length);
memmove((UINT8 *)a5 + *((unsigned int *)a5 + 15), InOutBuffer, v11);
LODWORD(a7) = *(_DWORD *)a5;
LODWORD(BufferLength) = v16;
SetExecuteSI = WmipQuerySetExecuteSI(
(_ADAPTER_OBJECT *)DataBlockObject,
0i64,
0,
9u,
(INT64)a5,
BufferLength,
(INT64)&a7);
if( SetExecuteSI >= 0 )
{
if( (*((_DWORD *)a5 + 11) & 0x20) != 0 )
{
v19 = *((_DWORD *)a5 + 12) - v17;
LABEL_7:
SetExecuteSI = -1073741789;
*(_DWORD *)v6 = (v19 + 7) & 0xFFFFFFF8;
goto LABEL_8;
}
v19 = *((_DWORD *)a5 + 16);
if( *(_DWORD *)v6 < v19 )
goto LABEL_7;
v21 = InOutBuffer;
*(_DWORD *)v6 = v19;
memmove(v21, (UINT8 *)a5 + *((unsigned int *)a5 + 15), *((unsigned int *)a5 + 16));
}
}
LABEL_8:
if( a5 )
ExFreePoolWithTag(a5, 0);
return(unsigned int)SetExecuteSI;
}Referenced by:
No references.