REGISTERED_INTERRUPT_CONTROLLER

The REGISTERED_INTERRUPT_CONTROLLER (formally _REGISTERED_INTERRUPT_CONTROLLER) is the HAL’s abstraction of an interrupt controller.

Documentation Status

The REGISTERED_INTERRUPT_CONTROLLER is not documented. Neither is Microsoft known to have ever published a C-language definition in any Windows Driver Kit (WDK).

The practical equivalent of a C-language definition is available as type information in public symbol files for the HAL, starting with Windows 8. The merging of the HAL into the kernel for the 2004 release of 64-bit Windows moves this type information into the public symbols for the kernel.

Exactly why the public symbols have type information for the REGISTERED_INTERRUPT_CONTROLLER is unclear. That it’s unintended is not impossible. When compiling the separate source file, HALSYM.C, to merge type information into the public symbols for the already built HAL, what the compiler counted as this structure’s use is a reference by pointer—but this pointer type is itself unreferenced. This situation can have been produced by as little as the pointer type’s use in an inline routine or just its appearance in the declaration of an internal routine that is in turn called from an inline routine. On the other hand, HALSYM.C can have used the pointer type explicitly, e.g., by defining a variable of this type. A reason to do this would be that the KDEXTS debugger extension’s !gicr_findapending and !ioapic commands depend on having type information for the REGISTERED_INTERRUPT_CONTROLLER. Intention is hard to gauge. It’s not as if either command is documented—at all, let alone as intended to work for those outside Microsoft who are not blessed with access to private symbols.

Variability

For a structure that looks to be used only within the HAL (not that any effort has yet been put into the looking), the REGISTERED_INTERRUPT_CONTROLLER is remarkably stable. The structure has grown, but only because one sub-structure pushes subsequent members ever further along:

Version Size (x86) Size (x64)
6.2 to 1607 0xBC 0x0148
1703 to 1809 0xC0 0x0150
1903 0xC4 0x0158
2004 0xC8 0x0160

Layout

The sizes in the preceding table and the offsets and definitions in the next are from type information in public symbols as noted above for Windows 8 and higher. Whether the structure even exists in earlier versions is left for another time.

Offset (x86) Offset (x64) Definition Versions
0x00 0x00
LIST_ENTRY ListEntry;
6.2 and higher
0x08 0x10
PVOID InternalData;
6.2 and higher
0x0C 0x18
ULONG InternalDataSize;
6.2 and higher
0x10 0x20
INTERRUPT_FUNCTION_TABLE FunctionTable;
6.2 and higher
0x60 (6.2 to 1607);
0x64 (1703 to 1809);
0x68 (1903);
0x6C
0xC0 (6.2 to 1607);
0xC8 (1703 to 1809);
0xD0 (1903);
0xD8
KNOWN_CONTROLLER_TYPE KnownType;
6.2 and higher
0x64 (6.2 to 1607);
0x68 (1703 to 1809);
0x6C (1903);
0x70
0xC4 (6.2 to 1607);
0xCC (1703 to 1809);
0xD4 (1903);
0xDC
ULONG Capabilities;
6.2 and higher
0x68 (6.2 to 1607);
0x6C (1703 to 1809);
0x70 (1903);
0x74
0xC8 (6.2 to 1607);
0xD0 (1703 to 1809);
0xD8 (1903);
0xE0
ULONG Flags;
6.2 and higher
0x6C (6.2 to 1607);
0x70 (1703 to 1809);
0x74 (1903);
0x78
0xCC (6.2 to 1607);
0xD4 (1703 to 1809);
0xDC (1903);
0xE4
ULONG MaxPriority;
6.2 and higher
0x70 (6.2 to 1607);
0x74 (1703 to 1809);
0x78 (1903);
0x7C
0xD0 (6.2 to 1607);
0xD8 (1703 to 1809);
0xE0 (1903);
0xE8
ULONG UnitId;
6.2 and higher
0x74 (6.2 to 1607);
0x78 (1703 to 1809);
0x7C (1903);
0x80
0xD8 (6.2 to 1607);
0xE0 (1703 to 1809);
0xE8 (1903);
0xF0
LIST_ENTRY LinesHead;
6.2 and higher
0x7C (6.2 to 1607);
0x80 (1703 to 1809);
0x84 (1903);
0x88
0xE8 (6.2 to 1607);
0xF0 (1703 to 1809);
0xF8 (1903);
0x0100
LIST_ENTRY OutputLinesHead;
6.2 and higher
0x84 (6.2 to 1607);
0x88 (1703 to 1809);
0x8C (1903);
0x90
0xF8 (6.2 to 1607);
0x0100 (1703 to 1809);
0x0108 (1903);
0x0110
LONG MinLine;
6.2 and higher
0x88 (6.2 to 1607);
0x8C (1703 to 1809);
0x90 (1903);
0x94
0xFC (6.2 to 1607);
0x0104 (1703 to 1809);
0x010C (1903);
0x0114
LONG MaxLine;
6.2 and higher
0x8C (6.2 to 1607);
0x90 (1703 to 1809);
0x94 (1903);
0x98
0x0100 (6.2 to 1607);
0x0108 (1703 to 1809);
0x0110 (1903);
0x0118
ULONG MaxClusterSize;
6.2 and higher
0x90 (6.2 to 1607);
0x94 (1703 to 1809);
0x98 (1903);
0x9C
0x0104 (6.2 to 1607);
0x010C (1703 to 1809);
0x0114 (1903);
0x011C
ULONG MaxClusters;
6.2 and higher
0x94 (6.2 to 1607);
0x98 (1703 to 1809);
0x9C (1903);
0xA0
0x0108 (6.2 to 1607);
0x0110 (1703 to 1809);
0x0118 (1903);
0x0120
ULONG InterruptReplayDataSize;
6.2 and higher
0x98 (6.2 to 1607);
0x9C (1703 to 1809);
0xA0 (1903);
0xA4
0x010C (6.2 to 1607);
0x0114 (1703 to 1809);
0x011C (1903);
0x0124
INTERRUPT_PROBLEM Problem;
6.2 and higher
0x9C (6.2 to 1607);
0xA0 (1703 to 1809);
0xA4 (1903);
0xA8
0x0110 (6.2 to 1607);
0x0118 (1703 to 1809);
0x0120 (1903);
0x0128
NTSTATUS ProblemStatus;
6.2 and higher
0xA0 (6.2 to 1607);
0xA4 (1703 to 1809);
0xA8 (1903);
0xAC
0x0118 (6.2 to 1607);
0x0120 (1703 to 1809);
0x0128 (1903);
0x0130
PCSTR ProblemSourceFile;
6.2 and higher
0xA4 (6.2 to 1607);
0xA8 (1703 to 1809);
0xAC (1903);
0xB0
0x0120 (6.2 to 1607);
0x0128 (1703 to 1809);
0x0130 (1903);
0x0138
ULONG ProblemSourceLine;
6.2 and higher
0xA8 (6.2 to 1607);
0xAC (1703 to 1809);
0xB0 (1903);
0xB4
0x0124 (6.2 to 1607);
0x012C (1703 to 1809);
0x0134 (1903);
0x013C
ULONG CustomProblem;
6.2 and higher
0xAC (6.2 to 1607);
0xB0 (1703 to 1809);
0xB4 (1903);
0xB8
0x0128 (6.2 to 1607);
0x0130 (1703 to 1809);
0x0138 (1903);
0x0140
NTSTATUS CustomProblemStatus;
6.2 and higher
0xB0 (6.2 to 1607);
0xB4 (1703 to 1809);
0xB8 (1903);
0xBC
0x0130 (6.2 to 1607);
0x0138 (1703 to 1809);
0x0140 (1903);
0x0148
UNICODE_STRING ResourceId;
6.2 and higher
0xB8 (6.2 to 1607);
0xBC (1703 to 1809);
0xC0 (1903);
0xC4
0x0140 (6.2 to 1607);
0x0148 (1703 to 1809);
0x0150 (1903);
0x0158
POHANDLE PowerHandle;
6.2 and higher