WmipOpenBlock
__int64 __fastcall WmipOpenBlock(int a1, __int64 a2, __int64 a3, DWORD a4, PADAPTER_OBJECT *a5){
unsigned __int64 v5;
char v6;
__int64 v8;
int v9;
char *v10;
_QWORD *GEByGuid;
_QWORD *v12;
_QWORD *v13;
_QWORD *v15;
_QWORD *v16;
__int64 v17;
_QWORD *v18;
_QWORD *v19;
void *DmaAdapter[5];
DmaAdapter[0] = 0i64;
v5 = (unsigned int)(a1 - 2244872);
v6 = a2;
if( (unsigned int)v5 > 0x38 )
return(unsigned int)-1073741649;
v8 = 0x110000000000001i64;
if( !_bittest64(&v8, v5) )
return(unsigned int)-1073741649;
v9 = WmipOpenGuidObject(a3, a2, a4, DmaAdapter);
if( v9 >= 0 )
{
v10 = (char *)DmaAdapter[0];
*((_DWORD *)DmaAdapter[0] + 16) = a1;
if( a1 == 2244872 )
{
*((_DWORD *)v10 + 41) |= 1u;
}
else
{
GEByGuid = WmipFindGEByGuid((_QWORD *)v10 + 3, 0);
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
if( GEByGuid )
{
v12 = (_QWORD *)GEByGuid[6];
v13 = v10 + 40;
if( (_QWORD *)*v12 != GEByGuid + 5 )
goto LABEL_28;
*v13 = GEByGuid + 5;
*((_QWORD *)v10 + 6) = v12;
*v12 = v13;
GEByGuid[6] = v13;
}
*((_QWORD *)v10 + 7) = GEByGuid;
KeReleaseMutex(&WmipSMMutex, 0);
if( a1 == 2244924 )
{
if( !GEByGuid || *((_DWORD *)GEByGuid + 9) == a1 - 2244924 || !WmipIsQuerySetGuid((__int64)GEByGuid) )
{
v9 = -1073741163;
goto LABEL_17;
}
LABEL_12:
if( !v6 )
*((_DWORD *)v10 + 41) |= 2u;
if( GEByGuid )
{
LABEL_15:
v9 = WmipEnableCollectOrEvent((ULONG_PTR)GEByGuid, a1, v10 + 160);
if( v9 < 0 )
goto LABEL_17;
goto LABEL_16;
}
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
v15 = WmipAllocGuidEntry();
GEByGuid = v15;
if( v15 )
{
*(_OWORD *)(v15 + 9) = *(_OWORD *)(v10 + 24);
v16 = (_QWORD *)WmipGEHeadPtr;
v17 = *(_QWORD *)WmipGEHeadPtr;
if( *(_QWORD *)(*(_QWORD *)WmipGEHeadPtr + 8i64) == WmipGEHeadPtr )
{
*GEByGuid = v17;
GEByGuid[1] = v16;
*(_QWORD *)(v17 + 8) = GEByGuid;
*v16 = GEByGuid;
v18 = v10 + 40;
v19 = (_QWORD *)GEByGuid[6];
if( (_QWORD *)*v19 == GEByGuid + 5 )
{
*v18 = GEByGuid + 5;
*((_QWORD *)v10 + 6) = v19;
*v19 = v18;
GEByGuid[6] = v18;
*((_QWORD *)v10 + 7) = GEByGuid;
KeReleaseMutex(&WmipSMMutex, 0);
goto LABEL_15;
}
}
LABEL_28:
__fastfail(3u);
}
KeReleaseMutex(&WmipSMMutex, 0);
v9 = -1073741670;
LABEL_17:
if( v10 )
HalPutDmaAdapter((PADAPTER_OBJECT)v10);
return(unsigned int)v9;
}
if( a1 == 2244928 )
goto LABEL_12;
}
LABEL_16:
*a5 = (PADAPTER_OBJECT)v10;
v10 = 0i64;
v9 = 0;
goto LABEL_17;
}
return(unsigned int)v9;
}Referenced by:
IoWMIOpenBlock
WmipIoControl