WmipQueueNotification
NTSTATUS __stdcall WmipQueueNotification(VOID *Object, WMIEVENTQUEUE *EventQueue, _WNODE_HEADER *Wnode){
VOID **v3;
unsigned int v5;
NTSTATUS v6;
__int64 v7;
ULONG BufferSize;
_KEVENT *v10;
unsigned int v11;
ULONG v12;
VOID **PoolWithTag;
char *v14;
VOID **v16;
ULONG Size;
v3 = *(VOID ***)EventQueue;
v5 = EventQueue[4];
v6 = 0;
v7 = *((_QWORD *)EventQueue + 1);
BufferSize = Wnode->BufferSize;
v10 = (_KEVENT *)Object;
v11 = EventQueue[5];
Size = Wnode->BufferSize;
v12 = (v11 + Wnode->BufferSize + 7) & 0xFFFFFFF8;
if( !v3 )
goto LABEL_20;
if( v12 > v5 )
v3 = 0i64;
if( !v3 )
{
LABEL_20:
if( v12 > 0x80000 )
goto LABEL_17;
if( v12 > v5 )
v5 = (v12 + 0x3FFF) & 0xFFFFC000;
PoolWithTag = ExAllocatePoolWithTag(1ui64, v5, 1885957463i64);
v3 = PoolWithTag;
if( !PoolWithTag )
{
LABEL_17:
++EventQueue[6];
return -1073741670;
}
memset(PoolWithTag, 0i64, v5);
if( *(_QWORD *)EventQueue )
{
memmove(v3, *(const VOID **)EventQueue, EventQueue[5]);
v16 = *(VOID ***)EventQueue;
v7 += (__int64)v3 - *(_QWORD *)EventQueue;
*((_QWORD *)EventQueue + 1) = v7;
ExFreePoolWithTag(v16, 0);
}
v11 = EventQueue[5];
BufferSize = Size;
v10 = (_KEVENT *)Object;
*(_QWORD *)EventQueue = v3;
EventQueue[4] = v5;
}
v14 = (char *)v3 + v11;
if( v7 )
*(_DWORD *)(v7 + 12) = (_DWORD)v14 - v7;
*((_QWORD *)EventQueue + 1) = v14;
EventQueue[5] = v12;
memmove(v14, Wnode, BufferSize);
KeSetEvent(v10, 0, 0);
return v6;
}Referenced by:
WmipWriteWnodeToObject