HAL Version 3.10 Exports

The table below lists the 69 exports from the HAL in version 3.10. These functions (and one variable) are in effect 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 10.0. Just over a half of these original exports are documented.

Documentation status is summarised by colour coding so that more detail can be given as Remarks with less text. Functions that appear to be completely undocumented are highlighted yellow. If a function is documented now but is known not to have been documented in the first contemporaneous Device Driver Kit (DDK), WDK or Installable File System (IFS) Kit, then it is shaded yellow to retain some of its previous status as undocumented. If a function is documented as reserved or obsolete, with or without a prototype, it is shaded red or shaded grey, respectively. An undocumented function that is at least declared in one or another header file from the Windows Driver Kit (WDK) is shaded orange. If the only declaration that Microsoft is known to have disclosed publicly is from the “minwin” directory of the Enterprise WDK for Windows 10 version 1511, specifically, then the function is highlighted orange.

For no functions does the WDK documentation list (or even hint about) the applicable versions. Header files in the WDK apply version constraints (in terms of the NTDDI_VERSION macro) to most declarations. However, this is a recent practice. When Microsoft started adding this information, here supposed as 2006 for preparing the WDK for Windows Vista, 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 what must surely have been 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. Saying it also in the plain-text documentation waited until the WDK for Windows 7 in 2009, mostly.

Years given below for changes of documentation status are best estimates from the year of release of the DDK documentation that is the first in which I have found the new status. For instance, if a function is not known to the documentation in the DDK for Windows Server 2003 SP1, with a copyright notice for 2005, but is documented as reserved in the WDK for Windows Vista, with its copyright notice for 2006, then although the function may have changed its status any time in 2005-2006, I plumb for the brevity of 2006. Another way that this dating is almost unavoidably inexact is that a DDK’s documentation may be dated to one year, e.g., 2000, but its headers to the year before.

Function Remarks
HalAcquireDisplayOwnership from declared to reserved in 2006;
declaration since 2006 requires Windows 2000 and higher
HalAllocateAdapterChannel from declared to reserved in 2006;
declaration since 1999 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
HalAllocateCommonBuffer from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
HalBeginSystemInterrupt x86 only
HalCalibratePerformanceCounter  
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 from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
HalGetAdapter from documented to obsolete in 2000;
declaration since 2006 requires Windows 2000 and higher
HalGetBusData from documented to obsolete in 2000;
declaration since 1999 requires NO_LEGACY_DRIVERS not defined;
declaration since 2006 requires Windows 2000 and higher
HalGetEnvironmentVariable declared without version constraint
HalGetInterruptVector from documented to obsolete in 2000;
declaration since 1999 requires NO_LEGACY_DRIVERS not defined;
declaration since 2006 requires Windows 2000 and higher
HalHandleNMI  
HalInitSystem  
HalInitializeProcessor  
HalMakeBeep from undocumented to declared in 1999, to reserved in 2006;
declared since 1999 if NO_LEGACY_DRIVERS not defined;
declaration since 2006 requires Windows 2000 and higher
HalQueryDisplayParameters  
HalQueryRealTimeClock declared without version constraint
HalReadDmaCounter from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
HalReportResourceUsage  
HalRequestIpi  
HalRequestSoftwareInterrupt  
HalReturnToFirmware from undocumented to reserved in 2009;
documented in 2009 as “Available in Microsoft Windows Server 2003 and Windows XP”;
documented in 2012 as “Available in Windows Server 2003 and later”;
declared in 2015 without version constraint
HalSetDisplayParameters  
HalSetEnvironmentVariable declared without version constraint
HalSetProfileInterval  
HalSetRealTimeClock  
HalStartNextProcessor  
HalStartProfileInterrupt  
HalStopProfileInterrupt  
HalTranslateBusAddress from documented to obsolete in 2000;
declaration since 2006 requires Windows 2000 and higher
IoAssignDriveLetters discontinued in 6.1
IoFlushAdapterBuffers from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
IoFreeAdapterChannel from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
IoFreeMapRegisters from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
IoMapTransfer from documented to obsolete in 2000;
redefined as inline function from 1999 to 2005 if USE_DMA_MACROS defined, etc;
declaration since 2006 requires USE_DMA_MACROS not defined, etc;
declaration since 2006 requires Windows 2000 and higher
IoReadPartitionTable redirected to kernel in 5.1 and higher;
from documented to obsolete in 2001-2002;
declaration since 2006 requires Windows XP and higher
IoSetPartitionInformation redirected to kernel in 5.1 and higher;
from documented to obsolete in 2001-2002;
declaration since 2006 requires Windows XP and higher
IoWritePartitionTable redirected to kernel in 5.1 and higher;
from documented to obsolete in 2001-2002;
declaration since 2006 requires Windows XP 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 in 6.2 and higher;
documentation since 2009 requires Windows 2000 and higher;
redefined since 1995 by macro in terms of KfAcquireSpinLock
x64 support as macro in terms of kernel export KeAcquireSpinLockRaiseToDpc
KeFlushWriteBuffer from declared to reserved in 2001-2002;
declared without version constraint
KeGetCurrentIrql x86 only;
documentation since 2009 requires Windows 2000 and higher;
declared without version constraint
x64 support as kernel export;
redefined since 2005 as inline function
KeLowerIrql x86 only;
documentation since 2009 requires Windows 2000 and higher;
redefined since 1995 by macro in terms of KfLowerIrql
x64 support as kernel export;
redefined since 2005 as inline function
KeQueryPerformanceCounter documentation since 2009 requires Windows 2000 and higher;
declaration since 2006 requires Windows 2000 and higher
KeRaiseIrql x86 only;
documentation since 2009 requires Windows 2000 and higher;
redefined since 1995 by macro in terms of KfRaiseIrql
x64 support as kernel export;
redefined since 2005 as macro in terms of inline function KfRaiseIrql
KeReleaseSpinLock x86 only;
forwarded to kernel in 6.2 and higher;
documentation since 2009 requires Windows 2000 and higher;
redefined since 1995 by macro in terms of KfReleaseSpinLock
x64 support as kernel export
KeStallExecutionProcessor documentation since 2009 requires Windows 2000 and higher;
declaration since 2006 requires Windows 2000 and higher
READ_PORT_BUFFER_UCHAR x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
READ_PORT_BUFFER_ULONG x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
READ_PORT_BUFFER_USHORT x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
READ_PORT_UCHAR x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
READ_PORT_ULONG x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
READ_PORT_USHORT x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_BUFFER_UCHAR x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_BUFFER_ULONG x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_BUFFER_USHORT x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_UCHAR x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_ULONG x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function
WRITE_PORT_USHORT x86 only;
documentation since 2012 requires Windows 2000 and higher;
declared without version constraint
x64 support as inline function

That KeAcquireSpinLock, etc., are redirected by macros to KfAcquireSpinLock, etc., as early as 1995 is known from the NTDDK.H in the DDK for Windows NT 3.51. With no earlier DDK available for inspection, it is not known whether the redirections started as early as their targets’ introduction for version 3.50.