HalpInterruptRestoreController
NTSTATUS __stdcall HalpInterruptRestoreController(_REGISTERED_INTERRUPT_CONTROLLER *Controller, INT64 LocalUnit){
char v2;
unsigned int Flags;
_LIST_ENTRY *p_LinesHead;
_LIST_ENTRY *Flink;
int v7;
__int64 v8;
__int64 v9;
_LIST_ENTRY *v10;
NTSTATUS result;
_INTERRUPT_LINE Line;
Line = 0i64;
v2 = LocalUnit;
Flags = Controller->Flags;
if( (Flags & 2) != 0 )
return -1073741823;
if( (Flags & 1) == 0 )
return -1073741436;
p_LinesHead = &Controller->LinesHead;
Flink = Controller->LinesHead.Flink;
while( 1 )
{
LABEL_7:
if( Flink == p_LinesHead )
return 0;
v10 = Flink;
Flink = Flink->Flink;
if( v10[2].Blink && (!v2 || ((LODWORD(v10[2].Flink) - 3) & 0xFFFFFFFD) == 0) )
{
v7 = 0;
if( LODWORD(v10[1].Blink) - HIDWORD(v10[1].Flink) > 0 )
break;
}
}
v9 = 0i64;
v8 = 0i64;
while( 1 )
{
if( (*(_DWORD *)((_BYTE *)&v10[2].Blink->Blink + v8 + 4) & 0x10) != 0 || LOBYTE(v10[3].Flink[v9].Flink) )
{
Line.UnitId = Controller->UnitId;
Line.Line = v7 + HIDWORD(v10[1].Flink);
result = HalpInterruptSetLineStateInternal(Controller, &Line, (_INTERRUPT_LINE_STATE *)v10[2].Blink + v7);
if( result < 0 )
return result;
}
++v7;
v8 += 56i64;
++v9;
if( v7 >= LODWORD(v10[1].Blink) - HIDWORD(v10[1].Flink) )
goto LABEL_7;
}
}Referenced by:
HalpInterruptInitializeLocalUnit
HalpInterruptPowerChange
HalpInterruptRestoreAllControllerState