IoWMIExecuteMethod
NTSTATUS __stdcall IoWMIExecuteMethod(
VOID *DataBlockObject,
_UNICODE_STRING *InstanceName,
UINT64 MethodId,
UINT64 InBufferSize,
UINT64 *OutBufferSize,
UINT8 *InOutBuffer){
UINT64 *v6;
int v7;
UINT64 v9;
size_t v11;
NTSTATUS v12;
_DWORD *Wnode;
int v14;
int v15;
int v16;
int v17;
unsigned __int16 *v18;
unsigned int v19;
UINT8 *v21;
UINT64 v22;
UINT64 InstanceNameOffset;
PVOID P;
UINT64 ValidSize;
v6 = OutBufferSize;
LODWORD(ValidSize) = 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),
&ValidSize,
&P);
Wnode = P;
v14 = v12;
if( v12 >= 0 )
{
v15 = InstanceNameOffset;
v16 = ValidSize;
*((_DWORD *)P + 11) = 0x8000;
*((_QWORD *)Wnode + 2) = 0i64;
*Wnode = v16;
Wnode[3] = 0;
Wnode[14] = v7;
v17 = HIDWORD(InstanceNameOffset);
Wnode[12] = v15;
Wnode[15] = v17;
Wnode[16] = v11;
v18 = (unsigned __int16 *)((char *)Wnode + (unsigned int)Wnode[12]);
*v18 = InstanceName->Length;
memmove(v18 + 1, InstanceName->Buffer, InstanceName->Length);
memmove((char *)Wnode + (unsigned int)Wnode[15], InOutBuffer, v11);
LODWORD(ValidSize) = *Wnode;
LODWORD(v22) = v16;
v14 = WmipQuerySetExecuteSI(DataBlockObject, 0i64, 0, 9u, Wnode, v22, &ValidSize);
if( v14 >= 0 )
{
if( (Wnode[11] & 0x20) != 0 )
{
v19 = Wnode[12] - v17;
LABEL_7:
v14 = -1073741789;
*(_DWORD *)v6 = (v19 + 7) & 0xFFFFFFF8;
goto LABEL_8;
}
v19 = Wnode[16];
if( *(_DWORD *)v6 < v19 )
goto LABEL_7;
v21 = InOutBuffer;
*(_DWORD *)v6 = v19;
memmove(v21, (char *)Wnode + (unsigned int)Wnode[15], Wnode[16]);
}
}
LABEL_8:
if( Wnode )
ExFreePoolWithTag(Wnode, 0);
return v14;
}Referenced by:
No references.