#define PARTITION_MAGIC 0xaa55
+#define EFI_PMBR_OSTYPE_EFI 0xEE
+
#include <pshpack1.h>
typedef struct _REG_DISK_MOUNT_INFO
}
}
+VOID
+NTAPI
+FstubFixupEfiPartition(IN PPARTITION_DESCRIPTOR PartitionDescriptor,
+ IN ULONGLONG MaxOffset)
+{
+ ULONG PartitionLength;
+ PAGED_CODE();
+
+ /* Compute partition length (according to MBR entry) */
+ PartitionLength = PartitionDescriptor->StartingSectorLsb0 + PartitionDescriptor->PartitionLengthLsb0;
+ /* In case the partition length goes beyond disk size... */
+ if (PartitionLength > MaxOffset)
+ {
+ /* Resize partition to its maximum real length */
+ PartitionDescriptor->PartitionLengthLsb0 = MaxOffset - PartitionDescriptor->StartingSectorLsb0;
+ }
+}
+
NTSTATUS
FASTCALL
xHalIoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject,
MaxOffset, MaxSector);
/* Allocate our buffer */
- Buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, TAG_FILE_SYSTEM);
+ Buffer = ExAllocatePoolWithTag(NonPagedPool, InputSize, TAG_FILE_SYSTEM);
if (!Buffer)
{
/* Fail, free the input buffer */
PartitionDescriptor = (PPARTITION_DESCRIPTOR)
&(((PUSHORT)Buffer)[PARTITION_TABLE_OFFSET]);
- /* Get the partition type */
- PartitionType = PartitionDescriptor->PartitionType;
-
/* Start looping partitions */
j++;
DPRINT("FSTUB: Partition Table %d:\n", j);
GET_STARTING_SECTOR(PartitionDescriptor),
GET_PARTITION_LENGTH(PartitionDescriptor));
+ /* Check whether we're facing a protective MBR */
+ if (PartitionType == EFI_PMBR_OSTYPE_EFI)
+ {
+ /* Partition length might be bigger than disk size */
+ FstubFixupEfiPartition(PartitionDescriptor,
+ MaxOffset);
+ }
+
/* Make sure that the partition is valid, unless it's the first */
if (!(HalpIsValidPartitionEntry(PartitionDescriptor,
MaxOffset,
for (Entry = 1; Entry <= 4; Entry++, PartitionDescriptor++)
{
/* Check if this is a container partition, since we skipped them */
- if (IsContainerPartition(PartitionType))
+ if (IsContainerPartition(PartitionDescriptor->PartitionType))
{
/* Get its offset */
Offset.QuadPart = VolumeOffset.QuadPart +