HAL Functions

The table on this page lists all the functions and variables that appear in the export directory of any known x86 or x64 build of the HAL. It gives for each export just brief summaries of the applicable HAL versions and of the status with respect to Microsoft’s documentation.

This master list is intended as a key to other lists which may develop in time. Some detail on each function’s availability and documentation status may be found by looking for the function in the history lists (expand the Versions folder in the Table of Contents), according to its first appearance as shown here. Some (very few) functions link directly from this page to an attempt at alternative documentation. Additional explanatory notes follow the table.

Function Applicable Versions Documentation Status
ExAcquireFastMutex 3.50 and higher (x86 only) documented
ExReleaseFastMutex 3.50 and higher (x86 only) documented
ExTryToAcquireFastMutex 3.50 and higher (x86 only) documented
HalAcpiGetTableEx 6.2 and higher  
HalAcquireDisplayOwnership 3.10 and higher documented as reserved
HalAdjustResourceList 3.50 and higher  
HalAllProcessorsStarted 3.50 and higher  
HalAllocateAdapterChannel 3.10 and higher documented as reserved
HalAllocateCommonBuffer 3.10 and higher documented as obsolete
HalAllocateCrashDumpRegisters 3.50 and higher documented as reserved
HalAllocateHardwareCounters 6.1 and higher documented
HalAssignSlotResources 3.50 and higher documented as obsolete
HalBeginSystemInterrupt 3.10 and higher (x86 only)  
HalBugCheckSystem 6.0 and higher declared in NTDDK.H
HalCalibratePerformanceCounter 3.10 and higher  
HalCallBios 5.2 to 6.1 (x64 only)  
HalClearSoftwareInterrupt 3.50 and higher  
HalConvertDeviceIdtToIrql 6.0 and higher  
HalDisableInterrupt 6.0 and higher  
HalDisableSystemInterrupt 3.10 to 5.2  
HalDisplayString 3.10 and higher  
HalDmaAllocateCrashDumpRegistersEx 6.2 and higher  
HalDmaFreeCrashDumpRegistersEx 6.2 and higher  
HalDynamicProcessorStarted 6.0 from original Windows Vista only  
HalEnableInterrupt 6.0 and higher  
HalEnableSystemInterrupt 3.10 to 5.2  
HalEndSystemInterrupt 3.10 and higher (x86 only)  
HalEnumerateEnvironmentVariablesEx 6.0 and higher  
HalEnumerateProcessors 6.0 and higher (x64 only);
10.0 and higher (x86 also)
 
HalFlushCommonBuffer 3.10 and higher  
HalFreeCommonBuffer 3.10 and higher documented as obsolete
HalFreeHardwareCounters 6.1 and higher documented
HalGetAdapter 3.10 and higher documented as obsolete
HalGetBusData 3.10 and higher documented as obsolete
HalGetBusDataByOffset 3.50 and higher documented as obsolete
HalGetEnvironmentVariable 3.10 and higher  
HalGetEnvironmentVariableEx 6.0 and higher  
HalGetInterruptTargetInformation 6.0 and higher  
HalGetInterruptVector 3.10 and higher documented as obsolete
HalGetMemoryCachingRequirements 6.1 and higher  
HalGetMessageRoutingInfo 6.0 and higher  
HalGetProcessorIdByNtNumber 6.0 from Windows Vista SP1, and higher  
HalGetVectorInput 6.0 and higher  
HalHandleMcheck 5.2 and higher (x64 only)  
HalHandleNMI 3.10 and higher  
HalInitSystem 3.10 and higher  
HalInitializeBios 6.0 and higher  
HalInitializeOnResume 6.0 from Windows Vista SP1, and higher  
HalInitializeProcessor 3.10 and higher  
HalIsHyperThreadingEnabled 5.2 and higher (x64 only)  
HalMakeBeep 3.10 and higher documented as reserved
HalMcUpdateReadPCIConfig 6.1 only  
HalPerformEndOfInterrupt 6.1 and higher (x64 only)  
HalProcessorIdle 3.50 and higher  
HalQueryDisplayParameters 3.10 and higher  
HalQueryEnvironmentVariableInfoEx 6.0 from Windows Vista SP1, and higher  
HalQueryMaximumProcessorCount 6.0 from Windows Vista SP1, and higher  
HalQueryRealTimeClock 3.10 and higher  
HalReadDmaCounter 3.10 and higher documented as obsolete
HalRegisterDynamicProcessor 6.0 from Windows Vista SP1, and higher  
HalRegisterErrataCallbacks 6.0 and higher  
HalReportResourceUsage 3.10 and higher  
HalRequestClockInterrupt 6.1 and higher  
HalRequestDeferredRecoveryServiceInterrupt 6.1 and higher (x64 only)  
HalRequestIpi 3.10 and higher  
HalRequestIpiSpecifyVector 6.2 and higher  
HalRequestSoftwareInterrupt 3.10 and higher  
HalReturnToFirmware 3.10 and higher  
HalSendNMI 5.2 and higher (x64 only)  
HalSendSoftwareInterrupt 5.2 and higher (x64 only);
10.0 and higher (x86 also)
 
HalSetBusData 3.50 and higher documented as obsolete
HalSetBusDataByOffset 3.50 and higher documented as obsolete
HalSetDisplayParameters 3.10 and higher  
HalSetEnvironmentVariable 3.10 and higher  
HalSetEnvironmentVariableEx 6.0 and higher  
HalSetProfileInterval 3.10 and higher  
HalSetRealTimeClock 3.10 and higher  
HalSetTimeIncrement 3.50 to 6.2  
HalStartDynamicProcessor 6.0 and higher  
HalStartNextProcessor 3.10 and higher  
HalStartProfileInterrupt 3.10 and higher  
HalStopProfileInterrupt 3.10 and higher  
HalSystemVectorDispatchEntry 4.0 and higher  
HalTranslateBusAddress 3.10 and higher documented as obsolete
IoAssignDriveLetters 3.10 to 6.0  
IoFlushAdapterBuffers 3.10 and higher documented as obsolete
IoFreeAdapterChannel 3.10 and higher documented as obsolete
IoFreeMapRegisters 3.10 and higher documented as obsolete
IoMapTransfer 3.10 and higher documented as obsolete
IoReadPartitionTable 3.10 and higher documented as obsolete
IoSetPartitionInformation 3.10 and higher documented as obsolete
IoWritePartitionTable 3.10 and higher documented as obsolete
KdComPortInUse (data) 3.10 and higher  
KdHvComPortInUse (data) 6.2 and higher  
KdPortGetByte 3.10 to 5.0  
KdPortInitialize 3.10 to 5.0  
KdPortPollByte 3.10 to 5.0  
KdPortPutByte 3.10 to 5.0  
KdPortRestore 3.10 to 5.0  
KdPortSave 3.10 to 5.0  
KeAcquireInStackQueuedSpinLock 5.1 and higher (x86 only) documented
KeAcquireInStackQueuedSpinLockRaiseToSynch 5.1 and higher (x86 only)  
KeAcquireQueuedSpinLock 5.0 and higher (x86 only) documented as reserved (IFS)
KeAcquireQueuedSpinLockRaiseToSynch 5.0 and higher (x86 only)  
KeAcquireSpinLock 3.10 and higher (x86 only) documented
KeAcquireSpinLockRaiseToSynch 4.0 and higher (x86 only) documented as reserved
KeFlushWriteBuffer 3.10 and higher documented as reserved
KeGetCurrentIrql 3.10 and higher (x86 only) documented
KeLowerIrql 3.10 and higher (x86 only) documented
KeQueryPerformanceCounter 3.10 and higher documented
KeRaiseIrql 3.10 and higher (x86 only) documented
KeRaiseIrqlToDpcLevel 4.0 and higher (x86 only) documented
KeRaiseIrqlToSynchLevel 4.0 and higher (x86 only) documented as reserved
KeReleaseInStackQueuedSpinLock 5.1 and higher (x86 only) documented
KeReleaseQueuedSpinLock 5.0 and higher (x86 only) documented as reserved (IFS)
KeReleaseSpinLock 3.10 and higher (x86 only) documented
KeStallExecutionProcessor 3.10 and higher documented
KeTryToAcquireQueuedSpinLock 5.0 and higher (x86 only) documented as reserved (IFS)
KeTryToAcquireQueuedSpinLockRaiseToSynch 5.0 and higher (x86 only)  
KfAcquireSpinLock 3.50 and higher (x86 only) declared in WDM.H
KfLowerIrql 3.50 and higher (x86 only) declared in WDM.H
KfRaiseIrql 3.50 and higher (x86 only) declared in WDM.H
KfReleaseSpinLock 3.50 and higher (x86 only) declared in WDM.H
READ_PORT_BUFFER_UCHAR 3.10 and higher (x86 only) documented
READ_PORT_BUFFER_ULONG 3.10 and higher (x86 only) documented
READ_PORT_BUFFER_USHORT 3.10 and higher (x86 only) documented
READ_PORT_UCHAR 3.10 and higher (x86 only) documented
READ_PORT_ULONG 3.10 and higher (x86 only) documented
READ_PORT_USHORT 3.10 and higher (x86 only) documented
WRITE_PORT_BUFFER_UCHAR 3.10 and higher (x86 only) documented
WRITE_PORT_BUFFER_ULONG 3.10 and higher (x86 only) documented
WRITE_PORT_BUFFER_USHORT 3.10 and higher (x86 only) documented
WRITE_PORT_UCHAR 3.10 and higher (x86 only) documented
WRITE_PORT_ULONG 3.10 and higher (x86 only) documented
WRITE_PORT_USHORT 3.10 and higher (x86 only) documented
x86BiosAllocateBuffer 6.0 and higher  
x86BiosCall 6.0 and higher  
x86BiosExecuteInterrupt 5.2 only (x64 only)  
x86BiosFreeBuffer 6.0 and higher  
x86BiosInitializeBiosEx 5.2 only (x64 only)  
x86BiosReadMemory 6.0 and higher  
x86BiosTranslateAddress 5.2 only (x64 only)  
x86BiosWriteMemory 6.0 and higher  

Notes

Function names are reproduced from the export directory of the HAL.DLL executable. All exports from the HAL are by name.

Since experience shows that this table is not always read with the knowledge of an advanced programmer, it must be stressed that a function’s presence in the export directory does not mean that the function is implemented non-trivially, let alone that it will work satisfactorily if called. It means just that the function can be imported by other modules, and be called by them, for better or worse. That a function is first exported in some version does not mean that Microsoft supports its use in that version, even if such support is documented for later versions.

Versions

The HAL versions shown for each function are inferred from a study of public releases such as I have managed to find on MSDN discs. My holdings are incomplete, especially for the early history, and I anyway have no time for (or interest in) examining pre-release builds or hotfixes. Of necessity then, the table makes what I hope are reasonable assumptions about likely continuity, especially to suppose that a function will exist in future versions or that a function exists in all builds of a version if no counter-example is yet known. If you want more accurate or comprehensive information, try getting it from Microsoft.

Documentation Status

Except where otherwise stated, the reference for all comment on Microsoft’s documentation is the Windows Vista Windows Driver Kit (WDK) distributed by Microsoft on MSDN Disc 3667 dated January 2007. Though this ought to cover everything in the original Windows Vista, it does of course mean that no functions introduced for Windows 7 and Windows 8 are (yet) shown above as documented except if I happen to have noticed the documentation in a later WDK or online.

Several of the original HAL functions were later generalised so that although the HAL function continues to be exported it is merely a standard or default implementation which is better reached through the general mechanism. Such functions have since been documented as obsolete or reserved. Some others seem only ever to have been documented as reserved.

A few functions are not formally documented in the WDK, not even as being reserved, but are declared in one or another header file. All HAL exports, whether documented or not, have link-time support in the HAL.LIB import library.

Note that many HAL functions are arguably a private matter between the HAL and the kernel, and would not usefully be documented for programmers outside Microsoft’s few who work on the HAL and kernel. As a quick summary, you may care to know that just under one half of all HAL exports are documented, and the majority of these are documented as reserved or obsolete.