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.