WmipWriteWnodeToObject
NTSTATUS __stdcall WmipWriteWnodeToObject(_WMIGUIDOBJECT *Object, _WNODE_HEADER *Wnode, UINT8 IsHighPriority){
__int64 v6;
NTSTATUS v7;
char v8;
ULONG BufferSize;
_DWORD *v10;
_KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&ExBootDevicesRemovedEvent + 429, &LockHandle);
v6 = *((_QWORD *)Object + 9);
v7 = 0;
if( v6 )
{
WmipClearIrpObjectList(*((_IRP **)Object + 9));
v6 &= -(__int64)(_InterlockedExchange64((volatile __int64 *)(v6 + 104), 0i64) != 0);
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
v8 = 1;
__writecr8(LockHandle.OldIrql);
if( !v6 )
return WmipQueueNotification(
Object,
(_WMIGUIDOBJECT *)((char *)Object + (-(__int64)(IsHighPriority != 0) & 0xFFFFFFFFFFFFFFE0ui64) + 128),
Wnode);
BufferSize = Wnode->BufferSize;
v10 = *(_DWORD **)(v6 + 24);
if( Wnode->BufferSize > *(_DWORD *)(*(_QWORD *)(v6 + 184) + 8i64) )
{
v10[12] = BufferSize;
*v10 = 56;
BufferSize = 56;
v10[11] = 32;
}
else
{
memmove(v10, Wnode, BufferSize);
v8 = 0;
}
*(_QWORD *)(v6 + 56) = BufferSize;
*(_DWORD *)(v6 + 48) = 0;
IofCompleteRequest((PIRP)v6, 0);
if( v8 )
return WmipQueueNotification(
Object,
(_WMIGUIDOBJECT *)((char *)Object + (-(__int64)(IsHighPriority != 0) & 0xFFFFFFFFFFFFFFE0ui64) + 128),
Wnode);
return v7;
}Referenced by:
WmipProcessEvent