WmipInsertMofResource
NTSTATUS __stdcall WmipInsertMofResource(tagDATASOURCE *DataSource, ULONG_PTR MofResource){
NTSTATUS v2;
__int64 v4;
INT64 v5;
unsigned int v6;
__int64 v7;
__int64 v8;
tagDATASOURCE v10;
__int64 v11;
size_t v12;
unsigned __int64 v13;
size_t v14;
VOID **PoolWithTag;
VOID **v16;
tagDATASOURCE *v17;
v2 = 0;
v4 = (unsigned int)DataSource[16];
v5 = *(_QWORD *)&MofResource;
v6 = 0;
if( (_DWORD)v4 )
{
v7 = *((_QWORD *)DataSource + 9);
while( 1 )
{
v8 = *(_QWORD *)(v7 + 8i64 * v6);
if( v8 == *(_QWORD *)&MofResource )
break;
if( !v8 )
{
*(_QWORD *)(v7 + 8i64 * v6) = *(_QWORD *)&MofResource;
goto LABEL_6;
}
if( ++v6 >= (unsigned int)v4 )
goto LABEL_6;
}
}
else
{
LABEL_6:
if( v6 == (_DWORD)v4 )
{
v10 = v4 + 4;
v17 = (tagDATASOURCE *)*((_QWORD *)DataSource + 9);
v11 = v4;
v12 = -1;
if( (unsigned __int64)(8 * v4) <= 0xFFFFFFFF )
v12 = 8 * v4;
v13 = 8i64 * (unsigned int)(v4 + 4);
if( v13 > 0xFFFFFFFF )
return -1073741675;
v14 = 8 * (v4 + 4);
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)v13, 1885957463i64);
v16 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v14);
memmove(v16, *((const VOID **)DataSource + 9), v12);
if( v17 != DataSource + 20 )
ExFreePoolWithTag(*((PVOID *)DataSource + 9), 0);
*((_QWORD *)DataSource + 9) = v16;
v16[v11] = (VOID *)v5;
DataSource[16] = v10;
}
WmipReferenceEntry(v5);
}
return v2;
}Referenced by:
WmipAddMofResource