WmipPrepareForWnodeAD
NTSTATUS __stdcall WmipPrepareForWnodeAD(
_WMIGUIDOBJECT *GuidObject,
_GUID *Guid,
UINT64 *ProviderIdCount,
tagInstanceSet ***ProviderIdList,
UINT8 *InternalGuid){
__int64 v5;
int v8;
bool v9;
UINT8 *v10;
tagInstanceSet **v11;
int v12;
int v13;
tagInstanceSet *v14;
tagInstanceSet *InstanceSet;
UINT64 PIMaxPtr;
tagInstanceSet **PIPtrPtr;
UINT64 PICountPtr;
v5 = *((_QWORD *)GuidObject + 7);
if( !v5 || !*(_DWORD *)(v5 + 36) )
return -1073741055;
v8 = 0;
v9 = (*(_DWORD *)(v5 + 16) & 1) == 0;
v10 = InternalGuid;
*Guid = *(_GUID *)(v5 + 72);
if( !v9 )
{
*v10 = 1;
return v8;
}
v11 = *ProviderIdList;
v12 = 0;
*v10 = 0;
v13 = *(_DWORD *)ProviderIdCount;
PIPtrPtr = v11;
LODWORD(PIMaxPtr) = v13;
LODWORD(PICountPtr) = 0;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v14 = (tagInstanceSet *)(v5 + 56);
InstanceSet = *(tagInstanceSet **)(v5 + 56);
if( InstanceSet != v14 )
{
do
{
if( v8 < 0 )
break;
if( (InstanceSet[4] & 0x89000) == 0 )
{
WmipReferenceEntry((INT64)InstanceSet);
v8 = WmipAddProviderIdToPIList(&PIPtrPtr, &PICountPtr, &PIMaxPtr, v11, InstanceSet);
}
InstanceSet = *(tagInstanceSet **)InstanceSet;
}
while( InstanceSet != v14 );
v11 = PIPtrPtr;
v12 = PICountPtr;
}
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
if( !v12 )
return -1073741055;
*(_DWORD *)ProviderIdCount = v12;
*ProviderIdList = v11;
return v8;
}Referenced by:
WmipQueryAllData