WmipPrepareWnodeSI
NTSTATUS __stdcall WmipPrepareWnodeSI(
_WMIGUIDOBJECT *GuidObject,
tagWNODE_SINGLE_INSTANCE *WnodeSI,
UINT64 *ProviderIdCount,
VOID **ProviderIdList,
_BYTE *IsDynamic,
_BYTE *InternalGuid){
tagInstanceSet **v7;
__int64 v8;
tagInstanceSet **v9;
__int64 v10;
int v11;
wchar_t *v12;
__int64 v13;
INT64 v14;
int v15;
_DWORD *v17;
unsigned __int64 v18;
unsigned int v19;
const wchar_t *v20;
unsigned __int64 v21;
wchar_t *v22;
unsigned int v23;
_BYTE *v24;
ULONG v25;
__int64 v26;
_BYTE *v27;
volatile signed __int64 **v28;
wchar_t *Str1;
UINT64 PICountPtr;
tagInstanceSet **StaticPIPtr;
UINT64 PIMaxPtr;
tagInstanceSet **PIPtrPtr;
_BYTE *v34;
UINT64 *v35;
tagInstanceSet ***v36;
__int64 v37;
WCHAR pszDest[8];
v35 = ProviderIdCount;
v36 = (tagInstanceSet ***)ProviderIdList;
v7 = 0i64;
v8 = 0i64;
v9 = 0i64;
v34 = IsDynamic;
StaticPIPtr = 0i64;
*IsDynamic = 1;
v10 = *((_QWORD *)GuidObject + 7);
LODWORD(PICountPtr) = 0;
if( !v10 || !*(_DWORD *)(v10 + 36) )
return -1073741055;
v11 = 0;
WnodeSI->WnodeHeader.Guid = *(GUID *)(v10 + 72);
if( (*(_DWORD *)(v10 + 16) & 1) != 0 )
{
*InternalGuid = 1;
}
else
{
*InternalGuid = 0;
Str1 = WmipCountedToSz((WCHAR *)((char *)WnodeSI + WnodeSI->OffsetInstanceName));
v12 = Str1;
if( Str1 )
{
StaticPIPtr = *v36;
v7 = StaticPIPtr;
PIPtrPtr = StaticPIPtr;
LODWORD(PIMaxPtr) = *(_DWORD *)v35;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( *(_DWORD *)(v10 + 36) )
{
v13 = v10 + 56;
v14 = *(_QWORD *)(v10 + 56);
v37 = v13;
if( v14 != v13 )
{
do
{
if( (_BYTE)v9 )
break;
v15 = *(_DWORD *)(v14 + 16);
if( (v15 & 0x89000) == 0 )
{
if( (v15 & 1) != 0 )
{
v17 = *(_DWORD **)(v14 + 88);
v18 = -1i64;
v19 = *v17;
v20 = (const wchar_t *)(v17 + 1);
do
++v18;
while( v20[v18] );
v21 = -1i64;
do
++v21;
while( Str1[v21] );
if( v21 <= v18 || wcsnicmp(Str1, v20, v18) )
{
v12 = Str1;
}
else
{
v22 = &Str1[v18];
v23 = wtoi(v22);
if( WmipIsNumber(v22) )
{
if( v23 >= v19 && v23 < v19 + *(_DWORD *)(v14 + 72) && v23 < 0xF423F )
{
RtlStringCbPrintfW(pszDest, 0xEui64, (WCHAR *)L"%d");
if( !wcsicmp(pszDest, v22) )
{
WnodeSI->WnodeHeader.Flags |= 0x80u;
LOBYTE(v9) = 1;
WnodeSI->WnodeHeader.ProviderId = *(_DWORD *)(v14 + 80);
v24 = v34;
WnodeSI->InstanceIndex = v23 - v19;
*v24 = 0;
}
}
}
v12 = Str1;
}
}
else if( (v15 & 2) != 0 )
{
v25 = 0;
v26 = *(_QWORD *)(v14 + 88);
if( *(_DWORD *)(v14 + 72) )
{
while( wcsicmp(*(const wchar_t **)(v26 + 8i64 * v25), v12) )
{
if( ++v25 >= *(_DWORD *)(v14 + 72) )
goto LABEL_13;
}
WnodeSI->WnodeHeader.Flags |= 0x80u;
LOBYTE(v9) = 1;
WnodeSI->WnodeHeader.ProviderId = *(_DWORD *)(v14 + 80);
v27 = v34;
WnodeSI->InstanceIndex = v25;
*v27 = 0;
}
}
else
{
WmipReferenceEntry(v14);
v11 = WmipAddProviderIdToPIList(&PIPtrPtr, &PICountPtr, &PIMaxPtr, StaticPIPtr, (tagInstanceSet *)v14);
if( v11 < 0 )
LOBYTE(v9) = 1;
}
}
LABEL_13:
v14 = *(_QWORD *)v14;
}
while( v14 != v37 );
v7 = PIPtrPtr;
v8 = (unsigned int)PICountPtr;
}
}
else
{
v11 = -1073741055;
}
ExFreePoolWithTag(v12, 0);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
v9 = StaticPIPtr;
}
else
{
v11 = -1073741670;
}
if( *v34 )
{
*(_DWORD *)v35 = v8;
*v36 = v7;
}
else if( v7 )
{
if( (_DWORD)v8 )
{
v28 = (volatile signed __int64 **)v7;
do
{
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4496, *v28++);
--v8;
}
while( v8 );
v9 = StaticPIPtr;
}
if( v7 != v9 )
ExFreePoolWithTag(v7, 0);
}
}
return v11;
}Referenced by:
WmipQuerySetExecuteSI