WmipSendEnableDisableRequest
__int64 __fastcall WmipSendEnableDisableRequest(unsigned __int8 a1, __int64 a2, char a3){
int v6;
bool v7;
__int64 v8;
__int64 v9;
int v10;
char *PoolWithTag;
__int64 *i;
int v13;
__int64 v14;
int v15;
UINT64 v16;
int v17;
__int128 v18;
__int64 v19;
char *v20;
volatile signed __int64 *v21;
bool v23;
IO_STATUS_BLOCK Iosb;
__int128 Buffer[3];
char P[512];
memset((INT64)P, 0i64);
v6 = *(_DWORD *)(a2 + 16);
memset(Buffer, 0, sizeof(Buffer));
if( (v6 & 1) != 0 )
return 0i64;
v7 = ((a1 - 4) & 0xFD) == 0;
v8 = *(unsigned int *)(a2 + 36);
v23 = v7;
v9 = 0i64;
v10 = a3 != 0 ? 0x2000 : 0x4000;
if( (unsigned int)v8 > 0x40 )
{
PoolWithTag = (char *)ExAllocatePoolWithTag(PagedPool, 8 * v8, 0x70696D57ui64);
if( !PoolWithTag )
return 3221225626i64;
v7 = ((a1 - 4) & 0xFD) == 0;
}
else
{
PoolWithTag = P;
}
for( i = *(__int64 **)(a2 + 56); i != (__int64 *)(a2 + 56) && (unsigned int)v9 < *(_DWORD *)(a2 + 36); i = (__int64 *)*i )
{
v13 = *((_DWORD *)i + 4);
if( (v13 & 0x1000) == 0 && (a3 || (v13 & 4) != 0) )
{
v14 = i[8];
if( (*(_DWORD *)(v14 + 16) & 0x20000000) == 0 )
{
v15 = v13 & v10;
if( v7 )
{
if( !v15 )
goto LABEL_13;
}
else if( v15 )
{
LABEL_13:
v16 = i[8];
*(_QWORD *)&PoolWithTag[8 * v9] = v14;
WmipReferenceEntry(v16);
v13 = *((_DWORD *)i + 4);
v9 = (unsigned int)(v9 + 1);
v7 = v23;
}
if( v7 )
v17 = v13 | v10;
else
v17 = v13 & ~v10;
*((_DWORD *)i + 4) = v17;
continue;
}
}
}
KeReleaseMutex(&WmipSMMutex, 0);
if( (_DWORD)v9 )
{
memset((char *)Buffer + 4, 0, 20);
*((_QWORD *)&Buffer[2] + 1) = 0i64;
v18 = *(_OWORD *)(a2 + 72);
v19 = (unsigned int)v9;
v20 = PoolWithTag;
*(__int128 *)((char *)&Buffer[1] + 8) = v18;
LODWORD(Buffer[0]) = 48;
do
{
v21 = *(volatile signed __int64 **)v20;
WmipSendWmiIrp(a1, *(unsigned int *)(*(_QWORD *)v20 + 56i64), (char *)&Buffer[1] + 8, 0x30ui64, Buffer, &Iosb);
WmipUnreferenceEntry((__int64)&WmipDSChunkInfo, v21);
v20 += 8;
--v19;
}
while( v19 );
}
if( PoolWithTag != P )
ExFreePoolWithTag(PoolWithTag, 0);
KeWaitForSingleObject(&WmipSMMutex, Executive, 0, 0, 0i64);
return 0i64;
}Referenced by:
WmipDoDisableRequest
WmipSendEnableRequest