HAL Version 3.51 Exports

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