/*++ Copyright (c) 1991 Microsoft Corporation Module Name: bldr.h Abstract: This module is the header file for the NT boot loader. Author: David N. Cutler (davec) 10-May-1991 Revision History: --*/ #ifndef _BLDR_ #define _BLDR_ #include "ntos.h" #include "arccodes.h" // // Define boot file id. // #define BOOT_FILEID 2 // boot partition file id // // Define image types. // #define MIPS_IMAGE 0x162 #define I386_IMAGE 0x14C #define ALPHA_IMAGE 0x184 #define PPC_IMAGE 0x1f0 #if defined(_MIPS_) #define TARGET_IMAGE MIPS_IMAGE #endif #if defined(_X86_) #define TARGET_IMAGE I386_IMAGE #define KSEG0_BASE 0x80000000 #endif #if defined(_ALPHA_) #define TARGET_IMAGE ALPHA_IMAGE #endif #if defined(_PPC_) #define TARGET_IMAGE PPC_IMAGE #endif // // Define size of sector. // #define SECTOR_SIZE 512 // size of disk sector #define SECTOR_SHIFT 9 // sector shift value // // Define heap allocation block granularity. // #define BL_GRANULARITY 8 // // Define number of entries in file table. // #define BL_FILE_TABLE_SIZE 32 // // Define size of memory allocation table. // #define BL_MEMORY_TABLE_SIZE 16 // // Define number of loader heap and stack pages. // #define BL_HEAP_PAGES 16 #define BL_STACK_PAGES 8 // // Define buffer alignment macro. // #define ALIGN_BUFFER(Buffer) (PVOID) \ ((((ULONG)(Buffer) + BlDcacheFillSize - 1)) & (~(BlDcacheFillSize - 1))) typedef ARC_STATUS (*PRENAME_ROUTINE)( IN ULONG FileId, IN PCHAR NewName ); typedef struct _BOOTFS_INFO { PWSTR DriverName; } BOOTFS_INFO, *PBOOTFS_INFO; // // Device entry table structure. // typedef struct _BL_DEVICE_ENTRY_TABLE { PARC_CLOSE_ROUTINE Close; PARC_MOUNT_ROUTINE Mount; PARC_OPEN_ROUTINE Open; PARC_READ_ROUTINE Read; PARC_READ_STATUS_ROUTINE GetReadStatus; PARC_SEEK_ROUTINE Seek; PARC_WRITE_ROUTINE Write; PARC_GET_FILE_INFO_ROUTINE GetFileInformation; PARC_SET_FILE_INFO_ROUTINE SetFileInformation; PRENAME_ROUTINE Rename; PARC_GET_DIRECTORY_ENTRY_ROUTINE GetDirectoryEntry; PBOOTFS_INFO BootFsInfo; } BL_DEVICE_ENTRY_TABLE, *PBL_DEVICE_ENTRY_TABLE; // // Define main entrypoint. // ARC_STATUS BlOsLoader ( IN ULONG Argc, IN PCHAR Argv[], IN PCHAR Envp[] ); // // Define file I/O prototypes. // ARC_STATUS BlIoInitialize ( VOID ); ARC_STATUS BlClose ( IN ULONG FileId ); PBOOTFS_INFO BlGetFsInfo( IN ULONG DeviceId ); ARC_STATUS BlMount ( IN PCHAR MountPath, IN MOUNT_OPERATION Operation ); ARC_STATUS BlOpen ( IN ULONG DeviceId, IN PCHAR OpenPath, IN OPEN_MODE OpenMode, OUT PULONG FileId ); ARC_STATUS BlRead ( IN ULONG FileId, OUT PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BlRename ( IN ULONG FileId, IN PCHAR NewName ); ARC_STATUS BlGetReadStatus ( IN ULONG FileId ); ARC_STATUS BlSeek ( IN ULONG FileId, IN PLARGE_INTEGER Offset, IN SEEK_MODE SeekMode ); ARC_STATUS BlWrite ( IN ULONG FileId, IN PVOID Buffer, IN ULONG Length, OUT PULONG Count ); ARC_STATUS BlGetFileInformation ( IN ULONG FileId, IN PFILE_INFORMATION FileInformation ); ARC_STATUS BlSetFileInformation ( IN ULONG FileId, IN ULONG AttributeFlags, IN ULONG AttributeMask ); #ifdef DBLSPACE_LEGAL VOID BlSetAutoDoubleSpace ( IN BOOLEAN Enable ); #endif // // Define image manipulation routine prototyupes. // ARC_STATUS BlLoadImage( IN ULONG DeviceId, IN TYPE_OF_MEMORY MemoryType, IN PCHAR LoadFile, IN USHORT ImageType, OUT PVOID *ImageBase); ARC_STATUS BlLoadDeviceDriver ( IN ULONG DeviceId, IN PCHAR LoadDevice, IN PCHAR DirectoryPath, IN PCHAR DriverName, IN ULONG DriverFlags, IN PLDR_DATA_TABLE_ENTRY *DriverDataTableEntry ); ARC_STATUS BlLoadNLSData( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PUNICODE_STRING AnsiCodepage, IN PUNICODE_STRING OemCodepage, IN PUNICODE_STRING LanguageTable, OUT PCHAR BadFileName ); ARC_STATUS BlLoadOemHalFont( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PUNICODE_STRING OemHalFont, OUT PCHAR BadFileName ); PVOID BlImageNtHeader ( IN PVOID Base ); ARC_STATUS BlSetupForNt( IN PLOADER_PARAMETER_BLOCK BlLoaderBlock ); ARC_STATUS BlScanImportDescriptorTable ( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PLDR_DATA_TABLE_ENTRY DataTableEntry ); ARC_STATUS BlScanOsloaderBoundImportTable ( IN PLDR_DATA_TABLE_ENTRY ScanEntry ); #if defined(_ALPHA_) ARC_STATUS BlGeneratePalName( IN PCHAR PalFIleName ); ARC_STATUS BlLoadPal( IN ULONG DeviceId, IN TYPE_OF_MEMORY MemoryType, IN PCHAR LoadPath, IN USHORT ImageType, OUT PVOID *ImageBase, IN PCHAR LoadDevice ); #endif #if defined(_PPC_) ARC_STATUS BlPpcInitialize ( VOID ); #endif // defined(_PPC) // // Define configuration allocation prototypes. // ARC_STATUS BlConfigurationInitialize ( IN PCONFIGURATION_COMPONENT Parent, IN PCONFIGURATION_COMPONENT_DATA ParentEntry ); // // define routines for searching the ARC firmware tree // typedef BOOLEAN (*PNODE_CALLBACK)( IN PCONFIGURATION_COMPONENT_DATA FoundComponent ); BOOLEAN BlSearchConfigTree( IN PCONFIGURATION_COMPONENT_DATA Node, IN CONFIGURATION_CLASS Class, IN CONFIGURATION_TYPE Type, IN ULONG Key, IN PNODE_CALLBACK CallbackRoutine ); VOID BlGetPathnameFromComponent( IN PCONFIGURATION_COMPONENT_DATA Component, OUT PCHAR ArcName ); BOOLEAN BlGetPathMnemonicKey( IN PCHAR OpenPath, IN PCHAR Mnemonic, IN PULONG Key ); ARC_STATUS BlGetArcDiskInformation( VOID ); BOOLEAN BlReadSignature( IN PCHAR DiskName, IN BOOLEAN IsCdRom ); // // Define memory allocation prototypes. // typedef enum _ALLOCATION_POLICY { BlAllocateLowestFit, BlAllocateBestFit, BlAllocateHighestFit } ALLOCATION_POLICY, *PALLOCATION_POLICY; VOID BlSetAllocationPolicy ( IN ALLOCATION_POLICY MemoryAllocationPolicy, IN ALLOCATION_POLICY HeapAllocationPolicy ); ARC_STATUS BlMemoryInitialize ( VOID ); ARC_STATUS BlAllocateDataTableEntry ( IN PCHAR BaseDllName, IN PCHAR FullDllName, IN PVOID ImageHeader, OUT PLDR_DATA_TABLE_ENTRY *Entry ); #define BlAllocateDescriptor(_MemoryType, _BasePage, _PageCount, _ActualBase) \ BlAllocateAlignedDescriptor((_MemoryType), \ (_BasePage), \ (_PageCount), \ 1, \ (_ActualBase)) ARC_STATUS BlAllocateAlignedDescriptor ( IN TYPE_OF_MEMORY MemoryType, IN ULONG BasePage, IN ULONG PageCount, IN ULONG Alignment, OUT PULONG ActualBase ); PVOID BlAllocateHeapAligned ( IN ULONG Size ); PVOID BlAllocateHeap ( IN ULONG Size ); VOID BlStartConfigPrompt( VOID ); BOOLEAN BlEndConfigPrompt( VOID ); BOOLEAN BlCheckForLoadedDll ( IN PCHAR DllName, OUT PLDR_DATA_TABLE_ENTRY *FoundEntry ); PMEMORY_ALLOCATION_DESCRIPTOR BlFindMemoryDescriptor( IN ULONG BasePage ); ARC_STATUS BlInitResources( IN PCHAR StartCommand ); PCHAR BlFindMessage( IN ULONG Id ); ARC_STATUS BlGenerateDescriptor ( IN PMEMORY_ALLOCATION_DESCRIPTOR MemoryDescriptor, IN MEMORY_TYPE MemoryType, IN ULONG BasePage, IN ULONG PageCount ); VOID BlInsertDescriptor ( IN PMEMORY_ALLOCATION_DESCRIPTOR NewDescriptor ); #define BlRemoveDescriptor(_md_) RemoveEntryList(&(_md_)->ListEntry) ARC_STATUS BlGenerateDeviceNames ( IN PCHAR ArcDeviceName, OUT PCHAR ArcCanonicalName, OUT OPTIONAL PCHAR NtDevicePrefix ); BOOLEAN BlLastKnownGoodPrompt( IN OUT PBOOLEAN UseLastKnownGood ); PCHAR BlGetArgumentValue ( IN ULONG Argc, IN PCHAR Argv[], IN PCHAR ArgumentName ); // // Define message output prototype. // VOID BlOutputLoadMessage ( IN PCHAR DeviceName, IN PCHAR FileName ); // // Define file structure recognition prototypes. // PBL_DEVICE_ENTRY_TABLE IsCdfsFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); #ifdef DBLSPACE_LEGAL PBL_DEVICE_ENTRY_TABLE IsDblsFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); #endif PBL_DEVICE_ENTRY_TABLE IsFatFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); PBL_DEVICE_ENTRY_TABLE IsHpfsFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); PBL_DEVICE_ENTRY_TABLE IsNtfsFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); #if defined(ELTORITO) PBL_DEVICE_ENTRY_TABLE IsEtfsFileStructure ( IN ULONG DeviceId, IN PVOID StructureContext ); #endif // // Define registry prototypes // ARC_STATUS BlLoadSystemHive( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PCHAR HiveName ); ARC_STATUS BlLoadAndScanSystemHive( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PWSTR BootFileSystem, OUT PCHAR BadFileName ); ARC_STATUS BlLoadAndInitSystemHive( IN ULONG DeviceId, IN PCHAR DeviceName, IN PCHAR DirectoryPath, IN PCHAR HiveName, IN BOOLEAN IsAlternate, OUT PBOOLEAN RestartSetup ); ARC_STATUS BlLoadBootDrivers( IN ULONG DeviceId, IN PCHAR LoadDevice, IN PCHAR SystemPath, IN PLIST_ENTRY BootDriverListHead, OUT PCHAR BadFileName ); PCHAR BlScanRegistry( IN PWSTR BootFileSystemPath, OUT PLIST_ENTRY BootDriverListHead, OUT PUNICODE_STRING AnsiCodepage, OUT PUNICODE_STRING OemCodepage, OUT PUNICODE_STRING LanguageTable, OUT PUNICODE_STRING OemHalFont ); // // Define external references. // extern ULONG BlConsoleOutDeviceId; extern ULONG BlConsoleInDeviceId; extern ULONG BlDcacheFillSize; extern ULONG BlHeapFree; extern ULONG BlHeapLimit; extern PLOADER_PARAMETER_BLOCK BlLoaderBlock; extern ULONG DbcsLangId; extern BOOLEAN BlRebootSystem; // // Routine to get graphics characters // typedef enum { GraphicsCharDoubleRightDoubleDown = 0, GraphicsCharDoubleLeftDoubleDown, GraphicsCharDoubleRightDoubleUp, GraphicsCharDoubleLeftDoubleUp, GraphicsCharDoubleVertical, GraphicsCharDoubleHorizontal, GraphicsCharMax } GraphicsChar; UCHAR GetGraphicsChar( IN GraphicsChar WhichOne ); // // Control sequence introducer. // On x86 machines the loaders support dbcs and so using // 0x9b for output is no good (that value is a dbcs lead byte // in several codepages). Escape-leftbracket is a synonym for CSI // in the emulated ARC console on x86 (and on many ARC machines too // but since we can't be sure all the machines out there support // this we use the old-style csi on non-x86). // // We ignore this issue for characters read from the ARC console // since we don't ask for any text to be typed in, just arrow keys, // escape, F#, enter, etc. // #define ASCI_CSI_IN 0x9b #ifdef _X86_ #define ASCI_CSI_OUT "\033[" // escape-leftbracket #else #define ASCI_CSI_OUT "\233" // 0x9b #endif // // Define OS/2 executable resource information structure. // #define FONT_DIRECTORY 0x8007 #define FONT_RESOURCE 0x8008 typedef struct _RESOURCE_TYPE_INFORMATION { USHORT Ident; USHORT Number; LONG Proc; } RESOURCE_TYPE_INFORMATION, *PRESOURCE_TYPE_INFORMATION; // // Define OS/2 executable resource name information structure. // typedef struct _RESOURCE_NAME_INFORMATION { USHORT Offset; USHORT Length; USHORT Flags; USHORT Ident; USHORT Handle; USHORT Usage; } RESOURCE_NAME_INFORMATION, *PRESOURCE_NAME_INFORMATION; // // Define debug logging macros and functions. // #if !DBG #define BlLogInitialize(_x_) #define BlLogTerminate() #define BlLog(_x_) #define BlLogArcDescriptors(_x_) #define BlLogMemoryDescriptors(_x_) #define BlLogWaitForKeystroke() #else VOID BlLogInitialize ( IN ULONG LogfileDeviceId ); VOID BlLogTerminate ( VOID ); #define BlLog(_x_) BlLogPrint _x_ #define LOG_DISPLAY 0x0001 #define LOG_LOGFILE 0x0002 #define LOG_WAIT 0x8000 #define LOG_ALL (LOG_DISPLAY | LOG_LOGFILE) #define LOG_ALL_W (LOG_ALL | LOG_WAIT) VOID BlLogPrint ( ULONG Targets, PCHAR Format, ... ); VOID BlLogArcDescriptors ( ULONG Targets ); VOID BlLogMemoryDescriptors ( ULONG Targets ); VOID BlLogWaitForKeystroke ( VOID ); #endif // DBG #endif // _BLDR_