From 470210fb06e00bc30a0142f6bdd9a8aa0e0233db Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Tue, 25 May 2004 21:31:27 +0000 Subject: [PATCH] - Enabled the 'Press any key to boot from CD' message in the ISO boot code and show it only when some hard disk is present. - Adjusted detection timeouts for PS/2 and RS232 to the minimum allowed by the specifications so we don't spend ages in hardware detection. - Experimental NTFS reading support. (No boot code, no attribute lists, no decompression) svn path=/trunk/; revision=9493 --- freeldr/bootsect/isoboot.asm | 21 +++++++++++---------- freeldr/freeldr/CHANGELOG | 8 ++++++++ freeldr/freeldr/Makefile | 1 + freeldr/freeldr/arch/i386/hardware.c | 18 +++++++++--------- freeldr/freeldr/fs/fs.c | 25 +++++++++++++++++++++++++ freeldr/freeldr/fs/fsrec.c | 23 +++++++++++++++++++++++ freeldr/freeldr/fs/fsrec.h | 1 + freeldr/freeldr/include/disk.h | 1 + freeldr/freeldr/include/version.h | 4 ++-- 9 files changed, 81 insertions(+), 21 deletions(-) diff --git a/freeldr/bootsect/isoboot.asm b/freeldr/bootsect/isoboot.asm index 89f9752fa4b..c6ef9bd44da 100644 --- a/freeldr/bootsect/isoboot.asm +++ b/freeldr/bootsect/isoboot.asm @@ -33,7 +33,7 @@ ; Note: The Makefile builds one version with DEBUG_MESSAGES automatically. ;%define DEBUG_MESSAGES ; Uncomment to get debugging messages - +%define WAIT_FOR_KEY ; --------------------------------------------------------------------------- @@ -139,6 +139,14 @@ relocate: jmp .kbd_buffer_test .kbd_buffer_empty: + ; Check if there is harddisk + pusha + mov ax, 0800h + mov dx, 0080h + int 13h + popa + jc .boot_cdrom + ; Display the 'Press key' message and wait for a maximum of 5 seconds call crlf mov si, presskey_msg ; si points to 'Press key' message @@ -164,6 +172,8 @@ relocate: jmp .next_second .boot_harddisk: + call crlf + ; Boot first harddisk (drive 0x80) mov ax, 0201h mov dx, 0080h @@ -998,12 +1008,3 @@ MaxTransfer dw 2 ;32 ; Max sectors per transfer times 2046-($-$$) db 0 ; Pad to file offset 2046 dw 0aa55h ; BootSector signature - - - - - - - - - diff --git a/freeldr/freeldr/CHANGELOG b/freeldr/freeldr/CHANGELOG index 36b13baed63..3e9685cdcf2 100644 --- a/freeldr/freeldr/CHANGELOG +++ b/freeldr/freeldr/CHANGELOG @@ -1,3 +1,11 @@ +Changes in v1.8.21 (21/05/2004) (navaraf) + +- Experimental NTFS reading support with no boot code yet. +- Adjusted detection timeouts for PS/2 and RS232 to the minimum + allowed by the specifications. +- Enabled the 'Press any key to boot from CD' message in the ISO + boot code and show it only when some hard disk is present. + Changes in v1.8.20 (21/05/2004) (navaraf) - Added support for special value "LiveCD" of SystemPath option diff --git a/freeldr/freeldr/Makefile b/freeldr/freeldr/Makefile index df4ad1eea15..f491077819e 100644 --- a/freeldr/freeldr/Makefile +++ b/freeldr/freeldr/Makefile @@ -249,6 +249,7 @@ FS_OBJS = fs.o \ fat.o \ iso.o \ ext2.o \ + ntfs.o \ fsrec.o UI_OBJS = tui.o \ diff --git a/freeldr/freeldr/arch/i386/hardware.c b/freeldr/freeldr/arch/i386/hardware.c index 5b5838ddb03..84f2e3fadfb 100644 --- a/freeldr/freeldr/arch/i386/hardware.c +++ b/freeldr/freeldr/arch/i386/hardware.c @@ -719,13 +719,13 @@ DetectMicrosoftMouse(U32 Port) { CHAR Buffer[4]; U32 i; - U32 TimeOut = 250; + U32 TimeOut = 200; U8 LineControl; /* Shutdown mouse or something like that */ LineControl = READ_PORT_UCHAR((PUCHAR)Port + 4); WRITE_PORT_UCHAR((PUCHAR)Port + 4, (LineControl & ~0x02) | 0x01); - KeStallExecutionProcessor(500000); + KeStallExecutionProcessor(100000); /* Clear buffer */ while (READ_PORT_UCHAR((PUCHAR)Port + 5) & 0x01) @@ -812,15 +812,15 @@ GetMousePnpId(U32 Port, char *Buffer) WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x09); /* Wait 10 milliseconds for the mouse getting ready */ - KeStallExecutionProcessor(200000); + KeStallExecutionProcessor(10000); WRITE_PORT_UCHAR((PUCHAR)Port + 4, 0x0b); - KeStallExecutionProcessor(200000); + KeStallExecutionProcessor(10000); for (;;) { - TimeOut = 250; + TimeOut = 200; while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0)) { KeStallExecutionProcessor(1000); @@ -841,7 +841,7 @@ GetMousePnpId(U32 Port, char *Buffer) for (;;) { - TimeOut = 250; + TimeOut = 200; while (((READ_PORT_UCHAR((PUCHAR)Port + 5) & 1) == 0) && (TimeOut > 0)) { KeStallExecutionProcessor(1000); @@ -1244,7 +1244,7 @@ DetectPS2AuxPort(VOID) break; } - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); } return FALSE; @@ -1266,7 +1266,7 @@ DetectPS2AuxDevice(VOID) WRITE_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_DATA, 0xF2); - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) @@ -1278,7 +1278,7 @@ DetectPS2AuxDevice(VOID) if (Scancode != 0xFA) return FALSE; - KeStallExecutionProcessor(10000); + KeStallExecutionProcessor(1000); Status = READ_PORT_UCHAR((PUCHAR)CONTROLLER_REGISTER_STATUS); if ((Status & CONTROLLER_STATUS_MOUSE_OUTPUT_BUFFER_FULL) == 0) diff --git a/freeldr/freeldr/fs/fs.c b/freeldr/freeldr/fs/fs.c index 544189eaff8..912b8cac982 100644 --- a/freeldr/freeldr/fs/fs.c +++ b/freeldr/freeldr/fs/fs.c @@ -22,6 +22,7 @@ #include "fat.h" #include "iso.h" #include "ext2.h" +#include "ntfs.h" #include "fsrec.h" #include #include @@ -140,6 +141,9 @@ BOOL FsOpenVolume(U32 DriveNumber, U32 PartitionNumber) case PARTITION_EXT2: FileSystemType = FS_EXT2; return Ext2OpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition); + case PARTITION_NTFS: + FileSystemType = FS_NTFS; + return NtfsOpenVolume(DriveNumber, PartitionTableEntry.SectorCountBeforePartition); default: FileSystemType = 0; sprintf(ErrorText, "Unsupported file system. Type: 0x%x", VolumeType); @@ -181,6 +185,9 @@ PFILE FsOpenFile(PUCHAR FileName) case FS_EXT2: FileHandle = Ext2OpenFile(FileName); break; + case FS_NTFS: + FileHandle = NtfsOpenFile(FileName); + break; default: FileSystemError("Error: Unknown filesystem."); break; @@ -241,6 +248,10 @@ BOOL FsReadFile(PFILE FileHandle, U32 BytesToRead, U32* BytesRead, PVOID Buffer) *BytesRead = (U32)BytesReadBig; return Success; + case FS_NTFS: + + return NtfsReadFile(FileHandle, BytesToRead, BytesRead, Buffer); + default: FileSystemError("Unknown file system."); @@ -266,6 +277,10 @@ U32 FsGetFileSize(PFILE FileHandle) return Ext2GetFileSize(FileHandle); + case FS_NTFS: + + return NtfsGetFileSize(FileHandle); + default: FileSystemError("Unknown file system."); break; @@ -293,6 +308,11 @@ VOID FsSetFilePointer(PFILE FileHandle, U32 NewFilePointer) Ext2SetFilePointer(FileHandle, NewFilePointer); break; + case FS_NTFS: + + NtfsSetFilePointer(FileHandle, NewFilePointer); + break; + default: FileSystemError("Unknown file system."); break; @@ -318,6 +338,11 @@ U32 FsGetFilePointer(PFILE FileHandle) return Ext2GetFilePointer(FileHandle); break; + case FS_NTFS: + + return NtfsGetFilePointer(FileHandle); + break; + default: FileSystemError("Unknown file system."); break; diff --git a/freeldr/freeldr/fs/fsrec.c b/freeldr/freeldr/fs/fsrec.c index b7d7dfe05ad..0de3708c7bf 100644 --- a/freeldr/freeldr/fs/fsrec.c +++ b/freeldr/freeldr/fs/fsrec.c @@ -23,6 +23,7 @@ #include "fat.h" #include "iso.h" #include "ext2.h" +#include "ntfs.h" #include #include #include @@ -55,6 +56,11 @@ BOOL FsRecognizeVolume(U32 DriveNumber, U32 VolumeStartSector, U8* VolumeType) *VolumeType = PARTITION_FAT32; return TRUE; } + else if (FsRecIsNtfs(DriveNumber, VolumeStartSector)) + { + *VolumeType = PARTITION_NTFS; + return TRUE; + } return FALSE; } @@ -114,3 +120,20 @@ BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector) return FALSE; } + +BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector) +{ + PNTFS_BOOTSECTOR BootSector = (PNTFS_BOOTSECTOR)DISKREADBUFFER; + if (!DiskReadLogicalSectors(DriveNumber, VolumeStartSector, 1, BootSector)) + { + FileSystemError("Failed to read the boot sector."); + return FALSE; + } + + if (!RtlCompareMemory(BootSector->SystemId, "NTFS", 4)) + { + return TRUE; + } + + return FALSE; +} diff --git a/freeldr/freeldr/fs/fsrec.h b/freeldr/freeldr/fs/fsrec.h index bf42b9994c7..210a4acebcf 100644 --- a/freeldr/freeldr/fs/fsrec.h +++ b/freeldr/freeldr/fs/fsrec.h @@ -24,5 +24,6 @@ BOOL FsRecognizeVolume(U32 DriveNumber, U32 VolumeStartSector, U8* VolumeType); BOOL FsRecIsIso9660(U32 DriveNumber); BOOL FsRecIsExt2(U32 DriveNumber, U32 VolumeStartSector); BOOL FsRecIsFat(U32 DriveNumber, U32 VolumeStartSector); +BOOL FsRecIsNtfs(U32 DriveNumber, U32 VolumeStartSector); #endif // #defined __FSREC_H diff --git a/freeldr/freeldr/include/disk.h b/freeldr/freeldr/include/disk.h index 147bf4de862..780409e22f8 100644 --- a/freeldr/freeldr/include/disk.h +++ b/freeldr/freeldr/include/disk.h @@ -92,6 +92,7 @@ typedef struct _MASTER_BOOT_RECORD #define PARTITION_FAT32_XINT13 0x0C // FAT32 using extended int13 services #define PARTITION_XINT13 0x0E // Win95 partition using extended int13 services #define PARTITION_XINT13_EXTENDED 0x0F // Same as type 5 but uses extended int13 services +#define PARTITION_NTFS 0x17 // NTFS #define PARTITION_PREP 0x41 // PowerPC Reference Platform (PReP) Boot Partition #define PARTITION_LDM 0x42 // Logical Disk Manager partition #define PARTITION_UNIX 0x63 // Unix diff --git a/freeldr/freeldr/include/version.h b/freeldr/freeldr/include/version.h index db7358ad37f..93f0e6139d4 100644 --- a/freeldr/freeldr/include/version.h +++ b/freeldr/freeldr/include/version.h @@ -22,7 +22,7 @@ /* just some stuff */ -#define VERSION "FreeLoader v1.8.20" +#define VERSION "FreeLoader v1.8.21" #define COPYRIGHT "Copyright (C) 1998-2003 Brian Palmer " #define AUTHOR_EMAIL "" #define BY_AUTHOR "by Brian Palmer" @@ -36,7 +36,7 @@ // #define FREELOADER_MAJOR_VERSION 1 #define FREELOADER_MINOR_VERSION 8 -#define FREELOADER_PATCH_VERSION 20 +#define FREELOADER_PATCH_VERSION 21 #ifndef ASM