static LONG DiskRead(ULONG FileId, VOID* Buffer, ULONG N, ULONG* Count)
{
DISKCONTEXT* Context = FsGetDeviceSpecific(FileId);
+ UCHAR* Ptr = (UCHAR*)Buffer;
+ ULONG i;
BOOLEAN ret;
*Count = 0;
if (N & (Context->SectorSize - 1))
return EINVAL;
- ret = MachDiskReadLogicalSectors(
- Context->DriveNumber,
- Context->SectorNumber + Context->SectorOffset,
- N / Context->SectorSize,
- Buffer);
- if (!ret)
- return EIO;
+ for (i = 0; i < N / Context->SectorSize; i++)
+ {
+ ret = MachDiskReadLogicalSectors(
+ Context->DriveNumber,
+ Context->SectorNumber + Context->SectorOffset + i,
+ 1,
+ (PVOID)DISKREADBUFFER);
+ if (!ret)
+ return EIO;
+ RtlCopyMemory(Ptr, (PVOID)DISKREADBUFFER, Context->SectorSize);
+ Ptr += Context->SectorSize;
+ }
*Count = N;
return ESUCCESS;
/*
* FreeLoader
* Copyright (C) 1998-2003 Brian Palmer <brianp@sginet.com>
+ * Copyright (C) 2008-2009 Hervé Poussineau <hpoussin@reactos.org>
*
* 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
// FUNCTIONS
/////////////////////////////////////////////////////////////////////////////////////////////
+static BOOLEAN CompatArcOpenVolume(UCHAR DriveNumber, ULONGLONG VolumeStartSector, ULONGLONG PartitionSectorCount)
+{
+ //
+ // Always return success
+ //
+ return TRUE;
+}
+
+static FILE* CompatArcOpenFile(PCSTR FileName)
+{
+ CHAR FullPath[MAX_PATH];
+ ULONG FileId;
+ LONG ret;
+
+ //
+ // Create full file name
+ //
+ MachDiskGetBootPath(FullPath, sizeof(FullPath));
+ strcat(FullPath, FileName);
+
+ //
+ // Open the file
+ //
+ ret = ArcOpen(FullPath, OpenReadOnly, &FileId);
+
+ //
+ // Check for success
+ //
+ if (ret == ESUCCESS)
+ return (FILE*)FileId;
+ else
+ return NULL;
+}
+
+static BOOLEAN CompatArcReadFile(FILE *FileHandle, ULONG BytesToRead, ULONG* BytesRead, PVOID Buffer)
+{
+ ULONG FileId = (ULONG)FileHandle;
+ LONG ret;
+
+ //
+ // Read the file
+ //
+ ret = ArcRead(FileId, Buffer, BytesToRead, BytesRead);
+
+ //
+ // Check for success
+ //
+ if (ret == ESUCCESS)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+ULONG CompatArcGetFileSize(FILE *FileHandle)
+{
+ ULONG FileId = (ULONG)FileHandle;
+ FILEINFORMATION Information;
+ LONG ret;
+
+ //
+ // Query file informations
+ //
+ ret = ArcGetFileInformation(FileId, &Information);
+
+ //
+ // Check for error
+ //
+ if (ret != ESUCCESS || Information.EndingAddress.HighPart != 0)
+ return 0;
+
+ //
+ // Return file size
+ //
+ return Information.EndingAddress.LowPart;
+}
+
+VOID CompatArcSetFilePointer(FILE *FileHandle, ULONG NewFilePointer)
+{
+ ULONG FileId = (ULONG)FileHandle;
+ LARGE_INTEGER Position;
+
+ //
+ // Set file position
+ //
+ Position.HighPart = 0;
+ Position.LowPart = NewFilePointer;
+ ArcSeek(FileId, &Position, SeekAbsolute);
+
+ //
+ // Do not check for error; this function is
+ // supposed to always succeed
+ //
+}
+
+ULONG CompatArcGetFilePointer(FILE *FileHandle)
+{
+ ULONG FileId = (ULONG)FileHandle;
+ FILEINFORMATION Information;
+ LONG ret;
+
+ //
+ // Query file informations
+ //
+ ret = ArcGetFileInformation(FileId, &Information);
+
+ //
+ // Check for error
+ //
+ if (ret != ESUCCESS || Information.CurrentAddress.HighPart != 0)
+ return 0;
+
+ //
+ // Return file pointer position
+ //
+ return Information.CurrentAddress.LowPart;
+}
+
+static const FS_VTBL CompatArcVtbl =
+{
+ CompatArcOpenVolume,
+ CompatArcOpenFile,
+ NULL,
+ CompatArcReadFile,
+ CompatArcGetFileSize,
+ CompatArcSetFilePointer,
+ CompatArcGetFilePointer,
+};
+
VOID FileSystemError(PCSTR ErrorString)
{
DPRINTM(DPRINT_FILESYSTEM, "%s\n", ErrorString);
CompatFsSeek,
};
-#define MAX_FDS 20
+#define MAX_FDS 60
typedef struct tagFILEDATA
{
ULONG DeviceId;
{
FileData[FileId].FuncTable = NULL;
FileData[FileId].Specific = NULL;
+ FileData[FileId].DeviceId = -1;
}
return ret;
}
OPENMODE DeviceOpenMode;
ULONG DeviceId;
+ /* Print status message */
+ DPRINTM(DPRINT_FILESYSTEM, "Opening file '%s'...\n", Path);
+
*FileId = MAX_FDS;
/* Search last ')', which delimits device and path */
/* Open the file */
FileData[i].FuncTable = FileData[DeviceId].FileFuncTable;
+ FileData[i].DeviceId = DeviceId;
*FileId = i;
ret = FileData[i].FuncTable->Open(FileName, OpenMode, FileId);
if (ret != ESUCCESS)
return FileData[FileId].Specific;
}
+ULONG FsGetDeviceId(ULONG FileId)
+{
+ if (FileId >= MAX_FDS)
+ return (ULONG)-1;
+ return FileData[FileId].DeviceId;
+}
+
VOID FsInit(VOID)
{
- memset(FileData, 0, sizeof(FileData));
+ ULONG i;
+
+ RtlZeroMemory(FileData, sizeof(FileData));
+ for (i = 0; i < MAX_FDS; i++)
+ FileData[i].DeviceId = (ULONG)-1;
+
InitializeListHead(&DeviceListHead);
}