HalacpiIrqTranslateResourceRequirementsIsa

NTSTATUS __stdcall HalacpiIrqTranslateResourceRequirementsIsa(
        VOID *Context,
        _IO_RESOURCE_DESCRIPTOR *Source,
        _DEVICE_OBJECT *PhysicalDeviceObject,
        _IO_RESOURCE_DESCRIPTOR **Target,
        _IO_RESOURCE_DESCRIPTOR **Targeta){
  unsigned int Length; 
  NTSTATUS v6; 
  __int64 v7; 
  unsigned int v10; 
  unsigned int Alignment; 
  char v12; 
  UINT64 v13; 
  VOID **v14; 
  VOID **v15; 
  unsigned int v16; 
  unsigned __int16 sci_int_vector; 
  char v18; 
  unsigned int v19; 
  VOID **v20; 
  unsigned int v21; 
  unsigned int v22; 
  int v23; 
  VOID **v24; 
  _IO_RESOURCE_DESCRIPTOR *v25; 
  unsigned int *v26; 
  unsigned int v27; 
  unsigned int v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  unsigned int v33; 
  VOID **PoolWithTag; 
  _IO_RESOURCE_DESCRIPTOR *v35; 
  char v36; 
  __int64 v37; 
  __int64 v38; 
  __int64 v39; 
  __int64 v40; 
  _DWORD *v41; 
  __int64 v42; 
  UINT64 NumberOfBytes; 
  VOID **v44; 
  unsigned __int16 v45; 

  Length = Source->u.Port.Length;
  v6 = 0;
  v7 = 0i64;
  v10 = 0;
  if( Length + 0x100000 <= 0xFFFFE )
    goto LABEL_29;
  Alignment = Source->u.Port.Alignment;
  if( Alignment + 0x100000 <= 0xFFFFE )
    return -1073741823;
  HalpIsInterruptTypeSecondary(0i64, Length);
  if( v12 )
  {
    HalpIsInterruptTypeSecondary(0i64, Alignment);
    if( v36 )
    {
LABEL_29:
      PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x20ui64, 543973704i64);
      *Targeta = (_IO_RESOURCE_DESCRIPTOR *)PoolWithTag;
      if( PoolWithTag )
      {
        *(_DWORD *)Target = 1;
        v35 = *Targeta;
        *(_OWORD *)&v35->Option = *(_OWORD *)&Source->Option;
        *(_OWORD *)&v35->u.BusNumber.MaxBusNumber = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
        return 0;
      }
      return -1073741670;
    }
  }
  v13 = 32 * (Alignment - Length + 3);
  NumberOfBytes = v13;
  v14 = ExAllocatePoolWithTag(1ui64, v13, 543973704i64);
  v44 = v14;
  v15 = v14;
  if( !v14 )
    return -1073741670;
  memset(v14, 0i64, v13);
  v16 = Source->u.Port.Length;
  if( v16 > 2 || (v33 = Source->u.Port.Alignment, v33 < 2) )
  {
    v7 = 1i64;
    *(_OWORD *)v15 = *(_OWORD *)&Source->Option;
    *((_OWORD *)v15 + 1) = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
  }
  else
  {
    if( v16 < 2 )
    {
      v7 = 1i64;
      *(_OWORD *)v15 = *(_OWORD *)&Source->Option;
      *((_OWORD *)v15 + 1) = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
      *((_DWORD *)v15 + 2) = Source->u.Port.Length;
      *((_DWORD *)v15 + 3) = 1;
      v33 = Source->u.Port.Alignment;
    }
    if( v33 > 2 )
    {
      v37 = 4i64 * (unsigned int)v7;
      v7 = (unsigned int)(v7 + 1);
      *(_OWORD *)&v15[v37] = *(_OWORD *)&Source->Option;
      *(_OWORD *)&v15[v37 + 2] = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
      HIDWORD(v15[v37 + 1]) = Source->u.Port.Alignment;
      LODWORD(v15[v37 + 1]) = 3;
    }
    if( Source->u.Port.Length > 9 || Source->u.Port.Alignment < 9 )
    {
      v38 = 4i64 * (unsigned int)v7;
      v7 = (unsigned int)(v7 + 1);
      *(_OWORD *)&v15[v38] = *(_OWORD *)&Source->Option;
      *(_OWORD *)&v15[v38 + 2] = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
      LODWORD(v15[v38 + 1]) = 9;
      HIDWORD(v15[v38 + 1]) = 9;
    }
  }
  sci_int_vector = Fadt.sci_int_vector;
  v18 = 0;
  v45 = Fadt.sci_int_vector;
  v19 = 0;
  if( (_DWORD)v7 )
  {
    while( 1 )
    {
      v20 = &v15[4 * v19];
      v21 = *((_DWORD *)v20 + 3);
      if( v21 >= 0x10 )
        break;
      v22 = *((_DWORD *)v20 + 2);
      if( v22 >= 0x10 )
        break;
      v23 = sci_int_vector;
      if( v21 >= sci_int_vector && v22 <= sci_int_vector )
      {
        if( v18 )
        {
          v6 = -1073741595;
          goto LABEL_24;
        }
        v18 = 1;
        if( v22 < sci_int_vector )
        {
          v39 = 4i64 * (unsigned int)v7;
          LODWORD(v7) = v7 + 1;
          LODWORD(v15[v39 + 1]) = v22;
          HIDWORD(v15[v39 + 1]) = sci_int_vector - 1;
          v21 = *((_DWORD *)v20 + 3);
        }
        if( v21 > sci_int_vector )
        {
          v40 = 4i64 * (unsigned int)v7;
          LODWORD(v7) = v7 + 1;
          LODWORD(v15[v40 + 1]) = v23 + 1;
          HIDWORD(v15[v40 + 1]) = *((_DWORD *)v20 + 3);
        }
        memmove(&v15[4 * v19], v20 + 4, 32 * (v7 - v19));
        sci_int_vector = v45;
        v7 = (unsigned int)(v7 - 1);
      }
      if( ++v19 >= (unsigned int)v7 )
        goto LABEL_12;
    }
    v6 = -1073741823;
  }
  else
  {
LABEL_12:
    v24 = ExAllocatePoolWithTag(1ui64, NumberOfBytes, 543973704i64);
    v25 = (_IO_RESOURCE_DESCRIPTOR *)v24;
    if( v24 )
    {
      memset(v24, 0i64, NumberOfBytes);
      if( (_DWORD)v7 )
      {
        v26 = (unsigned int *)v15 + 3;
        do
        {
          v27 = *(v26 - 1);
          v28 = *v26;
          do
          {
            v29 = v27;
            if( v27 < v28 )
            {
              v41 = (_DWORD *)HalpPicVectorRedirect + v27;
              do
              {
                v42 = v27 + 1;
                if( *v41 + 1 != *((_DWORD *)HalpPicVectorRedirect + v42) )
                  break;
                ++v41;
                ++v27;
              }
              while( (unsigned int)v42 < v28 );
            }
            v30 = v10;
            *(_OWORD *)&v25[v30].Option = *(_OWORD *)&Source->Option;
            *(_OWORD *)&v25[v30].u.BusNumber.MaxBusNumber = *(_OWORD *)&Source->u.BusNumber.MaxBusNumber;
            if( v10 )
              v25[v30].Option = 8;
            ++v10;
            v25[v30].u.Port.Length = *((_DWORD *)HalpPicVectorRedirect + v29);
            v31 = v27++;
            v25[v30].u.Port.Alignment = *((_DWORD *)HalpPicVectorRedirect + v31);
          }
          while( v27 <= v28 );
          v26 += 8;
          --v7;
        }
        while( v7 );
        v15 = v44;
      }
      *(_DWORD *)Target = v10;
      if( v10 )
        *Targeta = v25;
      else
        ExFreePoolWithTag(v25, 0);
    }
    else
    {
      v6 = -1073741670;
    }
  }
LABEL_24:
  ExFreePoolWithTag(v15, 0);
  return v6;
}

Referenced by:

No references.