VfPutDmaAdapter

VOID __stdcall VfPutDmaAdapter(_DMA_ADAPTER *DmaAdapter){
  void(__fastcall *RealDmaOperation)(_DMA_ADAPTER *); 
  char v3; 
  _KIRQL v4; 
  UINT64 Param3; 
  char v6; 
  char v7; 
  int v8; 
  int v9; 
  int v10; 
  int v11; 
  int v12; 
  UINT64 v13; 
  UINT64 v14; 
  __int64 v15; 
  _QWORD *v16; 
  UINT64 v17; 

  VF_ASSERT_MAX_IRQL((UINT8)DmaAdapter);
  RealDmaOperation = (void(__fastcall *)(_DMA_ADAPTER *))ViGetRealDmaOperation((ULONG_PTR)DmaAdapter, 8ui64);
  if( RealDmaOperation )
  {
    v3 = KeAcquireSpinLockRaiseToDpc(&qword_140D49088);
    Param3 = ViAdapterList;
    v6 = 0;
    v7 = v3;
    v8 = 0;
    while( &ViAdapterList != (UINT64 *)Param3 )
    {
      if( DmaAdapter == *(_DMA_ADAPTER **)(Param3 + 16) )
      {
        v8 = _InterlockedDecrement((volatile signed __int32 *)(Param3 + 36));
        if( v8 < 0 )
        {
          ViHalPreprocessOptions(
            &unk_140C12D28,
            (PSTR)"Driver has attempted to access an adapter(%p) that has already been released.",
            0x18ui64,
            (UINT64)DmaAdapter,
            Param3,
            0i64,
            v17);
          VfReportIssueWithOptions(0xE6ui64, 0x18u, (ULONG_PTR)DmaAdapter, Param3, 0, &unk_140C12D28);
        }
        ViFlushZeroMapRegisterBaseWcbs((_ADAPTER_INFORMATION *)Param3);
        v9 = *(_DWORD *)(Param3 + 180);
        v10 = *(_DWORD *)(Param3 + 184);
        if( v9 != v10 )
        {
          ViHalPreprocessOptions(
            (UINT64 *)((char *)&qword_140C12D2C + 4),
            (PSTR)"Cannot put adapter %p until all adapter channels are freed(%x left).",
            8ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(v9 - v10),
            Param3,
            v17);
          VfReportIssueWithOptions(
            0xE6ui64,
            8u,
            (ULONG_PTR)DmaAdapter,
            *(_DWORD *)(Param3 + 180) - *(_DWORD *)(Param3 + 184),
            Param3,
            (UINT64 *)((char *)&qword_140C12D2C + 4));
        }
        v11 = *(_DWORD *)(Param3 + 172);
        v12 = *(_DWORD *)(Param3 + 176);
        if( v11 != v12 )
        {
          ViHalPreprocessOptions(
            &qword_140C12D2C,
            (PSTR)"Cannot put adapter %p until all common buffers are freed(%x left).",
            7ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(v11 - v12),
            Param3,
            v17);
          VfReportIssueWithOptions(
            0xE6ui64,
            7u,
            (ULONG_PTR)DmaAdapter,
            *(_DWORD *)(Param3 + 172) - *(_DWORD *)(Param3 + 176),
            Param3,
            &qword_140C12D2C);
        }
        v13 = *(int *)(Param3 + 160);
        if( (_DWORD)v13 )
        {
          ViHalPreprocessOptions(
            &qword_140C12D20,
            (PSTR)"Cannot put adapter %p until all map registers are freed(%x left).",
            9ui64,
            (UINT64)DmaAdapter,
            v13,
            Param3,
            v17);
          VfReportIssueWithOptions(
            0xE6ui64,
            9u,
            (ULONG_PTR)DmaAdapter,
            *(_DWORD *)(Param3 + 160),
            Param3,
            &qword_140C12D20);
        }
        v14 = *(int *)(Param3 + 168);
        if( (_DWORD)v14 )
        {
          ViHalPreprocessOptions(
            (UINT64 *)((char *)&qword_140C12D18 + 4),
            (PSTR)"Cannot put adapter %p until all scatter gather lists are freed(%x left).",
            0xAui64,
            (UINT64)DmaAdapter,
            v14,
            Param3,
            v17);
          VfReportIssueWithOptions(
            0xE6ui64,
            0xAu,
            (ULONG_PTR)DmaAdapter,
            *(_DWORD *)(Param3 + 168),
            Param3,
            (UINT64 *)((char *)&qword_140C12D18 + 4));
        }
        if( *(_QWORD *)(Param3 + 24) && !*(_BYTE *)(Param3 + 34) )
        {
          if( !*(_BYTE *)(Param3 + 35) )
          {
            Param3 = 0i64;
            break;
          }
          v6 = 1;
          if( v8 > 0 )
            break;
        }
        v15 = *(_QWORD *)Param3;
        if( *(_QWORD *)(*(_QWORD *)Param3 + 8i64) != Param3 || (v16 = *(_QWORD **)(Param3 + 8), *v16 != Param3) )
          __fastfail(3u);
        *v16 = v15;
        *(_QWORD *)(v15 + 8) = v16;
        break;
      }
      Param3 = *(_QWORD *)Param3;
    }
    LOBYTE(v4) = v7;
    KeReleaseSpinLock(&qword_140D49088, v4);
    if( Param3 && !v6 )
      ViReleaseDmaAdapter((_ADAPTER_INFORMATION *)Param3);
    RealDmaOperation(DmaAdapter);
    if( Param3 && v6 && v8 <= 0 )
      ViReleaseDmaAdapter((_ADAPTER_INFORMATION *)Param3);
  }
}

Referenced by:

No references.