HalpDmaProcessMapRegisterQueueV2

VOID __stdcall HalpDmaProcessMapRegisterQueueV2(_HALP_DMA_MASTER_ADAPTER_OBJECT *MasterAdapter, INT64 ScatterGather){
  char v2; 
  _ADAPTER_OBJECT *v4; 
  _ADAPTER_OBJECT *v5; 
  _WAIT_CONTEXT_BLOCK *CurrentWcb; 
  _HALP_DMA_TRANSLATION_ENTRY *MapRegisters; 
  int v8; 
  UINT64 NumberOfMapRegisters; 

  v2 = ScatterGather;
  while( 1 )
  {
    LOBYTE(ScatterGather) = v2;
    v4 = (_ADAPTER_OBJECT *)HalpDmaDequeueAdapter(MasterAdapter, ScatterGather);
    v5 = v4;
    if( !v4 )
      break;
    CurrentWcb = v4->CurrentWcb;
    MapRegisters = HalpDmaAllocateMapRegisters(v4, v4->NumberOfMapRegisters);
    v5->MapRegisterBase = MapRegisters;
    if( !MapRegisters )
    {
      HalpDmaQueueAdapter(v5);
      HalpQueueMapBufferWorker(v5, v5->NumberOfMapRegisters);
      return;
    }
    v8 = CurrentWcb->DeviceRoutine(
           (_DEVICE_OBJECT *)CurrentWcb->DeviceObject,
           (_IRP *)CurrentWcb->CurrentIrp,
           MapRegisters,
           CurrentWcb->DeviceContext);
    if( v8 == 3 )
    {
      v5->NumberOfMapRegisters = 0;
      v8 = 2;
    }
    if( v8 == 2 )
    {
      NumberOfMapRegisters = v5->NumberOfMapRegisters;
      if( (_DWORD)NumberOfMapRegisters )
      {
        HalpDmaFreeMapRegisters(v5, (_HALP_DMA_TRANSLATION_ENTRY *)v5->MapRegisterBase, NumberOfMapRegisters);
        v5->NumberOfMapRegisters = 0;
      }
      IoFreeAdapterChannel(&v5->AdapterObject.DmaHeader);
    }
  }
}

Referenced by:

HalpGrowMapBufferWorker
IoFreeMapRegistersV2