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.