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
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
//
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;
//
// Attempt to allocate memory for directory buffer
//
+ DbgPrint((DPRINT_FILESYSTEM, "Trying to allocate (DirectorySize) %d bytes.\n", DirectorySize));
DirectoryBuffer = AllocateMemory(DirectorySize);
if (DirectoryBuffer == NULL)
// 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))
{
--- /dev/null
+#
+# 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
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+/*
+ * 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++;
+ }
+
+}
ULONG HeapLengthInBytes = 0;
ULONG HeapMemBlockCount = 0;
PMEMBLOCK HeapMemBlockArray = NULL;
+ULONG Stack;
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);
// 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));
#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
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)
{