WmipDisableCollectionForRemovedGuid
VOID __stdcall WmipDisableCollectionForRemovedGuid(const _GUID *Guid, tagInstanceSet *InstanceSet){
tagGUIDENTRY *GEByGuid;
__int64 v5;
__int64 v6;
_IO_STATUS_BLOCK Iosb;
_LARGE_INTEGER Timeout[6];
memset(Timeout, 0, sizeof(Timeout));
GEByGuid = WmipFindGEByGuid((_GUID *)Guid, 0);
if( GEByGuid )
{
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( GEByGuid[22] && (InstanceSet[4] & 0x82000) == 0x2000 )
{
InstanceSet[4] &= ~0x2000u;
GEByGuid[4] |= 2u;
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
v5 = *((_QWORD *)InstanceSet + 8);
Timeout[5].QuadPart = 0i64;
memset((char *)&Timeout[0].QuadPart + 4, 0, 20);
Timeout[0].anonymous_0.LowPart = 48;
*(_GUID *)&Timeout[3].anonymous_0.LowPart = *Guid;
WmipSendWmiIrp(5u, *(unsigned int *)(v5 + 56), &Timeout[3], 0x30ui64, Timeout, &Iosb);
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( GEByGuid[22] )
GEByGuid[4] &= ~2u;
else
WmipDoDisableRequest(GEByGuid, 1u, 2ui64);
}
if( GEByGuid[23] && (InstanceSet[4] & 0x4000) != 0 )
{
GEByGuid[4] |= 4u;
InstanceSet[4] &= ~0x4000u;
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
v6 = *((_QWORD *)InstanceSet + 8);
Timeout[5].QuadPart = 0i64;
memset((char *)&Timeout[0].QuadPart + 4, 0, 20);
Timeout[0].anonymous_0.LowPart = 48;
*(_GUID *)&Timeout[3].anonymous_0.LowPart = *Guid;
WmipSendWmiIrp(7u, *(unsigned int *)(v6 + 56), &Timeout[3], 0x30ui64, Timeout, &Iosb);
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
if( GEByGuid[23] )
{
GEByGuid[4] &= ~4u;
WmipReleaseCollectionEnabled(GEByGuid);
}
else
{
WmipDoDisableRequest(GEByGuid, 0, 4ui64);
}
}
WmipUnreferenceEntry((__int64)&stru_140C00F40 + 4528, (volatile signed __int64 *)GEByGuid);
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
}
}Referenced by:
WmipGenerateRegistrationNotification
WmipUpdateDataSource