WmipIncludeStaticNames
_WNODE_HEADER *__stdcall WmipIncludeStaticNames(_WNODE_HEADER *Wnode, UINT64 WnodeSize){
unsigned int v2;
_WNODE_HEADER *v3;
__int64 v4;
volatile signed __int64 *GEByGuid;
ULONG ProviderId;
UINT64 i;
int v8;
unsigned int v9;
unsigned int v10;
unsigned int v11;
UINT8 *PoolWithTag;
int *v13;
__int64 v14;
__int64 v15;
WCHAR *v16;
__int64 v17;
__int64 v18;
unsigned int v19;
__int64 v20;
__int64 v21;
UINT8 *v22;
_WORD *v23;
int v24;
unsigned int v25;
ULONG Flags;
UINT64 Number;
wchar_t pszDest[8];
v2 = WnodeSize;
v3 = Wnode;
v4 = 0i64;
if( (Wnode->Flags & 7) != 0 )
{
GEByGuid = WmipFindGEByGuid(&Wnode->Guid.Data1, 0);
if( GEByGuid )
{
ProviderId = v3->ProviderId;
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
for( i = *((_QWORD *)GEByGuid + 7); (volatile signed __int64 *)i != GEByGuid + 7; i = *(_QWORD *)i )
{
if( *(_DWORD *)(i + 80) == ProviderId )
{
v4 = i;
WmipReferenceEntry(i);
break;
}
}
KeReleaseMutex(&WmipSMMutex, 0);
WmipUnreferenceEntry((__int64)&WmipGEChunkInfo, GEByGuid);
if( v4 )
{
v8 = *(_DWORD *)(v4 + 16);
if( (v8 & 3) != 0 )
{
v9 = *(_DWORD *)(v4 + 72);
if( (v3->Flags & 1) != 0 )
{
LODWORD(Number) = v2;
if( WmipAlign(4ui64, &Number) )
{
v10 = WmipStaticInstanceNameSize(v4);
if( v10 <= -1 - (int)Number )
{
v11 = v10 + Number;
PoolWithTag = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v10 + (unsigned int)Number, 0x70696D57ui64);
v13 = (int *)PoolWithTag;
if( PoolWithTag )
{
memmove(PoolWithTag, (UINT8 *)v3, v3->BufferSize);
WmipInsertStaticNames(v13, v11, v4);
LABEL_34:
v3 = (_WNODE_HEADER *)v13;
goto LABEL_41;
}
}
}
}
else
{
v14 = v3[1].ProviderId;
HIDWORD(Number) = v14;
if( (unsigned int)v14 < v9 )
{
v15 = *(_QWORD *)(v4 + 88);
if( (v8 & 2) != 0 )
{
v16 = *(WCHAR **)(v15 + 8 * v14);
v17 = -1i64;
v18 = -1i64;
do
++v18;
while( v16[v18] );
v19 = 2 * v18 + 4;
}
else
{
v16 = (WCHAR *)(v15 + 4);
v17 = -1i64;
v20 = -1i64;
do
++v20;
while( v16[v20] );
v19 = 2 * v20 + 16;
}
LODWORD(Number) = v2;
if( WmipAlign(2ui64, &Number) )
{
v21 = (unsigned int)Number;
if( v19 <= ~(_DWORD)Number )
{
v22 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, v19 + (unsigned int)Number, 0x70696D57ui64);
v13 = (int *)v22;
if( v22 )
{
memmove(v22, (UINT8 *)v3, v3->BufferSize);
v13[12] = v21;
*v13 = v19 + v21;
v23 = (_WORD *)((char *)v13 + v21);
v24 = *(_DWORD *)(v4 + 16);
v25 = v19 - 2;
if( (v24 & 2) != 0 )
{
*v23 = v25;
RtlStringCbCopyW(v23 + 1, v25, v16);
}
else
{
if( (v24 & 0x20000) != 0 )
v13[11] |= 0x10000u;
RtlStringCbPrintfW(pszDest, 0xEui64, (WCHAR *)L"%d");
RtlStringCbCopyW(v23 + 1, v25, v16);
RtlStringCbCatW(v23 + 1, v25, pszDest);
do
++v17;
while( v23[v17 + 1] );
*v23 = 2 * (v17 + 1);
}
goto LABEL_34;
}
}
}
}
}
}
}
}
}
Flags = v3->Flags;
if( (Flags & 1) != 0 && v2 >= 0x3C )
{
v3[1].Version = 0;
}
else if( (Flags & 6) != 0 && v2 >= 0x34 )
{
v3[1].BufferSize = 0;
}
LABEL_41:
if( v4 )
WmipUnreferenceEntry((__int64)&WmipISChunkInfo, (volatile signed __int64 *)v4);
return v3;
}Referenced by:
WmipProcessEvent