- 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
This commit is contained in:
Filip Navara 2004-05-25 21:31:27 +00:00
parent 5a22e5bcf0
commit 470210fb06
9 changed files with 81 additions and 21 deletions

View file

@ -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

View file

@ -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

View file

@ -249,6 +249,7 @@ FS_OBJS = fs.o \
fat.o \
iso.o \
ext2.o \
ntfs.o \
fsrec.o
UI_OBJS = tui.o \

View file

@ -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)

View file

@ -22,6 +22,7 @@
#include "fat.h"
#include "iso.h"
#include "ext2.h"
#include "ntfs.h"
#include "fsrec.h"
#include <disk.h>
#include <rtl.h>
@ -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;

View file

@ -23,6 +23,7 @@
#include "fat.h"
#include "iso.h"
#include "ext2.h"
#include "ntfs.h"
#include <disk.h>
#include <rtl.h>
#include <arch.h>
@ -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;
}

View file

@ -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

View file

@ -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

View file

@ -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 <brianp@sginet.com>"
#define AUTHOR_EMAIL "<brianp@sginet.com>"
#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