Fixed a bug in the LBA extensions detection code.
authorBrian Palmer <brianp@sginet.com>
Wed, 6 Mar 2002 18:32:22 +0000 (18:32 +0000)
committerBrian Palmer <brianp@sginet.com>
Wed, 6 Mar 2002 18:32:22 +0000 (18:32 +0000)
Fixed a bug in the root directory size calculations for FAT12 & FAT16 (I must have been smoking something when I wrote that).
Started work on new .ini file code, the old stuff is just way too slow.

svn path=/trunk/; revision=2676

freeldr/freeldr/arch/i386/disk.S
freeldr/freeldr/fs/fat.c
freeldr/freeldr/inifile/Makefile [new file with mode: 0644]
freeldr/freeldr/inifile/ini.h [new file with mode: 0644]
freeldr/freeldr/inifile/inifile.c [new file with mode: 0644]
freeldr/freeldr/inifile/inifile.h [new file with mode: 0644]
freeldr/freeldr/inifile/init.c [new file with mode: 0644]
freeldr/freeldr/inifile/parse.c [new file with mode: 0644]
freeldr/freeldr/mm/init.c
freeldr/freeldr/mm/mm.c

index 8b3c197..f8ccf55 100644 (file)
@@ -292,7 +292,7 @@ EXTERN(_BiosInt13ExtensionsSupported)
        movb    _int13_extension_check_drive,%dl        // DL = drive (80h-FFh)
        int             $0x13                                                           // IBM/MS INT 13 Extensions - INSTALLATION CHECK
        jc              _int13_extension_check_error            // CF set on error (extensions not supported)
-       cmpw    $0x55aa,%bx                                                     // BX = AA55h if installed
+       cmpw    $0xaa55,%bx                                                     // BX = AA55h if installed
        jne             _int13_extension_check_error
        testb   $1,%cl                                                          // CX = API subset support bitmap
        jz              _int13_extension_check_error            // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
index 8cb6836..c7ac7e7 100644 (file)
@@ -285,10 +285,35 @@ PVOID FatBufferDirectory(UINT32 DirectoryStartCluster, PUINT32 EntryCountPointer
        //
        if ((RootDirectory) && (FatType != FAT32))
        {
-               DirectorySize = (FatVolumeBootSector->RootDirEntries / 32) * 512;
+               DbgPrint((DPRINT_FILESYSTEM, "We are here.\n"));
+               /*DbgPrint((DPRINT_FILESYSTEM, "sizeof(FAT_BOOTSECTOR) = 0x%x.\n", sizeof(FAT_BOOTSECTOR)));
+
+               DbgPrint((DPRINT_FILESYSTEM, "JumpBoot: 0x%x 0x%x 0x%x\n", FatVolumeBootSector->JumpBoot[0], FatVolumeBootSector->JumpBoot[1], FatVolumeBootSector->JumpBoot[2]));
+               DbgPrint((DPRINT_FILESYSTEM, "OemName: %c%c%c%c%c%c%c%c\n", FatVolumeBootSector->OemName[0], FatVolumeBootSector->OemName[1], FatVolumeBootSector->OemName[2], FatVolumeBootSector->OemName[3], FatVolumeBootSector->OemName[4], FatVolumeBootSector->OemName[5], FatVolumeBootSector->OemName[6], FatVolumeBootSector->OemName[7]));*/
+               DbgPrint((DPRINT_FILESYSTEM, "BytesPerSector: %d\n", FatVolumeBootSector->BytesPerSector));
+               DbgPrint((DPRINT_FILESYSTEM, "SectorsPerCluster: %d\n", FatVolumeBootSector->SectorsPerCluster));
+               DbgPrint((DPRINT_FILESYSTEM, "ReservedSectors: %d\n", FatVolumeBootSector->ReservedSectors));
+               DbgPrint((DPRINT_FILESYSTEM, "NumberOfFats: %d\n", FatVolumeBootSector->NumberOfFats));
+               DbgPrint((DPRINT_FILESYSTEM, "RootDirEntries: %d\n", FatVolumeBootSector->RootDirEntries));
+               DbgPrint((DPRINT_FILESYSTEM, "TotalSectors: %d\n", FatVolumeBootSector->TotalSectors));
+               DbgPrint((DPRINT_FILESYSTEM, "MediaDescriptor: 0x%x\n", FatVolumeBootSector->MediaDescriptor));
+               DbgPrint((DPRINT_FILESYSTEM, "SectorsPerFat: %d\n", FatVolumeBootSector->SectorsPerFat));
+               DbgPrint((DPRINT_FILESYSTEM, "SectorsPerTrack: %d\n", FatVolumeBootSector->SectorsPerTrack));
+               DbgPrint((DPRINT_FILESYSTEM, "NumberOfHeads: %d\n", FatVolumeBootSector->NumberOfHeads));
+               DbgPrint((DPRINT_FILESYSTEM, "HiddenSectors: %d\n", FatVolumeBootSector->HiddenSectors));
+               DbgPrint((DPRINT_FILESYSTEM, "TotalSectorsBig: %d\n", FatVolumeBootSector->TotalSectorsBig));
+               DbgPrint((DPRINT_FILESYSTEM, "DriveNumber: 0x%x\n", FatVolumeBootSector->DriveNumber));
+               DbgPrint((DPRINT_FILESYSTEM, "Reserved1: 0x%x\n", FatVolumeBootSector->Reserved1));
+               DbgPrint((DPRINT_FILESYSTEM, "BootSignature: 0x%x\n", FatVolumeBootSector->BootSignature));
+               DbgPrint((DPRINT_FILESYSTEM, "VolumeSerialNumber: 0x%x\n", FatVolumeBootSector->VolumeSerialNumber));
+               /*DbgPrint((DPRINT_FILESYSTEM, "VolumeLabel: %c%c%c%c%c%c%c%c%c%c%c\n", FatVolumeBootSector->VolumeLabel[0], FatVolumeBootSector->VolumeLabel[1], FatVolumeBootSector->VolumeLabel[2], FatVolumeBootSector->VolumeLabel[3], FatVolumeBootSector->VolumeLabel[4], FatVolumeBootSector->VolumeLabel[5], FatVolumeBootSector->VolumeLabel[6], FatVolumeBootSector->VolumeLabel[7], FatVolumeBootSector->VolumeLabel[8], FatVolumeBootSector->VolumeLabel[9], FatVolumeBootSector->VolumeLabel[10]));
+               DbgPrint((DPRINT_FILESYSTEM, "FileSystemType: %c%c%c%c%c%c%c%c\n", FatVolumeBootSector->FileSystemType[0], FatVolumeBootSector->FileSystemType[1], FatVolumeBootSector->FileSystemType[2], FatVolumeBootSector->FileSystemType[3], FatVolumeBootSector->FileSystemType[4], FatVolumeBootSector->FileSystemType[5], FatVolumeBootSector->FileSystemType[6], FatVolumeBootSector->FileSystemType[7]));*/
+               DbgPrint((DPRINT_FILESYSTEM, "BootSectorMagic: 0x%x\n", FatVolumeBootSector->BootSectorMagic));
+               DirectorySize = ROUND_UP((FatVolumeBootSector->RootDirEntries * 32), FatVolumeBootSector->BytesPerSector);
        }
        else
        {
+               DbgPrint((DPRINT_FILESYSTEM, "No we are here.\n"));
                if (RootDirectory)
                {
                        DirectorySize = (FatCountClustersInChain(Fat32VolumeBootSector->RootDirStartCluster) * Fat32VolumeBootSector->SectorsPerCluster) * Fat32VolumeBootSector->BytesPerSector;
@@ -302,6 +327,7 @@ PVOID FatBufferDirectory(UINT32 DirectoryStartCluster, PUINT32 EntryCountPointer
        //
        // Attempt to allocate memory for directory buffer
        //
+       DbgPrint((DPRINT_FILESYSTEM, "Trying to allocate (DirectorySize) %d bytes.\n", DirectorySize));
        DirectoryBuffer = AllocateMemory(DirectorySize);
 
        if (DirectoryBuffer == NULL)
@@ -328,7 +354,7 @@ PVOID FatBufferDirectory(UINT32 DirectoryStartCluster, PUINT32 EntryCountPointer
                        // FAT type is not FAT32 so the root directory comes right after the fat table
                        //
                        RootDirectoryStartSector = FatVolumeBootSector->ReservedSectors + (FatVolumeBootSector->NumberOfFats * FatVolumeBootSector->SectorsPerFat);
-                       RootDirectorySectorCount = FatVolumeBootSector->RootDirEntries / 32;
+                       RootDirectorySectorCount = (DirectorySize / FatVolumeBootSector->BytesPerSector);
 
                        if (!FatReadVolumeSectors(FatDriveNumber, RootDirectoryStartSector, RootDirectorySectorCount, DirectoryBuffer))
                        {
diff --git a/freeldr/freeldr/inifile/Makefile b/freeldr/freeldr/inifile/Makefile
new file mode 100644 (file)
index 0000000..55309ff
--- /dev/null
@@ -0,0 +1,42 @@
+#
+#  FreeLoader
+#  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+#
+#  This program is free software; you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program; if not, write to the Free Software
+#  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+#
+       
+include ../rules.mk
+
+OBJS = inifile.o init.o parse.o
+
+.PHONY : clean
+
+all: inifile.a
+
+inifile.a:     $(OBJS)
+       $(LD) -r -o inifile.a $(OBJS)
+
+inifile.o:     inifile.c ../inifile.h
+       $(CC) $(FLAGS) -o inifile.o -c inifile.c
+
+init.o:        init.c ../inifile.h
+       $(CC) $(FLAGS) -o init.o -c init.c
+
+parse.o:       parse.c ../inifile.h
+       $(CC) $(FLAGS) -o parse.o -c parse.c
+
+clean:
+       - $(RM) *.o
+       - $(RM) *.a
diff --git a/freeldr/freeldr/inifile/ini.h b/freeldr/freeldr/inifile/ini.h
new file mode 100644 (file)
index 0000000..3fc08b9
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __INI_H
+#define __INI_H
+
+#include <rtl.h>
+
+
+#define INI_FILE_COMMENT_CHAR  ';'
+
+
+
+// This structure describes a single .ini file item
+// The item format in the .ini file is:
+// Name=Value
+typedef struct
+{
+       LIST_ITEM       ListEntry;
+       PUCHAR          ItemName;
+       PUCHAR          ItemValue;
+
+} INI_SECTION_ITEM, *PINI_SECTION_ITEM;
+
+// This structure describes a .ini file section
+// The section format in the .ini file is:
+// [Section Name]
+// This structure has a list of section items with
+// one INI_SECTION_ITEM for each line in the section
+typedef struct
+{
+       LIST_ITEM                       ListEntry;
+       PUCHAR                          SectionName;
+       ULONG                           SectionItemCount;
+       PINI_SECTION_ITEM       SectionItemList;
+
+} INI_SECTION, *PINI_SECTION;
+
+#endif // defined __INI_H
diff --git a/freeldr/freeldr/inifile/inifile.c b/freeldr/freeldr/inifile/inifile.c
new file mode 100644 (file)
index 0000000..aafe033
--- /dev/null
@@ -0,0 +1,433 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "freeldr.h"
+#include "parseini.h"
+#include "ui.h"
+#include "fs.h"
+#include "rtl.h"
+#include "mm.h"
+#include "debug.h"
+
+PUCHAR FreeLoaderIniFileData = NULL;
+ULONG  FreeLoaderIniFileSize = 0;
+
+BOOL ParseIniFile(VOID)
+{
+       //int           i;
+       //char  name[1024];
+       //char  value[1024];
+       PFILE   Freeldr_Ini;    // File handle for freeldr.ini
+
+       // Open the boot drive for file access
+       if (!OpenDiskDrive(BootDrive, 0))
+       {
+               printf("Error opening boot drive for file access.\n");
+               return FALSE;
+       }
+
+       // Try to open freeldr.ini or fail
+       Freeldr_Ini = OpenFile("freeldr.ini");
+       if (Freeldr_Ini == NULL)
+       {
+               printf("FREELDR.INI not found.\nYou need to re-install FreeLoader.\n");
+               return FALSE;
+       }
+
+       // Get the file size & allocate enough memory for it
+       FreeLoaderIniFileSize = GetFileSize(Freeldr_Ini);
+       FreeLoaderIniFileData = AllocateMemory(FreeLoaderIniFileSize);
+
+       // If we are out of memory then return FALSE
+       if (FreeLoaderIniFileData == NULL)
+       {
+               printf("Out of memory while loading FREELDR.INI.\n");
+               CloseFile(Freeldr_Ini);
+               return FALSE;
+       }
+
+       // Read freeldr.ini off the disk
+       ReadFile(Freeldr_Ini, FreeLoaderIniFileSize, NULL, FreeLoaderIniFileData);
+       CloseFile(Freeldr_Ini);
+
+       // Make sure the [FREELOADER] section exists
+       /*if (OpenSection("FREELOADER", NULL))
+       {
+               printf("Section [FREELOADER] not found in FREELDR.INI.\nYou need to re-install FreeLoader.\n");
+               return FALSE;
+       }
+
+       // Validate the settings in the [FREELOADER] section
+       for (i=1; i<=GetNumSectionItems("FREELOADER"); i++)
+       {
+               ReadSectionSettingByNumber("FREELOADER", i, name, value);
+               if (!IsValidSetting(name, value))
+               {
+                       printf("Invalid setting in freeldr.ini.\nName: \"%s\", Value: \"%s\"\n", name, value);
+                       printf("Press any key to continue.\n");
+                       getch();
+               }
+               else
+                       SetSetting(name, value);
+       }*/
+
+       return TRUE;
+}
+
+ULONG GetNextLineOfFileData(PUCHAR Buffer, ULONG BufferSize, ULONG CurrentOffset)
+{
+       ULONG   Idx;
+
+       // Loop through grabbing chars until we hit the end of the
+       // file or we encounter a new line char
+       for (Idx=0; (CurrentOffset < FreeLoaderIniFileSize); CurrentOffset++)
+       {
+               // If we haven't exceeded our buffer size yet
+               // then store another char
+               if (Idx < (BufferSize - 1))
+               {
+                       Buffer[Idx++] = FreeLoaderIniFileData[CurrentOffset];
+               }
+
+               // Check for new line char
+               if (FreeLoaderIniFileData[CurrentOffset] == '\n')
+               {
+                       CurrentOffset++;
+                       break;
+               }
+       }
+
+       // Terminate the string
+       Buffer[Idx] = '\0';
+
+       // Get rid of newline & linefeed characters (if any)
+       if((Buffer[strlen(Buffer)-1] == '\n') || (Buffer[strlen(Buffer)-1] == '\r'))
+               Buffer[strlen(Buffer)-1] = '\0';
+       if((Buffer[strlen(Buffer)-1] == '\n') || (Buffer[strlen(Buffer)-1] == '\r'))
+               Buffer[strlen(Buffer)-1] = '\0';
+
+       // Send back new offset
+       return CurrentOffset;
+}
+
+BOOL OpenSection(PUCHAR SectionName, PULONG SectionId)
+{
+       UCHAR   TempString[80];
+       UCHAR   RealSectionName[80];
+       ULONG   FileOffset;
+       BOOL    SectionFound = FALSE;
+
+       //
+       // Get the real section name
+       //
+       strcpy(RealSectionName, "[");
+       strcat(RealSectionName, SectionName);
+       strcat(RealSectionName, "]");
+
+       //
+       // Get to the beginning of the file
+       //
+       FileOffset = 0;
+
+       //
+       // Find the section
+       //
+       while (FileOffset < FreeLoaderIniFileSize)
+       {
+               //
+               // Read a line
+               //
+               FileOffset = GetNextLineOfFileData(TempString, 80, FileOffset);
+
+               //
+               // If it isn't a section header then continue on
+               //
+               if (TempString[0] != '[')
+                       continue;
+
+               //
+               // Check and see if we found it
+               //
+               if (stricmp(TempString, RealSectionName) == 0)
+               {
+                       SectionFound = TRUE;
+                       break;
+               }
+       }
+
+       if (SectionId)
+       {
+               *SectionId = FileOffset;
+       }
+
+       return SectionFound;
+}
+
+ULONG GetNumSectionItems(ULONG SectionId)
+{
+       UCHAR   TempString[80];
+       ULONG   SectionItemCount = 0;
+
+       // Now count how many settings are in this section
+       while (SectionId < FreeLoaderIniFileSize)
+       {
+               // Read a line
+               SectionId = GetNextLineOfFileData(TempString, 80, SectionId);
+
+               // If we hit a new section then we're done
+               if (TempString[0] == '[')
+                       break;
+
+               // Skip comments
+               if (TempString[0] == '#')
+                       continue;
+
+               // Skip blank lines
+               if (!strlen(TempString))
+                       continue;
+
+               SectionItemCount++;
+       }
+
+       return SectionItemCount;
+}
+
+BOOL ReadSectionSettingByNumber(ULONG SectionId, ULONG SettingNumber, PUCHAR SettingName, ULONG NameSize, PUCHAR SettingValue, ULONG ValueSize)
+{
+       UCHAR   TempString[1024];
+       ULONG   SectionItemCount = 0;
+       ULONG   Idx;
+       ULONG   FileOffset;
+
+       //
+       // Get to the beginning of the section
+       //
+       FileOffset = SectionId;
+
+       //
+       // Now find the setting we are looking for
+       //
+       do
+       {
+               // Read a line
+               FileOffset = GetNextLineOfFileData(TempString, 1024, FileOffset);
+
+               // Skip comments
+               if (TempString[0] == '#')
+                       continue;
+
+               // Skip blank lines
+               if (!strlen(TempString))
+                       continue;
+
+               // If we hit a new section then we're done
+               if (TempString[0] == '[')
+                       break;
+
+               // Check and see if we found the setting
+               if (SectionItemCount == SettingNumber)
+               {
+                       for (Idx=0; Idx<strlen(TempString); Idx++)
+                       {
+                               // Check and see if this character is the separator
+                               if (TempString[Idx] == '=')
+                               {
+                                       SettingName[Idx] = '\0';
+
+                                       strncpy(SettingValue, TempString + Idx + 1, ValueSize);
+
+                                       return TRUE;
+                               }
+                               else if (Idx < NameSize)
+                               {
+                                       SettingName[Idx] = TempString[Idx];
+                               }
+                       }
+               }
+
+               // Increment setting number
+               SectionItemCount++;
+       }
+       while (FileOffset < FreeLoaderIniFileSize);
+
+       return FALSE;
+}
+
+BOOL ReadSectionSettingByName(ULONG SectionId, PUCHAR SettingName, PUCHAR Buffer, ULONG BufferSize)
+{
+       UCHAR   TempString[1024];
+       UCHAR   TempBuffer[80];
+       ULONG   Idx;
+       ULONG   FileOffset;
+
+       //
+       // Get to the beginning of the section
+       //
+       FileOffset = SectionId;
+
+       //
+       // Now find the setting we are looking for
+       //
+       while (FileOffset < FreeLoaderIniFileSize)
+       {
+               // Read a line
+               FileOffset = GetNextLineOfFileData(TempString, 1024, FileOffset);
+
+               // Skip comments
+               if (TempString[0] == '#')
+                       continue;
+
+               // Skip blank lines
+               if (!strlen(TempString))
+                       continue;
+
+               // If we hit a new section then we're done
+               if (TempString[0] == '[')
+                       break;
+
+               // Extract the setting name
+               for (Idx=0; Idx<strlen(TempString); Idx++)
+               {
+                       if (TempString[Idx] != '=')
+                               TempBuffer[Idx] = TempString[Idx];
+                       else
+                       {
+                               TempBuffer[Idx] = '\0';
+                               break;
+                       }
+               }
+
+               // Check and see if we found the setting
+               if (stricmp(TempBuffer, SettingName) == 0)
+               {
+                       for (Idx=0; Idx<strlen(TempString); Idx++)
+                       {
+                               // Check and see if this character is the separator
+                               if (TempString[Idx] == '=')
+                               {
+                                       strcpy(Buffer, TempString + Idx + 1);
+
+                                       return TRUE;
+                               }
+                       }
+               }
+       }
+
+       return FALSE;
+}
+
+BOOL IsValidSetting(char *setting, char *value)
+{
+       if(stricmp(setting, "MessageBox") == 0)
+               return TRUE;
+       else if(stricmp(setting, "MessageLine") == 0)
+               return TRUE;
+       else if(stricmp(setting, "TitleText") == 0)
+               return TRUE;
+       else if(stricmp(setting, "StatusBarColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "StatusBarTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "BackdropTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "BackdropColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "BackdropFillStyle") == 0)
+       {
+               if(IsValidFillStyle(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "TitleBoxTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "TitleBoxColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "MessageBoxTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "MessageBoxColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "MenuTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "MenuColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "TextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "SelectedTextColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "SelectedColor") == 0)
+       {
+               if(IsValidColor(value))
+                       return TRUE;
+       }
+       else if(stricmp(setting, "OS") == 0)
+               return TRUE;
+       else if(stricmp(setting, "TimeOut") == 0)
+               return TRUE;
+       /*else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;
+       else if(stricmp(setting, "") == 0)
+               return TRUE;*/
+
+       return FALSE;
+}
diff --git a/freeldr/freeldr/inifile/inifile.h b/freeldr/freeldr/inifile/inifile.h
new file mode 100644 (file)
index 0000000..363e8e5
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __PARSEINI_H
+#define __PARSEINI_H
+
+/*BOOL ParseIniFile(void);
+ULONG  GetNextLineOfFileData(PUCHAR Buffer, ULONG BufferSize, ULONG CurrentOffset); // Gets the next line of text (up to BufferSize) after CurrentOffset and returns the offset of the next line
+ULONG  GetOffsetOfFirstLineOfSection(PUCHAR SectionName); // Returns the offset of the first line in the section or zero if the section wasn't found
+ULONG  GetNumSectionItems(PUCHAR SectionName); // returns the number of items in a particular section (i.e. [FREELOADER])
+BOOL   ReadSectionSettingByNumber(PUCHAR SectionName, ULONG SettingNumber, PUCHAR SettingName, PUCHAR SettingValue); // Reads the num'th value from section
+BOOL   ReadSectionSettingByName(PUCHAR SectionName, PUCHAR SettingName, PUCHAR SettingValue); // Reads the value named name from section
+BOOL   IsValidSetting(char *setting, char *value);
+void   SetSetting(char *setting, char *value);*/
+
+BOOL   ParseIniFile(VOID);
+ULONG  GetNextLineOfFileData(PUCHAR Buffer, ULONG BufferSize, ULONG CurrentOffset);
+BOOL   OpenSection(PUCHAR SectionName, PULONG SectionId);
+ULONG  GetNumSectionItems(ULONG SectionId);
+BOOL   ReadSectionSettingByNumber(ULONG SectionId, ULONG SettingNumber, PUCHAR SettingName, ULONG NameSize, PUCHAR SettingValue, ULONG ValueSize);
+BOOL   ReadSectionSettingByName(ULONG SectionId, PUCHAR SettingName, PUCHAR Buffer, ULONG BufferSize);
+BOOL   IsValidSetting(char *setting, char *value);
+
+
+#endif // defined __PARSEINI_H
diff --git a/freeldr/freeldr/inifile/init.c b/freeldr/freeldr/inifile/init.c
new file mode 100644 (file)
index 0000000..e93eed3
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <freeldr.h>
+#include "ini.h"
+#include <ui.h>
+#include <fs.h>
+#include <rtl.h>
+#include <mm.h>
+#include <debug.h>
+
+
+BOOL InitializeIniFile(VOID)
+{
+       PFILE   Freeldr_Ini;    // File handle for freeldr.ini
+       PUCHAR  FreeLoaderIniFileData;
+       ULONG   FreeLoaderIniFileSize;
+
+       // Open the boot drive for file access
+       if (!OpenDiskDrive(BootDrive, 0))
+       {
+               printf("Error opening boot drive for file access.\n");
+               return FALSE;
+       }
+
+       // Try to open freeldr.ini or fail
+       Freeldr_Ini = OpenFile("freeldr.ini");
+       if (Freeldr_Ini == NULL)
+       {
+               printf("FREELDR.INI not found.\nYou need to re-install FreeLoader.\n");
+               return FALSE;
+       }
+
+       // Get the file size & allocate enough memory for it
+       FreeLoaderIniFileSize = GetFileSize(Freeldr_Ini);
+       FreeLoaderIniFileData = AllocateMemory(FreeLoaderIniFileSize);
+
+       // If we are out of memory then return FALSE
+       if (FreeLoaderIniFileData == NULL)
+       {
+               printf("Out of memory while loading FREELDR.INI.\n");
+               CloseFile(Freeldr_Ini);
+               return FALSE;
+       }
+
+       // Read freeldr.ini off the disk
+       if (!ReadFile(Freeldr_Ini, FreeLoaderIniFileSize, NULL, FreeLoaderIniFileData))
+       {
+               CloseFile(Freeldr_Ini);
+               FreeMemory(FreeLoaderIniFileData);
+               return FALSE;
+       }
+
+       CloseFile(Freeldr_Ini);
+       FreeMemory(FreeLoaderIniFileData);
+
+       return TRUE;
+}
diff --git a/freeldr/freeldr/inifile/parse.c b/freeldr/freeldr/inifile/parse.c
new file mode 100644 (file)
index 0000000..ea25537
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ *  FreeLoader
+ *  Copyright (C) 1998-2002  Brian Palmer  <brianp@sginet.com>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <freeldr.h>
+#include "ini.h"
+#include <ui.h>
+#include <fs.h>
+#include <rtl.h>
+#include <mm.h>
+#include <debug.h>
+
+
+VOID IniParseFile(PUCHAR IniFileData, ULONG IniFileSize)
+{
+}
+
+ULONG IniGetNextLineSize(PUCHAR IniFileData, ULONG IniFileSize, ULONG CurrentOffset)
+{
+       ULONG   Idx;
+       ULONG   LineCharCount = 0;
+
+       // Loop through grabbing chars until we hit the end of the
+       // file or we encounter a new line char
+       for (Idx=0; (CurrentOffset < IniFileSize); CurrentOffset++)
+       {
+               // Increment the line character count
+               LineCharCount++;
+
+               // Check for new line char
+               if (IniFileData[CurrentOffset] == '\n')
+               {
+                       CurrentOffset++;
+                       break;
+               }
+       }
+
+       // Send back line character count
+       return LineCharCount;
+}
+
+ULONG IniGetNextLine(PUCHAR IniFileData, ULONG IniFileSize, PUCHAR Buffer, ULONG BufferSize, ULONG CurrentOffset)
+{
+       ULONG   Idx;
+
+       // Loop through grabbing chars until we hit the end of the
+       // file or we encounter a new line char
+       for (Idx=0; (CurrentOffset < IniFileSize); CurrentOffset++)
+       {
+               // If we haven't exceeded our buffer size yet
+               // then store another char
+               if (Idx < (BufferSize - 1))
+               {
+                       Buffer[Idx++] = IniFileData[CurrentOffset];
+               }
+
+               // Check for new line char
+               if (IniFileData[CurrentOffset] == '\n')
+               {
+                       CurrentOffset++;
+                       break;
+               }
+       }
+
+       // Terminate the string
+       Buffer[Idx] = '\0';
+
+       // Get rid of newline & linefeed characters (if any)
+       if((Buffer[strlen(Buffer)-1] == '\n') || (Buffer[strlen(Buffer)-1] == '\r'))
+               Buffer[strlen(Buffer)-1] = '\0';
+       if((Buffer[strlen(Buffer)-1] == '\n') || (Buffer[strlen(Buffer)-1] == '\r'))
+               Buffer[strlen(Buffer)-1] = '\0';
+
+       // Send back new offset
+       return CurrentOffset;
+}
+
+BOOL IniIsLineEmpty(PUCHAR LineOfText, ULONG TextLength)
+{
+       ULONG   Idx;
+
+       // Check the first character (skipping whitespace)
+       // and make sure that it is an opening bracket
+       for (Idx=0; Idx<TextLength; Idx++)
+       {
+               if ((LineOfText[Idx] == ' ') ||
+                       (LineOfText[Idx] == '\t') ||
+                       (LineOfText[Idx] == '\n') ||
+                       (LineOfText[Idx] == '\r'))
+               {
+                       continue;
+               }
+               else
+               {
+                       return FALSE;
+               }
+       }
+
+       return TRUE;
+}
+
+BOOL IniIsCommentLine(PUCHAR LineOfText, ULONG TextLength)
+{
+       ULONG   Idx;
+
+       // Check the first character (skipping whitespace)
+       // and make sure that it is an opening bracket
+       for (Idx=0; Idx<TextLength; Idx++)
+       {
+               if ((LineOfText[Idx] == ' ') ||
+                       (LineOfText[Idx] == '\t'))
+               {
+                       continue;
+               }
+               else if (LineOfText[Idx] == INI_FILE_COMMENT_CHAR)
+               {
+                       return TRUE;
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       return FALSE;
+}
+
+BOOL IniIsSectionName(PUCHAR LineOfText, ULONG TextLength)
+{
+       ULONG   Idx;
+
+       // Check the first character (skipping whitespace)
+       // and make sure that it is an opening bracket
+       for (Idx=0; Idx<TextLength; Idx++)
+       {
+               if ((LineOfText[Idx] == ' ') ||
+                       (LineOfText[Idx] == '\t'))
+               {
+                       continue;
+               }
+               else if (LineOfText[Idx] == '[')
+               {
+                       return TRUE;
+               }
+               else
+               {
+                       break;
+               }
+       }
+
+       return FALSE;
+}
+
+ULONG IniGetSectionNameSize(PUCHAR SectionNameLine, ULONG LineLength)
+{
+       ULONG   Idx;
+       ULONG   NameSize;
+
+       // Find the opening bracket (skipping whitespace)
+       for (Idx=0; Idx<LineLength; Idx++)
+       {
+               if ((SectionNameLine[Idx] == ' ') ||
+                       (SectionNameLine[Idx] == '\t'))
+               {
+                       continue;
+               }
+               else //if (SectionNameLine[Idx] == '[')
+               {
+                       break;
+               }
+       }
+
+       // Skip past the opening bracket
+       Idx++;
+
+       // Count the characters up until the closing bracket of EOL
+       for (NameSize=0; Idx<LineLength; Idx++)
+       {
+               if ((SectionNameLine[Idx] == ']') ||
+                       (SectionNameLine[Idx] == '\0'))
+               {
+                       break;
+               }
+
+               // Increment the count
+               NameSize++;
+       }
+
+       return NameSize;
+}
+
+VOID IniExtractSectionName(PUCHAR SectionName, PUCHAR SectionNameLine, ULONG LineLength)
+{
+       ULONG   Idx;
+       ULONG   DestIdx;
+
+       // Find the opening bracket (skipping whitespace)
+       for (Idx=0; Idx<LineLength; Idx++)
+       {
+               if ((SectionNameLine[Idx] == ' ') ||
+                       (SectionNameLine[Idx] == '\t'))
+               {
+                       continue;
+               }
+               else //if (SectionNameLine[Idx] == '[')
+               {
+                       break;
+               }
+       }
+
+       // Skip past the opening bracket
+       Idx++;
+
+       // Count the characters up until the closing bracket of EOL
+       for (DestIdx=0; Idx<LineLength; Idx++)
+       {
+               if ((SectionNameLine[Idx] == ']') ||
+                       (SectionNameLine[Idx] == '\0'))
+               {
+                       break;
+               }
+
+               // Grab a character and increment DestIdx
+               SectionName[DestIdx] = SectionNameLine[Idx];
+               DestIdx++;
+       }
+
+}
index 17cda07..319ec6a 100644 (file)
@@ -32,6 +32,7 @@ PVOID         HeapBaseAddress = NULL;
 ULONG          HeapLengthInBytes = 0;
 ULONG          HeapMemBlockCount = 0;
 PMEMBLOCK      HeapMemBlockArray = NULL;
+ULONG          Stack;
 
 VOID InitMemoryManager(VOID)
 {
@@ -40,7 +41,7 @@ VOID InitMemoryManager(VOID)
        ULONG   Length;
 
        // Round up to the next page of memory
-       RealFreeLoaderModuleEnd = ((FreeLoaderModuleEnd + 4095) / 4096) * 4096;
+       RealFreeLoaderModuleEnd = ROUND_UP(FreeLoaderModuleEnd, 4096);
        BaseAddress = RealFreeLoaderModuleEnd;
        Length = (MAXLOWMEMADDR - RealFreeLoaderModuleEnd);
 
@@ -63,16 +64,22 @@ VOID InitMemoryManager(VOID)
        // Adjust the heap length so we can reserve
        // enough storage space for the MEMBLOCK array
        Length -= (MemBlocks * sizeof(MEMBLOCK));
+       DbgPrint((DPRINT_MEMORY, "We get here.\n"));
 
        // Initialize our tracking variables
-       HeapBaseAddress = BaseAddress;
+       HeapBaseAddress = (PVOID)BaseAddress;
        HeapLengthInBytes = Length;
        HeapMemBlockCount = (HeapLengthInBytes / MEM_BLOCK_SIZE);
        HeapMemBlockArray = (PMEMBLOCK)(HeapBaseAddress + HeapLengthInBytes);
+       DbgPrint((DPRINT_MEMORY, "We get here2.\n"));
 
        // Clear the memory
+       __asm__("movl   %esp,_Stack");
+       DbgPrint((DPRINT_MEMORY, "HeapBaseAddress: 0x%x HeapLengthInBytes: %d Stack: %d.\n", HeapBaseAddress, HeapLengthInBytes, Stack));
        RtlZeroMemory(HeapBaseAddress, HeapLengthInBytes);
+       DbgPrint((DPRINT_MEMORY, "We get here3.\n"));
        RtlZeroMemory(HeapMemBlockArray, (HeapMemBlockCount * sizeof(MEMBLOCK)));
+       DbgPrint((DPRINT_MEMORY, "We get here4.\n"));
 
 #ifdef DEBUG
        DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. BaseAddress = 0x%x Length = 0x%x. %d blocks in heap.\n", BaseAddress, Length, HeapMemBlockCount));
index 9b300ae..5975d52 100644 (file)
@@ -104,6 +104,7 @@ PVOID AllocateMemory(ULONG NumberOfBytes)
 #ifdef DEBUG
        IncrementAllocationCount();
        DbgPrint((DPRINT_MEMORY, "Allocated %d bytes (%d blocks) of memory starting at block %d. AllocCount: %d\n", NumberOfBytes, BlocksNeeded, Idx, AllocationCount));
+       DbgPrint((DPRINT_MEMORY, "Memory allocation pointer: 0x%x\n", MemPointer));
        VerifyHeap();
 #endif // DEBUG
 
@@ -225,7 +226,7 @@ VOID DumpMemoryAllocMap(VOID)
                if ((Idx % 32) == 0)
                {
                        DbgPrint((DPRINT_MEMORY, "\n"));
-                       DbgPrint((DPRINT_MEMORY, "%x:\t", (Idx * 256)));
+                       DbgPrint((DPRINT_MEMORY, "%x:\t", HeapBaseAddress + (Idx * 256)));
                }
                else if ((Idx % 4) == 0)
                {