HalBuildMdlFromScatterGatherListV2

NTSTATUS __stdcall HalBuildMdlFromScatterGatherListV2(
        _ADAPTER_OBJECT *AdapterObject,
        _SCATTER_GATHER_LIST *ScatterGather,
        _MDL *OriginalMdl,
        _MDL **TargetMdl){
  unsigned __int64 Reserved; 
  unsigned int NumberOfElements; 
  _SCATTER_GATHER_ELEMENT *Elements; 
  unsigned int v9; 
  _MDL *v10; 
  _MDL *v11; 
  int v12; 
  unsigned int v13; 
  UINT64 v14; 
  char v15; 
  _SCATTER_GATHER_ELEMENT *v16; 
  ULONG LowPart; 
  unsigned int v18; 
  unsigned int v19; 
  _MDL *Mdl; 
  _MDL *v21; 
  _MDL *Next; 
  _MDL *v23; 
  int v24; 
  _MDL *v25; 
  char v26; 
  __int64 v27; 
  _LARGE_INTEGER Address; 
  __int64 Length; 
  _MDL *v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  unsigned int v33; 
  ULONG v34; 
  unsigned int v35; 
  unsigned int v36; 

  if( !OriginalMdl )
    return -1073741811;
  if( !AdapterObject->NeedsMapRegisters && AdapterObject->CacheCoherent )
  {
    *TargetMdl = OriginalMdl;
    return 0;
  }
  Reserved = ScatterGather->Reserved;
  if( Reserved && *(_QWORD *)(Reserved + 16) )
    return -1073741709;
  NumberOfElements = ScatterGather->NumberOfElements;
  Elements = ScatterGather->Elements;
  v9 = 0;
  v33 = NumberOfElements;
  v10 = 0i64;
  v36 = 0;
  v11 = 0i64;
  v12 = 0;
  v13 = 0;
  v14 = 0i64;
  v15 = 1;
  v16 = ScatterGather->Elements;
  if( !NumberOfElements )
  {
LABEL_30:
    v23 = v10 + 1;
    v24 = 0;
    v25 = v10;
    v26 = 1;
    if( ScatterGather->NumberOfElements )
    {
      v27 = ScatterGather->NumberOfElements;
      do
      {
        Address = Elements->Address;
        Length = Elements->Length;
        if( !v26 && (v24 || (Address.anonymous_0.LowPart & 0xFFF) != 0) )
        {
          v25 = v25->Next;
          v23 = v25 + 1;
        }
        v30 = (_MDL *)((unsigned __int64)Address.QuadPart >> 12);
        v31 = ((Elements->Address.QuadPart & 0xFFFui64) + Length + 4095) >> 12;
        if( (_DWORD)v31 )
        {
          v32 = (unsigned int)v31;
          do
          {
            v23->Next = v30;
            v23 = (_MDL *)((char *)v23 + 8);
            v30 = (_MDL *)((char *)v30 + 1);
            --v32;
          }
          while( v32 );
        }
        v26 = 0;
        v24 = (LOWORD(Address.anonymous_0.LowPart) + (_WORD)Length) & 0xFFF;
        ++Elements;
        --v27;
      }
      while( v27 );
    }
    *TargetMdl = v10;
    if( Reserved )
      *(_QWORD *)(Reserved + 16) = v10;
    return 0;
  }
  do
  {
    LowPart = v16->Address.anonymous_0.LowPart;
    v18 = v16->Length;
    v19 = v16->Address.anonymous_0.LowPart & 0xFFF;
    v35 = v18;
    v34 = v16->Address.anonymous_0.LowPart;
    if( !v15 && (v12 || v19) )
    {
      Mdl = IoAllocateMdl((VOID *)v13, v14, 1u, 0, 0i64);
      if( !Mdl )
        goto LABEL_26;
      Mdl->MdlFlags |= 0x2802u;
      if( v10 )
        v11->Next = Mdl;
      else
        v10 = Mdl;
      NumberOfElements = v33;
      v11 = Mdl;
      v9 = v36;
      LODWORD(v14) = 0;
      LOWORD(LowPart) = v34;
      v18 = v35;
    }
    v15 = 0;
    if( (_DWORD)v14 )
      v19 = v13;
    ++v9;
    v14 = v18 + (unsigned int)v14;
    v13 = v19;
    v12 = ((_WORD)LowPart + (_WORD)v18) & 0xFFF;
    v36 = v9;
    ++v16;
  }
  while( v9 < NumberOfElements );
  if( !(_DWORD)v14 )
    goto LABEL_30;
  v21 = IoAllocateMdl((VOID *)v19, v14, 1u, 0, 0i64);
  if( v21 )
  {
    v21->MdlFlags |= 0x2802u;
    if( v10 )
      v11->Next = v21;
    else
      v10 = v21;
    goto LABEL_30;
  }
LABEL_26:
  if( v10 )
  {
    do
    {
      Next = v10->Next;
      IoFreeMdl(v10);
      v10 = Next;
    }
    while( Next );
  }
  return -1073741670;
}

Referenced by:

No references.