mirror of
https://github.com/reactos/reactos.git
synced 2025-05-29 22:18:13 +00:00
[BOOTMGFW]
- Hey Arch, your buddies gave you ETFS support for native EFI boot, of course reading sector 0 is all zeroes, you're not on FAT, you idiot! ETFS has data at sector 16 and 17. - Implement beginning of ETFS support. We correctly mount the reactOS boot cd as ETFS and open the root directory entry! svn path=/trunk/; revision=69181
This commit is contained in:
parent
51d5eadd25
commit
e88843426b
6 changed files with 494 additions and 37 deletions
|
@ -20,6 +20,7 @@ list(APPEND BOOTLIB_SOURCE
|
||||||
lib/mm/descriptor.c
|
lib/mm/descriptor.c
|
||||||
lib/platform/time.c
|
lib/platform/time.c
|
||||||
lib/io/blkcache.c
|
lib/io/blkcache.c
|
||||||
|
lib/io/etfs.c
|
||||||
lib/io/io.c
|
lib/io/io.c
|
||||||
lib/io/device.c
|
lib/io/device.c
|
||||||
lib/io/file.c
|
lib/io/file.c
|
||||||
|
|
|
@ -269,9 +269,9 @@ struct _BL_FILE_ENTRY;
|
||||||
typedef
|
typedef
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
(*PBL_FILE_OPEN) (
|
(*PBL_FILE_OPEN) (
|
||||||
_In_ struct _BL_FILE_ENTRY* ParentFileEntry,
|
_In_ struct _BL_FILE_ENTRY* Directory,
|
||||||
_In_ PWCHAR FileName,
|
_In_ PWCHAR FileName,
|
||||||
_In_ ULONG OpenFlags,
|
_In_ ULONG Flags,
|
||||||
_Out_ struct _BL_FILE_ENTRY** FileEntry
|
_Out_ struct _BL_FILE_ENTRY** FileEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -758,16 +758,17 @@ typedef struct _BL_FILE_CALLBACKS
|
||||||
|
|
||||||
typedef struct _BL_FILE_ENTRY
|
typedef struct _BL_FILE_ENTRY
|
||||||
{
|
{
|
||||||
ULONG ReferenceCount;
|
|
||||||
ULONG FileId;
|
|
||||||
ULONG DeviceId;
|
|
||||||
ULONG Flags;
|
|
||||||
PWCHAR FilePath;
|
PWCHAR FilePath;
|
||||||
|
ULONG DeviceId;
|
||||||
|
ULONG FileId;
|
||||||
|
ULONG Flags;
|
||||||
|
ULONG ReferenceCount;
|
||||||
ULONG Unknown;
|
ULONG Unknown;
|
||||||
ULONG Unknown1;
|
ULONGLONG Unknown1;
|
||||||
ULONG Unknown2;
|
ULONGLONG Unknown2;
|
||||||
BL_FILE_CALLBACKS Callbacks;
|
BL_FILE_CALLBACKS Callbacks;
|
||||||
PBL_FILE_DESTROY_CALLBACK DestroyCallback;
|
//PBL_FILE_DESTROY_CALLBACK DestroyCallback;
|
||||||
|
PVOID FsSpecificData;
|
||||||
} BL_FILE_ENTRY, *PBL_FILE_ENTRY;
|
} BL_FILE_ENTRY, *PBL_FILE_ENTRY;
|
||||||
|
|
||||||
typedef struct _BL_FILE_SYSTEM_ENTRY
|
typedef struct _BL_FILE_SYSTEM_ENTRY
|
||||||
|
@ -1225,6 +1226,18 @@ FatMount (
|
||||||
_Out_ PBL_FILE_ENTRY* FileEntry
|
_Out_ PBL_FILE_ENTRY* FileEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsInitialize (
|
||||||
|
VOID
|
||||||
|
);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsMount (
|
||||||
|
_In_ ULONG DeviceId,
|
||||||
|
_In_ ULONG Unknown,
|
||||||
|
_Out_ PBL_FILE_ENTRY* FileEntry
|
||||||
|
);
|
||||||
|
|
||||||
/* UTILITY ROUTINES **********************************************************/
|
/* UTILITY ROUTINES **********************************************************/
|
||||||
|
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
|
|
|
@ -130,8 +130,8 @@ BlockIoFirmwareRead (
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
EfiPrintf(L"EFI Reading BLOCK %d off media %lx (%d blocks)\r\n",
|
//EfiPrintf(L"EFI Reading BLOCK %d off media %lx (%d blocks)\r\n",
|
||||||
Block, BlockProtocol->Media->MediaId, BlockCount);
|
//Block, BlockProtocol->Media->MediaId, BlockCount);
|
||||||
EfiStatus = BlockProtocol->ReadBlocks(BlockProtocol,
|
EfiStatus = BlockProtocol->ReadBlocks(BlockProtocol,
|
||||||
BlockProtocol->Media->MediaId,
|
BlockProtocol->Media->MediaId,
|
||||||
Block,
|
Block,
|
||||||
|
@ -139,8 +139,8 @@ BlockIoFirmwareRead (
|
||||||
Buffer);
|
Buffer);
|
||||||
if (EfiStatus == EFI_SUCCESS)
|
if (EfiStatus == EFI_SUCCESS)
|
||||||
{
|
{
|
||||||
EfiPrintf(L"EFI Read complete into buffer\r\n");
|
//EfiPrintf(L"EFI Read complete into buffer\r\n");
|
||||||
EfiPrintf(L"Buffer data: %lx %lx %lx %lx\r\n", *(PULONG)Buffer, *((PULONG)Buffer + 1), *((PULONG)Buffer + 2), *((PULONG)Buffer + 3));
|
//EfiPrintf(L"Buffer data: %lx %lx %lx %lx\r\n", *(PULONG)Buffer, *((PULONG)Buffer + 1), *((PULONG)Buffer + 2), *((PULONG)Buffer + 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OldMode != 1)
|
if (OldMode != 1)
|
||||||
|
|
433
reactos/boot/environ/lib/io/etfs.c
Normal file
433
reactos/boot/environ/lib/io/etfs.c
Normal file
|
@ -0,0 +1,433 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING.ARM in the top level directory
|
||||||
|
* PROJECT: ReactOS UEFI Boot Library
|
||||||
|
* FILE: boot/environ/lib/io/etfs.c
|
||||||
|
* PURPOSE: Boot Library El Torito File System Management Routines
|
||||||
|
* PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* INCLUDES ******************************************************************/
|
||||||
|
|
||||||
|
#include "bl.h"
|
||||||
|
#include "../drivers/filesystems/cdfs_new/cd.h"
|
||||||
|
typedef struct _RAW_ET_VD
|
||||||
|
{
|
||||||
|
UCHAR BootIndicator;
|
||||||
|
UCHAR StandardId[5];
|
||||||
|
UCHAR Version;
|
||||||
|
UCHAR SystemId[32];
|
||||||
|
UCHAR Reserved[32];
|
||||||
|
ULONG BootCatalogOffset;
|
||||||
|
UCHAR Padding[1973];
|
||||||
|
} RAW_ET_VD, *PRAW_ET_VD;
|
||||||
|
|
||||||
|
/* DATA VARIABLES ************************************************************/
|
||||||
|
|
||||||
|
typedef struct _BL_ETFS_CONTEXT
|
||||||
|
{
|
||||||
|
ULONG RootDirOffset;
|
||||||
|
ULONG RootDirSize;
|
||||||
|
ULONG BlockSize;
|
||||||
|
ULONG VolumeSize;
|
||||||
|
BOOLEAN IsIso;
|
||||||
|
PRAW_ISO_VD MemoryBlock;
|
||||||
|
ULONG Offset;
|
||||||
|
} BL_ETFS_CONTEXT, *PBL_ETFS_CONTEXT;
|
||||||
|
|
||||||
|
typedef struct _BL_ETFS_FILE
|
||||||
|
{
|
||||||
|
ULONG Flags;
|
||||||
|
ULONG DeviceId;
|
||||||
|
ULONG Offset;
|
||||||
|
ULONG Unknown;
|
||||||
|
ULONGLONG Size;
|
||||||
|
PWCHAR FsName;
|
||||||
|
} BL_ETFS_FILE, *PBL_ETFS_FILE;
|
||||||
|
|
||||||
|
ULONG EtfsDeviceTableEntries;
|
||||||
|
PVOID* EtfsDeviceTable;
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsOpen (
|
||||||
|
_In_ PBL_FILE_ENTRY Directory,
|
||||||
|
_In_ PWCHAR FileName,
|
||||||
|
_In_ ULONG Flags,
|
||||||
|
_Out_ PBL_FILE_ENTRY *FileEntry
|
||||||
|
);
|
||||||
|
|
||||||
|
BL_FILE_CALLBACKS EtfsFunctionTable =
|
||||||
|
{
|
||||||
|
EtfsOpen,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsOpen (
|
||||||
|
_In_ PBL_FILE_ENTRY Directory,
|
||||||
|
_In_ PWCHAR FileName,
|
||||||
|
_In_ ULONG Flags,
|
||||||
|
_Out_ PBL_FILE_ENTRY *FileEntry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EfiPrintf(L"Attempting to open file %s in directory %s. Not yet supported\r\n", FileName, Directory->FilePath);
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfspCheckCdfs (
|
||||||
|
_In_ PBL_ETFS_CONTEXT EtfsContext,
|
||||||
|
_In_ ULONG DeviceId,
|
||||||
|
_Out_ PRAW_ISO_VD *VolumeDescriptor,
|
||||||
|
_Out_ PBOOLEAN VolumeIsIso
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EfiPrintf(L"Raw Cdfs not implemented\r\n");
|
||||||
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfspCheckEtfs (
|
||||||
|
_In_ PBL_ETFS_CONTEXT EtfsContext,
|
||||||
|
_In_ ULONG DeviceId,
|
||||||
|
_Out_ PRAW_ISO_VD *VolumeDescriptor,
|
||||||
|
_Out_ PBOOLEAN VolumeIsIso
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PRAW_ISO_VD IsoVd;
|
||||||
|
PRAW_ET_VD EtVd;
|
||||||
|
NTSTATUS Status;
|
||||||
|
BOOLEAN IsIso;
|
||||||
|
BL_DEVICE_INFORMATION DeviceInformation;
|
||||||
|
ULONG Unknown, BytesRead;
|
||||||
|
ANSI_STRING CompareString, String;
|
||||||
|
|
||||||
|
/* Save our static buffer pointer */
|
||||||
|
IsoVd = EtfsContext->MemoryBlock;
|
||||||
|
EtVd = (PRAW_ET_VD)IsoVd;
|
||||||
|
|
||||||
|
/* First, read the El Torito Volume Descriptor */
|
||||||
|
BlDeviceGetInformation(DeviceId, &DeviceInformation);
|
||||||
|
Unknown = DeviceInformation.BlockDeviceInfo.Unknown;
|
||||||
|
DeviceInformation.BlockDeviceInfo.Unknown |= 1;
|
||||||
|
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
||||||
|
Status = BlDeviceReadAtOffset(DeviceId,
|
||||||
|
CD_SECTOR_SIZE,
|
||||||
|
(FIRST_VD_SECTOR + 1) * CD_SECTOR_SIZE,
|
||||||
|
EtfsContext->MemoryBlock,
|
||||||
|
&BytesRead);
|
||||||
|
DeviceInformation.BlockDeviceInfo.Unknown = Unknown;
|
||||||
|
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
EfiPrintf(L" read failed\r\n");
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember that's where we last read */
|
||||||
|
EtfsContext->Offset = (FIRST_VD_SECTOR + 1) * CD_SECTOR_SIZE;
|
||||||
|
|
||||||
|
/* Check if it's EL TORITO! */
|
||||||
|
RtlInitString(&String, "EL TORITO SPECIFICATION");
|
||||||
|
CompareString.Buffer = (PCHAR)EtVd->SystemId;
|
||||||
|
CompareString.Length = 23;
|
||||||
|
CompareString.MaximumLength = 23;
|
||||||
|
if (!RtlEqualString(&CompareString, &String, TRUE))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check the version and boot indicator */
|
||||||
|
if ((EtVd->Version != 1) || (EtVd->BootIndicator))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if it has the CD0001 identifier */
|
||||||
|
RtlInitString(&String, ISO_VOL_ID);
|
||||||
|
CompareString.Buffer = (PCHAR)EtVd->StandardId;
|
||||||
|
CompareString.Length = 5;
|
||||||
|
CompareString.MaximumLength = 5;
|
||||||
|
if (!RtlEqualString(&CompareString, &String, TRUE))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Step two, we now want to read the ISO Volume Descriptor */
|
||||||
|
DeviceInformation.BlockDeviceInfo.Unknown |= 1u;
|
||||||
|
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
||||||
|
Status = BlDeviceReadAtOffset(DeviceId,
|
||||||
|
CD_SECTOR_SIZE,
|
||||||
|
FIRST_VD_SECTOR * CD_SECTOR_SIZE,
|
||||||
|
EtfsContext->MemoryBlock,
|
||||||
|
&BytesRead);
|
||||||
|
DeviceInformation.BlockDeviceInfo.Unknown = Unknown;
|
||||||
|
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Remember where we left off */
|
||||||
|
EtfsContext->Offset = FIRST_VD_SECTOR * CD_SECTOR_SIZE;
|
||||||
|
|
||||||
|
/* This should also say CD0001 */
|
||||||
|
CompareString.Buffer = (PCHAR)IsoVd->StandardId;
|
||||||
|
CompareString.Length = 5;
|
||||||
|
CompareString.MaximumLength = 5;
|
||||||
|
IsIso = RtlEqualString(&CompareString, &String, TRUE);
|
||||||
|
if (!IsIso)
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* And should be a version we support */
|
||||||
|
if ((IsoVd->Version != VERSION_1) || (IsoVd->DescType != VD_PRIMARY))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return back to the caller */
|
||||||
|
*VolumeDescriptor = IsoVd;
|
||||||
|
*VolumeIsIso = IsIso;
|
||||||
|
EfiPrintf(L"Recognized!!!\r\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID
|
||||||
|
EtfspGetDirectoryInfo (
|
||||||
|
_In_ PBL_ETFS_CONTEXT EtfsContext,
|
||||||
|
_In_ PRAW_DIR_REC DirEntry,
|
||||||
|
_Out_ PULONG FileOffset,
|
||||||
|
_Out_ PULONG FileSize,
|
||||||
|
_Out_opt_ PBOOLEAN IsDirectory
|
||||||
|
)
|
||||||
|
{
|
||||||
|
ULONG SectorOffset;
|
||||||
|
BOOLEAN IsDir;
|
||||||
|
|
||||||
|
*FileOffset = *(PULONG)DirEntry->FileLoc * EtfsContext->BlockSize;
|
||||||
|
*FileOffset += (DirEntry->XarLen * EtfsContext->BlockSize);
|
||||||
|
|
||||||
|
SectorOffset = ALIGN_DOWN_BY(*FileOffset, CD_SECTOR_SIZE);
|
||||||
|
|
||||||
|
*FileSize = *(PULONG)DirEntry->DataLen;
|
||||||
|
|
||||||
|
IsDir = DE_FILE_FLAGS(EtfsContext->IsIso, DirEntry) & ISO_ATTR_DIRECTORY;
|
||||||
|
if (IsDir)
|
||||||
|
{
|
||||||
|
*FileSize += ALIGN_UP_BY(SectorOffset, CD_SECTOR_SIZE) - SectorOffset;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsDirectory)
|
||||||
|
{
|
||||||
|
*IsDirectory = IsDir;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfspDeviceContextDestroy (
|
||||||
|
_In_ PBL_ETFS_CONTEXT EtfsContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (EtfsContext->MemoryBlock)
|
||||||
|
{
|
||||||
|
BlMmFreeHeap(EtfsContext->MemoryBlock);
|
||||||
|
}
|
||||||
|
BlMmFreeHeap(EtfsContext);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfspCreateContext (
|
||||||
|
_In_ ULONG DeviceId,
|
||||||
|
_Out_ PBL_ETFS_CONTEXT *EtfsContext
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PBL_ETFS_CONTEXT NewContext;
|
||||||
|
PVOID MemoryBlock;
|
||||||
|
NTSTATUS Status;
|
||||||
|
BOOLEAN IsIso;
|
||||||
|
PRAW_ISO_VD RawVd;
|
||||||
|
|
||||||
|
NewContext = (PBL_ETFS_CONTEXT)BlMmAllocateHeap(sizeof(*NewContext));
|
||||||
|
if (!NewContext)
|
||||||
|
{
|
||||||
|
return STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
RtlZeroMemory(NewContext, sizeof(*NewContext));
|
||||||
|
|
||||||
|
MemoryBlock = BlMmAllocateHeap(CD_SECTOR_SIZE);
|
||||||
|
NewContext->MemoryBlock = MemoryBlock;
|
||||||
|
if (!MemoryBlock)
|
||||||
|
{
|
||||||
|
Status = STATUS_NO_MEMORY;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = EtfspCheckEtfs(NewContext, DeviceId, &RawVd, &IsIso);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
EfiPrintf(L"Drive not EDFS. Checking for CDFS: %lx\r\n");
|
||||||
|
Status = EtfspCheckCdfs(NewContext, DeviceId, &RawVd, &IsIso);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
EfiPrintf(L"Drive not CDFS. Failing: %lx\r\n");
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
NewContext->IsIso = IsIso;
|
||||||
|
NewContext->BlockSize = RVD_LB_SIZE(RawVd, IsIso);
|
||||||
|
NewContext->VolumeSize = RVD_VOL_SIZE(RawVd, IsIso);
|
||||||
|
|
||||||
|
EtfspGetDirectoryInfo(NewContext,
|
||||||
|
(PRAW_DIR_REC)RVD_ROOT_DE(RawVd, IsIso),
|
||||||
|
&NewContext->RootDirOffset,
|
||||||
|
&NewContext->RootDirSize,
|
||||||
|
0);
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
EtfspDeviceContextDestroy(NewContext);
|
||||||
|
NewContext = NULL;
|
||||||
|
|
||||||
|
*EtfsContext = NewContext;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfspDeviceTableDestroyEntry (
|
||||||
|
_In_ PBL_ETFS_CONTEXT EtfsContext,
|
||||||
|
_In_ ULONG Index
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EtfspDeviceContextDestroy(EtfsContext);
|
||||||
|
EtfsDeviceTable[Index] = NULL;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsMount (
|
||||||
|
_In_ ULONG DeviceId,
|
||||||
|
_In_ ULONG Unknown,
|
||||||
|
_Out_ PBL_FILE_ENTRY* FileEntry
|
||||||
|
)
|
||||||
|
{
|
||||||
|
PBL_ETFS_CONTEXT EtfsContext = NULL;
|
||||||
|
PBL_FILE_ENTRY RootEntry;
|
||||||
|
NTSTATUS Status;
|
||||||
|
PBL_ETFS_FILE EtfsFile;
|
||||||
|
|
||||||
|
EfiPrintf(L"Trying to mount as ETFS...\r\n");
|
||||||
|
|
||||||
|
Status = EtfspCreateContext(DeviceId, &EtfsContext);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
EfiPrintf(L"ETFS context failed: %lx\r\n");
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = BlTblSetEntry(&EtfsDeviceTable,
|
||||||
|
&EtfsDeviceTableEntries,
|
||||||
|
EtfsContext,
|
||||||
|
&DeviceId,
|
||||||
|
TblDoNotPurgeEntry);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
EtfspDeviceContextDestroy(EtfsContext);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
RootEntry = BlMmAllocateHeap(sizeof(*RootEntry));
|
||||||
|
if (!RootEntry)
|
||||||
|
{
|
||||||
|
Status = STATUS_NO_MEMORY;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlZeroMemory(RootEntry, sizeof(*RootEntry));
|
||||||
|
|
||||||
|
RootEntry->FilePath = BlMmAllocateHeap(4);
|
||||||
|
if (!RootEntry->FilePath)
|
||||||
|
{
|
||||||
|
Status = STATUS_NO_MEMORY;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
wcsncpy(RootEntry->FilePath, L"\\", 1);
|
||||||
|
|
||||||
|
RootEntry->DeviceId = DeviceId;
|
||||||
|
RtlCopyMemory(&RootEntry->Callbacks,
|
||||||
|
&EtfsFunctionTable,
|
||||||
|
sizeof(RootEntry->Callbacks));
|
||||||
|
|
||||||
|
EtfsFile = (PBL_ETFS_FILE)BlMmAllocateHeap(sizeof(*EtfsFile));
|
||||||
|
if (!EtfsFile)
|
||||||
|
{
|
||||||
|
Status = STATUS_NO_MEMORY;
|
||||||
|
goto Quickie;
|
||||||
|
}
|
||||||
|
|
||||||
|
RootEntry->Flags |= 0x10000;
|
||||||
|
|
||||||
|
RtlZeroMemory(EtfsFile, sizeof(*EtfsFile));
|
||||||
|
RootEntry->FsSpecificData = EtfsFile;
|
||||||
|
EtfsFile->DeviceId = DeviceId;
|
||||||
|
EtfsFile->Flags |= 1;
|
||||||
|
EtfsFile->Offset = EtfsContext->RootDirOffset;
|
||||||
|
EtfsFile->Unknown = 0;
|
||||||
|
EtfsFile->Size = EtfsContext->RootDirSize;
|
||||||
|
EtfsFile->FsName = L"cdfs";
|
||||||
|
*FileEntry = RootEntry;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
Quickie:
|
||||||
|
if (RootEntry->FilePath)
|
||||||
|
{
|
||||||
|
BlMmFreeHeap(RootEntry->FilePath);
|
||||||
|
}
|
||||||
|
if (RootEntry->FsSpecificData)
|
||||||
|
{
|
||||||
|
BlMmFreeHeap(RootEntry->FsSpecificData);
|
||||||
|
}
|
||||||
|
if (RootEntry)
|
||||||
|
{
|
||||||
|
BlMmFreeHeap(RootEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
EtfspDeviceTableDestroyEntry(EtfsContext, DeviceId);
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
EtfsInitialize (
|
||||||
|
VOID
|
||||||
|
)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* Allocate the device table with 2 entries*/
|
||||||
|
EtfsDeviceTableEntries = 2;
|
||||||
|
EtfsDeviceTable = BlMmAllocateHeap(sizeof(PBL_FILE_ENTRY) *
|
||||||
|
EtfsDeviceTableEntries);
|
||||||
|
if (EtfsDeviceTable)
|
||||||
|
{
|
||||||
|
/* Zero it out */
|
||||||
|
RtlZeroMemory(EtfsDeviceTable,
|
||||||
|
sizeof(PBL_FILE_ENTRY) * EtfsDeviceTableEntries);
|
||||||
|
Status = STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* No memory, fail */
|
||||||
|
Status = STATUS_NO_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return back to caller */
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
|
@ -43,7 +43,6 @@ FatMount (
|
||||||
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
BlDeviceSetInformation(DeviceId, &DeviceInformation);
|
||||||
|
|
||||||
/* Read the boot sector */
|
/* Read the boot sector */
|
||||||
EfiPrintf(L"Reading fat boot sector...\r\n");
|
|
||||||
Status = BlDeviceReadAtOffset(DeviceId,
|
Status = BlDeviceReadAtOffset(DeviceId,
|
||||||
sizeof(FatBootSector),
|
sizeof(FatBootSector),
|
||||||
0,
|
0,
|
||||||
|
@ -61,7 +60,11 @@ FatMount (
|
||||||
|
|
||||||
FatUnpackBios(&BiosBlock, &FatBootSector.PackedBpb);
|
FatUnpackBios(&BiosBlock, &FatBootSector.PackedBpb);
|
||||||
|
|
||||||
EfiPrintf(L"Drive read\r\n");
|
/* For now, quickly fail if this isn't FAT */
|
||||||
|
if (FatBootSector.Jump[0] != 0xE9)
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
EfiPrintf(L"Jump: %lx Bytes Per Sector: %d Sectors Per Cluster: %d Reserved: %d Fats: %d Sectors: %d Large Sectors: %d Media: %lx RootEntries: %d\r\n",
|
EfiPrintf(L"Jump: %lx Bytes Per Sector: %d Sectors Per Cluster: %d Reserved: %d Fats: %d Sectors: %d Large Sectors: %d Media: %lx RootEntries: %d\r\n",
|
||||||
FatBootSector.Jump[0],
|
FatBootSector.Jump[0],
|
||||||
|
@ -74,7 +77,6 @@ FatMount (
|
||||||
BiosBlock.Media,
|
BiosBlock.Media,
|
||||||
BiosBlock.RootEntries);
|
BiosBlock.RootEntries);
|
||||||
|
|
||||||
EfiStall(3000000);
|
|
||||||
return STATUS_NOT_IMPLEMENTED;
|
return STATUS_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,14 @@ BL_FILE_SYSTEM_REGISTRATION_TABLE FatRegisterFunctionTable =
|
||||||
FatMount,
|
FatMount,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
BL_FILE_SYSTEM_REGISTRATION_TABLE EtfsRegisterFunctionTable =
|
||||||
|
{
|
||||||
|
EtfsInitialize,
|
||||||
|
NULL,
|
||||||
|
EtfsMount,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
extern ULONG DmTableEntries;
|
extern ULONG DmTableEntries;
|
||||||
extern PVOID* DmDeviceTable;
|
extern PVOID* DmDeviceTable;
|
||||||
|
@ -106,7 +114,7 @@ FileTableCompareWithSubsetAttributes (
|
||||||
PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry;
|
PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry;
|
||||||
ULONG DeviceId = *(PULONG)Argument1;
|
ULONG DeviceId = *(PULONG)Argument1;
|
||||||
PWCHAR FilePath = (PWCHAR)Argument2;
|
PWCHAR FilePath = (PWCHAR)Argument2;
|
||||||
ULONG OpenFlags = *(PULONG)Argument3;
|
ULONG Flags = *(PULONG)Argument3;
|
||||||
ULONG Unknown = *(PULONG)Argument4;
|
ULONG Unknown = *(PULONG)Argument4;
|
||||||
BOOLEAN Found;
|
BOOLEAN Found;
|
||||||
|
|
||||||
|
@ -114,9 +122,9 @@ FileTableCompareWithSubsetAttributes (
|
||||||
|
|
||||||
if ((FileEntry->DeviceId == DeviceId) && !(_wcsicmp(FileEntry->FilePath, FilePath)) && (FileEntry->Unknown == Unknown))
|
if ((FileEntry->DeviceId == DeviceId) && !(_wcsicmp(FileEntry->FilePath, FilePath)) && (FileEntry->Unknown == Unknown))
|
||||||
{
|
{
|
||||||
if ((!(OpenFlags & 1) || (FileEntry->Flags & 2)) && (!(OpenFlags & 2) || (FileEntry->Flags & 4)))
|
if ((!(Flags & 1) || (FileEntry->Flags & 2)) && (!(Flags & 2) || (FileEntry->Flags & 4)))
|
||||||
{
|
{
|
||||||
if ((!(OpenFlags & 4) || (FileEntry->Flags & 0x10000)) && ((OpenFlags & 4) || !(FileEntry->Flags & 0x10000)))
|
if ((!(Flags & 4) || (FileEntry->Flags & 0x10000)) && ((Flags & 4) || !(FileEntry->Flags & 0x10000)))
|
||||||
{
|
{
|
||||||
Found = TRUE;
|
Found = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -137,7 +145,7 @@ FileTableCompareWithSameAttributes (
|
||||||
PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry;
|
PBL_FILE_ENTRY FileEntry = (PBL_FILE_ENTRY)Entry;
|
||||||
ULONG DeviceId = *(PULONG)Argument1;
|
ULONG DeviceId = *(PULONG)Argument1;
|
||||||
PWCHAR FilePath = (PWCHAR)Argument2;
|
PWCHAR FilePath = (PWCHAR)Argument2;
|
||||||
ULONG OpenFlags = *(PULONG)Argument3;
|
ULONG Flags = *(PULONG)Argument3;
|
||||||
ULONG Unknown = *(PULONG)Argument4;
|
ULONG Unknown = *(PULONG)Argument4;
|
||||||
BOOLEAN Found;
|
BOOLEAN Found;
|
||||||
|
|
||||||
|
@ -145,9 +153,9 @@ FileTableCompareWithSameAttributes (
|
||||||
|
|
||||||
if ((FileEntry->DeviceId == DeviceId) && !(_wcsicmp(FileEntry->FilePath, FilePath)) && (FileEntry->Unknown == Unknown))
|
if ((FileEntry->DeviceId == DeviceId) && !(_wcsicmp(FileEntry->FilePath, FilePath)) && (FileEntry->Unknown == Unknown))
|
||||||
{
|
{
|
||||||
if ((!(OpenFlags & 1) || (FileEntry->Flags & 2)) && ((OpenFlags & 1) || !(FileEntry->Flags & 2)) && (!(OpenFlags & 2) || (FileEntry->Flags & 4)) && ((OpenFlags & 2) || !(FileEntry->Flags & 4)))
|
if ((!(Flags & 1) || (FileEntry->Flags & 2)) && ((Flags & 1) || !(FileEntry->Flags & 2)) && (!(Flags & 2) || (FileEntry->Flags & 4)) && ((Flags & 2) || !(FileEntry->Flags & 4)))
|
||||||
{
|
{
|
||||||
if ((!(OpenFlags & 4) || (FileEntry->Flags & 0x10000)) && ((OpenFlags & 4) || !(FileEntry->Flags & 0x10000)))
|
if ((!(Flags & 4) || (FileEntry->Flags & 0x10000)) && ((Flags & 4) || !(FileEntry->Flags & 0x10000)))
|
||||||
{
|
{
|
||||||
Found = TRUE;
|
Found = TRUE;
|
||||||
}
|
}
|
||||||
|
@ -240,7 +248,7 @@ NTSTATUS
|
||||||
FileIoOpen (
|
FileIoOpen (
|
||||||
_In_ ULONG DeviceId,
|
_In_ ULONG DeviceId,
|
||||||
_In_ PWCHAR FileName,
|
_In_ PWCHAR FileName,
|
||||||
_In_ ULONG OpenFlags,
|
_In_ ULONG Flags,
|
||||||
_In_ ULONG Unknown,
|
_In_ ULONG Unknown,
|
||||||
_In_ PBL_TBL_LOOKUP_ROUTINE CompareRoutine,
|
_In_ PBL_TBL_LOOKUP_ROUTINE CompareRoutine,
|
||||||
_Out_ PBL_FILE_ENTRY *ReturnFileEntry
|
_Out_ PBL_FILE_ENTRY *ReturnFileEntry
|
||||||
|
@ -256,7 +264,7 @@ FileIoOpen (
|
||||||
|
|
||||||
ParentDirectoryEntry = NULL;
|
ParentDirectoryEntry = NULL;
|
||||||
FileNameCopy = NULL;
|
FileNameCopy = NULL;
|
||||||
OpenFlags |= 1;
|
Flags |= 1;
|
||||||
ParentFileName = NULL;
|
ParentFileName = NULL;
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
@ -271,13 +279,13 @@ FileIoOpen (
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((OpenFlags & 1) && (!(DeviceEntry->Flags & 1) || !(DeviceEntry->Flags & 2)))
|
if ((Flags & 1) && (!(DeviceEntry->Flags & 1) || !(DeviceEntry->Flags & 2)))
|
||||||
{
|
{
|
||||||
EfiPrintf(L"Access denied\r\n");
|
EfiPrintf(L"Access denied\r\n");
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((OpenFlags & 2) && (!(DeviceEntry->Flags & 1) || !(DeviceEntry->Flags & 4)))
|
if ((Flags & 2) && (!(DeviceEntry->Flags & 1) || !(DeviceEntry->Flags & 4)))
|
||||||
{
|
{
|
||||||
EfiPrintf(L"Access denied2\r\n");
|
EfiPrintf(L"Access denied2\r\n");
|
||||||
return STATUS_ACCESS_DENIED;
|
return STATUS_ACCESS_DENIED;
|
||||||
|
@ -289,7 +297,7 @@ FileIoOpen (
|
||||||
CompareRoutine,
|
CompareRoutine,
|
||||||
&DeviceId,
|
&DeviceId,
|
||||||
FileName,
|
FileName,
|
||||||
&OpenFlags,
|
&Flags,
|
||||||
&Unknown);
|
&Unknown);
|
||||||
if (FileEntry)
|
if (FileEntry)
|
||||||
{
|
{
|
||||||
|
@ -326,7 +334,7 @@ FileIoOpen (
|
||||||
|
|
||||||
Status = ParentDirectoryEntry->Callbacks.Open(ParentDirectoryEntry,
|
Status = ParentDirectoryEntry->Callbacks.Open(ParentDirectoryEntry,
|
||||||
FileNameCopy,
|
FileNameCopy,
|
||||||
OpenFlags,
|
Flags,
|
||||||
&FileEntry);
|
&FileEntry);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -350,7 +358,7 @@ FileIoOpen (
|
||||||
NextEntry = NextEntry->Flink;
|
NextEntry = NextEntry->Flink;
|
||||||
}
|
}
|
||||||
|
|
||||||
FileNameCopy = 0;
|
FileNameCopy = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
@ -361,12 +369,12 @@ FileIoOpen (
|
||||||
|
|
||||||
FileEntry->Unknown = Unknown;
|
FileEntry->Unknown = Unknown;
|
||||||
|
|
||||||
if (OpenFlags & 1)
|
if (Flags & 1)
|
||||||
{
|
{
|
||||||
FileEntry->Flags |= 2u;
|
FileEntry->Flags |= 2u;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OpenFlags & 2)
|
if (Flags & 2)
|
||||||
{
|
{
|
||||||
FileEntry->Flags |= 4u;
|
FileEntry->Flags |= 4u;
|
||||||
}
|
}
|
||||||
|
@ -385,6 +393,7 @@ FileIoOpen (
|
||||||
++DeviceEntry->ReferenceCount;
|
++DeviceEntry->ReferenceCount;
|
||||||
Status = STATUS_SUCCESS;
|
Status = STATUS_SUCCESS;
|
||||||
|
|
||||||
|
EfiPrintf(L"File %s opened with ID: %lx\r\n", FileEntry->FilePath, FileId);
|
||||||
FileEntry->FileId = FileId;
|
FileEntry->FileId = FileId;
|
||||||
|
|
||||||
FileOpened:
|
FileOpened:
|
||||||
|
@ -396,7 +405,7 @@ FileOpened:
|
||||||
|
|
||||||
FileEntry->Flags |= 1;
|
FileEntry->Flags |= 1;
|
||||||
|
|
||||||
if (OpenFlags & 0x10)
|
if (Flags & 0x10)
|
||||||
{
|
{
|
||||||
FileEntry->Flags |= 0x10;
|
FileEntry->Flags |= 0x10;
|
||||||
}
|
}
|
||||||
|
@ -426,7 +435,7 @@ NTSTATUS
|
||||||
BlFileOpen (
|
BlFileOpen (
|
||||||
_In_ ULONG DeviceId,
|
_In_ ULONG DeviceId,
|
||||||
_In_ PWCHAR FileName,
|
_In_ PWCHAR FileName,
|
||||||
_In_ ULONG OpenFlags,
|
_In_ ULONG Flags,
|
||||||
_Out_ PULONG FileId
|
_Out_ PULONG FileId
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
@ -437,7 +446,7 @@ BlFileOpen (
|
||||||
if (!(FileName) ||
|
if (!(FileName) ||
|
||||||
(*FileName != OBJ_NAME_PATH_SEPARATOR) ||
|
(*FileName != OBJ_NAME_PATH_SEPARATOR) ||
|
||||||
!(FileId) ||
|
!(FileId) ||
|
||||||
!(OpenFlags & 3))
|
!(Flags & 3))
|
||||||
{
|
{
|
||||||
EfiPrintf(L"Invalid file options\r\n");
|
EfiPrintf(L"Invalid file options\r\n");
|
||||||
return STATUS_INVALID_PARAMETER;
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
@ -460,7 +469,7 @@ BlFileOpen (
|
||||||
|
|
||||||
Status = FileIoOpen(DeviceId,
|
Status = FileIoOpen(DeviceId,
|
||||||
FileName,
|
FileName,
|
||||||
OpenFlags,
|
Flags,
|
||||||
0,
|
0,
|
||||||
FileTableCompareWithSameAttributes,
|
FileTableCompareWithSameAttributes,
|
||||||
&FileEntry);
|
&FileEntry);
|
||||||
|
@ -597,7 +606,7 @@ BlpFileInitialize (
|
||||||
UdfsRegisterFunctionTable.Purge,
|
UdfsRegisterFunctionTable.Purge,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* Initialize El-Torito CDFS */
|
/* Initialize El-Torito CDFS */
|
||||||
|
@ -607,7 +616,6 @@ BlpFileInitialize (
|
||||||
EtfsRegisterFunctionTable.Purge,
|
EtfsRegisterFunctionTable.Purge,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Destroy the file manager if any of the file systems didn't initialize */
|
/* Destroy the file manager if any of the file systems didn't initialize */
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
|
|
Loading…
Reference in a new issue