Kernel Exports Added for Version 5.1

This page lists the 247 exports that were newly exported from the Windows kernel for the original Windows XP.

Also listed are six additions for Windows XP SP1, 19 for Windows XP SP2 and four for Windows XP SP3. A handful of other exports perhaps were designed for version 5.1, and are mostly dated to Windows XP by Microsoft, but were back-fitted to Windows 2000 such that they appear first, in order of version number, as additions for Windows 2000 SP3.

Conventions

To convey more detail with less text, the page relies heavily on several types of shortcut.

The first is that although a few of the kernel’s exports are of variables rather than functions, I tend to talk of all as functions, hoping that no confusion will be caused by the loose terminology. The variables are indicated by a parenthetical “data” after their first appearance in the Functions column.

Colours

Documentation status is summarised by colour coding. (Had the website’s scripts run as expected, then hovering over any colour-coded text would produce a tooltip that shows why the text is coloured.) (To decode a colour, hover for a tooltip.)

Functions that appear to be completely undocumented are highlighted yellow. If a function is documented now but was not documented in the first contemporaneous Device Driver Kit (DDK), Windows Driver Kit (WDK) or Installable File System (IFS) Kit, then it is shaded yellow to retain some of its previous status. If a function is documented as reserved or obsolete, it is shaded red or shaded grey, respectively. Otherwise, functions that have their own non-trivial documentation are left with no background colour.

Many undocumented functions and some variables have C-language declarations in one or another header file. To show them as being not completely undocumented they are shaded orange, except for one special case. Some declarations are known only from “minwin” headers that Microsoft published in early editions of the WDK for Windows 10 which seem since to have been withdrawn. These are highlighted orange to indicate that public disclosure even of the declaration was exceptional.

Actual Availability

The default understanding is that exporting continues for all later versions, and in both the x86 and x64 builds. Exceptions are sketched in a column headed Export History.

The description “x86 only” means that the function is not exported from any known x64 build but is exported from the x86 build of at least some version that has an x64 build. If it had already ceased as an export before Windows Server 2003 SP1, the “x86 only” is left unstated.

That a function is “discontinued in” some version means that the function is exported up to but not including the stated version and not in any later version unless “restored”.

Documented Availability

It’s nothing but fair to note that the majority of these functions were not documented immediately. Even more were then or later said to require later versions. These misrepresentations of actual availability show also in C-language declarations for the functions’ use in programming. Conveying these differences between what the kernel exported and what Microsoft presented for drivers to import is the concern of columns headed Documentation History and Declaration History.

Conventions still in development!

Tabulation

As much as I might like to condense into one table as much as might be imagined is possible to summarise about all these functions’ history of availability both in the binary and according to the documentation and headers, many functions both individually and in groups demand additional explanation in text. I therefore break the tabulation according to Microsoft’s scheme of prefixes for separate areas of functionality within the otherwise monolithic kernel. Each function has its own row in one table, but please be sure to check for explanatory text before and (more usually) after the table.

Just more than 40% of these new exports for version 5.1 are nowadays documented. For most, the documentation states (correctly) that the function is “available on Microsoft Windows XP and later”. Six functions are documented only as being reserved, without even saying which versions have them. Another four are documented as obsolete, again without saying which versions have them. A small proportion of the new functions are undocumented but with declarations in one or another of the WDK header files. Declarations, both of these and the documented functions, are mostly for Windows XP and higher. For well more than a decade nearly a half of the new functions had neither documentation nor declaration—and then Microsoft published declarations for nearly all of them, only in the first two releases of the WDK for Windows 10, all too plausibly only by oversight.

Cc Function

Function Export History
CcMdlWriteAbort  

Cm Functions

Function Documentation History
CmRegisterCallback before 5.2 SP1, declared
CmUnRegisterCallback before 5.2 SP1, declared

Dbg Functions

Function Export History
DbgPrintEx  
DbgQueryDebugFilterState  
DbgSetDebugFilterState  

Ex Functions

Function Export History Documentation History
ExAcquireRundownProtection   before 5.2 SP1, undocumented;
before 6.2, declared
ExAcquireRundownProtectionEx starts in SP2 before 5.2 SP1, undocumented;
before 6.2, declared;
documented start is 5.2
ExGetCurrentProcessorCounts    
ExGetCurrentProcessorCpuUsage    
ExInitializeRundownProtection   before 5.2 SP1, undocumented;
before 6.2, declared
ExReInitializeRundownProtection   before 5.2 SP1, undocumented;
before 6.2, declared
ExReleaseRundownProtection   before 5.2 SP1, undocumented;
before 6.2, declared
ExReleaseRundownProtectionEx starts in SP2 before 5.2 SP1, undocumented;
before 6.2, declared;
documented start is 5.2
ExRundownCompleted   before 5.2 SP1, undocumented;
before 6.2, declared
ExVerifySuite   before 6.0, declared
ExWaitForRundownProtectionRelease   before 5.2 SP1, undocumented;
before 6.2, declared
ExfAcquirePushLockExclusive starts in SP2  
ExfAcquirePushLockShared starts in SP2  
ExfInterlockedCompareExchange64 x86 only  
ExfReleasePushLock starts in SP2  

FsRtl Functions

Function Export History Documentation History Declaration History
FsRtlCreateSectionForDataScan starts in SP3;
discontinued in 5.2;
restored in 5.2 SP1
in 6.0, documented start is 5.2 SP1;
since 6.1, documented start is 5.0 SP4 rollup
since 6.0, declared start is 5.0
FsRtlIncrementCcFastReadNoWait      
FsRtlIncrementCcFastReadNotPossible      
FsRtlIncrementCcFastReadResourceMiss      
FsRtlIncrementCcFastReadWait      
FsRtlInsertPerFileObjectContext   before 6.1, declared;
documented start is 6.0
 
FsRtlInsertPerStreamContext   documented start is 5.0 SP4 rollup  
FsRtlIsPagingFile   documented start is 5.0 SP4 rollup  
FsRtlLookupPerFileObjectContext   before 6.1, declared;
documented start is 6.0
 
FsRtlLookupPerStreamContextInternal      
FsRtlNotifyFilterChangeDirectory   documented start is 5.0 SP4 rollup  
FsRtlNotifyFilterReportChange   documented start is 5.0 SP4 rollup since 6.0, declared start is 5.0
FsRtlRegisterFileSystemFilterCallbacks   before 6.2, documented start is 5.0 SP4 rollup  
FsRtlRemovePerFileObjectContext   before 6.1, declared;
documented start is 6.0
 
FsRtlRemovePerStreamContext   documented start is 5.0 SP4 rollup  
FsRtlTeardownPerStreamContexts   documented start is 5.0 SP4 rollup since 6.0, declared start is 5.0

Some of the File System Run Time Library functions have complicated histories. Chronologically, they are exported first in version 5.1, and are so listed above. According to documentation, they were then back-fitted to an Update Rollup for Windows 2000 SP4. This is not formally a service pack, and would ordinarily fall outside the scope of this study, yet it plainly was intended as more than a hotfix.

The FsRtlCreateSectionForDataScan function is even more complicated. It might better be regarded as first exported for version 5.2 SP1 and then back-fitted to late builds of both version 5.0 and version 5.1. For version 5.0, this again means the Update Rollup for Windows 2000 SP4. For version 5.1, documentation cites a Filter Manager Rollup for Windows XP SP2. The first actual service pack of version 5.1 that has the function is then SP3, as noted above. Note anyway that Microsoft took its time over having its documentation tell of this function’s support in any of these updates.

Though FsRtlLookupPerStreamContextInternal is documented as reserved as early as the WDK for Windows Vista, it is the essence of the FsRtlLookupPerStreamContext macro which is documented as starting with the Update Rollup for Windows 2000 SP4.

The FsRtlRegisterFileSystemFilterCallbacks function is unusual in that its documented support in the Update Rollup for Windows 2000 SP4 is withdrawn.

Hal Function

Function Export History
HalExamineMBR  

The HalExamineMBR function has earlier history, back to version 3.51, as a macro that calls through the HalDispatchTable to an externally provided handler or to a default in the kernel. The earliest known documentation is in the DDK for Windows NT 4.0. Whether the documentation is of the macro or the exported function, it is notable for a long-standing error: not until version 6.2 does it give the correct type for the Buffer argument.

One Function

Function Export History
HeadlessDispatch  

Interlocked Function

Function Export History Documentation History
InterlockedPopEntrySList x86 only SDK
InterlockedPushEntrySList x86 only SDK

The “sequenced interlocked list” had been introduced to kernel-mode programming in version 4.0. It was as first a creature of the Executive, supported by macros and functions whose names each have the Ex prefix. This early support required that a spin lock be supplied even if the implementation could make do without it. With version 5.1 requiring the cmpxchg8b instruction, the implementation certainly could make do without a spin lock and the programming of drivers that would run only on Windows XP and higher was therefore simplified: these new functions that don’t have the Ex prefix don’t require a spin lock. What matters here for a survey of documentation status is that they were documented not in the DDK but in the Platform Software Development Kit (SDK) for user-mode programming—and there they have stayed. Though they plainly always have been intended as documented, they seem never to have been documented explicitly for use in kernel mode. Even after Microsoft reorganised its programming documentation in terms of header files in 2018, these functions are skipped from the many pages for WDM.H and NTDDK.H.

Io Functions

Function Export History Documentation History Declaration History
IoAssignDriveLetters discontinued in 6.1;
(also from HAL before 6.1)
   
IoAttachDeviceToDeviceStackSafe   documented start is 5.0 SP4 rollup  
IoCreateDisk      
IoCreateFileSpecifyDeviceObjectHint      
IoCreateStreamFileObjectEx      
IoCsqInitialize      
IoCsqInsertIrp      
IoCsqRemoveIrp      
IoCsqRemoveNextIrp      
IoEnumerateDeviceObjectList   documented start is 5.0 SP4 rollup  
IoEnumerateRegisteredFiltersList starts in SP3;
discontinued in 5.2;
restored in 5.2 SP1
documented start is 5.0 SP4 rollup and 5.2 SP1 since 6.0, declared start is 5.2 SP1
IoForwardAndCatchIrp      
IoForwardIrpSynchronously      
IoFreeErrorLogEntry      
IoGetDeviceAttachmentBaseRef   documented start is 5.0 SP4 rollup  
IoGetDiskDeviceObject   documented start is 5.0 SP4 rollup  
IoGetLowerDeviceObject   documented start is 5.0 SP4 rollup  
IoInitializeCrashDump starts in SP3;
discontinued in 5.2
   
IoQueryFileDosDeviceName      
IoReadDiskSignature      
IoReadPartitionTable also from HAL since 3.10 before 5.1, documented (HAL) deprecated
IoReadPartitionTableEx      
IoSetCompletionRoutineEx      
IoSetPartitionInformation also from HAL since 3.10 before 5.1, documented (HAL) deprecated
IoSetPartitionInformationEx      
IoSetStartIoAttributes      
IoSetSystemPartition      
IoValidateDeviceIoControlAccess starts in SP1 documented start is 5.2  
IoVerifyPartitionTable      
IoVolumeDeviceToDosName      
IoWMIDeviceObjectToInstanceName      
IoWMIExecuteMethod      
IoWMIHandleToInstanceName      
IoWMIOpenBlock      
IoWMIQueryAllData      
IoWMIQueryAllDataMultiple      
IoWMIQuerySingleInstance      
IoWMIQuerySingleInstanceMultiple     since 6.0, declared start is 5.0
IoWMISetNotificationCallback      
IoWMISetSingleInstance      
IoWMISetSingleItem      
IoWritePartitionTable also from HAL since 3.10 before 5.1, documented (HAL) deprecated
IoWritePartitionTableEx      

The IoAssignDriveLetters , IoReadPartitionTable, IoSetPartitionInformation and IoWritePartitionTable functions are original exports from the HAL. They are both the oldest and the first HAL exports to have got moved in some sense to the kernel. Redistribution of their functionality had been under way for some years. Version 3.51 had the HAL’s implementations call through the kernel’s HalDispatchTable, typically (though not necessarily) reaching default handlers in the kernel. Version 5.1 simply elevated those default handlers from internal routines to exported functions.

The several functions such as IoCsqInitialize for cancel-safe IRP queues are among those that are new for Windows XP and which the DDK for Windows XP unremarkably documents as being new for Windows XP. Microsoft’s formula is worth noting, however: “only available as part of the operating system on Windows XP and later.” Use of these cancel-safe queues is sufficiently important that Microsoft made it available to new drivers that find themselves running on Windows 2000. Instead of calling the exported functions, drivers that anticipate this execution can instead call routines from a statically linked library, csq.lib, which Microsoft continued to distribute up to and including the WDK for Windows 7. Note the implication that these cancel-safe queues were functionality that Microsoft realised programmers far and wide could have been coding for themselves all along, and should have been as standard practice, but hadn’t been.

The IoEnumerateRegisteredFiltersList function is another that may better be regarded as an export added for version 5.2 SP1 but then back-fitted to late builds of versions 5.0 and 5.1. Documentation starts the back-fit to version 5.0 with the Update Rollup for Windows 2000 SP4. Very plausibly, its back-fit to version 5.1 starts with the Filter Manager Rollup for Windows XP SP2, but no known documentation even catches that the function is exported from Windows XP SP3.

The IoValidateDeviceIoControlAccess function seems similarly to have been introduced to nudge programmers towards some discipline. It is available to new drivers on old Windows versions if they call the function as a routine in a statically linked library, wdmsec.lib, instead of importing it from the kernel. There is practical merit to using the library in a driver that wants to tolerate being loaded on a Windows XP that predates the function’s availability as an export from the kernel, but the documentation is incorrect about when this availablity starts. To the DDK for Windows XP, the function is “only available as part of the operating system on Windows .NET Server and later operating systems.” Later kits continue the (slight and no-doubt well-intended) misrepresentation except that they know what name was settled on for marketing.

Kd Function

Function Export History
KdPowerTransition  

Ke Functions

Function Export History
KeAcquireInStackQueuedSpinLockAtDpcLevel  
KeAcquireInterruptSpinLock  
KeAreApcsDisabled  
KeCapturePersistentThreadState starts in SP1
KeDeregisterBugCheckReasonCallback starts in SP1
KeFlushQueuedDpcs starts in SP2
KeGetRecommendedSharedDataAlignment  
KeIsAttachedProcess  
KeQueryRuntimeThread  
KeRegisterBugCheckReasonCallback starts in SP1
KeReleaseInStackQueuedSpinLockFromDpcLevel  
KeReleaseInterruptSpinLock  
KeRemoveByKeyDeviceQueueIfBusy  
KeRemoveSystemServiceTable  

The KeFlushQueuedDpcs function was documented in the DDK for Windows XP (and declared in both NTDDK.H and WDM.H) even while the kernel had it only as an internal routine. It does not become an export until SP2.

Mm Functions

Function Export History Documentation History
MmAddVerifierThunks   before 6.0, declared
MmAdvanceMdl    
MmAllocateMappingAddress    
MmCommitSessionMappedView starts in SP2  
MmFreeMappingAddress    
MmIsVerifierEnabled   before 6.0, declared;
before 6.2, reserved
MmMapLockedPagesWithReservedMapping    
MmMarkPhysicalMemoryAsBad    
MmMarkPhysicalMemoryAsGood    
MmPrefetchPages    
MmProtectMdlSystemAddress    
MmUnmapReservedMapping    

In the WDK for Windows Vista and again for Windows 7, MmIsVerifierEnabled is on a list of Memory Manager Routines that are “reserved for system use.” The WDK for Windows 8 drops the function from this list. The reason is not known: unlike the slightly older MmIsDriverVerifying, it is not dropped from the list for being newly documented. It just returns to being a function that’s declared but undocumented.

The MmMarkPhysicalMemoryAsBad and MmMarkPhysicalMemoryAsGood functions have never been anything but reserved, but they are slightly notable in that their declarations in the DDK for Windows XP were removed for subsequent versions.

Nt Functions

The functions whose names begin with Nt correspond closely to functions whose names have the Zw prefix instead (see below). Put aside some general points about how the two differ—see The Native API— and documentation of an Nt function is to a large extent implied by documentation of the corresponding Zw function.

Though this correspondence will have been understood well enough by all competent kernel-mode programmers, Microsoft didn’t make it explicit until some time after releasing the WDK for Windows Vista. This is here taken as an intention to leave the Nt functions undocumented (if not declared) before version 6.1.

Documentation in the WDK for Windows 7 gives each Nt function its own page and directs attention to the page for the corresponding Zw function. The Zw documentation might then be treated as counting for both, except that the Nt documentation warns expressly “Do not call this routine from kernel-mode code.” This is here taken as documenting the Nt functions as reserved in version 6.1 (certainly for kernel-mode use, which is this survey’s focus).

Microsoft loosened the text significantly for Windows 8 to note that the Nt and Zw versions “can behave differently” and to refer to a page of guidance. These changes, though slight, are taken here as formally permitting the Nt functions’ kernel-mode use, such that they must now be counted as documented (though delayed).

While each Nt function is documented only by reference to the Zw function, whatever documented availability Microsoft gives for the latter is here taken as intended also for the former. In the headers, however, the two functions necessarily each have their own declaration (if they have any), and so any “declared start” shown below is specifically for the Nt function.

Function Documentation History Declaration History
NtMakePermanentObject    
NtOpenProcessTokenEx before 6.1, declared;
in 6.1, reserved
 
NtOpenThread    
NtOpenThreadToken   since 6.0, declared start is 5.0
NtOpenThreadTokenEx before 6.1, declared;
in 6.1, reserved
 
NtQueryInformationThread    
NtShutdownSystem    
NtTraceEvent    

The NtQueryInformationThread function is mentioned in a comment in NTDDK.H from at least as far back as the Windows NT 3.51 DDK, presumably for its export from NTDLL.DLL in user mode, but has never yet been declared for use in programming.

Ob Functions

Function Export History Documentation History Declaration History
ObCloseHandle   before 6.2, undocumented;
before 6.3, declared;
documented start is 5.0
since 6.2, declared start is 6.1
ObCreateObjectType      
ObDereferenceSecurityDescriptor      
ObIsDosDeviceLocallyMapped starts in SP3;
discontinued in 5.2;
restored in 6.0
  declared start is 6.0
ObLogSecurityDescriptor      
ObReferenceSecurityDescriptor      
ObSetHandleAttributes      
ObSetSecurityObjectByPointer      

The ObCloseHandle function has got caught in some sort of tug-of-war between the documentation and the headers. Perhaps its documentation was squeezed into the WDK for Windows 8 too late to get it declared in a header. Someone took some care to save programmers some small inconvenience by documenting that the function “is not declared in a header file” and even to present a declaration to copy-and-paste. This declaration, like the documentation, would have it that the function starts in version 5.0. When a declaration did get into a header in the very next WDK, i.e., for Windows 8.1, it was made conditional on building for at least Windows 7. Whoever revised the documentation seems to have anticipated use by drivers running on older Windows and amended the declaration in the documentation to support all target operating systems older than Windows 7.

Po Functions

Function Documentation History Declaration History
PoQueueShutdownWorkItem    
PoRequestShutdownEvent before 6.0, declared  

The DDK for Windows XP and again for Windows Server 2003 declares PoRequestShutdownEvent in both NTDDK.H and WDM.H. Then the declaration disappears. Put this aside as not quite ancient history and the function would now count as undocumented except for the presumably accidental disclosure of NTOSP.H.

Ps Functions

Function Export History Documentation History Declaration History
PsChargeProcessNonPagedPoolQuota      
PsChargeProcessPagedPoolQuota      
PsChargeProcessPoolQuota      
PsDereferenceImpersonationToken      
PsDereferencePrimaryToken      
PsGetContextThread starts in SP1    
PsGetCurrentProcess   since 6.1 revision, documented start is 5.0  
PsGetCurrentProcessSessionId      
PsGetCurrentThread   since 6.1 revision, documented start is 5.0  
PsGetCurrentThreadPreviousMode      
PsGetCurrentThreadStackBase      
PsGetCurrentThreadStackLimit      
PsGetJobLock      
PsGetJobSessionId      
PsGetJobUIRestrictionsClass      
PsGetProcessCreateTimeQuadPart   before 6.1, undocumented  
PsGetProcessDebugPort      
PsGetProcessExitProcessCalled      
PsGetProcessExitStatus   before 6.2, undocumented  
PsGetProcessId   before 6.0, undocumented  
PsGetProcessImageFileName      
PsGetProcessInheritedFromUniqueProcessId      
PsGetProcessJob      
PsGetProcessPeb      
PsGetProcessPriorityClass      
PsGetProcessSectionBaseAddress      
PsGetProcessSecurityPort      
PsGetProcessSessionId      
PsGetProcessWin32Process      
PsGetProcessWin32WindowStation      
PsGetThreadFreezeCount      
PsGetThreadHardErrorsAreDisabled      
PsGetThreadId   before 6.1, undocumented  
PsGetThreadProcess   before 6.2, undocumented  
PsGetThreadProcessId   before 6.1, undocumented;
before 2015-2018, declared;
documented start is 6.0
declared start is 5.2
PsGetThreadSessionId      
PsGetThreadTeb      
PsGetThreadWin32Thread      
PsIsProcessBeingDebugged      
PsIsSystemThread   before 6.1, declared  
PsIsThreadImpersonating      
PsRemoveCreateThreadNotifyRoutine   before 5.2 SP1, declared  
PsRemoveLoadImageNotifyRoutine   before 5.2 SP1, declared  
PsReturnProcessNonPagedPoolQuota      
PsReturnProcessPagedPoolQuota      
PsRevertThreadToSelf      
PsSetContextThread starts in SP1    
PsSetJobUIRestrictionsClass discontinued in 6.2    
PsSetProcessPriorityClass      
PsSetProcessSecurityPort      
PsSetProcessWin32Process      
PsSetProcessWindowStation      
PsSetThreadHardErrorsAreDisabled      
PsSetThreadWin32Thread      

The PsDereferenceImpersonationToken and PsDereferencePrimaryToken function have earlier history, at least back to the NTIFS.H from the Windows 2000 IFS Kit, as macros.

The PsGetCurrentProcess function has always been documented, i.e., right from the DDK for Windows NT 3.1, but not until version 5.1 does the kernel actually export it. In all versions, it is defined by macro as an alias of the exported IoGetCurrentProcess. The latter was at first just an implementation detail: it is not documented until the DDK for Windows NT 4.0. As exported functions in version 5.1 and higher, the two have the same address.

The story is similar for PsGetCurrentThread, but slightly different. It has always been documented. It’s just not an exported function before version 5.1. It is instead defined by macro as KetGetCurrentThread but with a change of type for the return value. The macro was dropped by the WDK for Windows 7.

Rtl Functions

Function Export History Documentation History Declaration History
RtlAddAccessAllowedAceEx starts in SP2 before 6.1, undocumented;
documented start is 5.0
declared start is 5.0
RtlClearBit   before 6.0, declared  
RtlCreateSystemVolumeInformationFolder      
RtlDeleteElementGenericTableAvl   before 6.2, declared  
RtlEnumerateGenericTableAvl   before 6.2, declared  
RtlEnumerateGenericTableLikeADirectory      
RtlEnumerateGenericTableWithoutSplayingAvl   before 6.2, declared  
RtlGetElementGenericTableAvl   before 6.1, declared  
RtlGetSetBootStatusData      
RtlGetVersion   since 6.1 revision, documented start is 5.0 since 6.0, declared start is 5.0
RtlHashUnicodeString   before 6.0, declared  
RtlInitializeGenericTableAvl   before 6.2, declared  
RtlInsertElementGenericTableAvl   before 6.2, declared  
RtlInsertElementGenericTableFullAvl      
RtlInt64ToUnicodeString   since 6.1 revision, documented start is 5.0 since 6.0, declared start is 5.0
RtlIntegerToUnicode      
RtlIpv4AddressToStringA   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4AddressToStringExA starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4AddressToStringExW starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4AddressToStringW   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4StringToAddressA   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4StringToAddressExA starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4StringToAddressExW starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv4StringToAddressW   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6AddressToStringA   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6AddressToStringExA starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6AddressToStringExW starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6AddressToStringW   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6StringToAddressA   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6StringToAddressExA starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6StringToAddressExW starts in SP2 before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIpv6StringToAddressW   before 6.0, undocumented;
documented only in SDK;
documented start is 6.0;
in 6.0, not declared
 
RtlIsGenericTableEmptyAvl   before 6.2, declared  
RtlLockBootStatusData      
RtlLookupElementGenericTableAvl   before 6.2, declared  
RtlLookupElementGenericTableFullAvl      
RtlMapSecurityErrorToNtStatus      
RtlNumberGenericTableElementsAvl   before 6.2, declared  
RtlRandomEx      
RtlSetBit   before 6.0, declared  
RtlTestBit   before 6.0, declared  
RtlTimeToElapsedTimeFields      
RtlUnlockBootStatusData      
RtlVerifyVersionInfo   since 6.1 revision, documented start is 5.0 since 6.0, declared start is 5.0

That the RtlAddAccessAllowedAceEx function, once it is documented at all in the WDK, is said to start with Windows 2000 has two obvious candidates for explanation. Its presence in the kernel as an internal routine from as long ago as version 5.0 found its way into the documentation. It is exported from NTDLL.DLL starting with version 5.0, and the WDK documentation, if only of the RTL functions, is doing double duty for kernel mode and user mode.

The RtlGetVersion function is documented in the DDK for Windows 2000 as “the kernel-mode equivalent of the user-mode GetVersionEx function.” The RtlVerifyVersionInfo function is simlarly “the kernel-mode equivalent of the user-mode VerifyVersionInfo”. Kernel-mode programmers who thought to use either as the new and approved way of learning any sort of Windows version number or of testing for “operating system attributes” will have been unhappy. Both functions are exported from NTDLL in user mode in version 5.0 and both are declared in NTDDK.H as if for kernel-mode programming but neither actually is exported from the kernel. Frustrated programmers may have complained in the right places or Microsoft may simply have noticed the need for correction: for both functions, documentation in the DDK for Windows XP is very clear that “This routine is supported on Windows XP and later”. Years later, this rare but good work came undone as the functions got caught up in Microsoft’s over-zealous exercise in historical revision: a second edition of the WDK for Windows 7 goes back to telling kernel-mode programmers that the functions are “Available in Windows 2000 and later”.

Also documented in the DDK for Windows 2000 despite being unavailable in kernel mode is RtlInt64ToUnicodeString. Again, version 5.0 is the first that has the function as a user-mode export.

The 16 functions for converting IP addresses to and from text are not formally documented for use in kernel mode, only as user-mode exports from NTDLL. They are declared in IP2STRING.H, which is supplied with every WDK starting with Windows 7. A comment at the top is explicit that this header’s declared routines are “callable by both kernel mode code in the executive and user mode code in various NT subsystems.” A reorganisation for Windows 8 places the header in the “shared” subdirectory. Since the functions’ user-mode documentation requires Windows Vista and the first known user-mode documentation is in the SDK for Windows Vista, they must be ruled as having been undocumented before Windows Vista even for user-mode programming.

Se Functions and Variable

Function Export History Documentation History
SeAuditingFileEventsWithContext starts in SP2  
SeAuditingHardLinkEventsWithContext starts in SP2  
SeFilterToken    
SeTokenIsWriteRestricted starts in SP2;
discontinued in 5.2;
restored in 6.0
 
SeTokenObjectType (data)   before 6.1, undocumented;
indirectly documented

Three Se functions are first exported from Windows XP SP2, if reckoning by version number. Chronologically, the two that tell of auditing start in version 5.2 and may then have been thought useful enough to back-fit into the next service pack of version 5.1. The story is more complicated for SeTokenIsWriteRestricted. Even chronologically, it is first exported from Windows XP SP2 without being taken up for version 5.2.

As with most exported variables, SeTokenObjectType is not itself documented. Starting with the WDK for Windows 7, however, it gets mentioned in the documentation of exported functions such as ObReferenceObjectByHandle from its being intended as an argument.

Ver Function

Function Documentation History Declaration History
VerSetConditionMask documented only in SDK since 6.0, declared start is 5.0

Unlike RtlGetVersion and RtlVerifyVersionInfo (see above), VerSetConditionMask never has been documented explicitly for use in kernel mode.

Vf Functions

Function Export History
VfFailDeviceNode  
VfFailDriver  
VfFailSystemBIOS  
VfIsVerificationEnabled  

Wmi Functions

Function Export History
WmiFlushTrace discontinued in 6.0
WmiGetClock  
WmiQueryTrace discontinued in 6.0
WmiQueryTraceInformation  
WmiStartTrace discontinued in 6.0
WmiStopTrace discontinued in 6.0
WmiTraceMessage  
WmiTraceMessageVa  
WmiUpdateTrace discontinued in 6.0

XIP Function

Function Export History
XIPDispatch  

Zw Functions

Function Documentation History Declaration History
ZwAddBootEntry    
ZwAssignProcessToJobObject    
ZwCreateJobObject    
ZwDeleteBootEntry    
ZwEnumerateBootEntries    
ZwIsProcessInJob    
ZwOpenJobObject    
ZwOpenProcessTokenEx    
ZwOpenThreadTokenEx    
ZwQueryBootEntryOrder    
ZwQueryBootOptions    
ZwQueryFullAttributesFile before 6.1, undocumented;
before 6.1 revision, documented start is 5.0
declared start is 5.0
ZwQueryInformationJobObject    
ZwQueryInformationThread    
ZwSaveKeyEx before 6.2, undocumented declared start is 6.1
ZwSetBootEntryOrder    
ZwSetBootOptions    
ZwSetInformationJobObject    
ZwTerminateJobObject    
ZwTranslateFilePath    

C Run-Time (CRT) Functions

Function Export History Documentation History
_CIcos x86 only before 2012, undocumented
_CIsin x86 only before 2012, undocumented
_CIsqrt x86 only before 2012, undocumented
_alldvrm x86 only  
_alloca_probe x86 only  
_aulldvrm x86 only  
_vsnwprintf    

Calls to the _CIcos, _CIsin and _CIsqrt functions are generated by sufficiently early versions of Microsoft’s compiler when fed code that would call the CRT library’s cos, sin and sqrt functions, respectively. The first formal documentation I know of them is that each has its own page in the Alphabetical Function Reference of the C Run-Time Library Reference for Visual Studio 2012. Documentation for Visual Studio 2015 moved them to the Internal CRT Globals and Functions.

The _alldvrm and _aulldvrm functions are generated by Microsoft’s 32-bit compiler when fed code that seeks (in sufficient proximity) both the quotient and remainder from dividing signed or unsigned 64-bit integers. Microsoft has long published assembly-language source files for these functions along with other CRT library source code in the Visual Studio package. If you believe that source code is everything, then these functions are as fully documented as can be. Yet formal documentation is surprisingly scarce. For instance, within the C Run-Time Library Reference for Visual Studio 2015 (roughly contemporaneous with the original Windows 10) they don’t rate a mention in either the Alphabetical Function Reference or the list of Internal CRT Globals and Functions.

Microsoft’s CRT library has long implemented the _alloca_probe function as an alias for the _chkstk function. Microsoft’s compilers generate a call to the latter from the prologue code of any function that seeks too much space for local variables. Again, the assembly-language source code is published and so the function can hardly be regarded as undocumented. And again, formal documentation is surprisingly scarce.

vDbg Functions

Function Documentation History
vDbgPrintEx before 6.0, declared
vDbgPrintExWithPrefix before 6.1, declared

Discontinued

Version 5.1 stops exporting a few functions. For each, the version in parentheses tells when the function was first exported:

Unusually, several had been documented, albeit as obsolete.

Version 5.1 discontinues the ObDeleteCapturedInsertInfo function only to have version 5.2 restore it as an export. This may be an illusion due to this survey’s reckoning by increasing version number. Chronologically, the function was introduced for version 5.2. Its listing for a lower version is then explained as back-fitting into the last service pack of Windows 2000, but this still leaves as some mystery why the function was not back-fitted to any service pack of Windows XP.