ARC.H

The public symbol file NTKRPAMP.PDB for the original release of Windows 10 tells that the kernel is built with the ARC.H header at

d:\th.public.fre\halkit\inc

and draws from it the following type definitions:

Line Number Type
105 enum _TYPE_OF_MEMORY
142 struct _MEMORY_ALLOCATION_DESCRIPTOR

The header ARC.H is published in the “minwin” directory of the Windows Driver Kit (WDK) for Windows 10 in the original and Version 1511 editions. This was a significant new disclosure. The header as published defines many more structures, but the public symbol files for the kernel in the same versions do not have type information for these.

Later Versions

Indeed, many types that are defined in ARC.H had never or only rarely appeared in any public symbol files for any version. Starting with the 1803 release of Windows 10, however, the public symbol files for the kernel show very many more types as defined in ARC.H. That these many types that were for so long relatively unknown to programmers outside Microsoft are known to the kernel through this one header is surely worth cataloguing.

In the next table, the line numbers in the left column are for the unseen ARC.H for Windows 10 Version 1803, as known from the public symbol files for the kernel in this version, and the line numbers to the right are from the published header for the original Windows 10 release. Line numbers in parentheses are explained after the table.

Line Number
(Version 1803)
Type Line Number
(Original Windows 10)
58 enum _CONFIGURATION_CLASS 58
69 struct _CONFIGURATION_COMPONENT 69
(76) anonymous union in
struct _CONFIGURATION_COMPONENT
76
(78) anonymous struct in
anonymous union in
struct _CONFIGURATION_COMPONENT
78
92 struct _CONFIGURATION_COMPONENT_DATA 92
105 enum _TYPE_OF_MEMORY 105
145 struct _MEMORY_ALLOCATION_DESCRIPTOR 142
156 struct _NLS_DATA_BLOCK 153
(162) struct _VHD_DISK_SIGNATURE 159
(167) struct _ARC_DISK_SIGNATURE 164
180 struct _ARC_DISK_INFORMATION 177
184 struct _I386_LOADER_BLOCK 181
200 struct _ARM_LOADER_BLOCK 197
217 struct _LOADER_PERFORMANCE_DATA 214
  enum _BOOT_ENTROPY_SOURCE_RESULT_CODE 229
  enum _BOOT_ENTROPY_SOURCE_ID 237
284 struct _BOOT_ENTROPY_SOURCE_LDR_RESULT 280
302 struct _OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V2 298
(320) struct _OFFLINE_CRASHDUMP_CONFIGURATION_TABLE_V1 316
337 struct _BOOT_ENTROPY_LDR_RESULT 333
349 struct _LOADER_PARAMETER_HYPERVISOR_EXTENSION 344
374 struct _LOADER_PARAMETER_CI_EXTENSION 369
(378) anonymous struct in
struct _LOADER_PARAMETER_CI_EXTENSION
 
(416) struct _HAL_EXTENSION_INSTANCE_ENTRY 383
(432) struct _HAL_EXTENSION_MODULE_ENTRY 399
464 struct _LOADER_BUGCHECK_PARAMETERS 431
477 struct _LOADER_HIVE_RECOVERY_INFO  
(478) anonymous struct in
struct _LOADER_HIVE_RECOVERY_INFO
 
534 struct _LOADER_RESET_REASON  
536 unnamed union Basic in
struct _LOADER_RESET_REASON
 
537 unnamed struct Component in
unnamed union Basic in
struct _LOADER_RESET_REASON
 
632 struct _LOADER_PARAMETER_EXTENSION 453
(697) anonymous struct in
struct _LOADER_PARAMETER_EXTENSION
518
(920) anonymous union in
struct _LOADER_PARAMETER_EXTENSION
 
(922) anonymous struct in
anonymous union in
struct _LOADER_PARAMETER_EXTENSION
 
(933) anonymous union in
struct _LOADER_PARAMETER_EXTENSION
 
(935) anonymous struct in
anonymous union in
struct _LOADER_PARAMETER_EXTENSION
 
1116 struct _NETWORK_LOADER_BLOCK 808
1130 struct _VIRTUAL_EFI_RUNTIME_SERVICES 822
1153 struct _EFI_FIRMWARE_INFORMATION 845
1187 struct _PCAT_FIRMWARE_INFORMATION 879
1192 struct _FIRMWARE_INFORMATION_LOADER_BLOCK 884
(1193) anonymous struct in
struct _FIRMWARE_INFORMATION_LOADER_BLOCK
885
1237 unnamed union u in
struct _FIRMWARE_INFORMATION_LOADER_BLOCK
936
(1256) struct _BLDR_DATA_TABLE_ENTRY 955
1274 struct _LOADER_PARAMETER_BLOCK 971
1326 unnamed union u in
struct _LOADER_PARAMETER_BLOCK
1023
(1383) struct _LOADER_HIVE_BLOCK 1040
(1397) struct _NT_IMAGE_INFO  

As only to be expected, the header has grown in the years since its (accidental) disclosure and so the unseen ARC.H for Version 1803 has types that are not in the published ARC.H for the original Windows 10. For these, there is no line number to show on the right.

The explanation is a little more complicated for why the two enumerations BOOT_ENTROPY_SOURCE_RESULT_CODE and BOOT_ENTROPY_SOURCE_ID have no line number on the left. Their definitions can be seen in the accidentally published ARC.H for the original Windows 10. A comment there warns Microsoft’s programmers that

//
// Entropy result codes and source IDs
// for Boot entropy sources are defined both in arc.h and
// ntexapi.h. These two copies must be kept identical.
//

The public symbols for the Version 1803 kernel place these enumerations’ definitions in ntexapi.h and thus do not give line numbers of the definitions in ARC.H or even tell anything of whether the definitions remain in ARC.H (though the very nearly matching gap in line numbers suggests a high likelihood that the definitions are still in both headers).

For why some line numbers for Version 1803 are in parentheses, remember that the public symbols for the kernel in the original Windows 10 have only a few of the types that show in the (accidentally) published ARC.H for that version. Although very many more types show in the public symbols for the Version 1803 kernel, they still are not a complete reckoning of types that are defined in the Version 1803 ARC.H. Alert readers will note that the previous sentence is a stronger statement than can be supported just from the public symbols. From these, the strongest deduction is that the public symbols for the Version 1803 kernel do not have all the types that are known from the published ARC.H for two earlier releases of Windows 10. It turns out, however, that there is another source of information about types defined in ARC.H and this not only extends to Version 1803 (indeed, to Version 1903) but is credibly complete.

This other source also is type information such as shows in symbol files. What’s different is that it’s in a statically linked library. That this library, named CLFSMGMT.LIB and distributed in the Software Development Kit (SDK) as if for user-mode programming, credibly has all the types that are defined in the kernel-mode ARC.H is because this library archives an object file that resulted from creating a pre-compiled header. Its type information is therefore not for types that the compiler regarded as used, e.g., in source code for the other object files in the library, but for types that might have got used. A detraction to libraries, in terms of forensic quality, is that even when they are targeted to one version of the operating system they can be correct for their purpose even if built with headers that are not exactly what were used when building the operating system. It happens, however, that this library for Version 1803 was built on the same day as the Version 1803 kernel. For types that are common to the library and the public symbols, the line numbers match. The line numbers from the library are almost certainly correct even for types that are missing from the public symbols. These are the line numbers that are in parentheses.

Some, even many, of these line numbers in parentheses are for anonymous structures and unions which do or don’t get their own records depending on whether the header was compiled as C++ or C. A good handful, however, are thought never to have been revealed in public symbols and might never have been known from freely published materials except for the accidental disclosure of ARC.H for two Windows releases. The last of them, NT_IMAGE_INFO, has been added since and is not known to Google at all today, 9th December 2022.

Location

There is one more complication: the ARC.H that is compiled for the kernel’s public symbol files is not Microsoft’s only ARC.H. It may be a copy or extract for inclusion with a HAL development kit. It is not certainly the same ARC.H, if any, that is compiled when building the kernel itself. Where ARC.H is named in a handful of private symbol files that Microsoft has distributed with otherwise public symbols, a different location is given for it. For instance, in the downloadable package of public symbols for the original release of Windows 10, appxdeploymentclient.pdb names ARC.H in

d:\th.public.fre\internal\sdk\inc\minwin

which is indeed where the kernel gets many of its headers. More study is required.