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.

For each name, the table gives just a brief summary of the applicable HAL versions and of the status with respect to Microsoft’s documentation. This master list is then 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 according to its first appearance as shown here. In the Table of Contents, expand the Versions folder to get pages for each version. Some (very few) functions link directly from this page to an attempt at alternative documentation. Additional explanatory notes, especially about the different sources and degrees of documentation, follow the table.

Function Applicable Versions Documentation Status
ExAcquireFastMutex 3.50 and higher (x86 only);
later as kernel export (x64 and x86)
documented
ExReleaseFastMutex 3.50 and higher (x86 only);
later as kernel export (x64 and x86)
documented
ExTryToAcquireFastMutex 3.50 and higher (x86 only);
later as kernel export (x64 and x86)
documented
HalAcpiGetTableEx 6.2 and higher  
HalAcquireDisplayOwnership 3.10 and higher reserved
HalAdjustResourceList 3.50 and higher declared (minwin)
HalAllProcessorsStarted 3.50 and higher  
HalAllocateAdapterChannel 3.10 and higher reserved
HalAllocateCommonBuffer 3.10 and higher obsolete
HalAllocateCrashDumpRegisters 3.50 and higher reserved
HalAllocateHardwareCounters 6.1 and higher documented
HalAssignSlotResources 3.50 and higher obsolete
HalBeginSystemInterrupt 3.10 and higher (x86 only)  
HalBugCheckSystem 6.0 and higher declared
HalCalibratePerformanceCounter 3.10 and higher  
HalCallBios 5.2 to 6.1 (x64 only)  
HalClearSoftwareInterrupt 3.50 and higher  
HalConvertDeviceIdtToIrql 6.0 and higher declared (minwin)
HalDisableInterrupt 6.0 and higher declared (minwin)
HalDisableSystemInterrupt 3.10 to 5.2  
HalDisplayString 3.10 and higher  
HalDmaAllocateCrashDumpRegistersEx 6.2 and higher declared (minwin)
HalDmaFreeCrashDumpRegistersEx 6.2 and higher declared (minwin)
HalDynamicProcessorStarted 6.0 from original Windows Vista only  
HalEnableInterrupt 6.0 and higher declared (minwin)
HalEnableSystemInterrupt 3.10 to 5.2  
HalEndSystemInterrupt 3.10 and higher (x86 only)  
HalEnumerateEnvironmentVariablesEx 6.0 and higher declared (minwin)
HalEnumerateProcessors 6.0 and higher (x64 only);
10.0 and higher (x86 also)
 
HalFlushCommonBuffer 3.10 and higher  
HalFreeCommonBuffer 3.10 and higher obsolete
HalFreeHardwareCounters 6.1 and higher documented
HalGetAdapter 3.10 and higher obsolete
HalGetBusData 3.10 and higher obsolete
HalGetBusDataByOffset 3.50 and higher obsolete
HalGetEnvironmentVariable 3.10 and higher declared (minwin)
HalGetEnvironmentVariableEx 6.0 and higher declared (minwin)
HalGetInterruptTargetInformation 6.0 and higher declared (minwin)
HalGetInterruptVector 3.10 and higher obsolete
HalGetMemoryCachingRequirements 6.1 and higher  
HalGetMessageRoutingInfo 6.0 and higher declared (minwin)
HalGetProcessorIdByNtNumber 6.0 from Windows Vista SP1, and higher declared (minwin)
HalGetVectorInput 6.0 and higher declared (minwin)
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 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 declared (minwin)
HalQueryMaximumProcessorCount 6.0 from Windows Vista SP1, and higher  
HalQueryRealTimeClock 3.10 and higher declared (minwin)
HalReadDmaCounter 3.10 and higher 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 declared (minwin)
HalRequestSoftwareInterrupt 3.10 and higher  
HalReturnToFirmware 3.10 and higher reserved
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 obsolete
HalSetBusDataByOffset 3.50 and higher obsolete
HalSetDisplayParameters 3.10 and higher  
HalSetEnvironmentVariable 3.10 and higher declared (minwin)
HalSetEnvironmentVariableEx 6.0 and higher declared (minwin)
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 obsolete
IoAssignDriveLetters 3.10 to 6.0  
IoFlushAdapterBuffers 3.10 and higher obsolete
IoFreeAdapterChannel 3.10 and higher obsolete
IoFreeMapRegisters 3.10 and higher obsolete
IoMapTransfer 3.10 and higher obsolete
IoReadPartitionTable 3.10 and higher obsolete
IoSetPartitionInformation 3.10 and higher obsolete
IoWritePartitionTable 3.10 and higher 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);
later as kernel export (x64 and x86)
documented
KeAcquireInStackQueuedSpinLockRaiseToSynch 5.1 and higher (x86 only);
later as kernel export (x64 and x86)
 
KeAcquireQueuedSpinLock 5.0 and higher (x86 only);
later as kernel export (x64 and x86)
reserved
KeAcquireQueuedSpinLockRaiseToSynch 5.0 and higher (x86 only);
later as kernel export (x64 and x86)
 
KeAcquireSpinLock 3.10 and higher (x86 only);
later as kernel export (x86 only)
documented
KeAcquireSpinLockRaiseToSynch 4.0 and higher (x86 only);
later as kernel export (x64 and x86)
reserved
KeFlushWriteBuffer 3.10 and higher reserved
KeGetCurrentIrql 3.10 and higher (x86 only);
later as kernel export (x64 only)
documented
KeLowerIrql 3.10 and higher (x86 only);
later as kernel export (x64 only)
documented
KeQueryPerformanceCounter 3.10 and higher documented
KeRaiseIrql 3.10 and higher (x86 only) documented
KeRaiseIrqlToDpcLevel 4.0 and higher (x86 only);
later as kernel export (x64 only)
documented
KeRaiseIrqlToSynchLevel 4.0 and higher (x86 only) reserved
KeReleaseInStackQueuedSpinLock 5.1 and higher (x86 only);
later as kernel export (x64 and x86)
documented
KeReleaseQueuedSpinLock 5.0 and higher (x86 only);
later as kernel export (x64 and x86)
reserved
KeReleaseSpinLock 3.10 and higher (x86 only);
later as kernel export (x64 and x86)
documented
KeStallExecutionProcessor 3.10 and higher documented
KeTryToAcquireQueuedSpinLock 5.0 and higher (x86 only);
later as kernel export (x64 and x86)
reserved
KeTryToAcquireQueuedSpinLockRaiseToSynch 5.0 and higher (x86 only);
later as kernel export (x64 and x86)
 
KfAcquireSpinLock 3.50 and higher (x86 only);
later as kernel export (x86 only)
declared
KfLowerIrql 3.50 and higher (x86 only) declared
KfRaiseIrql 3.50 and higher (x86 only);
later as kernel export (x64 only) 
declared
KfReleaseSpinLock 3.50 and higher (x86 only);
later as kernel export (x86 only)
declared
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  

Names

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

A few exports are of variables rather than functions. They are marked above by the word “data” in parentheses. These notes talk of all as functions, hoping no confusion will be caused by such loose terminology.

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 or downloaded from Microsoft’s websites, whether free or requiring what is nowadays called a Visual Studio subscription. 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 chosen reference for all comment on Microsoft’s documentation of exported HAL functions is what Microsoft presents as Visual Studio Documentation under the heading “Windows Driver Kit (WDK)”. As this documentation says: “Windows Driver Kit (WDK) 10 is integrated with Microsoft Visual Studio 2015”. The large file, named v2Windows_Development_Windows_Driver_Development_B974_VS_85_en-us_3.mshc, from which this content is drawn appears to be as close as Microsoft now comes to publishing WDK documentation as a self-standing, explicitly dated collection. The file’s last modification date is 6th August 2015, which to my mind means it can reasonably be taken as Microsoft’s definitive offering of documentation for Windows 10 as first released on 29th July 2015.

The previously chosen reference edition of the Windows Driver Kit (WDK) for all comment on Microsoft’s documentation and programming support was version 7600.16385.0, mostly with documentation dated to 18th June 2009 and header files to 13th July 2009. This was the WDK’s first public release for Windows 7.

Currency

Choosing one reference edition is not ideal for all purposes. Windows versions that get released afterwards will inevitably add functions, which then will typically not be listed above as documented until a new reference edition is adopted. I may adjust for observations that I happen to come across, but please understand that I do not intend to poll Microsoft’s websites to keep the documentation status up to date. I may not even be able to sustain a programme of regularly updating this list to match new choices of reference edition even years apart. If you want more frequent updating, then please remember that this bookkeeping is done at my own expense in the public interest: look instead for an alternative that is done commercially or by academics who draw a salary.

History

There is also potentially a loss of history because any chosen reference edition can be too recent. Of interest perhaps only to historians is that even documented functions are sometimes discontinued, meaning specifically that later versions do not export them. Do not rely on me to have searched old editions of the WDK to find whether discontinued functions ever were documented.

Of potentially much wider interest is that new functions are often not documented immediately by Microsoft and sometimes not for several years. That a function is marked above as documented does not mean that it has always been documented, only that it is documented in the chosen reference edition (or that I have noticed later documentation of it online). I tend to think that delayed documentation imposes significant costs on and barriers to third-party software development. However, nobody can sensibly consider the question without a careful account of the documentation history. For as much precision as I happen yet to know about the history of a function’s documentation, look for the function in the version lists. Please be aware that this is a work in progress. For so many functions, each to be looked for in nearly a dozen sources of documentation, there are bound to be some mistakes in my descriptions, and my account of the history is anyway deficient for not having found an Installable File System (IFS) Kit for any release of Windows XP or Windows Server 2003.

The IFS Kit is especially notable in this context of delayed documentation. Of the kernel functions that Microsoft does document, a significant proportion (not quite a third) are documented in the WDK only by the relatively recent inclusion of the IFS Kit which was for many years not nearly as readily available as was the ordinary Device Driver Kit (DDK). According to stories that can still be found on the Internet, Microsoft’s practice if only in the early years of Windows was that the IFS Kit was not just very expensive, relative for instance to an MSDN subscription, but also was sold only under some sort of Non-Disclosure Agreement (NDA). If the latter is true, then functions that were documented only in the IFS Kit were undocumented in effect, at least in the early years. In any case, even the IFS Kit didn’t come with formal documentation until Windows 2000.

Corresponding somewhat to the IFS Kit for specialised development at the upper levels of kernel-mode programming is some sort of HAL Adaptation Kit for specialised development underneath the kernel for its interactions with the HAL. As far as I know, this kit has never been published by Microsoft except to make it available to selected parties under an NDA.

Classification

That a function is marked above as “reserved” means that the only known mention of it in the current reference edition of Microsoft’s documentation is to say some such thing as that the function is reserved for the system and is not to be used in drivers. The function may have its own page, and even be given with a prototype and other details, or it may appear only by name in a list of reserved functions. Some functions have only ever been documented as reserved.

Other functions are said to be obsolete. These often are given with prototypes and sometimes with substantial documentation, presumably from before the function became obsolete. This applies most notably to early HAL exports that were documented as obsolete as soon as Windows 2000. These had been generalised so that although they continue to be exported they are merely standard or default implementations that are better reached through the general (also documented) mechanism. That a function is marked above as ”obsolete” means that its page of documentation in the current reference edition is anything from slight to substantial but nonetheless includes a remark that the function is obsolete without qualification.

A few functions are marked above as “declared” to indicate that although they are not formally documented in the WDK, not even as being reserved, Microsoft publishes C-language declarations of them in one or another header file. All HAL exports, whether documented or not, have link-time support in the HAL.LIB import library.

Special mention must be made of some declarations that Microsoft published with the Enterprise WDK for the 1511 release of Windows 10. In that edition, and apparently in that edition only, a subdirectory named “minwin” of what look intended as user-mode inclusions has several headers that declare functions and define structures that have little or nothing to do with user-mode programming but are a treasure trove of kernel-mode material that Microsoft has otherwise kept very much to itself for decades. Functions for which Microsoft’s names and types for arguments are known only through this plausibly accidental disclosure are marked in the table by adding “minwin” in parentheses.

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.