github.com/apernet/sing-tun@v0.2.6-0.20240323130332-b9f6511036ad/internal/wintun/memmod/syscall_windows.go (about)

     1  /* SPDX-License-Identifier: MIT
     2   *
     3   * Copyright (C) 2017-2021 WireGuard LLC. All Rights Reserved.
     4   */
     5  
     6  package memmod
     7  
     8  import "unsafe"
     9  
    10  const (
    11  	IMAGE_DOS_SIGNATURE    = 0x5A4D     // MZ
    12  	IMAGE_OS2_SIGNATURE    = 0x454E     // NE
    13  	IMAGE_OS2_SIGNATURE_LE = 0x454C     // LE
    14  	IMAGE_VXD_SIGNATURE    = 0x454C     // LE
    15  	IMAGE_NT_SIGNATURE     = 0x00004550 // PE00
    16  )
    17  
    18  // DOS .EXE header
    19  type IMAGE_DOS_HEADER struct {
    20  	E_magic    uint16     // Magic number
    21  	E_cblp     uint16     // Bytes on last page of file
    22  	E_cp       uint16     // Pages in file
    23  	E_crlc     uint16     // Relocations
    24  	E_cparhdr  uint16     // Size of header in paragraphs
    25  	E_minalloc uint16     // Minimum extra paragraphs needed
    26  	E_maxalloc uint16     // Maximum extra paragraphs needed
    27  	E_ss       uint16     // Initial (relative) SS value
    28  	E_sp       uint16     // Initial SP value
    29  	E_csum     uint16     // Checksum
    30  	E_ip       uint16     // Initial IP value
    31  	E_cs       uint16     // Initial (relative) CS value
    32  	E_lfarlc   uint16     // File address of relocation table
    33  	E_ovno     uint16     // Overlay number
    34  	E_res      [4]uint16  // Reserved words
    35  	E_oemid    uint16     // OEM identifier (for e_oeminfo)
    36  	E_oeminfo  uint16     // OEM information; e_oemid specific
    37  	E_res2     [10]uint16 // Reserved words
    38  	E_lfanew   int32      // File address of new exe header
    39  }
    40  
    41  // File header format
    42  type IMAGE_FILE_HEADER struct {
    43  	Machine              uint16
    44  	NumberOfSections     uint16
    45  	TimeDateStamp        uint32
    46  	PointerToSymbolTable uint32
    47  	NumberOfSymbols      uint32
    48  	SizeOfOptionalHeader uint16
    49  	Characteristics      uint16
    50  }
    51  
    52  const (
    53  	IMAGE_SIZEOF_FILE_HEADER = 20
    54  
    55  	IMAGE_FILE_RELOCS_STRIPPED         = 0x0001 // Relocation info stripped from file.
    56  	IMAGE_FILE_EXECUTABLE_IMAGE        = 0x0002 // File is executable  (i.e. no unresolved external references).
    57  	IMAGE_FILE_LINE_NUMS_STRIPPED      = 0x0004 // Line nunbers stripped from file.
    58  	IMAGE_FILE_LOCAL_SYMS_STRIPPED     = 0x0008 // Local symbols stripped from file.
    59  	IMAGE_FILE_AGGRESIVE_WS_TRIM       = 0x0010 // Aggressively trim working set
    60  	IMAGE_FILE_LARGE_ADDRESS_AWARE     = 0x0020 // App can handle >2gb addresses
    61  	IMAGE_FILE_BYTES_REVERSED_LO       = 0x0080 // Bytes of machine word are reversed.
    62  	IMAGE_FILE_32BIT_MACHINE           = 0x0100 // 32 bit word machine.
    63  	IMAGE_FILE_DEBUG_STRIPPED          = 0x0200 // Debugging info stripped from file in .DBG file
    64  	IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400 // If Image is on removable media, copy and run from the swap file.
    65  	IMAGE_FILE_NET_RUN_FROM_SWAP       = 0x0800 // If Image is on Net, copy and run from the swap file.
    66  	IMAGE_FILE_SYSTEM                  = 0x1000 // System File.
    67  	IMAGE_FILE_DLL                     = 0x2000 // File is a DLL.
    68  	IMAGE_FILE_UP_SYSTEM_ONLY          = 0x4000 // File should only be run on a UP machine
    69  	IMAGE_FILE_BYTES_REVERSED_HI       = 0x8000 // Bytes of machine word are reversed.
    70  
    71  	IMAGE_FILE_MACHINE_UNKNOWN     = 0
    72  	IMAGE_FILE_MACHINE_TARGET_HOST = 0x0001 // Useful for indicating we want to interact with the host and not a WoW guest.
    73  	IMAGE_FILE_MACHINE_I386        = 0x014c // Intel 386.
    74  	IMAGE_FILE_MACHINE_R3000       = 0x0162 // MIPS little-endian, 0x160 big-endian
    75  	IMAGE_FILE_MACHINE_R4000       = 0x0166 // MIPS little-endian
    76  	IMAGE_FILE_MACHINE_R10000      = 0x0168 // MIPS little-endian
    77  	IMAGE_FILE_MACHINE_WCEMIPSV2   = 0x0169 // MIPS little-endian WCE v2
    78  	IMAGE_FILE_MACHINE_ALPHA       = 0x0184 // Alpha_AXP
    79  	IMAGE_FILE_MACHINE_SH3         = 0x01a2 // SH3 little-endian
    80  	IMAGE_FILE_MACHINE_SH3DSP      = 0x01a3
    81  	IMAGE_FILE_MACHINE_SH3E        = 0x01a4 // SH3E little-endian
    82  	IMAGE_FILE_MACHINE_SH4         = 0x01a6 // SH4 little-endian
    83  	IMAGE_FILE_MACHINE_SH5         = 0x01a8 // SH5
    84  	IMAGE_FILE_MACHINE_ARM         = 0x01c0 // ARM Little-Endian
    85  	IMAGE_FILE_MACHINE_THUMB       = 0x01c2 // ARM Thumb/Thumb-2 Little-Endian
    86  	IMAGE_FILE_MACHINE_ARMNT       = 0x01c4 // ARM Thumb-2 Little-Endian
    87  	IMAGE_FILE_MACHINE_AM33        = 0x01d3
    88  	IMAGE_FILE_MACHINE_POWERPC     = 0x01F0 // IBM PowerPC Little-Endian
    89  	IMAGE_FILE_MACHINE_POWERPCFP   = 0x01f1
    90  	IMAGE_FILE_MACHINE_IA64        = 0x0200 // Intel 64
    91  	IMAGE_FILE_MACHINE_MIPS16      = 0x0266 // MIPS
    92  	IMAGE_FILE_MACHINE_ALPHA64     = 0x0284 // ALPHA64
    93  	IMAGE_FILE_MACHINE_MIPSFPU     = 0x0366 // MIPS
    94  	IMAGE_FILE_MACHINE_MIPSFPU16   = 0x0466 // MIPS
    95  	IMAGE_FILE_MACHINE_AXP64       = IMAGE_FILE_MACHINE_ALPHA64
    96  	IMAGE_FILE_MACHINE_TRICORE     = 0x0520 // Infineon
    97  	IMAGE_FILE_MACHINE_CEF         = 0x0CEF
    98  	IMAGE_FILE_MACHINE_EBC         = 0x0EBC // EFI Byte Code
    99  	IMAGE_FILE_MACHINE_AMD64       = 0x8664 // AMD64 (K8)
   100  	IMAGE_FILE_MACHINE_M32R        = 0x9041 // M32R little-endian
   101  	IMAGE_FILE_MACHINE_ARM64       = 0xAA64 // ARM64 Little-Endian
   102  	IMAGE_FILE_MACHINE_CEE         = 0xC0EE
   103  )
   104  
   105  // Directory format
   106  type IMAGE_DATA_DIRECTORY struct {
   107  	VirtualAddress uint32
   108  	Size           uint32
   109  }
   110  
   111  const IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16
   112  
   113  type IMAGE_NT_HEADERS struct {
   114  	Signature      uint32
   115  	FileHeader     IMAGE_FILE_HEADER
   116  	OptionalHeader IMAGE_OPTIONAL_HEADER
   117  }
   118  
   119  func (ntheader *IMAGE_NT_HEADERS) Sections() []IMAGE_SECTION_HEADER {
   120  	return (*[0xffff]IMAGE_SECTION_HEADER)(unsafe.Pointer(
   121  		(uintptr)(unsafe.Pointer(ntheader)) +
   122  			unsafe.Offsetof(ntheader.OptionalHeader) +
   123  			uintptr(ntheader.FileHeader.SizeOfOptionalHeader)))[:ntheader.FileHeader.NumberOfSections]
   124  }
   125  
   126  const (
   127  	IMAGE_DIRECTORY_ENTRY_EXPORT         = 0  // Export Directory
   128  	IMAGE_DIRECTORY_ENTRY_IMPORT         = 1  // Import Directory
   129  	IMAGE_DIRECTORY_ENTRY_RESOURCE       = 2  // Resource Directory
   130  	IMAGE_DIRECTORY_ENTRY_EXCEPTION      = 3  // Exception Directory
   131  	IMAGE_DIRECTORY_ENTRY_SECURITY       = 4  // Security Directory
   132  	IMAGE_DIRECTORY_ENTRY_BASERELOC      = 5  // Base Relocation Table
   133  	IMAGE_DIRECTORY_ENTRY_DEBUG          = 6  // Debug Directory
   134  	IMAGE_DIRECTORY_ENTRY_COPYRIGHT      = 7  // (X86 usage)
   135  	IMAGE_DIRECTORY_ENTRY_ARCHITECTURE   = 7  // Architecture Specific Data
   136  	IMAGE_DIRECTORY_ENTRY_GLOBALPTR      = 8  // RVA of GP
   137  	IMAGE_DIRECTORY_ENTRY_TLS            = 9  // TLS Directory
   138  	IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG    = 10 // Load Configuration Directory
   139  	IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT   = 11 // Bound Import Directory in headers
   140  	IMAGE_DIRECTORY_ENTRY_IAT            = 12 // Import Address Table
   141  	IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT   = 13 // Delay Load Import Descriptors
   142  	IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14 // COM Runtime descriptor
   143  )
   144  
   145  const IMAGE_SIZEOF_SHORT_NAME = 8
   146  
   147  // Section header format
   148  type IMAGE_SECTION_HEADER struct {
   149  	Name                         [IMAGE_SIZEOF_SHORT_NAME]byte
   150  	physicalAddressOrVirtualSize uint32
   151  	VirtualAddress               uint32
   152  	SizeOfRawData                uint32
   153  	PointerToRawData             uint32
   154  	PointerToRelocations         uint32
   155  	PointerToLinenumbers         uint32
   156  	NumberOfRelocations          uint16
   157  	NumberOfLinenumbers          uint16
   158  	Characteristics              uint32
   159  }
   160  
   161  func (ishdr *IMAGE_SECTION_HEADER) PhysicalAddress() uint32 {
   162  	return ishdr.physicalAddressOrVirtualSize
   163  }
   164  
   165  func (ishdr *IMAGE_SECTION_HEADER) SetPhysicalAddress(addr uint32) {
   166  	ishdr.physicalAddressOrVirtualSize = addr
   167  }
   168  
   169  func (ishdr *IMAGE_SECTION_HEADER) VirtualSize() uint32 {
   170  	return ishdr.physicalAddressOrVirtualSize
   171  }
   172  
   173  func (ishdr *IMAGE_SECTION_HEADER) SetVirtualSize(addr uint32) {
   174  	ishdr.physicalAddressOrVirtualSize = addr
   175  }
   176  
   177  const (
   178  	// Dll characteristics.
   179  	IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA       = 0x0020
   180  	IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE          = 0x0040
   181  	IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY       = 0x0080
   182  	IMAGE_DLL_CHARACTERISTICS_NX_COMPAT             = 0x0100
   183  	IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION          = 0x0200
   184  	IMAGE_DLL_CHARACTERISTICS_NO_SEH                = 0x0400
   185  	IMAGE_DLL_CHARACTERISTICS_NO_BIND               = 0x0800
   186  	IMAGE_DLL_CHARACTERISTICS_APPCONTAINER          = 0x1000
   187  	IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER            = 0x2000
   188  	IMAGE_DLL_CHARACTERISTICS_GUARD_CF              = 0x4000
   189  	IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000
   190  )
   191  
   192  const (
   193  	// Section characteristics.
   194  	IMAGE_SCN_TYPE_REG    = 0x00000000 // Reserved.
   195  	IMAGE_SCN_TYPE_DSECT  = 0x00000001 // Reserved.
   196  	IMAGE_SCN_TYPE_NOLOAD = 0x00000002 // Reserved.
   197  	IMAGE_SCN_TYPE_GROUP  = 0x00000004 // Reserved.
   198  	IMAGE_SCN_TYPE_NO_PAD = 0x00000008 // Reserved.
   199  	IMAGE_SCN_TYPE_COPY   = 0x00000010 // Reserved.
   200  
   201  	IMAGE_SCN_CNT_CODE               = 0x00000020 // Section contains code.
   202  	IMAGE_SCN_CNT_INITIALIZED_DATA   = 0x00000040 // Section contains initialized data.
   203  	IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080 // Section contains uninitialized data.
   204  
   205  	IMAGE_SCN_LNK_OTHER         = 0x00000100 // Reserved.
   206  	IMAGE_SCN_LNK_INFO          = 0x00000200 // Section contains comments or some other type of information.
   207  	IMAGE_SCN_TYPE_OVER         = 0x00000400 // Reserved.
   208  	IMAGE_SCN_LNK_REMOVE        = 0x00000800 // Section contents will not become part of image.
   209  	IMAGE_SCN_LNK_COMDAT        = 0x00001000 // Section contents comdat.
   210  	IMAGE_SCN_MEM_PROTECTED     = 0x00004000 // Obsolete.
   211  	IMAGE_SCN_NO_DEFER_SPEC_EXC = 0x00004000 // Reset speculative exceptions handling bits in the TLB entries for this section.
   212  	IMAGE_SCN_GPREL             = 0x00008000 // Section content can be accessed relative to GP
   213  	IMAGE_SCN_MEM_FARDATA       = 0x00008000
   214  	IMAGE_SCN_MEM_SYSHEAP       = 0x00010000 // Obsolete.
   215  	IMAGE_SCN_MEM_PURGEABLE     = 0x00020000
   216  	IMAGE_SCN_MEM_16BIT         = 0x00020000
   217  	IMAGE_SCN_MEM_LOCKED        = 0x00040000
   218  	IMAGE_SCN_MEM_PRELOAD       = 0x00080000
   219  
   220  	IMAGE_SCN_ALIGN_1BYTES    = 0x00100000 //
   221  	IMAGE_SCN_ALIGN_2BYTES    = 0x00200000 //
   222  	IMAGE_SCN_ALIGN_4BYTES    = 0x00300000 //
   223  	IMAGE_SCN_ALIGN_8BYTES    = 0x00400000 //
   224  	IMAGE_SCN_ALIGN_16BYTES   = 0x00500000 // Default alignment if no others are specified.
   225  	IMAGE_SCN_ALIGN_32BYTES   = 0x00600000 //
   226  	IMAGE_SCN_ALIGN_64BYTES   = 0x00700000 //
   227  	IMAGE_SCN_ALIGN_128BYTES  = 0x00800000 //
   228  	IMAGE_SCN_ALIGN_256BYTES  = 0x00900000 //
   229  	IMAGE_SCN_ALIGN_512BYTES  = 0x00A00000 //
   230  	IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000 //
   231  	IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000 //
   232  	IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000 //
   233  	IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000 //
   234  	IMAGE_SCN_ALIGN_MASK      = 0x00F00000
   235  
   236  	IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000 // Section contains extended relocations.
   237  	IMAGE_SCN_MEM_DISCARDABLE = 0x02000000 // Section can be discarded.
   238  	IMAGE_SCN_MEM_NOT_CACHED  = 0x04000000 // Section is not cachable.
   239  	IMAGE_SCN_MEM_NOT_PAGED   = 0x08000000 // Section is not pageable.
   240  	IMAGE_SCN_MEM_SHARED      = 0x10000000 // Section is shareable.
   241  	IMAGE_SCN_MEM_EXECUTE     = 0x20000000 // Section is executable.
   242  	IMAGE_SCN_MEM_READ        = 0x40000000 // Section is readable.
   243  	IMAGE_SCN_MEM_WRITE       = 0x80000000 // Section is writeable.
   244  
   245  	// TLS Characteristic Flags
   246  	IMAGE_SCN_SCALE_INDEX = 0x00000001 // Tls index is scaled.
   247  )
   248  
   249  // Based relocation format
   250  type IMAGE_BASE_RELOCATION struct {
   251  	VirtualAddress uint32
   252  	SizeOfBlock    uint32
   253  }
   254  
   255  const (
   256  	IMAGE_REL_BASED_ABSOLUTE           = 0
   257  	IMAGE_REL_BASED_HIGH               = 1
   258  	IMAGE_REL_BASED_LOW                = 2
   259  	IMAGE_REL_BASED_HIGHLOW            = 3
   260  	IMAGE_REL_BASED_HIGHADJ            = 4
   261  	IMAGE_REL_BASED_MACHINE_SPECIFIC_5 = 5
   262  	IMAGE_REL_BASED_RESERVED           = 6
   263  	IMAGE_REL_BASED_MACHINE_SPECIFIC_7 = 7
   264  	IMAGE_REL_BASED_MACHINE_SPECIFIC_8 = 8
   265  	IMAGE_REL_BASED_MACHINE_SPECIFIC_9 = 9
   266  	IMAGE_REL_BASED_DIR64              = 10
   267  
   268  	IMAGE_REL_BASED_IA64_IMM64 = 9
   269  
   270  	IMAGE_REL_BASED_MIPS_JMPADDR   = 5
   271  	IMAGE_REL_BASED_MIPS_JMPADDR16 = 9
   272  
   273  	IMAGE_REL_BASED_ARM_MOV32   = 5
   274  	IMAGE_REL_BASED_THUMB_MOV32 = 7
   275  )
   276  
   277  // Export Format
   278  type IMAGE_EXPORT_DIRECTORY struct {
   279  	Characteristics       uint32
   280  	TimeDateStamp         uint32
   281  	MajorVersion          uint16
   282  	MinorVersion          uint16
   283  	Name                  uint32
   284  	Base                  uint32
   285  	NumberOfFunctions     uint32
   286  	NumberOfNames         uint32
   287  	AddressOfFunctions    uint32 // RVA from base of image
   288  	AddressOfNames        uint32 // RVA from base of image
   289  	AddressOfNameOrdinals uint32 // RVA from base of image
   290  }
   291  
   292  type IMAGE_IMPORT_BY_NAME struct {
   293  	Hint uint16
   294  	Name [1]byte
   295  }
   296  
   297  func IMAGE_ORDINAL(ordinal uintptr) uintptr {
   298  	return ordinal & 0xffff
   299  }
   300  
   301  func IMAGE_SNAP_BY_ORDINAL(ordinal uintptr) bool {
   302  	return (ordinal & IMAGE_ORDINAL_FLAG) != 0
   303  }
   304  
   305  // Thread Local Storage
   306  type IMAGE_TLS_DIRECTORY struct {
   307  	StartAddressOfRawData uintptr
   308  	EndAddressOfRawData   uintptr
   309  	AddressOfIndex        uintptr // PDWORD
   310  	AddressOfCallbacks    uintptr // PIMAGE_TLS_CALLBACK *;
   311  	SizeOfZeroFill        uint32
   312  	Characteristics       uint32
   313  }
   314  
   315  type IMAGE_IMPORT_DESCRIPTOR struct {
   316  	characteristicsOrOriginalFirstThunk uint32 // 0 for terminating null import descriptor
   317  	// RVA to original unbound IAT (PIMAGE_THUNK_DATA)
   318  	TimeDateStamp uint32 // 0 if not bound,
   319  	// -1 if bound, and real date\time stamp
   320  	//     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
   321  	// O.W. date/time stamp of DLL bound to (Old BIND)
   322  	ForwarderChain uint32 // -1 if no forwarders
   323  	Name           uint32
   324  	FirstThunk     uint32 // RVA to IAT (if bound this IAT has actual addresses)
   325  }
   326  
   327  func (imgimpdesc *IMAGE_IMPORT_DESCRIPTOR) Characteristics() uint32 {
   328  	return imgimpdesc.characteristicsOrOriginalFirstThunk
   329  }
   330  
   331  func (imgimpdesc *IMAGE_IMPORT_DESCRIPTOR) OriginalFirstThunk() uint32 {
   332  	return imgimpdesc.characteristicsOrOriginalFirstThunk
   333  }
   334  
   335  type IMAGE_DELAYLOAD_DESCRIPTOR struct {
   336  	Attributes                 uint32
   337  	DllNameRVA                 uint32
   338  	ModuleHandleRVA            uint32
   339  	ImportAddressTableRVA      uint32
   340  	ImportNameTableRVA         uint32
   341  	BoundImportAddressTableRVA uint32
   342  	UnloadInformationTableRVA  uint32
   343  	TimeDateStamp              uint32
   344  }
   345  
   346  type IMAGE_LOAD_CONFIG_CODE_INTEGRITY struct {
   347  	Flags         uint16
   348  	Catalog       uint16
   349  	CatalogOffset uint32
   350  	Reserved      uint32
   351  }
   352  
   353  const (
   354  	IMAGE_GUARD_CF_INSTRUMENTED                    = 0x00000100
   355  	IMAGE_GUARD_CFW_INSTRUMENTED                   = 0x00000200
   356  	IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT          = 0x00000400
   357  	IMAGE_GUARD_SECURITY_COOKIE_UNUSED             = 0x00000800
   358  	IMAGE_GUARD_PROTECT_DELAYLOAD_IAT              = 0x00001000
   359  	IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION   = 0x00002000
   360  	IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT = 0x00004000
   361  	IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION       = 0x00008000
   362  	IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT          = 0x00010000
   363  	IMAGE_GUARD_RF_INSTRUMENTED                    = 0x00020000
   364  	IMAGE_GUARD_RF_ENABLE                          = 0x00040000
   365  	IMAGE_GUARD_RF_STRICT                          = 0x00080000
   366  	IMAGE_GUARD_RETPOLINE_PRESENT                  = 0x00100000
   367  	IMAGE_GUARD_EH_CONTINUATION_TABLE_PRESENT      = 0x00400000
   368  	IMAGE_GUARD_XFG_ENABLED                        = 0x00800000
   369  	IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK        = 0xF0000000
   370  	IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT       = 28
   371  )
   372  
   373  const (
   374  	DLL_PROCESS_ATTACH = 1
   375  	DLL_THREAD_ATTACH  = 2
   376  	DLL_THREAD_DETACH  = 3
   377  	DLL_PROCESS_DETACH = 0
   378  )
   379  
   380  type SYSTEM_INFO struct {
   381  	ProcessorArchitecture     uint16
   382  	Reserved                  uint16
   383  	PageSize                  uint32
   384  	MinimumApplicationAddress uintptr
   385  	MaximumApplicationAddress uintptr
   386  	ActiveProcessorMask       uintptr
   387  	NumberOfProcessors        uint32
   388  	ProcessorType             uint32
   389  	AllocationGranularity     uint32
   390  	ProcessorLevel            uint16
   391  	ProcessorRevision         uint16
   392  }