Geoff Chappell, Software Analyst
The table below lists the 86 exports from the HAL in version 3.51, i.e., from Windows NT 3.51. For the purpose of this study, without having found an earlier Windows NT for inspection, these functions (and one variable) are effectively the original programming interface for the HAL. They represent nearly three quarters of all HAL exports that have ever existed. All but a handful are still exported as of version 6.3.
Just over half these original exports are documented in the Windows Driver Kit (WDK) for Windows Vista, dated January 2007. Some, highlighted pink in the table, are documented only as being reserved. More, shaded pink, are documented as obsolete.For none of these functions, including if marked obsolete or reserved, does the WDK documentation list (or even hint about) the applicable versions.
All the documented functions and four undocumented functions are declared in one or another of the WDK header files. Where this is true of an undocumented function, it is shaded yellow in the table. The WDK applies version constraints (in terms of the NTDDI_VERSION macro) to most declarations. However, this is a recent practice. When Microsoft started adding this information, it seems no trouble was taken to determine any function’s origin from before Windows 2000. Yet instead of leaving the old declarations without version constraints, trouble was taken to add version information in the full knowledge that the addition would be factually incorrect for the overwhelming majority of these old functions. In this way, nearly all these original functions are said to require at least Windows 2000. Assume that a function’s declaration is for Windows 2000 and higher except if stated otherwise.
Functions that the WDK neither documents nor declares are highlighted yellow, as being completely undocumented.
Function | Remarks |
---|---|
ExAcquireFastMutex | x86 only; forwarded to kernel function ExiAcquireFastMutex in 5.2 from Windows Server 2003 SP1 to 6.1; forwarded to kernel function ExAcquireFastMutex in 6.2 and higher; redefined by macro in terms of ExiAcquireFastMutex; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
ExReleaseFastMutex | x86 only; forwarded to kernel function ExiReleaseFastMutex in 5.2 from Windows Server 2003 SP1 to 6.1; forwarded to kernel function ExReleaseFastMutex in 6.2 and higher; redefined by macro in terms of ExiReleaseFastMutex; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
ExTryToAcquireFastMutex | x86 only; forwarded to kernel function ExiTryToAcquireFastMutex in 5.2 from Windows Server 2003 SP1 to 6.1; forwarded to kernel function ExTryToAcquireFastMutex in 6.2 and higher; redefined by macro in terms of ExiTryToAcquireFastMutex; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
HalAcquireDisplayOwnership | |
HalAdjustResourceList | |
HalAllProcessorsStarted | |
HalAllocateAdapterChannel | not declared if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
HalAllocateCommonBuffer | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
HalAllocateCrashDumpRegisters | |
HalAssignSlotResources | not declared if NO_LEGACY_DRIVERS defined |
HalBeginSystemInterrupt | x86 only |
HalCalibratePerformanceCounter | |
HalClearSoftwareInterrupt | |
HalDisableSystemInterrupt | discontinued in 6.0 |
HalDisplayString | redirected to kernel function InbvDisplayString in 5.0 and higher |
HalEnableSystemInterrupt | discontinued in 6.0 |
HalEndSystemInterrupt | x86 only |
HalFlushCommonBuffer | |
HalFreeCommonBuffer | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
HalGetAdapter | |
HalGetBusData | not declared if NO_LEGACY_DRIVERS defined |
HalGetBusDataByOffset | |
HalGetEnvironmentVariable | |
HalGetInterruptVector | not declared if NO_LEGACY_DRIVERS defined |
HalHandleNMI | |
HalInitSystem | |
HalInitializeProcessor | |
HalMakeBeep | not declared if NO_LEGACY_DRIVERS defined |
HalProcessorIdle | |
HalQueryDisplayParameters | |
HalQueryRealTimeClock | |
HalReadDmaCounter | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
HalReportResourceUsage | |
HalRequestIpi | |
HalRequestSoftwareInterrupt | |
HalReturnToFirmware | |
HalSetBusData | not declared if NO_LEGACY_DRIVERS defined |
HalSetBusDataByOffset | |
HalSetDisplayParameters | |
HalSetEnvironmentVariable | |
HalSetProfileInterval | |
HalSetRealTimeClock | |
HalSetTimeIncrement | discontinued in 6.3 |
HalStartNextProcessor | |
HalStartProfileInterrupt | |
HalStopProfileInterrupt | |
HalTranslateBusAddress | |
IoAssignDriveLetters | discontinued in 6.1 |
IoFlushAdapterBuffers | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
IoFreeAdapterChannel | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
IoFreeMapRegisters | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
IoMapTransfer | redefined as inline function if USE_DMA_MACROS defined and NTDDK.H included, or if WDM.H included |
IoReadPartitionTable | declared for Windows XP and higher; also exported from kernel in 5.1 and higher |
IoSetPartitionInformation | declared for Windows XP and higher; also exported from kernel in 5.1 and higher |
IoWritePartitionTable | declared for Windows XP and higher; also exported from kernel in 5.1 and higher |
KdComPortInUse (data) | |
KdPortGetByte | discontinued in 5.1 |
KdPortInitialize | discontinued in 5.1 |
KdPortPollByte | discontinued in 5.1 |
KdPortPutByte | discontinued in 5.1 |
KdPortRestore | discontinued in 5.1 |
KdPortSave | discontinued in 5.1 |
KeAcquireSpinLock | x86 only; forwarded to kernel function KeAcquireSpinLock in 6.2 and higher; redefined by macro in terms of KfAcquireSpinLock; supported for x64 by macro in terms of kernel export KeAcquireSpinLockRaiseToDpc |
KeFlushWriteBuffer | declared without version constraint |
KeGetCurrentIrql | x86 only; declared without version constraint; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
KeLowerIrql | x86 only; redefined by macro in terms of KfLowerIrql; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
KeQueryPerformanceCounter | |
KeRaiseIrql | x86 only; redefined by macro in terms of KfRaiseIrql; supported for x64 by same macro |
KeReleaseSpinLock | x86 only; forwarded to kernel function KeReleaseSpinLock in 6.2 and higher; redefined by macro in terms of KfReleaseSpinLock; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
KeStallExecutionProcessor | |
KfAcquireSpinLock | x86 only; forwarded to kernel function KfAcquireSpinLock in 6.2 and higher |
KfLowerIrql | x86 only |
KfRaiseIrql | x86 only; supported for x64 as kernel export in 5.2 from Windows Server 2003 SP1, and higher |
KfReleaseSpinLock | x86 only; forwarded to kernel function KfReleaseSpinLock in 6.2 and higher |
READ_PORT_BUFFER_UCHAR | x86 only; declared without version constraint; supported for x64 by inline function |
READ_PORT_BUFFER_ULONG | x86 only; declared without version constraint; supported for x64 by inline function |
READ_PORT_BUFFER_USHORT | x86 only; declared without version constraint; supported for x64 by inline function |
READ_PORT_UCHAR | x86 only; declared without version constraint; supported for x64 by inline function |
READ_PORT_ULONG | x86 only; declared without version constraint; supported for x64 by inline function |
READ_PORT_USHORT | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_BUFFER_UCHAR | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_BUFFER_ULONG | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_BUFFER_USHORT | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_UCHAR | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_ULONG | x86 only; declared without version constraint; supported for x64 by inline function |
WRITE_PORT_USHORT | x86 only; declared without version constraint; supported for x64 by inline function |