IoWMIAllocateInstanceIds
NTSTATUS __stdcall IoWMIAllocateInstanceIds(const _GUID *Guid, UINT64 InstanceCount, UINT64 *FirstInstanceId){
VOID ***v3;
int v5;
VOID **v8;
unsigned int v9;
_QWORD *v10;
int v11;
__int64 v12;
VOID **PoolWithTag;
VOID **v14;
_GUID v15;
v3 = 0i64;
v5 = InstanceCount;
if( !*(&ExBootDevicesRemovedEvent + 391) )
return -1073741823;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 3072, 0, 0, 0, 0i64);
v8 = (VOID **)*(&ExBootDevicesRemovedEvent + 437);
LABEL_11:
if( v8 )
{
v9 = 0;
v10 = v8 + 1;
while( 1 )
{
v11 = *((_DWORD *)v10 + 4);
if( v11 == -1 )
break;
v12 = *(_QWORD *)&Guid->Data1 - *v10;
if( *(_QWORD *)&Guid->Data1 == *v10 )
v12 = *(_QWORD *)Guid->Data4 - v10[1];
if( !v12 )
{
*(_DWORD *)FirstInstanceId = v11;
*((_DWORD *)v10 + 4) += v5;
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
return 0;
}
++v9;
v10 = (_QWORD *)((char *)v10 + 20);
if( v9 >= 8 )
{
v3 = (VOID ***)v8;
v8 = (VOID **)*v8;
goto LABEL_11;
}
}
}
else
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0xA8ui64, 1768516951i64);
v14 = PoolWithTag;
if( !PoolWithTag )
{
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
return -1073741670;
}
memset(PoolWithTag + 1, 255i64, 0xA0u);
*v14 = 0i64;
if( v3 )
*v3 = v14;
else
*(&ExBootDevicesRemovedEvent + 437) = v14;
v10 = v14 + 1;
}
v15 = *Guid;
*((_DWORD *)v10 + 4) = v5;
*(_GUID *)v10 = v15;
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 3072), 0);
*(_DWORD *)FirstInstanceId = 0;
return 0;
}Referenced by:
No references.