VfPutDmaAdapter

VOID __fastcall VfPutDmaAdapter(_DMA_ADAPTER *DmaAdapter){
  void(__fastcall *v2)(_DMA_ADAPTER *); 
  UINT64 v3; 
  void(__fastcall *v4)(_DMA_ADAPTER *); 
  _LIST_ENTRY *Param3; 
  char v6; 
  UINT8 v7; 
  UINT8 v8; 
  int v9; 
  int Flink_high; 
  int Blink; 
  int Blink_high; 
  int Flink; 
  UINT64 Flink_low; 
  UINT64 Blink_low; 
  _LIST_ENTRY *v16; 
  _LIST_ENTRY *v17; 
  UINT64 v18; 
  UINT64 v19; 
  UINT64 v20; 
  VF_ASSERT_MAX_IRQL((UINT8)DmaAdapter);
  LODWORD(v2) = ViGetRealDmaOperation(DmaAdapter, 8ui64);
  v4 = v2;
  if( v2 )
  {
    KeAcquireSpinLockRaiseToDpc(&qword_140D49088, v3);
    Param3 = ViAdapterList.Flink;
    v6 = 0;
    v8 = v7;
    v9 = 0;
    while( &ViAdapterList != Param3 )
    {
      if( DmaAdapter == (_DMA_ADAPTER *)Param3[1].Flink )
      {
        v9 = _InterlockedDecrement((volatile signed __int32 *)&Param3[2].Flink + 1);
        if( v9 < 0 )
        {
          ViHalPreprocessOptions(
            &byte_140C12D28,
            (PSTR)"Driver has attempted to access an adapter(%p) that has already been released.",
            0x18ui64,
            (UINT64)DmaAdapter,
            (UINT64)Param3,
            0i64,
            v20);
          VfReportIssueWithOptions(0xE6ui64, 0x18ui64, (UINT64)DmaAdapter, (UINT64)Param3, 0i64, &byte_140C12D28);
        }
        ViFlushZeroMapRegisterBaseWcbs((INT64)Param3);
        Flink_high = HIDWORD(Param3[11].Flink);
        Blink = (int)Param3[11].Blink;
        if( Flink_high != Blink )
        {
          ViHalPreprocessOptions(
            &byte_140C12D30,
            (PSTR)"Cannot put adapter %p until all adapter channels are freed(%x left).",
            8ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(Flink_high - Blink),
            (UINT64)Param3,
            v20);
          VfReportIssueWithOptions(
            0xE6ui64,
            8ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(HIDWORD(Param3[11].Flink) - LODWORD(Param3[11].Blink)),
            (UINT64)Param3,
            &byte_140C12D30);
        }
        Blink_high = HIDWORD(Param3[10].Blink);
        Flink = (int)Param3[11].Flink;
        if( Blink_high != Flink )
        {
          ViHalPreprocessOptions(
            &dword_140C12D2C,
            (PSTR)"Cannot put adapter %p until all common buffers are freed(%x left).",
            7ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(Blink_high - Flink),
            (UINT64)Param3,
            v20);
          VfReportIssueWithOptions(
            0xE6ui64,
            7ui64,
            (UINT64)DmaAdapter,
            (unsigned int)(HIDWORD(Param3[10].Blink) - LODWORD(Param3[11].Flink)),
            (UINT64)Param3,
            &dword_140C12D2C);
        }
        Flink_low = SLODWORD(Param3[10].Flink);
        if( (_DWORD)Flink_low )
        {
          ViHalPreprocessOptions(
            &byte_140C12D20,
            (PSTR)"Cannot put adapter %p until all map registers are freed(%x left).",
            9ui64,
            (UINT64)DmaAdapter,
            Flink_low,
            (UINT64)Param3,
            v20);
          VfReportIssueWithOptions(
            0xE6ui64,
            9ui64,
            (UINT64)DmaAdapter,
            SLODWORD(Param3[10].Flink),
            (UINT64)Param3,
            &byte_140C12D20);
        }
        Blink_low = SLODWORD(Param3[10].Blink);
        if( (_DWORD)Blink_low )
        {
          ViHalPreprocessOptions(
            &dword_140C12D1C,
            (PSTR)"Cannot put adapter %p until all scatter gather lists are freed(%x left).",
            0xAui64,
            (UINT64)DmaAdapter,
            Blink_low,
            (UINT64)Param3,
            v20);
          VfReportIssueWithOptions(
            0xE6ui64,
            0xAui64,
            (UINT64)DmaAdapter,
            SLODWORD(Param3[10].Blink),
            (UINT64)Param3,
            &dword_140C12D1C);
        }
        if( Param3[1].Blink && !BYTE2(Param3[2].Flink) )
        {
          if( !BYTE3(Param3[2].Flink) )
          {
            Param3 = 0i64;
            break;
          }
          v6 = 1;
          if( v9 > 0 )
            break;
        }
        v16 = Param3->Flink;
        if( Param3->Flink->Blink != Param3 || (v17 = Param3->Blink, v17->Flink != Param3) )
          __fastfail(3u);
        v17->Flink = v16;
        v16->Blink = v17;
        break;
      }
      Param3 = Param3->Flink;
    }
    KeReleaseSpinLock(&qword_140D49088, v8);
    if( Param3 && !v6 )
      ViReleaseDmaAdapter((__int64)Param3, v18);
    v4(DmaAdapter);
    if( Param3 && v6 && v9 <= 0 )
      ViReleaseDmaAdapter((__int64)Param3, v19);
  }
}

Referenced by:

No references.