WmipDereferenceEvent
_WNODE_HEADER *__stdcall WmipDereferenceEvent(tagWNODE_EVENT_REFERENCE *WnodeRef){
ULONG ProviderId;
_WNODE_HEADER *Buffer;
unsigned int BufferSize;
UINT64 i;
ULONG Flags;
int v7;
unsigned int v8;
ULONG v9;
ULONG TargetDataBlockSize;
unsigned int v11;
size_t v12;
_WNODE_HEADER *PoolWithTag;
ULONG Version;
UINT8 *v15;
int v16;
ULONG v17;
IO_STATUS_BLOCK Iosb[5];
UINT64 Number;
unsigned int v21;
unsigned int v22;
size_t Size;
ProviderId = WnodeRef->WnodeHeader.ProviderId;
Buffer = 0i64;
BufferSize = 0;
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
for( i = *(_QWORD *)WmipDSHeadPtr; ; i = *(_QWORD *)i )
{
if( i == WmipDSHeadPtr )
{
i = 0i64;
goto LABEL_6;
}
if( *(_DWORD *)(i + 56) == ProviderId )
break;
}
WmipReferenceEntry(i);
LABEL_6:
KeReleaseMutex(&WmipSMMutex, 0);
if( i )
{
Flags = WnodeRef->WnodeHeader.Flags;
LODWORD(Number) = 64;
v7 = Flags & 0x80;
if( v7 )
{
v8 = 0;
v9 = 0;
}
else
{
v8 = LOWORD(WnodeRef->TargetInstanceIndex) + 2;
if( !WmipAlign(2ui64, &Number) || (v9 = Number, v8 > ~(_DWORD)Number) )
{
LABEL_28:
WmipUnreferenceEntry((__int64)&WmipDSChunkInfo, (volatile signed __int64 *)i);
return Buffer;
}
LODWORD(Number) = v8 + Number;
}
if( WmipAlign(8ui64, &Number) )
{
TargetDataBlockSize = WnodeRef->TargetDataBlockSize;
if( TargetDataBlockSize <= ~(_DWORD)Number )
{
v21 = 0;
v11 = Number + TargetDataBlockSize;
v12 = (unsigned int)Number + TargetDataBlockSize;
v22 = Number + TargetDataBlockSize;
while( 1 )
{
Size = v12;
PoolWithTag = (_WNODE_HEADER *)ExAllocatePoolWithTag(NonPagedPoolNx, v12, 0x70696D57ui64);
Buffer = PoolWithTag;
if( !PoolWithTag )
break;
memset((INT64)PoolWithTag, 0i64);
Buffer->BufferSize = v11;
Buffer->ProviderId = WnodeRef->WnodeHeader.ProviderId;
Buffer->Guid = WnodeRef->TargetGuid;
Version = WnodeRef->WnodeHeader.Version;
Buffer->Flags = v7 | 2;
Buffer[1].Version = Number;
Buffer->Version = Version;
if( v7 )
{
Buffer[1].ProviderId = WnodeRef->TargetInstanceIndex;
}
else
{
v8 -= 2;
Buffer[1].BufferSize = v9;
v15 = (UINT8 *)Buffer + v9;
*(_WORD *)v15 = v8;
memmove(v15 + 2, (UINT8 *)&WnodeRef->TargetInstanceName[1], v8);
}
v16 = WmipSendWmiIrp(1u, *(unsigned int *)(i + 56), &Buffer->Guid, v11, Buffer, Iosb);
if( v16 >= 0 )
{
v17 = Buffer->Flags;
if( (v17 & 0x20) == 0 )
{
Buffer->Flags = v17 | WnodeRef->WnodeHeader.Flags & 0xFF000008 | 8;
goto LABEL_28;
}
BufferSize = Buffer[1].BufferSize;
}
ExFreePoolWithTag(Buffer, 0);
Buffer = 0i64;
if( v16 >= 0 && BufferSize > v22 )
{
v11 = BufferSize;
v12 = BufferSize;
++v21;
v22 = BufferSize;
if( v21 < 2 )
continue;
}
goto LABEL_28;
}
}
}
goto LABEL_28;
}
return Buffer;
}Referenced by:
WmipProcessEvent