/*++ BUILD Version: 0011 // Increment this if a change has global effects Copyright (c) 1991 Microsoft Corporation Module Name: hal.h Abstract: This header file defines the Hardware Architecture Layer (HAL) interfaces that are exported by a system vendor to the NT system. Author: David N. Cutler (davec) 25-Apr-1991 Revision History: --*/ // begin_nthal #ifndef _HAL_ #define _HAL_ // begin_ntosp // // Define OEM bitmapped font check values. // #define OEM_FONT_VERSION 0x200 #define OEM_FONT_TYPE 0 #define OEM_FONT_ITALIC 0 #define OEM_FONT_UNDERLINE 0 #define OEM_FONT_STRIKEOUT 0 #define OEM_FONT_CHARACTER_SET 255 #define OEM_FONT_FAMILY (3 << 4) // // Define OEM bitmapped font file header structure. // // N.B. this is a packed structure. // #include "pshpack1.h" typedef struct _OEM_FONT_FILE_HEADER { USHORT Version; ULONG FileSize; UCHAR Copyright[60]; USHORT Type; USHORT Points; USHORT VerticleResolution; USHORT HorizontalResolution; USHORT Ascent; USHORT InternalLeading; USHORT ExternalLeading; UCHAR Italic; UCHAR Underline; UCHAR StrikeOut; USHORT Weight; UCHAR CharacterSet; USHORT PixelWidth; USHORT PixelHeight; UCHAR Family; USHORT AverageWidth; USHORT MaximumWidth; UCHAR FirstCharacter; UCHAR LastCharacter; UCHAR DefaultCharacter; UCHAR BreakCharacter; USHORT WidthInBytes; ULONG Device; ULONG Face; ULONG BitsPointer; ULONG BitsOffset; UCHAR Filler; struct { USHORT Width; USHORT Offset; } Map[1]; } OEM_FONT_FILE_HEADER, *POEM_FONT_FILE_HEADER; #include "poppack.h" // end_ntosp // begin_ntddk begin_wdm begin_ntosp // // Define the device description structure. // typedef struct _DEVICE_DESCRIPTION { ULONG Version; BOOLEAN Master; BOOLEAN ScatterGather; BOOLEAN DemandMode; BOOLEAN AutoInitialize; BOOLEAN Dma32BitAddresses; BOOLEAN IgnoreCount; BOOLEAN Reserved1; // must be false BOOLEAN Dma64BitAddresses; ULONG BusNumber; // unused for WDM ULONG DmaChannel; INTERFACE_TYPE InterfaceType; DMA_WIDTH DmaWidth; DMA_SPEED DmaSpeed; ULONG MaximumLength; ULONG DmaPort; } DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION; // // Define the supported version numbers for the device description structure. // #define DEVICE_DESCRIPTION_VERSION 0 #define DEVICE_DESCRIPTION_VERSION1 1 #define DEVICE_DESCRIPTION_VERSION2 2 // end_ntddk end_wdm // // Boot record disk partition table entry structure format. // typedef struct _PARTITION_DESCRIPTOR { UCHAR ActiveFlag; // Bootable or not UCHAR StartingTrack; // Not used UCHAR StartingCylinderLsb; // Not used UCHAR StartingCylinderMsb; // Not used UCHAR PartitionType; // 12 bit FAT, 16 bit FAT etc. UCHAR EndingTrack; // Not used UCHAR EndingCylinderLsb; // Not used UCHAR EndingCylinderMsb; // Not used UCHAR StartingSectorLsb0; // Hidden sectors UCHAR StartingSectorLsb1; UCHAR StartingSectorMsb0; UCHAR StartingSectorMsb1; UCHAR PartitionLengthLsb0; // Sectors in this partition UCHAR PartitionLengthLsb1; UCHAR PartitionLengthMsb0; UCHAR PartitionLengthMsb1; } PARTITION_DESCRIPTOR, *PPARTITION_DESCRIPTOR; // // Number of partition table entries // #define NUM_PARTITION_TABLE_ENTRIES 4 // // Partition table record and boot signature offsets in 16-bit words. // #define PARTITION_TABLE_OFFSET (0x1be / 2) #define BOOT_SIGNATURE_OFFSET ((0x200 / 2) - 1) // // Boot record signature value. // #define BOOT_RECORD_SIGNATURE (0xaa55) // // Initial size of the Partition list structure. // #define PARTITION_BUFFER_SIZE 2048 // // Partition active flag - i.e., boot indicator // #define PARTITION_ACTIVE_FLAG 0x80 // end_ntosp // begin_ntddk // // The following function prototypes are for HAL routines with a prefix of Hal. // // General functions. // typedef BOOLEAN (*PHAL_RESET_DISPLAY_PARAMETERS) ( IN ULONG Columns, IN ULONG Rows ); NTHALAPI VOID HalAcquireDisplayOwnership ( IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters ); // end_ntddk NTHALAPI VOID HalDisplayString ( PUCHAR String ); NTHALAPI VOID HalQueryDisplayParameters ( OUT PULONG WidthInCharacters, OUT PULONG HeightInLines, OUT PULONG CursorColumn, OUT PULONG CursorRow ); NTHALAPI VOID HalSetDisplayParameters ( IN ULONG CursorColumn, IN ULONG CursorRow ); NTHALAPI BOOLEAN HalInitSystem ( IN ULONG Phase, IN PLOADER_PARAMETER_BLOCK LoaderBlock ); NTHALAPI VOID HalProcessorIdle( VOID ); NTHALAPI VOID HalReportResourceUsage ( VOID ); NTHALAPI ULONG HalSetTimeIncrement ( IN ULONG DesiredIncrement ); // begin_ntosp // // Get and set environment variable values. // NTHALAPI ARC_STATUS HalGetEnvironmentVariable ( IN PCHAR Variable, IN USHORT Length, OUT PCHAR Buffer ); NTHALAPI ARC_STATUS HalSetEnvironmentVariable ( IN PCHAR Variable, IN PCHAR Value ); NTHALAPI NTSTATUS HalGetEnvironmentVariableEx ( IN PWSTR VariableName, IN LPGUID VendorGuid, OUT PVOID Value, IN OUT PULONG ValueLength, OUT PULONG Attributes OPTIONAL ); NTSTATUS HalSetEnvironmentVariableEx ( IN PWSTR VariableName, IN LPGUID VendorGuid, IN PVOID Value, IN ULONG ValueLength, IN ULONG Attributes ); NTSTATUS HalEnumerateEnvironmentVariablesEx ( IN ULONG InformationClass, OUT PVOID Buffer, IN OUT PULONG BufferLength ); // end_ntosp // // Cache and write buffer flush functions. // // #if defined(_ALPHA_) || defined(_IA64_) // ntddk ntifs ntndis ntosp // ntddk ntifs ntndis ntosp NTHALAPI VOID HalChangeColorPage ( IN PVOID NewColor, IN PVOID OldColor, IN ULONG PageFrame ); NTHALAPI VOID HalFlushDcachePage ( IN PVOID Color, IN ULONG PageFrame, IN ULONG Length ); // begin_ntosp NTHALAPI VOID HalFlushIoBuffers ( IN PMDL Mdl, IN BOOLEAN ReadOperation, IN BOOLEAN DmaOperation ); // begin_ntddk begin_ntifs begin_ntndis DECLSPEC_DEPRECATED_DDK // Use GetDmaRequirement NTHALAPI ULONG HalGetDmaAlignmentRequirement ( VOID ); // end_ntosp end_ntddk end_ntifs end_ntndis NTHALAPI VOID HalPurgeDcachePage ( IN PVOID Color, IN ULONG PageFrame, IN ULONG Length ); NTHALAPI VOID HalPurgeIcachePage ( IN PVOID Color, IN ULONG PageFrame, IN ULONG Length ); NTHALAPI VOID HalSweepDcache ( VOID ); NTHALAPI VOID HalSweepDcacheRange ( IN PVOID BaseAddress, IN SIZE_T Length ); NTHALAPI VOID HalSweepIcache ( VOID ); NTHALAPI VOID HalSweepIcacheRange ( IN PVOID BaseAddress, IN SIZE_T Length ); NTHALAPI VOID HalZeroPage ( IN PVOID NewColor, IN PVOID OldColor, IN PFN_NUMBER PageFrame ); #endif // ntddk ntifs ntndis ntosp // ntddk ntifs ntndis ntosp #if defined(_M_IX86) || defined(_M_AMD64) // ntddk ntifs ntndis ntosp // ntddk ntifs ntndis ntosp #define HalGetDmaAlignmentRequirement() 1L // ntddk ntifs ntndis ntosp NTHALAPI VOID HalHandleNMI ( IN OUT PVOID NmiInformation ); #if defined(_AMD64_) NTHALAPI VOID HalHandleMcheck ( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame ); #endif // // The following are temporary. // #if defined(_M_AMD64) NTHALAPI KIRQL HalSwapIrql ( IN KIRQL Irql ); NTHALAPI KIRQL HalGetCurrentIrql ( VOID ); #endif #endif // ntddk ntifs ntndis ntosp // ntddk ntifs wdm ntndis #if defined(_M_IA64) NTHALAPI VOID HalSweepCacheRange ( IN PVOID BaseAddress, IN SIZE_T Length ); NTHALAPI LONGLONG HalCallPal ( IN ULONGLONG FunctionIndex, IN ULONGLONG Arguement1, IN ULONGLONG Arguement2, IN ULONGLONG Arguement3, OUT PULONGLONG ReturnValue0, OUT PULONGLONG ReturnValue1, OUT PULONGLONG ReturnValue2, OUT PULONGLONG ReturnValue3 ); #endif // begin_ntosp NTHALAPI // ntddk ntifs wdm ntndis VOID // ntddk ntifs wdm ntndis KeFlushWriteBuffer ( // ntddk ntifs wdm ntndis VOID // ntddk ntifs wdm ntndis ); // ntddk ntifs wdm ntndis // ntddk ntifs wdm ntndis #if defined(_ALPHA_) NTHALAPI PVOID HalCreateQva( IN PHYSICAL_ADDRESS PhysicalAddress, IN PVOID VirtualAddress ); NTHALAPI PVOID HalDereferenceQva( PVOID Qva, INTERFACE_TYPE InterfaceType, ULONG BusNumber ); #endif #if !defined(_X86_) NTHALAPI BOOLEAN HalCallBios ( IN ULONG BiosCommand, IN OUT PULONG Eax, IN OUT PULONG Ebx, IN OUT PULONG Ecx, IN OUT PULONG Edx, IN OUT PULONG Esi, IN OUT PULONG Edi, IN OUT PULONG Ebp ); #endif // end_ntosp // // Profiling functions. // NTHALAPI VOID HalCalibratePerformanceCounter ( IN LONG volatile *Number, IN ULONGLONG NewCount ); NTHALAPI ULONG_PTR HalSetProfileInterval ( IN ULONG_PTR Interval ); NTHALAPI VOID HalStartProfileInterrupt ( KPROFILE_SOURCE ProfileSource ); NTHALAPI VOID HalStopProfileInterrupt ( KPROFILE_SOURCE ProfileSource ); // // Timer and interrupt functions. // // begin_ntosp NTHALAPI BOOLEAN HalQueryRealTimeClock ( OUT PTIME_FIELDS TimeFields ); // end_ntosp NTHALAPI BOOLEAN HalSetRealTimeClock ( IN PTIME_FIELDS TimeFields ); #if defined(_M_IX86) || defined(_M_AMD64) NTHALAPI VOID FASTCALL HalRequestSoftwareInterrupt ( KIRQL RequestIrql ); ULONG FASTCALL HalSystemVectorDispatchEntry ( IN ULONG Vector, OUT PKINTERRUPT_ROUTINE **FlatDispatch, OUT PKINTERRUPT_ROUTINE *NoConnection ); #endif // begin_ntosp // // Firmware interface functions. // NTHALAPI VOID HalReturnToFirmware ( IN FIRMWARE_REENTRY Routine ); // // System interrupts functions. // NTHALAPI VOID HalDisableSystemInterrupt ( IN ULONG Vector, IN KIRQL Irql ); NTHALAPI BOOLEAN HalEnableSystemInterrupt ( IN ULONG Vector, IN KIRQL Irql, IN KINTERRUPT_MODE InterruptMode ); // begin_ntddk // // I/O driver configuration functions. // #if !defined(NO_LEGACY_DRIVERS) DECLSPEC_DEPRECATED_DDK // Use Pnp or IoReportDetectedDevice NTHALAPI NTSTATUS HalAssignSlotResources ( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources ); DECLSPEC_DEPRECATED_DDK // Use Pnp or IoReportDetectedDevice NTHALAPI ULONG HalGetInterruptVector( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity ); DECLSPEC_DEPRECATED_DDK // Use IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG NTHALAPI ULONG HalSetBusData( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Length ); #endif // NO_LEGACY_DRIVERS DECLSPEC_DEPRECATED_DDK // Use IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG NTHALAPI ULONG HalSetBusDataByOffset( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); DECLSPEC_DEPRECATED_DDK // Use IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG NTHALAPI BOOLEAN HalTranslateBusAddress( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress ); // // Values for AddressSpace parameter of HalTranslateBusAddress // // 0x0 - Memory space // 0x1 - Port space // 0x2 - 0x1F - Address spaces specific for Alpha // 0x2 - UserMode view of memory space // 0x3 - UserMode view of port space // 0x4 - Dense memory space // 0x5 - reserved // 0x6 - UserMode view of dense memory space // 0x7 - 0x1F - reserved // NTHALAPI PVOID HalAllocateCrashDumpRegisters( IN PADAPTER_OBJECT AdapterObject, IN OUT PULONG NumberOfMapRegisters ); #if !defined(NO_LEGACY_DRIVERS) DECLSPEC_DEPRECATED_DDK // Use IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG NTHALAPI ULONG HalGetBusData( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Length ); #endif // NO_LEGACY_DRIVERS DECLSPEC_DEPRECATED_DDK // Use IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG NTHALAPI ULONG HalGetBusDataByOffset( IN BUS_DATA_TYPE BusDataType, IN ULONG BusNumber, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); DECLSPEC_DEPRECATED_DDK // Use IoGetDmaAdapter NTHALAPI PADAPTER_OBJECT HalGetAdapter( IN PDEVICE_DESCRIPTION DeviceDescription, IN OUT PULONG NumberOfMapRegisters ); // end_ntddk end_ntosp #if !defined(NO_LEGACY_DRIVERS) NTHALAPI NTSTATUS HalAdjustResourceList ( IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList ); #endif // NO_LEGACY_DRIVERS // begin_ntddk begin_ntosp // // System beep functions. // #if !defined(NO_LEGACY_DRIVERS) NTHALAPI BOOLEAN HalMakeBeep( IN ULONG Frequency ); #endif // NO_LEGACY_DRIVERS // // The following function prototypes are for HAL routines with a prefix of Io. // // DMA adapter object functions. // // end_ntddk end_ntosp // // Multi-Processorfunctions. // NTHALAPI BOOLEAN HalAllProcessorsStarted ( VOID ); NTHALAPI VOID HalInitializeProcessor ( IN ULONG Number, IN PLOADER_PARAMETER_BLOCK LoaderBlock ); NTHALAPI BOOLEAN HalStartNextProcessor ( IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PKPROCESSOR_STATE ProcessorState ); NTHALAPI VOID HalRequestIpi ( IN KAFFINITY Mask ); // // The following function prototypes are for HAL routines with a prefix of Kd. // // Kernel debugger port functions. // NTHALAPI BOOLEAN KdPortInitialize ( PDEBUG_PARAMETERS DebugParameters, PLOADER_PARAMETER_BLOCK LoaderBlock, BOOLEAN Initialize ); NTHALAPI ULONG KdPortGetByte ( OUT PUCHAR Input ); NTHALAPI ULONG KdPortPollByte ( OUT PUCHAR Input ); NTHALAPI VOID KdPortPutByte ( IN UCHAR Output ); NTHALAPI VOID KdPortRestore ( VOID ); NTHALAPI VOID KdPortSave ( VOID ); // // The following function prototypes are for HAL routines with a prefix of Ke. // // begin_ntddk begin_ntifs begin_wdm begin_ntosp // // Performance counter function. // NTHALAPI LARGE_INTEGER KeQueryPerformanceCounter ( OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL ); // begin_ntndis // // Stall processor execution function. // NTHALAPI VOID KeStallExecutionProcessor ( IN ULONG MicroSeconds ); // end_ntddk end_ntifs end_wdm end_ntndis end_ntosp //***************************************************************************** // // HAL BUS EXTENDERS // // Bus handlers // // begin_ntddk typedef VOID (*PDEVICE_CONTROL_COMPLETION)( IN struct _DEVICE_CONTROL_CONTEXT *ControlContext ); typedef struct _DEVICE_CONTROL_CONTEXT { NTSTATUS Status; PDEVICE_HANDLER_OBJECT DeviceHandler; PDEVICE_OBJECT DeviceObject; ULONG ControlCode; PVOID Buffer; PULONG BufferLength; PVOID Context; } DEVICE_CONTROL_CONTEXT, *PDEVICE_CONTROL_CONTEXT; // end_ntddk typedef struct _HAL_DEVICE_CONTROL { // // Handler this DeviceControl is for // struct _BUS_HANDLER *Handler; struct _BUS_HANDLER *RootHandler; // // Bus specific storage for this Context // PVOID BusExtensionData; // // Reserved for HALs use // ULONG HalReserved[4]; // // Reserved for BusExtneder use // ULONG BusExtenderReserved[4]; // // DeviceControl Context and the CompletionRoutine // PDEVICE_CONTROL_COMPLETION CompletionRoutine; DEVICE_CONTROL_CONTEXT DeviceControl; } HAL_DEVICE_CONTROL_CONTEXT, *PHAL_DEVICE_CONTROL_CONTEXT; typedef ULONG (*PGETSETBUSDATA)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN ULONG SlotNumber, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); typedef ULONG (*PGETINTERRUPTVECTOR)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN ULONG BusInterruptLevel, IN ULONG BusInterruptVector, OUT PKIRQL Irql, OUT PKAFFINITY Affinity ); typedef BOOLEAN (*PTRANSLATEBUSADDRESS)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress ); typedef NTSTATUS (*PADJUSTRESOURCELIST)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList ); typedef PDEVICE_HANDLER_OBJECT (*PREFERENCE_DEVICE_HANDLER)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN ULONG SlotNumber ); //typedef VOID //(*PDEREFERENCE_DEVICE_HANDLER)( // IN PDEVICE_HANDLER_OBJECT DeviceHandler // ); typedef NTSTATUS (*PASSIGNSLOTRESOURCES)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject OPTIONAL, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources ); typedef NTSTATUS (*PQUERY_BUS_SLOTS)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN ULONG BufferSize, OUT PULONG SlotNumbers, OUT PULONG ReturnedLength ); typedef ULONG (*PGET_SET_DEVICE_INSTANCE_DATA)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler, IN PDEVICE_HANDLER_OBJECT DeviceHandler, IN ULONG DataType, IN PVOID Buffer, IN ULONG Offset, IN ULONG Length ); typedef NTSTATUS (*PDEVICE_CONTROL)( IN PHAL_DEVICE_CONTROL_CONTEXT Context ); typedef NTSTATUS (*PHIBERNATEBRESUMEBUS)( IN struct _BUS_HANDLER *BusHandler, IN struct _BUS_HANDLER *RootHandler ); // // Supported range structures // #define BUS_SUPPORTED_RANGE_VERSION 1 typedef struct _SUPPORTED_RANGE { struct _SUPPORTED_RANGE *Next; ULONG SystemAddressSpace; LONGLONG SystemBase; LONGLONG Base; LONGLONG Limit; } SUPPORTED_RANGE, *PSUPPORTED_RANGE; typedef struct _SUPPORTED_RANGES { USHORT Version; BOOLEAN Sorted; UCHAR Reserved; ULONG NoIO; SUPPORTED_RANGE IO; ULONG NoMemory; SUPPORTED_RANGE Memory; ULONG NoPrefetchMemory; SUPPORTED_RANGE PrefetchMemory; ULONG NoDma; SUPPORTED_RANGE Dma; } SUPPORTED_RANGES, *PSUPPORTED_RANGES; // // Bus handler structure // #define BUS_HANDLER_VERSION 1 typedef struct _BUS_HANDLER { // // Version of structure // ULONG Version; // // This bus handler structure is for the following bus // INTERFACE_TYPE InterfaceType; BUS_DATA_TYPE ConfigurationType; ULONG BusNumber; // // Device object for this bus extender, or NULL if it is // a hal internal bus extender // PDEVICE_OBJECT DeviceObject; // // The parent handlers for this bus // struct _BUS_HANDLER *ParentHandler; // // Bus specific strorage // PVOID BusData; // // Amount of bus specific storage needed for DeviceControl function calls // ULONG DeviceControlExtensionSize; // // Supported address ranges this bus allows // PSUPPORTED_RANGES BusAddresses; // // For future use // ULONG Reserved[4]; // // Handlers for this bus // PGETSETBUSDATA GetBusData; PGETSETBUSDATA SetBusData; PADJUSTRESOURCELIST AdjustResourceList; PASSIGNSLOTRESOURCES AssignSlotResources; PGETINTERRUPTVECTOR GetInterruptVector; PTRANSLATEBUSADDRESS TranslateBusAddress; PVOID Spare1; PVOID Spare2; PVOID Spare3; PVOID Spare4; PVOID Spare5; PVOID Spare6; PVOID Spare7; PVOID Spare8; } BUS_HANDLER, *PBUS_HANDLER; VOID HalpInitBusHandler ( VOID ); typedef NTSTATUS (*PINSTALL_BUS_HANDLER)( IN PBUS_HANDLER Bus ); typedef NTSTATUS (*pHalRegisterBusHandler)( IN INTERFACE_TYPE InterfaceType, IN BUS_DATA_TYPE AssociatedConfigurationSpace, IN ULONG BusNumber, IN INTERFACE_TYPE ParentBusType, IN ULONG ParentBusNumber, IN ULONG SizeofBusExtensionData, IN PINSTALL_BUS_HANDLER InstallBusHandlers, OUT PBUS_HANDLER *BusHandler ); NTSTATUS HaliRegisterBusHandler ( IN INTERFACE_TYPE InterfaceType, IN BUS_DATA_TYPE AssociatedConfigurationSpace, IN ULONG BusNumber, IN INTERFACE_TYPE ParentBusType, IN ULONG ParentBusNumber, IN ULONG SizeofBusExtensionData, IN PINSTALL_BUS_HANDLER InstallBusHandlers, OUT PBUS_HANDLER *BusHandler ); // begin_ntddk begin_ntosp typedef PBUS_HANDLER (FASTCALL *pHalHandlerForBus) ( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber ); // end_ntddk end_ntosp PBUS_HANDLER FASTCALL HaliReferenceHandlerForBus ( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber ); PBUS_HANDLER FASTCALL HaliHandlerForBus ( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber ); typedef VOID (FASTCALL *pHalRefernceBusHandler) ( IN PBUS_HANDLER BusHandler ); VOID FASTCALL HaliDerefernceBusHandler ( IN PBUS_HANDLER BusHandler ); typedef PBUS_HANDLER (FASTCALL *pHalHandlerForConfigSpace) ( IN BUS_DATA_TYPE ConfigSpace, IN ULONG BusNumber ); PBUS_HANDLER FASTCALL HaliHandlerForConfigSpace ( IN BUS_DATA_TYPE ConfigSpace, IN ULONG BusNumber ); // begin_ntddk begin_ntosp typedef VOID (FASTCALL *pHalReferenceBusHandler) ( IN PBUS_HANDLER BusHandler ); // end_ntddk end_ntosp VOID FASTCALL HaliReferenceBusHandler ( IN PBUS_HANDLER BusHandler ); VOID FASTCALL HaliDereferenceBusHandler ( IN PBUS_HANDLER BusHandler ); NTSTATUS HaliQueryBusSlots ( IN PBUS_HANDLER BusHandler, IN ULONG BufferSize, OUT PULONG SlotNumbers, OUT PULONG ReturnedLength ); NTSTATUS HaliAdjustResourceListRange ( IN PSUPPORTED_RANGES SupportedRanges, IN PSUPPORTED_RANGE InterruptRanges, IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList ); VOID HaliLocateHiberRanges ( IN PVOID MemoryMap ); typedef VOID (*pHalSetWakeEnable)( IN BOOLEAN Enable ); typedef VOID (*pHalSetWakeAlarm)( IN ULONGLONG WakeTime, IN PTIME_FIELDS WakeTimeFields ); typedef VOID (*pHalLocateHiberRanges)( IN PVOID MemoryMap ); // begin_ntddk begin_ntosp //***************************************************************************** // HAL Function dispatch // typedef enum _HAL_QUERY_INFORMATION_CLASS { HalInstalledBusInformation, HalProfileSourceInformation, HalInformationClassUnused1, HalPowerInformation, HalProcessorSpeedInformation, HalCallbackInformation, HalMapRegisterInformation, HalMcaLogInformation, // Machine Check Abort Information HalFrameBufferCachingInformation, HalDisplayBiosInformation, HalProcessorFeatureInformation, HalNumaTopologyInterface, HalErrorInformation, // General MCA, CMC, CPE Error Information. HalCmcLogInformation, // Processor Corrected Machine Check Information HalCpeLogInformation, // Corrected Platform Error Information HalQueryMcaInterface, HalQueryAMLIIllegalIOPortAddresses, HalQueryMaxHotPlugMemoryAddress, HalPartitionIpiInterface, HalPlatformInformation // information levels >= 0x8000000 reserved for OEM use } HAL_QUERY_INFORMATION_CLASS, *PHAL_QUERY_INFORMATION_CLASS; typedef enum _HAL_SET_INFORMATION_CLASS { HalProfileSourceInterval, HalProfileSourceInterruptHandler, HalMcaRegisterDriver, // Registring Machine Check Abort driver HalKernelErrorHandler, HalCmcRegisterDriver, // Registring Processor Corrected Machine Check driver HalCpeRegisterDriver, // Registring Corrected Platform Error driver HalMcaLog, HalCmcLog, HalCpeLog, } HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS; typedef NTSTATUS (*pHalQuerySystemInformation)( IN HAL_QUERY_INFORMATION_CLASS InformationClass, IN ULONG BufferSize, IN OUT PVOID Buffer, OUT PULONG ReturnedLength ); NTSTATUS HaliQuerySystemInformation( IN HAL_SET_INFORMATION_CLASS InformationClass, IN ULONG BufferSize, IN OUT PVOID Buffer, OUT PULONG ReturnedLength ); NTSTATUS HaliHandlePCIConfigSpaceAccess( IN BOOLEAN Read, IN ULONG Addr, IN ULONG Size, IN OUT PULONG pData ); typedef NTSTATUS (*pHalSetSystemInformation)( IN HAL_SET_INFORMATION_CLASS InformationClass, IN ULONG BufferSize, IN PVOID Buffer ); NTSTATUS HaliSetSystemInformation( 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 VOID (FASTCALL *pHalIoAssignDriveLetters)( IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, IN PSTRING NtDeviceName, OUT PUCHAR NtSystemPath, OUT PSTRING NtSystemPathString ); 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 (*pHalQueryBusSlots)( IN PBUS_HANDLER BusHandler, IN ULONG BufferSize, OUT PULONG SlotNumbers, OUT PULONG ReturnedLength ); typedef NTSTATUS (*pHalInitPnpDriver)( VOID ); NTSTATUS HaliInitPnpDriver( VOID ); typedef struct _PM_DISPATCH_TABLE { ULONG Signature; ULONG Version; PVOID Function[1]; } PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE; typedef NTSTATUS (*pHalInitPowerManagement)( IN PPM_DISPATCH_TABLE PmDriverDispatchTable, OUT PPM_DISPATCH_TABLE *PmHalDispatchTable ); NTSTATUS HaliInitPowerManagement( IN PPM_DISPATCH_TABLE PmDriverDispatchTable, IN OUT PPM_DISPATCH_TABLE *PmHalDispatchTable ); typedef struct _DMA_ADAPTER * (*pHalGetDmaAdapter)( IN PVOID Context, IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, OUT PULONG NumberOfMapRegisters ); struct _DMA_ADAPTER * HaliGetDmaAdapter( IN PVOID Context, IN struct _DEVICE_DESCRIPTION *DeviceDescriptor, OUT PULONG NumberOfMapRegisters ); typedef NTSTATUS (*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 ); NTSTATUS HaliGetInterruptTranslator( 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 BOOLEAN (*pHalTranslateBusAddress)( IN INTERFACE_TYPE InterfaceType, IN ULONG BusNumber, IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress ); typedef NTSTATUS (*pHalAssignSlotResources) ( IN PUNICODE_STRING RegistryPath, IN PUNICODE_STRING DriverClassName OPTIONAL, IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT DeviceObject, IN INTERFACE_TYPE BusType, IN ULONG BusNumber, IN ULONG SlotNumber, IN OUT PCM_RESOURCE_LIST *AllocatedResources ); typedef VOID (*pHalHaltSystem) ( VOID ); typedef VOID (*pHalResetDisplay) ( VOID ); typedef UCHAR (*pHalVectorToIDTEntry) ( ULONG Vector ); typedef BOOLEAN (*pHalFindBusAddressTranslation) ( IN PHYSICAL_ADDRESS BusAddress, IN OUT PULONG AddressSpace, OUT PPHYSICAL_ADDRESS TranslatedAddress, IN OUT PULONG_PTR Context, IN BOOLEAN NextBus ); typedef NTSTATUS (*pHalStartMirroring)( VOID ); typedef NTSTATUS (*pHalEndMirroring)( IN ULONG PassNumber ); typedef NTSTATUS (*pHalMirrorPhysicalMemory)( IN PHYSICAL_ADDRESS PhysicalAddress, IN LARGE_INTEGER NumberOfBytes ); typedef NTSTATUS (*pHalMirrorVerify)( IN PHYSICAL_ADDRESS PhysicalAddress, IN LARGE_INTEGER NumberOfBytes ); typedef struct { UCHAR Type; //CmResourceType BOOLEAN Valid; UCHAR Reserved[2]; PUCHAR TranslatedAddress; ULONG Length; } DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS; typedef struct { PHYSICAL_ADDRESS Start; PHYSICAL_ADDRESS MaxEnd; PVOID VirtualAddress; ULONG Length; BOOLEAN Cached; BOOLEAN Aligned; } DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS; typedef struct { ULONG Bus; ULONG Slot; USHORT VendorID; USHORT DeviceID; UCHAR BaseClass; UCHAR SubClass; UCHAR ProgIf; BOOLEAN Initialized; DEBUG_DEVICE_ADDRESS BaseAddress[6]; DEBUG_MEMORY_REQUIREMENTS Memory; } DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR; typedef NTSTATUS (*pKdSetupPciDeviceForDebugging)( IN PVOID LoaderBlock, OPTIONAL IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice ); typedef NTSTATUS (*pKdReleasePciDeviceForDebugging)( IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice ); typedef PVOID (*pKdGetAcpiTablePhase0)( IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock, IN ULONG Signature ); typedef VOID (*pKdCheckPowerButton)( VOID ); typedef VOID (*pHalEndOfBoot)( VOID ); typedef PVOID (*pKdMapPhysicalMemory64)( IN PHYSICAL_ADDRESS PhysicalAddress, IN ULONG NumberPages ); typedef VOID (*pKdUnmapVirtualAddress)( IN PVOID VirtualAddress, IN ULONG NumberPages ); typedef struct { ULONG Version; pHalQuerySystemInformation HalQuerySystemInformation; pHalSetSystemInformation HalSetSystemInformation; pHalQueryBusSlots HalQueryBusSlots; ULONG Spare1; pHalExamineMBR HalExamineMBR; pHalIoAssignDriveLetters HalIoAssignDriveLetters; 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; } HAL_DISPATCH, *PHAL_DISPATCH; #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) extern PHAL_DISPATCH HalDispatchTable; #define HALDISPATCH HalDispatchTable #else extern HAL_DISPATCH HalDispatchTable; #define HALDISPATCH (&HalDispatchTable) #endif #define HAL_DISPATCH_VERSION 3 #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 // end_ntddk end_ntosp typedef struct { ULONG Version; pHalHandlerForBus HalHandlerForBus; pHalHandlerForConfigSpace HalHandlerForConfigSpace; pHalLocateHiberRanges HalLocateHiberRanges; pHalRegisterBusHandler HalRegisterBusHandler; pHalSetWakeEnable HalSetWakeEnable; pHalSetWakeAlarm HalSetWakeAlarm; pHalTranslateBusAddress HalPciTranslateBusAddress; pHalAssignSlotResources HalPciAssignSlotResources; pHalHaltSystem HalHaltSystem; pHalFindBusAddressTranslation HalFindBusAddressTranslation; pHalResetDisplay HalResetDisplay; pKdSetupPciDeviceForDebugging KdSetupPciDeviceForDebugging; pKdReleasePciDeviceForDebugging KdReleasePciDeviceForDebugging; pKdGetAcpiTablePhase0 KdGetAcpiTablePhase0; pKdCheckPowerButton KdCheckPowerButton; pHalVectorToIDTEntry HalVectorToIDTEntry; pKdMapPhysicalMemory64 KdMapPhysicalMemory64; pKdUnmapVirtualAddress KdUnmapVirtualAddress; } HAL_PRIVATE_DISPATCH, *PHAL_PRIVATE_DISPATCH; #if defined(_NTDRIVER_) || defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) extern PHAL_PRIVATE_DISPATCH HalPrivateDispatchTable; #define HALPDISPATCH HalPrivateDispatchTable #else extern HAL_PRIVATE_DISPATCH HalPrivateDispatchTable; #define HALPDISPATCH (&HalPrivateDispatchTable) #endif #define HAL_PRIVATE_DISPATCH_VERSION 2 #define HalRegisterBusHandler HALPDISPATCH->HalRegisterBusHandler #define HalHandlerForBus HALPDISPATCH->HalHandlerForBus #define HalHandlerForConfigSpace HALPDISPATCH->HalHandlerForConfigSpace #define HalLocateHiberRanges HALPDISPATCH->HalLocateHiberRanges #define HalSetWakeEnable HALPDISPATCH->HalSetWakeEnable #define HalSetWakeAlarm HALPDISPATCH->HalSetWakeAlarm #define HalHaltSystem HALPDISPATCH->HalHaltSystem #define HalResetDisplay HALPDISPATCH->HalResetDisplay #define KdSetupPciDeviceForDebugging HALPDISPATCH->KdSetupPciDeviceForDebugging #define KdReleasePciDeviceForDebugging HALPDISPATCH->KdReleasePciDeviceForDebugging #define KdGetAcpiTablePhase0 HALPDISPATCH->KdGetAcpiTablePhase0 #define KdCheckPowerButton HALPDISPATCH->KdCheckPowerButton #define HalVectorToIDTEntry HALPDISPATCH->HalVectorToIDTEntry #define KdMapPhysicalMemory64 HALPDISPATCH->KdMapPhysicalMemory64 #define KdUnmapVirtualAddress HALPDISPATCH->KdUnmapVirtualAddress // begin_ntddk begin_ntosp // // HAL System Information Structures. // // for the information class "HalInstalledBusInformation" typedef struct _HAL_BUS_INFORMATION{ INTERFACE_TYPE BusType; BUS_DATA_TYPE ConfigurationType; ULONG BusNumber; ULONG Reserved; } HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION; // for the information class "HalProfileSourceInformation" 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; // for the information class "HalProfileSourceInterval" typedef struct _HAL_PROFILE_SOURCE_INTERVAL { KPROFILE_SOURCE Source; ULONG_PTR Interval; } HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL; // for the information class "HalDispayBiosInformation" typedef enum _HAL_DISPLAY_BIOS_INFORMATION { HalDisplayInt10Bios, HalDisplayEmulatedBios, HalDisplayNoBios } HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION; // for the information class "HalPowerInformation" typedef struct _HAL_POWER_INFORMATION { ULONG TBD; } HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION; // for the information class "HalProcessorSpeedInformation" typedef struct _HAL_PROCESSOR_SPEED_INFO { ULONG ProcessorSpeed; } HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION; // for the information class "HalCallbackInformation" typedef struct _HAL_CALLBACKS { PCALLBACK_OBJECT SetSystemInformation; PCALLBACK_OBJECT BusCheck; } HAL_CALLBACKS, *PHAL_CALLBACKS; // for the information class "HalProcessorFeatureInformation" typedef struct _HAL_PROCESSOR_FEATURE { ULONG UsableFeatureBits; } HAL_PROCESSOR_FEATURE; // for the information class "HalNumaTopologyInterface" typedef ULONG HALNUMAPAGETONODE; typedef HALNUMAPAGETONODE (*PHALNUMAPAGETONODE)( IN ULONG_PTR PhysicalPageNumber ); typedef NTSTATUS (*PHALNUMAQUERYPROCESSORNODE)( IN ULONG ProcessorNumber, OUT PUSHORT Identifier, OUT PUCHAR Node ); typedef struct _HAL_NUMA_TOPOLOGY_INTERFACE { ULONG NumberOfNodes; PHALNUMAQUERYPROCESSORNODE QueryProcessorNode; PHALNUMAPAGETONODE PageToNode; } HAL_NUMA_TOPOLOGY_INTERFACE; typedef NTSTATUS (*PHALIOREADWRITEHANDLER)( IN BOOLEAN fRead, IN ULONG dwAddr, IN ULONG dwSize, IN OUT PULONG pdwData ); // for the information class "HalQueryIllegalIOPortAddresses" 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; // end_ntosp #if defined(_X86_) || defined(_IA64_) || defined(_AMD64_) // // HalQueryMcaInterface // typedef VOID (*PHALMCAINTERFACELOCK)( VOID ); typedef VOID (*PHALMCAINTERFACEUNLOCK)( VOID ); typedef NTSTATUS (*PHALMCAINTERFACEREADREGISTER)( IN UCHAR BankNumber, IN OUT PVOID Exception ); typedef struct _HAL_MCA_INTERFACE { PHALMCAINTERFACELOCK Lock; PHALMCAINTERFACEUNLOCK Unlock; PHALMCAINTERFACEREADREGISTER ReadRegister; } HAL_MCA_INTERFACE; typedef #if defined(_IA64_) ERROR_SEVERITY #else // !_IA64_ VOID #endif // !_IA64_ (*PDRIVER_EXCPTN_CALLBACK) ( IN PVOID Context, IN PMCA_EXCEPTION BankLog ); typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK; // // Structure to record the callbacks from driver // typedef struct _MCA_DRIVER_INFO { PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback; PKDEFERRED_ROUTINE DpcCallback; PVOID DeviceContext; } MCA_DRIVER_INFO, *PMCA_DRIVER_INFO; // For the information class HalKernelErrorHandler typedef BOOLEAN (*KERNEL_MCA_DELIVERY)( PVOID Reserved, PVOID Argument2 ); typedef BOOLEAN (*KERNEL_CMC_DELIVERY)( PVOID Reserved, PVOID Argument2 ); typedef BOOLEAN (*KERNEL_CPE_DELIVERY)( PVOID Reserved, PVOID Argument2 ); typedef BOOLEAN (*KERNEL_MCE_DELIVERY)( PVOID Reserved, PVOID Argument2 ); #define KERNEL_ERROR_HANDLER_VERSION 0x1 typedef struct { ULONG Version; // Version of this structure. Required to be 1rst field. ULONG Padding; KERNEL_MCA_DELIVERY KernelMcaDelivery; // Kernel callback for MCA DPC Queueing. KERNEL_CMC_DELIVERY KernelCmcDelivery; // Kernel callback for CMC DPC Queueing. KERNEL_CPE_DELIVERY KernelCpeDelivery; // Kernel callback for CPE DPC Queueing. KERNEL_MCE_DELIVERY KernelMceDelivery; // Kernel callback for CME DPC Queueing. // Includes the kernel notifications for FW // interfaces errors. } KERNEL_ERROR_HANDLER_INFO, *PKERNEL_ERROR_HANDLER_INFO; // KERNEL_MCA_DELIVERY.McaType definition #define KERNEL_MCA_UNKNOWN 0x0 #define KERNEL_MCA_PREVIOUS 0x1 #define KERNEL_MCA_CORRECTED 0x2 // KERNEL_MCE_DELIVERY.Reserved.EVENTTYPE definitions #define KERNEL_MCE_EVENTTYPE_MCA 0x00 #define KERNEL_MCE_EVENTTYPE_INIT 0x01 #define KERNEL_MCE_EVENTTYPE_CMC 0x02 #define KERNEL_MCE_EVENTTYPE_CPE 0x03 #define KERNEL_MCE_EVENTTYPE_MASK 0xffff #define KERNEL_MCE_EVENTTYPE( _Reverved ) ((USHORT)(ULONG_PTR)(_Reserved)) // KERNEL_MCE_DELIVERY.Reserved.OPERATION definitions #define KERNEL_MCE_OPERATION_CLEAR_STATE_INFO 0x1 #define KERNEL_MCE_OPERATION_GET_STATE_INFO 0x2 #define KERNEL_MCE_OPERATION_MASK 0xffff #define KERNEL_MCE_OPERATION_SHIFT KERNEL_MCE_EVENTTYPE_MASK #define KERNEL_MCE_OPERATION( _Reserved ) \ ((USHORT)((((ULONG_PTR)(_Reserved)) >> KERNEL_MCE_OPERATION_SHIFT) & KERNEL_MCE_OPERATION_MASK)) // for information class HalErrorInformation #define HAL_ERROR_INFO_VERSION 0x2 typedef struct _HAL_ERROR_INFO { ULONG Version; // Version of this structure ULONG Reserved; // ULONG McaMaxSize; // Maximum size of a Machine Check Abort record ULONG McaPreviousEventsCount; // Flag indicating previous or early-boot MCA event logs. ULONG McaCorrectedEventsCount; // Number of corrected MCA events since boot. approx. ULONG McaKernelDeliveryFails; // Number of Kernel callback failures. approx. ULONG McaDriverDpcQueueFails; // Number of OEM MCA Driver Dpc queueing failures. approx. ULONG McaReserved; ULONG CmcMaxSize; // Maximum size of a Corrected Machine Check record ULONG CmcPollingInterval; // In units of seconds ULONG CmcInterruptsCount; // Number of CMC interrupts. approx. ULONG CmcKernelDeliveryFails; // Number of Kernel callback failures. approx. ULONG CmcDriverDpcQueueFails; // Number of OEM CMC Driver Dpc queueing failures. approx. ULONG CmcGetStateFails; // Number of failures in getting the log from FW. ULONG CmcClearStateFails; // Number of failures in clearing the log from FW. ULONG CmcReserved; ULONGLONG CmcLogId; // Last seen record identifier. ULONG CpeMaxSize; // Maximum size of a Corrected Platform Event record ULONG CpePollingInterval; // In units of seconds ULONG CpeInterruptsCount; // Number of CPE interrupts. approx. ULONG CpeKernelDeliveryFails; // Number of Kernel callback failures. approx. ULONG CpeDriverDpcQueueFails; // Number of OEM CPE Driver Dpc queueing failures. approx. ULONG CpeGetStateFails; // Number of failures in getting the log from FW. ULONG CpeClearStateFails; // Number of failures in clearing the log from FW. ULONG CpeInterruptSources; // Number of SAPIC Platform Interrupt Sources ULONGLONG CpeLogId; // Last seen record identifier. ULONGLONG KernelReserved[4]; } HAL_ERROR_INFO, *PHAL_ERROR_INFO; // // Known values for HAL_ERROR_INFO.CmcPollingInterval. // #define HAL_CMC_INTERRUPTS_BASED ((ULONG)-1) #define HAL_CMC_DISABLED ((ULONG)0) // // Known values for HAL_ERROR_INFO.CpePollingInterval. // #define HAL_CPE_INTERRUPTS_BASED ((ULONG)-1) #define HAL_CPE_DISABLED ((ULONG)0) #define HAL_MCA_INTERRUPTS_BASED ((ULONG)-1) #define HAL_MCA_DISABLED ((ULONG)0) // end_ntddk // // Kernel/WMI Tokens for HAL MCE Log Interfaces // #define McaKernelToken KernelReserved[0] #define CmcKernelToken KernelReserved[1] #define CpeKernelToken KernelReserved[2] // begin_ntddk // // Driver Callback type for the information class "HalCmcRegisterDriver" // typedef VOID (*PDRIVER_CMC_EXCEPTION_CALLBACK) ( IN PVOID Context, IN PCMC_EXCEPTION CmcLog ); // // Driver Callback type for the information class "HalCpeRegisterDriver" // typedef VOID (*PDRIVER_CPE_EXCEPTION_CALLBACK) ( IN PVOID Context, IN PCPE_EXCEPTION CmcLog ); // // // Structure to record the callbacks from driver // 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, IN OUT PKAFFINITY Affinity, OUT PUCHAR HardwareVector ); typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE { HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi; HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector; } HAL_CROSS_PARTITION_IPI_INTERFACE; #endif typedef struct _HAL_PLATFORM_INFORMATION { ULONG PlatformFlags; } HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION; // // These platform flags are carried over from the IPPT table // definition if appropriate. // #define HAL_PLATFORM_DISABLE_PTCG 0x04L #define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L // begin_wdm begin_ntndis begin_ntosp typedef struct _SCATTER_GATHER_ELEMENT { PHYSICAL_ADDRESS Address; ULONG Length; ULONG_PTR Reserved; } SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT; #pragma warning(disable:4200) typedef struct _SCATTER_GATHER_LIST { ULONG NumberOfElements; ULONG_PTR Reserved; SCATTER_GATHER_ELEMENT Elements[]; } SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST; #pragma warning(default:4200) // end_ntndis typedef struct _DMA_OPERATIONS *PDMA_OPERATIONS; typedef struct _DMA_ADAPTER { USHORT Version; USHORT Size; PDMA_OPERATIONS DmaOperations; // Private Bus Device Driver data follows, } DMA_ADAPTER, *PDMA_ADAPTER; typedef VOID (*PPUT_DMA_ADAPTER)( PDMA_ADAPTER DmaAdapter ); typedef PVOID (*PALLOCATE_COMMON_BUFFER)( IN PDMA_ADAPTER DmaAdapter, IN ULONG Length, OUT PPHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled ); typedef VOID (*PFREE_COMMON_BUFFER)( IN PDMA_ADAPTER DmaAdapter, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled ); typedef NTSTATUS (*PALLOCATE_ADAPTER_CHANNEL)( IN PDMA_ADAPTER DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context ); typedef BOOLEAN (*PFLUSH_ADAPTER_BUFFERS)( IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN ULONG Length, IN BOOLEAN WriteToDevice ); typedef VOID (*PFREE_ADAPTER_CHANNEL)( IN PDMA_ADAPTER DmaAdapter ); typedef VOID (*PFREE_MAP_REGISTERS)( IN PDMA_ADAPTER DmaAdapter, PVOID MapRegisterBase, ULONG NumberOfMapRegisters ); typedef PHYSICAL_ADDRESS (*PMAP_TRANSFER)( IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice ); typedef ULONG (*PGET_DMA_ALIGNMENT)( IN PDMA_ADAPTER DmaAdapter ); typedef ULONG (*PREAD_DMA_COUNTER)( IN PDMA_ADAPTER DmaAdapter ); typedef VOID (*PDRIVER_LIST_CONTROL)( IN struct _DEVICE_OBJECT *DeviceObject, IN struct _IRP *Irp, IN PSCATTER_GATHER_LIST ScatterGather, IN PVOID Context ); typedef NTSTATUS (*PGET_SCATTER_GATHER_LIST)( IN PDMA_ADAPTER DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN PMDL Mdl, IN PVOID CurrentVa, IN ULONG Length, IN PDRIVER_LIST_CONTROL ExecutionRoutine, IN PVOID Context, IN BOOLEAN WriteToDevice ); typedef VOID (*PPUT_SCATTER_GATHER_LIST)( IN PDMA_ADAPTER DmaAdapter, IN PSCATTER_GATHER_LIST ScatterGather, IN BOOLEAN WriteToDevice ); typedef NTSTATUS (*PCALCULATE_SCATTER_GATHER_LIST_SIZE)( IN PDMA_ADAPTER DmaAdapter, IN OPTIONAL PMDL Mdl, IN PVOID CurrentVa, IN ULONG Length, OUT PULONG ScatterGatherListSize, OUT OPTIONAL PULONG pNumberOfMapRegisters ); typedef NTSTATUS (*PBUILD_SCATTER_GATHER_LIST)( IN PDMA_ADAPTER DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN PMDL Mdl, IN PVOID CurrentVa, IN ULONG Length, IN PDRIVER_LIST_CONTROL ExecutionRoutine, IN PVOID Context, IN BOOLEAN WriteToDevice, IN PVOID ScatterGatherBuffer, IN ULONG ScatterGatherLength ); typedef NTSTATUS (*PBUILD_MDL_FROM_SCATTER_GATHER_LIST)( IN PDMA_ADAPTER DmaAdapter, IN PSCATTER_GATHER_LIST ScatterGather, IN PMDL OriginalMdl, OUT PMDL *TargetMdl ); typedef struct _DMA_OPERATIONS { ULONG Size; PPUT_DMA_ADAPTER PutDmaAdapter; PALLOCATE_COMMON_BUFFER AllocateCommonBuffer; PFREE_COMMON_BUFFER FreeCommonBuffer; PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel; PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers; PFREE_ADAPTER_CHANNEL FreeAdapterChannel; PFREE_MAP_REGISTERS FreeMapRegisters; PMAP_TRANSFER MapTransfer; PGET_DMA_ALIGNMENT GetDmaAlignment; PREAD_DMA_COUNTER ReadDmaCounter; PGET_SCATTER_GATHER_LIST GetScatterGatherList; PPUT_SCATTER_GATHER_LIST PutScatterGatherList; PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList; PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList; PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList; } DMA_OPERATIONS; // end_wdm #if defined(_WIN64) // // Use __inline DMA macros (hal.h) // #ifndef USE_DMA_MACROS #define USE_DMA_MACROS #endif // // Only PnP drivers! // #ifndef NO_LEGACY_DRIVERS #define NO_LEGACY_DRIVERS #endif #endif // _WIN64 #if defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) // begin_wdm DECLSPEC_DEPRECATED_DDK // Use AllocateCommonBuffer FORCEINLINE PVOID HalAllocateCommonBuffer( IN PDMA_ADAPTER DmaAdapter, IN ULONG Length, OUT PPHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled ){ PALLOCATE_COMMON_BUFFER allocateCommonBuffer; PVOID commonBuffer; allocateCommonBuffer = *(DmaAdapter)->DmaOperations->AllocateCommonBuffer; ASSERT( allocateCommonBuffer != NULL ); commonBuffer = allocateCommonBuffer( DmaAdapter, Length, LogicalAddress, CacheEnabled ); return commonBuffer; } DECLSPEC_DEPRECATED_DDK // Use FreeCommonBuffer FORCEINLINE VOID HalFreeCommonBuffer( IN PDMA_ADAPTER DmaAdapter, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled ){ PFREE_COMMON_BUFFER freeCommonBuffer; freeCommonBuffer = *(DmaAdapter)->DmaOperations->FreeCommonBuffer; ASSERT( freeCommonBuffer != NULL ); freeCommonBuffer( DmaAdapter, Length, LogicalAddress, VirtualAddress, CacheEnabled ); } DECLSPEC_DEPRECATED_DDK // Use AllocateAdapterChannel FORCEINLINE NTSTATUS IoAllocateAdapterChannel( IN PDMA_ADAPTER DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine, IN PVOID Context ){ PALLOCATE_ADAPTER_CHANNEL allocateAdapterChannel; NTSTATUS status; allocateAdapterChannel = *(DmaAdapter)->DmaOperations->AllocateAdapterChannel; ASSERT( allocateAdapterChannel != NULL ); status = allocateAdapterChannel( DmaAdapter, DeviceObject, NumberOfMapRegisters, ExecutionRoutine, Context ); return status; } DECLSPEC_DEPRECATED_DDK // Use FlushAdapterBuffers FORCEINLINE BOOLEAN IoFlushAdapterBuffers( IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN ULONG Length, IN BOOLEAN WriteToDevice ){ PFLUSH_ADAPTER_BUFFERS flushAdapterBuffers; BOOLEAN result; flushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers; ASSERT( flushAdapterBuffers != NULL ); result = flushAdapterBuffers( DmaAdapter, Mdl, MapRegisterBase, CurrentVa, Length, WriteToDevice ); return result; } DECLSPEC_DEPRECATED_DDK // Use FreeAdapterChannel FORCEINLINE VOID IoFreeAdapterChannel( IN PDMA_ADAPTER DmaAdapter ){ PFREE_ADAPTER_CHANNEL freeAdapterChannel; freeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel; ASSERT( freeAdapterChannel != NULL ); freeAdapterChannel( DmaAdapter ); } DECLSPEC_DEPRECATED_DDK // Use FreeMapRegisters FORCEINLINE VOID IoFreeMapRegisters( IN PDMA_ADAPTER DmaAdapter, IN PVOID MapRegisterBase, IN ULONG NumberOfMapRegisters ){ PFREE_MAP_REGISTERS freeMapRegisters; freeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters; ASSERT( freeMapRegisters != NULL ); freeMapRegisters( DmaAdapter, MapRegisterBase, NumberOfMapRegisters ); } DECLSPEC_DEPRECATED_DDK // Use MapTransfer FORCEINLINE PHYSICAL_ADDRESS IoMapTransfer( IN PDMA_ADAPTER DmaAdapter, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice ){ PHYSICAL_ADDRESS physicalAddress; PMAP_TRANSFER mapTransfer; mapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer; ASSERT( mapTransfer != NULL ); physicalAddress = mapTransfer( DmaAdapter, Mdl, MapRegisterBase, CurrentVa, Length, WriteToDevice ); return physicalAddress; } DECLSPEC_DEPRECATED_DDK // Use GetDmaAlignment FORCEINLINE ULONG HalGetDmaAlignment( IN PDMA_ADAPTER DmaAdapter ) { PGET_DMA_ALIGNMENT getDmaAlignment; ULONG alignment; getDmaAlignment = *(DmaAdapter)->DmaOperations->GetDmaAlignment; ASSERT( getDmaAlignment != NULL ); alignment = getDmaAlignment( DmaAdapter ); return alignment; } DECLSPEC_DEPRECATED_DDK // Use ReadDmaCounter FORCEINLINE ULONG HalReadDmaCounter( IN PDMA_ADAPTER DmaAdapter ) { PREAD_DMA_COUNTER readDmaCounter; ULONG counter; readDmaCounter = *(DmaAdapter)->DmaOperations->ReadDmaCounter; ASSERT( readDmaCounter != NULL ); counter = readDmaCounter( DmaAdapter ); return counter; } // end_wdm #else // // DMA adapter object functions. // NTHALAPI NTSTATUS HalAllocateAdapterChannel( IN PADAPTER_OBJECT AdapterObject, IN PWAIT_CONTEXT_BLOCK Wcb, IN ULONG NumberOfMapRegisters, IN PDRIVER_CONTROL ExecutionRoutine ); DECLSPEC_DEPRECATED_DDK // Use AllocateCommonBuffer NTHALAPI PVOID HalAllocateCommonBuffer( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, OUT PPHYSICAL_ADDRESS LogicalAddress, IN BOOLEAN CacheEnabled ); DECLSPEC_DEPRECATED_DDK // Use FreeCommonBuffer NTHALAPI VOID HalFreeCommonBuffer( IN PADAPTER_OBJECT AdapterObject, IN ULONG Length, IN PHYSICAL_ADDRESS LogicalAddress, IN PVOID VirtualAddress, IN BOOLEAN CacheEnabled ); DECLSPEC_DEPRECATED_DDK // Use ReadDmaCounter NTHALAPI ULONG HalReadDmaCounter( IN PADAPTER_OBJECT AdapterObject ); DECLSPEC_DEPRECATED_DDK // Use FlushAdapterBuffers NTHALAPI BOOLEAN IoFlushAdapterBuffers( IN PADAPTER_OBJECT AdapterObject, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN ULONG Length, IN BOOLEAN WriteToDevice ); DECLSPEC_DEPRECATED_DDK // Use FreeAdapterChannel NTHALAPI VOID IoFreeAdapterChannel( IN PADAPTER_OBJECT AdapterObject ); DECLSPEC_DEPRECATED_DDK // Use FreeMapRegisters NTHALAPI VOID IoFreeMapRegisters( IN PADAPTER_OBJECT AdapterObject, IN PVOID MapRegisterBase, IN ULONG NumberOfMapRegisters ); DECLSPEC_DEPRECATED_DDK // Use MapTransfer NTHALAPI PHYSICAL_ADDRESS IoMapTransfer( IN PADAPTER_OBJECT AdapterObject, IN PMDL Mdl, IN PVOID MapRegisterBase, IN PVOID CurrentVa, IN OUT PULONG Length, IN BOOLEAN WriteToDevice ); #endif // USE_DMA_MACROS && (_NTDDK_ || _NTDRIVER_) NTSTATUS HalGetScatterGatherList ( IN PADAPTER_OBJECT DmaAdapter, IN PDEVICE_OBJECT DeviceObject, IN PMDL Mdl, IN PVOID CurrentVa, IN ULONG Length, IN PDRIVER_LIST_CONTROL ExecutionRoutine, IN PVOID Context, IN BOOLEAN WriteToDevice ); VOID HalPutScatterGatherList ( IN PADAPTER_OBJECT DmaAdapter, IN PSCATTER_GATHER_LIST ScatterGather, IN BOOLEAN WriteToDevice ); VOID HalPutDmaAdapter( IN PADAPTER_OBJECT DmaAdapter ); // end_ntddk end_ntosp #endif // _HAL_ // end_nthal