WbFreeWarbirdProcess

VOID __fastcall WbFreeWarbirdProcess(
        _DMA_ADAPTER *DmaAdapter,
        UINT64 Length,
        _LARGE_INTEGER LogicalAddress,
        VOID *VirtualAddress,
        UINT8 CacheEnabled){
  unsigned int v5; 
  unsigned int i; 
  unsigned int j; 
  _DMA_ADAPTER *v9; 
  UINT64 *v10; 
  UINT64 v11; 
  unsigned int k; 
  v5 = 0;
  if( DmaAdapter )
  {
    for( i = 0; i < HIDWORD(DmaAdapter[5].DmaOperations); ++i )
      sub_14065E6C8(
        (INT64)DmaAdapter,
        *(_QWORD *)((char *)&DmaAdapter[6].DmaOperations->Size + LODWORD(DmaAdapter[5].DmaOperations) * i));
    sub_14064F544((INT64)&DmaAdapter[5].DmaOperations);
    for( j = 0; j < HIDWORD(DmaAdapter->DmaOperations); ++j )
      sub_14065EF2C(
        (__int64)DmaAdapter,
        *(_QWORD *)((char *)&DmaAdapter[1].DmaOperations->Size + j * LODWORD(DmaAdapter->DmaOperations)));
    sub_14064F544((INT64)&DmaAdapter->DmaOperations);
    v9 = DmaAdapter + 4;
    while( 1 )
    {
      v10 = *(UINT64 **)&v9->Version;
      if( *(_DMA_ADAPTER **)(*(_QWORD *)&v9->Version + 8i64) != v9 || (v11 = *v10, *(UINT64 **)(*v10 + 8) != v10) )
        __fastfail(3u);
      *(_QWORD *)&v9->Version = v11;
      *(_QWORD *)(v11 + 8) = v9;
      if( v10 == (UINT64 *)v9 )
        break;
      sub_14065EF2C((__int64)DmaAdapter, (__int64)v10);
    }
    for( k = 0; k < HIDWORD(DmaAdapter[8].DmaOperations); ++k )
      WbFreeWarbirdEncryptionSegment(
        *(VOID **)((char *)&DmaAdapter[9].DmaOperations->Size + k * LODWORD(DmaAdapter[8].DmaOperations)),
        v10);
    sub_14064F544((INT64)&DmaAdapter[8].DmaOperations);
    if( HIDWORD(DmaAdapter[11].DmaOperations) )
    {
      do
        WbFreeMemoryBlock(*(PVOID **)((char *)&DmaAdapter[12].DmaOperations->Size
                                    + LODWORD(DmaAdapter[11].DmaOperations) * v5++));
      while( v5 < HIDWORD(DmaAdapter[11].DmaOperations) );
    }
    sub_14064F544((INT64)&DmaAdapter[11].DmaOperations);
    ExFreePoolWithTag(DmaAdapter, 0x42524157u);
  }
}

Referenced by:

sub_14065E8E4