mirror of
https://github.com/reactos/reactos.git
synced 2024-08-07 11:48:03 +00:00
Fixed a bug in the LBA extensions detection code.
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
This commit is contained in:
parent
dfbd52f882
commit
513784c84a
|
@ -292,7 +292,7 @@ EXTERN(_BiosInt13ExtensionsSupported)
|
||||||
movb _int13_extension_check_drive,%dl // DL = drive (80h-FFh)
|
movb _int13_extension_check_drive,%dl // DL = drive (80h-FFh)
|
||||||
int $0x13 // IBM/MS INT 13 Extensions - INSTALLATION CHECK
|
int $0x13 // IBM/MS INT 13 Extensions - INSTALLATION CHECK
|
||||||
jc _int13_extension_check_error // CF set on error (extensions not supported)
|
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
|
jne _int13_extension_check_error
|
||||||
testb $1,%cl // CX = API subset support bitmap
|
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
|
jz _int13_extension_check_error // Bit 0, extended disk access functions (AH=42h-44h,47h,48h) supported
|
||||||
|
|
|
@ -285,10 +285,35 @@ PVOID FatBufferDirectory(UINT32 DirectoryStartCluster, PUINT32 EntryCountPointer
|
||||||
//
|
//
|
||||||
if ((RootDirectory) && (FatType != FAT32))
|
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
|
else
|
||||||
{
|
{
|
||||||
|
DbgPrint((DPRINT_FILESYSTEM, "No we are here.\n"));
|
||||||
if (RootDirectory)
|
if (RootDirectory)
|
||||||
{
|
{
|
||||||
DirectorySize = (FatCountClustersInChain(Fat32VolumeBootSector->RootDirStartCluster) * Fat32VolumeBootSector->SectorsPerCluster) * Fat32VolumeBootSector->BytesPerSector;
|
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
|
// Attempt to allocate memory for directory buffer
|
||||||
//
|
//
|
||||||
|
DbgPrint((DPRINT_FILESYSTEM, "Trying to allocate (DirectorySize) %d bytes.\n", DirectorySize));
|
||||||
DirectoryBuffer = AllocateMemory(DirectorySize);
|
DirectoryBuffer = AllocateMemory(DirectorySize);
|
||||||
|
|
||||||
if (DirectoryBuffer == NULL)
|
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
|
// FAT type is not FAT32 so the root directory comes right after the fat table
|
||||||
//
|
//
|
||||||
RootDirectoryStartSector = FatVolumeBootSector->ReservedSectors + (FatVolumeBootSector->NumberOfFats * FatVolumeBootSector->SectorsPerFat);
|
RootDirectoryStartSector = FatVolumeBootSector->ReservedSectors + (FatVolumeBootSector->NumberOfFats * FatVolumeBootSector->SectorsPerFat);
|
||||||
RootDirectorySectorCount = FatVolumeBootSector->RootDirEntries / 32;
|
RootDirectorySectorCount = (DirectorySize / FatVolumeBootSector->BytesPerSector);
|
||||||
|
|
||||||
if (!FatReadVolumeSectors(FatDriveNumber, RootDirectoryStartSector, RootDirectorySectorCount, DirectoryBuffer))
|
if (!FatReadVolumeSectors(FatDriveNumber, RootDirectoryStartSector, RootDirectorySectorCount, DirectoryBuffer))
|
||||||
{
|
{
|
||||||
|
|
42
freeldr/freeldr/inifile/Makefile
Normal file
42
freeldr/freeldr/inifile/Makefile
Normal file
|
@ -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
|
55
freeldr/freeldr/inifile/ini.h
Normal file
55
freeldr/freeldr/inifile/ini.h
Normal file
|
@ -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
|
433
freeldr/freeldr/inifile/inifile.c
Normal file
433
freeldr/freeldr/inifile/inifile.c
Normal file
|
@ -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;
|
||||||
|
}
|
41
freeldr/freeldr/inifile/inifile.h
Normal file
41
freeldr/freeldr/inifile/inifile.h
Normal file
|
@ -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
|
74
freeldr/freeldr/inifile/init.c
Normal file
74
freeldr/freeldr/inifile/init.c
Normal file
|
@ -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;
|
||||||
|
}
|
243
freeldr/freeldr/inifile/parse.c
Normal file
243
freeldr/freeldr/inifile/parse.c
Normal file
|
@ -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++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -32,6 +32,7 @@ PVOID HeapBaseAddress = NULL;
|
||||||
ULONG HeapLengthInBytes = 0;
|
ULONG HeapLengthInBytes = 0;
|
||||||
ULONG HeapMemBlockCount = 0;
|
ULONG HeapMemBlockCount = 0;
|
||||||
PMEMBLOCK HeapMemBlockArray = NULL;
|
PMEMBLOCK HeapMemBlockArray = NULL;
|
||||||
|
ULONG Stack;
|
||||||
|
|
||||||
VOID InitMemoryManager(VOID)
|
VOID InitMemoryManager(VOID)
|
||||||
{
|
{
|
||||||
|
@ -40,7 +41,7 @@ VOID InitMemoryManager(VOID)
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
|
||||||
// Round up to the next page of memory
|
// Round up to the next page of memory
|
||||||
RealFreeLoaderModuleEnd = ((FreeLoaderModuleEnd + 4095) / 4096) * 4096;
|
RealFreeLoaderModuleEnd = ROUND_UP(FreeLoaderModuleEnd, 4096);
|
||||||
BaseAddress = RealFreeLoaderModuleEnd;
|
BaseAddress = RealFreeLoaderModuleEnd;
|
||||||
Length = (MAXLOWMEMADDR - RealFreeLoaderModuleEnd);
|
Length = (MAXLOWMEMADDR - RealFreeLoaderModuleEnd);
|
||||||
|
|
||||||
|
@ -63,16 +64,22 @@ VOID InitMemoryManager(VOID)
|
||||||
// Adjust the heap length so we can reserve
|
// Adjust the heap length so we can reserve
|
||||||
// enough storage space for the MEMBLOCK array
|
// enough storage space for the MEMBLOCK array
|
||||||
Length -= (MemBlocks * sizeof(MEMBLOCK));
|
Length -= (MemBlocks * sizeof(MEMBLOCK));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "We get here.\n"));
|
||||||
|
|
||||||
// Initialize our tracking variables
|
// Initialize our tracking variables
|
||||||
HeapBaseAddress = BaseAddress;
|
HeapBaseAddress = (PVOID)BaseAddress;
|
||||||
HeapLengthInBytes = Length;
|
HeapLengthInBytes = Length;
|
||||||
HeapMemBlockCount = (HeapLengthInBytes / MEM_BLOCK_SIZE);
|
HeapMemBlockCount = (HeapLengthInBytes / MEM_BLOCK_SIZE);
|
||||||
HeapMemBlockArray = (PMEMBLOCK)(HeapBaseAddress + HeapLengthInBytes);
|
HeapMemBlockArray = (PMEMBLOCK)(HeapBaseAddress + HeapLengthInBytes);
|
||||||
|
DbgPrint((DPRINT_MEMORY, "We get here2.\n"));
|
||||||
|
|
||||||
// Clear the memory
|
// Clear the memory
|
||||||
|
__asm__("movl %esp,_Stack");
|
||||||
|
DbgPrint((DPRINT_MEMORY, "HeapBaseAddress: 0x%x HeapLengthInBytes: %d Stack: %d.\n", HeapBaseAddress, HeapLengthInBytes, Stack));
|
||||||
RtlZeroMemory(HeapBaseAddress, HeapLengthInBytes);
|
RtlZeroMemory(HeapBaseAddress, HeapLengthInBytes);
|
||||||
|
DbgPrint((DPRINT_MEMORY, "We get here3.\n"));
|
||||||
RtlZeroMemory(HeapMemBlockArray, (HeapMemBlockCount * sizeof(MEMBLOCK)));
|
RtlZeroMemory(HeapMemBlockArray, (HeapMemBlockCount * sizeof(MEMBLOCK)));
|
||||||
|
DbgPrint((DPRINT_MEMORY, "We get here4.\n"));
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. BaseAddress = 0x%x Length = 0x%x. %d blocks in heap.\n", BaseAddress, Length, HeapMemBlockCount));
|
DbgPrint((DPRINT_MEMORY, "Memory Manager initialized. BaseAddress = 0x%x Length = 0x%x. %d blocks in heap.\n", BaseAddress, Length, HeapMemBlockCount));
|
||||||
|
|
|
@ -104,6 +104,7 @@ PVOID AllocateMemory(ULONG NumberOfBytes)
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
IncrementAllocationCount();
|
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, "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();
|
VerifyHeap();
|
||||||
#endif // DEBUG
|
#endif // DEBUG
|
||||||
|
|
||||||
|
@ -225,7 +226,7 @@ VOID DumpMemoryAllocMap(VOID)
|
||||||
if ((Idx % 32) == 0)
|
if ((Idx % 32) == 0)
|
||||||
{
|
{
|
||||||
DbgPrint((DPRINT_MEMORY, "\n"));
|
DbgPrint((DPRINT_MEMORY, "\n"));
|
||||||
DbgPrint((DPRINT_MEMORY, "%x:\t", (Idx * 256)));
|
DbgPrint((DPRINT_MEMORY, "%x:\t", HeapBaseAddress + (Idx * 256)));
|
||||||
}
|
}
|
||||||
else if ((Idx % 4) == 0)
|
else if ((Idx % 4) == 0)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue