/* Hardware Abstraction Layer Types */ $if (_NTDDK_) typedef BOOLEAN (NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)( _In_ ULONG Columns, _In_ ULONG Rows); typedef PBUS_HANDLER (FASTCALL *pHalHandlerForBus)( _In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber); typedef VOID (FASTCALL *pHalReferenceBusHandler)( _In_ PBUS_HANDLER BusHandler); typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, HalProfileSourceInformation, HalInformationClassUnused1, HalPowerInformation, HalProcessorSpeedInformation, HalCallbackInformation, HalMapRegisterInformation, HalMcaLogInformation, HalFrameBufferCachingInformation, HalDisplayBiosInformation, HalProcessorFeatureInformation, HalNumaTopologyInterface, HalErrorInformation, HalCmcLogInformation, HalCpeLogInformation, HalQueryMcaInterface, HalQueryAMLIIllegalIOPortAddresses, HalQueryMaxHotPlugMemoryAddress, HalPartitionIpiInterface, HalPlatformInformation, HalQueryProfileSourceList, HalInitLogInformation, HalFrequencyInformation, HalProcessorBrandString, HalHypervisorInformation, HalPlatformTimerInformation, HalAcpiAuditInformation } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS; typedef enum _HAL_SET_INFORMATION_CLASS { HalProfileSourceInterval, HalProfileSourceInterruptHandler, HalMcaRegisterDriver, HalKernelErrorHandler, HalCmcRegisterDriver, HalCpeRegisterDriver, HalMcaLog, HalCmcLog, HalCpeLog, HalGenerateCmcInterrupt, HalProfileSourceTimerHandler, HalEnlightenment, HalProfileDpgoSourceInterruptHandler } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; typedef NTSTATUS (NTAPI *pHalQuerySystemInformation)( _In_ HAL_QUERY_INFORMATION_CLASS InformationClass, _In_ ULONG BufferSize, _Inout_updates_bytes_to_(BufferSize, *ReturnedLength) PVOID Buffer, _Out_ PULONG ReturnedLength); typedef NTSTATUS (NTAPI *pHalSetSystemInformation)( _In_ HAL_SET_INFORMATION_CLASS InformationClass, _In_ ULONG BufferSize, _In_ PVOID Buffer); typedef VOID (FASTCALL *pHalExamineMBR)( _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG SectorSize, _In_ ULONG MBRTypeIdentifier, _Out_ PVOID *Buffer); typedef NTSTATUS (FASTCALL *pHalIoReadPartitionTable)( _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG SectorSize, _In_ BOOLEAN ReturnRecognizedPartitions, _Out_ struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer); typedef NTSTATUS (FASTCALL *pHalIoSetPartitionInformation)( _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG SectorSize, _In_ ULONG PartitionNumber, _In_ ULONG PartitionType); typedef NTSTATUS (FASTCALL *pHalIoWritePartitionTable)( _In_ PDEVICE_OBJECT DeviceObject, _In_ ULONG SectorSize, _In_ ULONG SectorsPerTrack, _In_ ULONG NumberOfHeads, _In_ struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer); typedef NTSTATUS (NTAPI *pHalQueryBusSlots)( _In_ PBUS_HANDLER BusHandler, _In_ ULONG BufferSize, _Out_ PULONG SlotNumbers, _Out_ PULONG ReturnedLength); typedef NTSTATUS (NTAPI *pHalInitPnpDriver)(VOID); typedef struct _PM_DISPATCH_TABLE { ULONG Signature; ULONG Version; PVOID Function[1]; } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; typedef NTSTATUS (NTAPI *pHalInitPowerManagement)( _In_ PPM_DISPATCH_TABLE PmDriverDispatchTable, _Out_ PPM_DISPATCH_TABLE *PmHalDispatchTable); typedef struct _DMA_ADAPTER* (NTAPI *pHalGetDmaAdapter)( _In_ PVOID Context, _In_ struct _DEVICE_DESCRIPTION *DeviceDescriptor, _Out_ PULONG NumberOfMapRegisters); typedef NTSTATUS (NTAPI *pHalGetInterruptTranslator)( _In_ INTERFACE_TYPE ParentInterfaceType, _In_ ULONG ParentBusNumber, _In_ INTERFACE_TYPE BridgeInterfaceType, _In_ USHORT Size, _In_ USHORT Version, _Out_ PTRANSLATOR_INTERFACE Translator, _Out_ PULONG BridgeBusNumber); typedef NTSTATUS (NTAPI *pHalStartMirroring)(VOID); typedef NTSTATUS (NTAPI *pHalEndMirroring)( _In_ ULONG PassNumber); typedef NTSTATUS (NTAPI *pHalMirrorPhysicalMemory)( _In_ PHYSICAL_ADDRESS PhysicalAddress, _In_ LARGE_INTEGER NumberOfBytes); typedef NTSTATUS (NTAPI *pHalMirrorVerify)( _In_ PHYSICAL_ADDRESS PhysicalAddress, _In_ LARGE_INTEGER NumberOfBytes); typedef BOOLEAN (NTAPI *pHalTranslateBusAddress)( _In_ INTERFACE_TYPE InterfaceType, _In_ ULONG BusNumber, _In_ PHYSICAL_ADDRESS BusAddress, _Inout_ PULONG AddressSpace, _Out_ PPHYSICAL_ADDRESS TranslatedAddress); typedef NTSTATUS (NTAPI *pHalAssignSlotResources)( _In_ PUNICODE_STRING RegistryPath, _In_opt_ PUNICODE_STRING DriverClassName, _In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT DeviceObject, _In_ INTERFACE_TYPE BusType, _In_ ULONG BusNumber, _In_ ULONG SlotNumber, _Inout_ PCM_RESOURCE_LIST *AllocatedResources); typedef VOID (NTAPI *pHalHaltSystem)(VOID); typedef BOOLEAN (NTAPI *pHalResetDisplay)(VOID); typedef struct _MAP_REGISTER_ENTRY { PVOID MapRegister; BOOLEAN WriteToDevice; } MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY; typedef UCHAR (NTAPI *pHalVectorToIDTEntry)( ULONG Vector); typedef BOOLEAN (NTAPI *pHalFindBusAddressTranslation)( _In_ PHYSICAL_ADDRESS BusAddress, _Inout_ PULONG AddressSpace, _Out_ PPHYSICAL_ADDRESS TranslatedAddress, _Inout_ PULONG_PTR Context, _In_ BOOLEAN NextBus); typedef VOID (NTAPI *pHalEndOfBoot)(VOID); typedef PVOID (NTAPI *pHalGetAcpiTable)( _In_ ULONG Signature, _In_opt_ PCSTR OemId, _In_opt_ PCSTR OemTableId); #if defined(_IA64_) typedef NTSTATUS (*pHalGetErrorCapList)( _Inout_ PULONG CapsListLength, _Inout_updates_bytes_(*CapsListLength) PUCHAR ErrorCapList); typedef NTSTATUS (*pHalInjectError)( _In_ ULONG BufferLength, _In_reads_bytes_(BufferLength) PUCHAR Buffer); #endif typedef VOID (NTAPI *PCI_ERROR_HANDLER_CALLBACK)(VOID); typedef VOID (NTAPI *pHalSetPciErrorHandlerCallback)( _In_ PCI_ERROR_HANDLER_CALLBACK Callback); #if 1 /* Not present in WDK 7600 */ typedef VOID (FASTCALL *pHalIoAssignDriveLetters)( _In_ struct _LOADER_PARAMETER_BLOCK *LoaderBlock, _In_ PSTRING NtDeviceName, _Out_ PUCHAR NtSystemPath, _Out_ PSTRING NtSystemPathString); #endif typedef struct { ULONG Version; pHalQuerySystemInformation HalQuerySystemInformation; pHalSetSystemInformation HalSetSystemInformation; pHalQueryBusSlots HalQueryBusSlots; ULONG Spare1; pHalExamineMBR HalExamineMBR; #if 1 /* Not present in WDK 7600 */ pHalIoAssignDriveLetters HalIoAssignDriveLetters; #endif pHalIoReadPartitionTable HalIoReadPartitionTable; pHalIoSetPartitionInformation HalIoSetPartitionInformation; pHalIoWritePartitionTable HalIoWritePartitionTable; pHalHandlerForBus HalReferenceHandlerForBus; pHalReferenceBusHandler HalReferenceBusHandler; pHalReferenceBusHandler HalDereferenceBusHandler; pHalInitPnpDriver HalInitPnpDriver; pHalInitPowerManagement HalInitPowerManagement; pHalGetDmaAdapter HalGetDmaAdapter; pHalGetInterruptTranslator HalGetInterruptTranslator; pHalStartMirroring HalStartMirroring; pHalEndMirroring HalEndMirroring; pHalMirrorPhysicalMemory HalMirrorPhysicalMemory; pHalEndOfBoot HalEndOfBoot; pHalMirrorVerify HalMirrorVerify; pHalGetAcpiTable HalGetCachedAcpiTable; pHalSetPciErrorHandlerCallback HalSetPciErrorHandlerCallback; #if defined(_IA64_) pHalGetErrorCapList HalGetErrorCapList; pHalInjectError HalInjectError; #endif } HAL_DISPATCH, *PHAL_DISPATCH; #ifdef _NTSYSTEM_ extern HAL_DISPATCH HalDispatchTable; #define HALDISPATCH (&HalDispatchTable) #else __CREATE_NTOS_DATA_IMPORT_ALIAS(HalDispatchTable) extern PHAL_DISPATCH HalDispatchTable; #define HALDISPATCH HalDispatchTable #endif #define HAL_DISPATCH_VERSION 3 /* FIXME: when to use 4? */ #define HalDispatchTableVersion HALDISPATCH->Version #define HalQuerySystemInformation HALDISPATCH->HalQuerySystemInformation #define HalSetSystemInformation HALDISPATCH->HalSetSystemInformation #define HalQueryBusSlots HALDISPATCH->HalQueryBusSlots #define HalReferenceHandlerForBus HALDISPATCH->HalReferenceHandlerForBus #define HalReferenceBusHandler HALDISPATCH->HalReferenceBusHandler #define HalDereferenceBusHandler HALDISPATCH->HalDereferenceBusHandler #define HalInitPnpDriver HALDISPATCH->HalInitPnpDriver #define HalInitPowerManagement HALDISPATCH->HalInitPowerManagement #define HalGetDmaAdapter HALDISPATCH->HalGetDmaAdapter #define HalGetInterruptTranslator HALDISPATCH->HalGetInterruptTranslator #define HalStartMirroring HALDISPATCH->HalStartMirroring #define HalEndMirroring HALDISPATCH->HalEndMirroring #define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory #define HalEndOfBoot HALDISPATCH->HalEndOfBoot #define HalMirrorVerify HALDISPATCH->HalMirrorVerify #define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable #define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback #if defined(_IA64_) #define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList #define HalInjectError HALDISPATCH->HalInjectError #endif typedef struct _HAL_BUS_INFORMATION { INTERFACE_TYPE BusType; BUS_DATA_TYPE ConfigurationType; ULONG BusNumber; ULONG Reserved; } HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION; typedef struct _HAL_PROFILE_SOURCE_INFORMATION { KPROFILE_SOURCE Source; BOOLEAN Supported; ULONG Interval; } HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION; typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX { KPROFILE_SOURCE Source; BOOLEAN Supported; ULONG_PTR Interval; ULONG_PTR DefInterval; ULONG_PTR MaxInterval; ULONG_PTR MinInterval; } HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX; typedef struct _HAL_PROFILE_SOURCE_INTERVAL { KPROFILE_SOURCE Source; ULONG_PTR Interval; } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; typedef struct _HAL_PROFILE_SOURCE_LIST { KPROFILE_SOURCE Source; PWSTR Description; } HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST; typedef enum _HAL_DISPLAY_BIOS_INFORMATION { HalDisplayInt10Bios, HalDisplayEmulatedBios, HalDisplayNoBios } HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION; typedef struct _HAL_POWER_INFORMATION { ULONG TBD; } HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION; typedef struct _HAL_PROCESSOR_SPEED_INFO { ULONG ProcessorSpeed; } HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION; typedef struct _HAL_CALLBACKS { PCALLBACK_OBJECT SetSystemInformation; PCALLBACK_OBJECT BusCheck; } HAL_CALLBACKS, *PHAL_CALLBACKS; typedef struct _HAL_PROCESSOR_FEATURE { ULONG UsableFeatureBits; } HAL_PROCESSOR_FEATURE; typedef NTSTATUS (NTAPI *PHALIOREADWRITEHANDLER)( _In_ BOOLEAN fRead, _In_ ULONG dwAddr, _In_ ULONG dwSize, _Inout_ PULONG pdwData); typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST { ULONG BadAddrBegin; ULONG BadAddrSize; ULONG OSVersionTrigger; PHALIOREADWRITEHANDLER IOHandler; } HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST; #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) typedef VOID (NTAPI *PHALMCAINTERFACELOCK)(VOID); typedef VOID (NTAPI *PHALMCAINTERFACEUNLOCK)(VOID); typedef NTSTATUS (NTAPI *PHALMCAINTERFACEREADREGISTER)( _In_ UCHAR BankNumber, _Inout_ PVOID Exception); typedef struct _HAL_MCA_INTERFACE { PHALMCAINTERFACELOCK Lock; PHALMCAINTERFACEUNLOCK Unlock; PHALMCAINTERFACEREADREGISTER ReadRegister; } HAL_MCA_INTERFACE; typedef enum { ApicDestinationModePhysical = 1, ApicDestinationModeLogicalFlat, ApicDestinationModeLogicalClustered, ApicDestinationModeUnknown } HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE; #if defined(_AMD64_) struct _KTRAP_FRAME; struct _KEXCEPTION_FRAME; typedef ERROR_SEVERITY (NTAPI *PDRIVER_EXCPTN_CALLBACK)( _In_ PVOID Context, _In_ struct _KTRAP_FRAME *TrapFrame, _In_ struct _KEXCEPTION_FRAME *ExceptionFrame, _In_ PMCA_EXCEPTION Exception); #endif #if defined(_X86_) || defined(_IA64_) typedef #if defined(_IA64_) ERROR_SEVERITY #else VOID #endif (NTAPI *PDRIVER_EXCPTN_CALLBACK)( _In_ PVOID Context, _In_ PMCA_EXCEPTION BankLog); #endif typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; typedef struct _MCA_DRIVER_INFO { PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback; PKDEFERRED_ROUTINE DpcCallback; PVOID DeviceContext; } MCA_DRIVER_INFO, *PMCA_DRIVER_INFO; typedef struct _HAL_ERROR_INFO { ULONG Version; ULONG InitMaxSize; ULONG McaMaxSize; ULONG McaPreviousEventsCount; ULONG McaCorrectedEventsCount; ULONG McaKernelDeliveryFails; ULONG McaDriverDpcQueueFails; ULONG McaReserved; ULONG CmcMaxSize; ULONG CmcPollingInterval; ULONG CmcInterruptsCount; ULONG CmcKernelDeliveryFails; ULONG CmcDriverDpcQueueFails; ULONG CmcGetStateFails; ULONG CmcClearStateFails; ULONG CmcReserved; ULONGLONG CmcLogId; ULONG CpeMaxSize; ULONG CpePollingInterval; ULONG CpeInterruptsCount; ULONG CpeKernelDeliveryFails; ULONG CpeDriverDpcQueueFails; ULONG CpeGetStateFails; ULONG CpeClearStateFails; ULONG CpeInterruptSources; ULONGLONG CpeLogId; ULONGLONG KernelReserved[4]; } HAL_ERROR_INFO, *PHAL_ERROR_INFO; #define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1) #define HAL_MCE_DISABLED ((ULONG)0) #define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED #define HAL_CMC_DISABLED HAL_MCE_DISABLED #define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED #define HAL_CPE_DISABLED HAL_MCE_DISABLED #define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED #define HAL_MCA_DISABLED HAL_MCE_DISABLED typedef VOID (NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)( _In_ PVOID Context, _In_ PCMC_EXCEPTION CmcLog); typedef VOID (NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)( _In_ PVOID Context, _In_ PCPE_EXCEPTION CmcLog); typedef struct _CMC_DRIVER_INFO { PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback; PKDEFERRED_ROUTINE DpcCallback; PVOID DeviceContext; } CMC_DRIVER_INFO, *PCMC_DRIVER_INFO; typedef struct _CPE_DRIVER_INFO { PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback; PKDEFERRED_ROUTINE DpcCallback; PVOID DeviceContext; } CPE_DRIVER_INFO, *PCPE_DRIVER_INFO; #endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_) #if defined(_IA64_) typedef NTSTATUS (*HALSENDCROSSPARTITIONIPI)( _In_ USHORT ProcessorID, _In_ UCHAR HardwareVector); typedef NTSTATUS (*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)( _Out_ PULONG Vector, _Out_ PKIRQL Irql, _Inout_ PGROUP_AFFINITY Affinity, _Out_ PUCHAR HardwareVector); typedef VOID (*HALFREECROSSPARTITIONINTERRUPTVECTOR)( _In_ ULONG Vector, _In_ PGROUP_AFFINITY Affinity); typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector; HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector; } HAL_CROSS_PARTITION_IPI_INTERFACE; #define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \ FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \ HalFreeCrossPartitionInterruptVector) #endif /* defined(_IA64_) */ typedef struct _HAL_PLATFORM_INFORMATION { ULONG PlatformFlags; } HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION; #define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L #define HAL_PLATFORM_DISABLE_PTCG 0x04L #define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L #define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L #define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L $endif (_NTDDK_)