/* * COPYRIGHT: See COPYING.ARM in the top level directory * PROJECT: ReactOS UEFI Boot Library * FILE: boot/environ/lib/io/fat.c * PURPOSE: Boot Library FAT File System Management Routines * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org) */ /* INCLUDES ******************************************************************/ #include #include /* DATA VARIABLES ************************************************************/ PVOID* FatDeviceTable; ULONG FatDeviceTableEntries; PWCHAR FatpLongFileName; /* FUNCTIONS *****************************************************************/ NTSTATUS FatMount ( _In_ ULONG DeviceId, _In_ ULONG Unknown, _Out_ PBL_FILE_ENTRY* FileEntry ) { BL_DEVICE_INFORMATION DeviceInformation; ULONG UnknownFlag; NTSTATUS Status; PACKED_BOOT_SECTOR FatBootSector; BIOS_PARAMETER_BLOCK BiosBlock; /* Capture thing */ BlDeviceGetInformation(DeviceId, &DeviceInformation); UnknownFlag = DeviceInformation.BlockDeviceInfo.Unknown; /* Set thing to 1 */ DeviceInformation.BlockDeviceInfo.Unknown |= 1; BlDeviceSetInformation(DeviceId, &DeviceInformation); /* Read the boot sector */ Status = BlDeviceReadAtOffset(DeviceId, sizeof(FatBootSector), 0, &FatBootSector, NULL); /* Restore thing back */ DeviceInformation.BlockDeviceInfo.Unknown = UnknownFlag; BlDeviceSetInformation(DeviceId, &DeviceInformation); if (!NT_SUCCESS(Status)) { EfiPrintf(L"Failed reading drive: %lx\r\n", Status); return Status; } FatUnpackBios(&BiosBlock, &FatBootSector.PackedBpb); /* 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", FatBootSector.Jump[0], BiosBlock.BytesPerSector, BiosBlock.SectorsPerCluster, BiosBlock.ReservedSectors, BiosBlock.Fats, BiosBlock.Sectors, BiosBlock.LargeSectors, BiosBlock.Media, BiosBlock.RootEntries); return STATUS_NOT_IMPLEMENTED; } NTSTATUS FatInitialize ( VOID ) { NTSTATUS Status; /* Allocate the device table with 2 entries*/ FatDeviceTableEntries = 2; FatDeviceTable = BlMmAllocateHeap(sizeof(PBL_FILE_ENTRY) * FatDeviceTableEntries); if (FatDeviceTable) { /* Zero it out */ RtlZeroMemory(FatDeviceTable, sizeof(PBL_FILE_ENTRY) * FatDeviceTableEntries); /* Allocate a 512 byte buffer for long file name conversion */ FatpLongFileName = BlMmAllocateHeap(512); Status = FatpLongFileName != NULL ? STATUS_SUCCESS : STATUS_NO_MEMORY; } else { /* No memory, fail */ Status = STATUS_NO_MEMORY; } /* Return back to caller */ return Status; }