EmProviderDeregister
VOID __stdcall EmProviderDeregister(PVOID ProviderHandle){
unsigned int i;
_QWORD *v3;
__int64 v4;
_QWORD *v5;
__int64 j;
_QWORD *k;
_QWORD *v8;
_QWORD *v9;
__int64 m;
_QWORD *n;
void *v12;
if( ProviderHandle )
{
ExAcquirePushLockExclusiveEx((UINT64)&EmpDatabaseLock, 0i64);
if( *((_QWORD *)ProviderHandle + 3) )
{
for( i = 0; i < *((_DWORD *)ProviderHandle + 8); *(_QWORD *)(v4 + 8) = v5 )
{
v3 = (_QWORD *)(32i64 * i + *((_QWORD *)ProviderHandle + 3) + 16i64);
v4 = *v3;
if( *(_QWORD **)(*v3 + 8i64) != v3 || (v5 = (_QWORD *)v3[1], (_QWORD *)*v5 != v3) )
__fastfail(3u);
*v5 = v4;
++i;
}
ExFreePoolWithTag(*((PVOID *)ProviderHandle + 3), 0x72704D45u);
}
for( j = 0i64; (unsigned int)j < *((_DWORD *)ProviderHandle + 4); j = (unsigned int)(j + 1) )
{
if( _InterlockedExchangeAdd(
(volatile signed __int32 *)(*(_QWORD *)(*((_QWORD *)ProviderHandle + 1) + 8 * j) + 16i64),
0xFFFFFFFF) == 1 )
{
for( k = *(_QWORD **)(*(_QWORD *)(*((_QWORD *)ProviderHandle + 1) + 8 * j) + 72i64); k; k = (_QWORD *)*k )
EmpQueueRuleUpdateState(*(k - 1), 0i64);
}
}
v8 = (_QWORD *)*((_QWORD *)ProviderHandle + 7);
while( v8 != (_QWORD *)((char *)ProviderHandle + 56) )
{
v9 = v8 - 5;
v8 = (_QWORD *)*v8;
EmpProviderDeregisterEntry(v9);
}
for( m = 0i64; (unsigned int)m < *((_DWORD *)ProviderHandle + 12); m = (unsigned int)(m + 1) )
{
if( _InterlockedExchangeAdd(
(volatile signed __int32 *)(*(_QWORD *)(*((_QWORD *)ProviderHandle + 5) + 8 * m) + 24i64),
0xFFFFFFFF) == 1 )
{
*(_QWORD *)(*(_QWORD *)(*((_QWORD *)ProviderHandle + 5) + 8 * m) + 16i64) = 0i64;
for( n = *(_QWORD **)(*(_QWORD *)(*((_QWORD *)ProviderHandle + 5) + 8 * m) + 48i64); n; n = (_QWORD *)*n )
EmpQueueRuleUpdateState(*(n - 1), 0i64);
}
}
if( *(_QWORD *)ProviderHandle )
HalPutDmaAdapter(*(PADAPTER_OBJECT *)ProviderHandle);
v12 = (void *)*((_QWORD *)ProviderHandle + 5);
if( v12 )
ExFreePoolWithTag(v12, 0x72704D45u);
ExFreePoolWithTag(ProviderHandle, 0x72704D45u);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&EmpDatabaseLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&EmpDatabaseLock);
KeAbPostRelease(&EmpDatabaseLock);
}
}Referenced by:
No references.