mirror of
https://github.com/reactos/reactos.git
synced 2024-09-30 14:37:45 +00:00
Replaced linux partition type constants.
svn path=/trunk/; revision=2993
This commit is contained in:
parent
f07010f0fe
commit
9238b6279b
|
@ -16,7 +16,7 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
/* $Id: fsctl.c,v 1.5 2002/05/28 09:25:09 ekohl Exp $
|
/* $Id: fsctl.c,v 1.6 2002/05/29 21:41:41 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -93,12 +93,12 @@ VfatHasFileSystem(PDEVICE_OBJECT DeviceToMount,
|
||||||
DbgPrint("RecognizedPartition %u\n", PartitionInfo.RecognizedPartition);
|
DbgPrint("RecognizedPartition %u\n", PartitionInfo.RecognizedPartition);
|
||||||
DbgPrint("RewritePartition %u\n", PartitionInfo.RewritePartition);
|
DbgPrint("RewritePartition %u\n", PartitionInfo.RewritePartition);
|
||||||
#endif
|
#endif
|
||||||
if (PartitionInfo.PartitionType == PTDOS3xPrimary ||
|
if (PartitionInfo.PartitionType == PARTITION_FAT_12 ||
|
||||||
PartitionInfo.PartitionType == PTOLDDOS16Bit ||
|
PartitionInfo.PartitionType == PARTITION_FAT_16 ||
|
||||||
PartitionInfo.PartitionType == PTDos5xPrimary ||
|
PartitionInfo.PartitionType == PARTITION_HUGE ||
|
||||||
PartitionInfo.PartitionType == PTWin95FAT32 ||
|
PartitionInfo.PartitionType == PARTITION_FAT32 ||
|
||||||
PartitionInfo.PartitionType == PTWin95FAT32LBA ||
|
PartitionInfo.PartitionType == PARTITION_FAT32_XINT13 ||
|
||||||
PartitionInfo.PartitionType == PTWin95FAT16LBA)
|
PartitionInfo.PartitionType == PARTITION_XINT13)
|
||||||
{
|
{
|
||||||
*RecognizedFS = TRUE;
|
*RecognizedFS = TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/* $Id: xhaldrv.c,v 1.22 2002/05/26 20:18:18 ekohl Exp $
|
/* $Id: xhaldrv.c,v 1.23 2002/05/29 21:40:39 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -28,16 +28,6 @@
|
||||||
#define PARTITION_TBL_SIZE 4
|
#define PARTITION_TBL_SIZE 4
|
||||||
|
|
||||||
|
|
||||||
#define IsUsablePartition(P) \
|
|
||||||
((P) == PTDOS3xPrimary || \
|
|
||||||
(P) == PTOLDDOS16Bit || \
|
|
||||||
(P) == PTDos5xPrimary || \
|
|
||||||
(P) == PTIfs || \
|
|
||||||
(P) == PTWin95FAT32 || \
|
|
||||||
(P) == PTWin95FAT32LBA || \
|
|
||||||
(P) == PTWin95FAT16LBA)
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct _PARTITION
|
typedef struct _PARTITION
|
||||||
{
|
{
|
||||||
unsigned char BootFlags;
|
unsigned char BootFlags;
|
||||||
|
@ -54,8 +44,8 @@ typedef struct _PARTITION
|
||||||
|
|
||||||
typedef struct _PARTITION_TABLE
|
typedef struct _PARTITION_TABLE
|
||||||
{
|
{
|
||||||
PARTITION Partition[PARTITION_TBL_SIZE];
|
PARTITION Partition[PARTITION_TBL_SIZE];
|
||||||
unsigned short Magic;
|
unsigned short Magic;
|
||||||
} PARTITION_TABLE, *PPARTITION_TABLE;
|
} PARTITION_TABLE, *PPARTITION_TABLE;
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
@ -175,75 +165,75 @@ xHalExamineMBR(IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN ULONG MBRTypeIdentifier,
|
IN ULONG MBRTypeIdentifier,
|
||||||
OUT PVOID *Buffer)
|
OUT PVOID *Buffer)
|
||||||
{
|
{
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
IO_STATUS_BLOCK StatusBlock;
|
IO_STATUS_BLOCK StatusBlock;
|
||||||
LARGE_INTEGER Offset;
|
LARGE_INTEGER Offset;
|
||||||
PUCHAR LocalBuffer;
|
PUCHAR LocalBuffer;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
DPRINT("xHalExamineMBR()\n");
|
DPRINT("xHalExamineMBR()\n");
|
||||||
*Buffer = NULL;
|
*Buffer = NULL;
|
||||||
|
|
||||||
if (SectorSize < 512)
|
if (SectorSize < 512)
|
||||||
SectorSize = 512;
|
SectorSize = 512;
|
||||||
if (SectorSize > 4096)
|
if (SectorSize > 4096)
|
||||||
SectorSize = 4096;
|
SectorSize = 4096;
|
||||||
|
|
||||||
LocalBuffer = (PUCHAR)ExAllocatePool(PagedPool,
|
LocalBuffer = (PUCHAR)ExAllocatePool(PagedPool,
|
||||||
SectorSize);
|
SectorSize);
|
||||||
if (LocalBuffer == NULL)
|
if (LocalBuffer == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
KeInitializeEvent(&Event,
|
KeInitializeEvent(&Event,
|
||||||
NotificationEvent,
|
NotificationEvent,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
Offset.QuadPart = 0;
|
Offset.QuadPart = 0;
|
||||||
|
|
||||||
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
||||||
DeviceObject,
|
DeviceObject,
|
||||||
LocalBuffer,
|
LocalBuffer,
|
||||||
SectorSize,
|
SectorSize,
|
||||||
&Offset,
|
&Offset,
|
||||||
&Event,
|
&Event,
|
||||||
&StatusBlock);
|
&StatusBlock);
|
||||||
|
|
||||||
Status = IoCallDriver(DeviceObject,
|
Status = IoCallDriver(DeviceObject,
|
||||||
Irp);
|
Irp);
|
||||||
if (Status == STATUS_PENDING)
|
if (Status == STATUS_PENDING)
|
||||||
{
|
{
|
||||||
KeWaitForSingleObject(&Event,
|
KeWaitForSingleObject(&Event,
|
||||||
Executive,
|
Executive,
|
||||||
KernelMode,
|
KernelMode,
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
Status = StatusBlock.Status;
|
Status = StatusBlock.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("xHalExamineMBR failed (Status = 0x%08lx)\n",
|
DPRINT("xHalExamineMBR failed (Status = 0x%08lx)\n",
|
||||||
Status);
|
Status);
|
||||||
ExFreePool(LocalBuffer);
|
ExFreePool(LocalBuffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LocalBuffer[0x1FE] != 0x55 || LocalBuffer[0x1FF] != 0xAA)
|
if (LocalBuffer[0x1FE] != 0x55 || LocalBuffer[0x1FF] != 0xAA)
|
||||||
{
|
{
|
||||||
DPRINT("xHalExamineMBR: invalid MBR signature\n");
|
DPRINT("xHalExamineMBR: invalid MBR signature\n");
|
||||||
ExFreePool(LocalBuffer);
|
ExFreePool(LocalBuffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (LocalBuffer[0x1C2] != MBRTypeIdentifier)
|
if (LocalBuffer[0x1C2] != MBRTypeIdentifier)
|
||||||
{
|
{
|
||||||
DPRINT("xHalExamineMBR: invalid MBRTypeIdentifier\n");
|
DPRINT("xHalExamineMBR: invalid MBRTypeIdentifier\n");
|
||||||
ExFreePool(LocalBuffer);
|
ExFreePool(LocalBuffer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Buffer = (PVOID)LocalBuffer;
|
*Buffer = (PVOID)LocalBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -441,7 +431,7 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
for (j = 0; j < LayoutArray[0]->PartitionCount; j++)
|
for (j = 0; j < LayoutArray[0]->PartitionCount; j++)
|
||||||
{
|
{
|
||||||
if ((LayoutArray[0]->PartitionEntry[j].BootIndicator == TRUE) &&
|
if ((LayoutArray[0]->PartitionEntry[j].BootIndicator == TRUE) &&
|
||||||
IsUsablePartition(LayoutArray[0]->PartitionEntry[j].PartitionType))
|
IsRecognizedPartition(LayoutArray[0]->PartitionEntry[j].PartitionType))
|
||||||
{
|
{
|
||||||
swprintf(Buffer2,
|
swprintf(Buffer2,
|
||||||
L"\\Device\\Harddisk0\\Partition%d",
|
L"\\Device\\Harddisk0\\Partition%d",
|
||||||
|
@ -468,7 +458,7 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
if ((i == 0) && (LayoutArray[i]->PartitionEntry[j].BootIndicator == TRUE))
|
if ((i == 0) && (LayoutArray[i]->PartitionEntry[j].BootIndicator == TRUE))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (IsUsablePartition(LayoutArray[i]->PartitionEntry[j].PartitionType))
|
if (IsRecognizedPartition(LayoutArray[i]->PartitionEntry[j].PartitionType))
|
||||||
{
|
{
|
||||||
swprintf(Buffer2,
|
swprintf(Buffer2,
|
||||||
L"\\Device\\Harddisk%d\\Partition%d",
|
L"\\Device\\Harddisk%d\\Partition%d",
|
||||||
|
@ -496,7 +486,7 @@ xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
|
||||||
/* Search for extended partitions */
|
/* Search for extended partitions */
|
||||||
for (j = PARTITION_TBL_SIZE; j < LayoutArray[i]->PartitionCount; j++)
|
for (j = PARTITION_TBL_SIZE; j < LayoutArray[i]->PartitionCount; j++)
|
||||||
{
|
{
|
||||||
if (IsUsablePartition(LayoutArray[i]->PartitionEntry[j].PartitionType) &&
|
if (IsRecognizedPartition(LayoutArray[i]->PartitionEntry[j].PartitionType) &&
|
||||||
(LayoutArray[i]->PartitionEntry[j].PartitionNumber != 0))
|
(LayoutArray[i]->PartitionEntry[j].PartitionNumber != 0))
|
||||||
{
|
{
|
||||||
swprintf(Buffer2,
|
swprintf(Buffer2,
|
||||||
|
@ -596,211 +586,202 @@ xHalIoReadPartitionTable(PDEVICE_OBJECT DeviceObject,
|
||||||
BOOLEAN ReturnRecognizedPartitions,
|
BOOLEAN ReturnRecognizedPartitions,
|
||||||
PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
|
PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
|
||||||
{
|
{
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
IO_STATUS_BLOCK StatusBlock;
|
IO_STATUS_BLOCK StatusBlock;
|
||||||
ULARGE_INTEGER PartitionOffset;
|
ULARGE_INTEGER PartitionOffset;
|
||||||
ULARGE_INTEGER nextPartitionOffset;
|
ULARGE_INTEGER nextPartitionOffset;
|
||||||
ULARGE_INTEGER containerOffset;
|
ULARGE_INTEGER containerOffset;
|
||||||
PUCHAR SectorBuffer;
|
PUCHAR SectorBuffer;
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PPARTITION_TABLE PartitionTable;
|
PPARTITION_TABLE PartitionTable;
|
||||||
PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
|
PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
ULONG Count = 0;
|
ULONG Count = 0;
|
||||||
ULONG Number = 1;
|
ULONG Number = 1;
|
||||||
BOOLEAN ExtendedFound = FALSE;
|
BOOLEAN ExtendedFound = FALSE;
|
||||||
|
|
||||||
DPRINT("xHalIoReadPartitionTable(%p %lu %x %p)\n",
|
DPRINT("xHalIoReadPartitionTable(%p %lu %x %p)\n",
|
||||||
DeviceObject,
|
DeviceObject,
|
||||||
SectorSize,
|
SectorSize,
|
||||||
ReturnRecognizedPartitions,
|
ReturnRecognizedPartitions,
|
||||||
PartitionBuffer);
|
PartitionBuffer);
|
||||||
|
|
||||||
*PartitionBuffer = NULL;
|
*PartitionBuffer = NULL;
|
||||||
|
|
||||||
SectorBuffer = (PUCHAR)ExAllocatePool(PagedPool,
|
SectorBuffer = (PUCHAR)ExAllocatePool(PagedPool,
|
||||||
SectorSize);
|
SectorSize);
|
||||||
if (SectorBuffer == NULL)
|
if (SectorBuffer == NULL)
|
||||||
{
|
{
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return(STATUS_INSUFFICIENT_RESOURCES);
|
||||||
}
|
}
|
||||||
|
|
||||||
LayoutBuffer = (PDRIVE_LAYOUT_INFORMATION)ExAllocatePool(NonPagedPool,
|
LayoutBuffer = (PDRIVE_LAYOUT_INFORMATION)ExAllocatePool(NonPagedPool,
|
||||||
0x1000);
|
0x1000);
|
||||||
if (LayoutBuffer == NULL)
|
if (LayoutBuffer == NULL)
|
||||||
{
|
{
|
||||||
ExFreePool (SectorBuffer);
|
ExFreePool(SectorBuffer);
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return(STATUS_INSUFFICIENT_RESOURCES);
|
||||||
}
|
}
|
||||||
|
|
||||||
RtlZeroMemory(LayoutBuffer,
|
RtlZeroMemory(LayoutBuffer,
|
||||||
0x1000);
|
0x1000);
|
||||||
|
|
||||||
PartitionOffset.QuadPart = 0;
|
PartitionOffset.QuadPart = 0;
|
||||||
containerOffset.QuadPart = 0;
|
containerOffset.QuadPart = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
KeInitializeEvent(&Event,
|
KeInitializeEvent(&Event,
|
||||||
NotificationEvent,
|
NotificationEvent,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
DPRINT("PartitionOffset: %I64u\n", PartitionOffset.QuadPart / SectorSize);
|
DPRINT("PartitionOffset: %I64u\n", PartitionOffset.QuadPart / SectorSize);
|
||||||
|
|
||||||
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
|
||||||
DeviceObject,
|
DeviceObject,
|
||||||
SectorBuffer,
|
SectorBuffer,
|
||||||
SectorSize,
|
SectorSize,
|
||||||
(PLARGE_INTEGER)&PartitionOffset,
|
(PLARGE_INTEGER)&PartitionOffset,
|
||||||
&Event,
|
&Event,
|
||||||
&StatusBlock);
|
&StatusBlock);
|
||||||
Status = IoCallDriver(DeviceObject,
|
Status = IoCallDriver(DeviceObject,
|
||||||
Irp);
|
Irp);
|
||||||
if (Status == STATUS_PENDING)
|
if (Status == STATUS_PENDING)
|
||||||
{
|
{
|
||||||
KeWaitForSingleObject(&Event,
|
KeWaitForSingleObject(&Event,
|
||||||
Executive,
|
Executive,
|
||||||
KernelMode,
|
KernelMode,
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL);
|
NULL);
|
||||||
Status = StatusBlock.Status;
|
Status = StatusBlock.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DPRINT("Failed to read partition table sector (Status = 0x%08lx)\n",
|
DPRINT("Failed to read partition table sector (Status = 0x%08lx)\n",
|
||||||
Status);
|
Status);
|
||||||
ExFreePool(SectorBuffer);
|
ExFreePool(SectorBuffer);
|
||||||
ExFreePool(LayoutBuffer);
|
ExFreePool(LayoutBuffer);
|
||||||
return(Status);
|
return(Status);
|
||||||
}
|
}
|
||||||
|
|
||||||
PartitionTable = (PPARTITION_TABLE)(SectorBuffer+PARTITION_OFFSET);
|
PartitionTable = (PPARTITION_TABLE)(SectorBuffer + PARTITION_OFFSET);
|
||||||
|
|
||||||
/* check the boot sector id */
|
/* check the boot sector id */
|
||||||
DPRINT("Magic %x\n", PartitionTable->Magic);
|
DPRINT("Magic %x\n", PartitionTable->Magic);
|
||||||
if (PartitionTable->Magic != PARTITION_MAGIC)
|
if (PartitionTable->Magic != PARTITION_MAGIC)
|
||||||
{
|
{
|
||||||
DbgPrint("Invalid partition table magic\n");
|
DbgPrint("Invalid partition table magic\n");
|
||||||
ExFreePool(SectorBuffer);
|
ExFreePool(SectorBuffer);
|
||||||
*PartitionBuffer = LayoutBuffer;
|
*PartitionBuffer = LayoutBuffer;
|
||||||
return STATUS_SUCCESS;
|
return(STATUS_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
for (i = 0; i < PARTITION_TBL_SIZE; i++)
|
for (i = 0; i < PARTITION_TBL_SIZE; i++)
|
||||||
{
|
{
|
||||||
DPRINT1(" %d: flags:%2x type:%x start:%d:%d:%d end:%d:%d:%d stblk:%d count:%d\n",
|
DPRINT1(" %d: flags:%2x type:%x start:%d:%d:%d end:%d:%d:%d stblk:%d count:%d\n",
|
||||||
i,
|
i,
|
||||||
PartitionTable->Partition[i].BootFlags,
|
PartitionTable->Partition[i].BootFlags,
|
||||||
PartitionTable->Partition[i].PartitionType,
|
PartitionTable->Partition[i].PartitionType,
|
||||||
PartitionTable->Partition[i].StartingHead,
|
PartitionTable->Partition[i].StartingHead,
|
||||||
PartitionTable->Partition[i].StartingSector & 0x3f,
|
PartitionTable->Partition[i].StartingSector & 0x3f,
|
||||||
(((PartitionTable->Partition[i].StartingSector) & 0xc0) << 2) +
|
(((PartitionTable->Partition[i].StartingSector) & 0xc0) << 2) +
|
||||||
PartitionTable->Partition[i].StartingCylinder,
|
PartitionTable->Partition[i].StartingCylinder,
|
||||||
PartitionTable->Partition[i].EndingHead,
|
PartitionTable->Partition[i].EndingHead,
|
||||||
PartitionTable->Partition[i].EndingSector,
|
PartitionTable->Partition[i].EndingSector,
|
||||||
PartitionTable->Partition[i].EndingCylinder,
|
PartitionTable->Partition[i].EndingCylinder,
|
||||||
PartitionTable->Partition[i].StartingBlock,
|
PartitionTable->Partition[i].StartingBlock,
|
||||||
PartitionTable->Partition[i].SectorCount);
|
PartitionTable->Partition[i].SectorCount);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (ExtendedFound == FALSE);
|
if (ExtendedFound == FALSE);
|
||||||
{
|
{
|
||||||
LayoutBuffer->Signature = *((PULONG)(SectorBuffer + SIGNATURE_OFFSET));
|
LayoutBuffer->Signature = *((PULONG)(SectorBuffer + SIGNATURE_OFFSET));
|
||||||
}
|
}
|
||||||
|
|
||||||
ExtendedFound = FALSE;
|
ExtendedFound = FALSE;
|
||||||
|
|
||||||
for (i = 0; i < PARTITION_TBL_SIZE; i++)
|
for (i = 0; i < PARTITION_TBL_SIZE; i++)
|
||||||
{
|
{
|
||||||
if ((ReturnRecognizedPartitions == FALSE) ||
|
if ((ReturnRecognizedPartitions == FALSE) ||
|
||||||
((ReturnRecognizedPartitions == TRUE) &&
|
((ReturnRecognizedPartitions == TRUE) &&
|
||||||
IsRecognizedPartition(PartitionTable->Partition[i].PartitionType)))
|
IsRecognizedPartition(PartitionTable->Partition[i].PartitionType)))
|
||||||
{
|
{
|
||||||
/* handle normal partition */
|
/* handle normal partition */
|
||||||
DPRINT("Partition %u: Normal Partition\n", i);
|
DPRINT("Partition %u: Normal Partition\n", i);
|
||||||
Count = LayoutBuffer->PartitionCount;
|
Count = LayoutBuffer->PartitionCount;
|
||||||
DPRINT("Logical Partition %u\n", Count);
|
DPRINT("Logical Partition %u\n", Count);
|
||||||
if (PartitionTable->Partition[i].StartingBlock == 0)
|
if (PartitionTable->Partition[i].StartingBlock == 0)
|
||||||
{
|
{
|
||||||
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart = 0;
|
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart = 0;
|
||||||
}
|
}
|
||||||
else if (IsExtendedPartition(PartitionTable->Partition[i].PartitionType))
|
else if (IsContainerPartition(PartitionTable->Partition[i].PartitionType))
|
||||||
{
|
{
|
||||||
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart =
|
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart =
|
||||||
(ULONGLONG)PartitionOffset.QuadPart;
|
(ULONGLONG)PartitionOffset.QuadPart;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart =
|
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart =
|
||||||
(ULONGLONG)PartitionOffset.QuadPart +
|
(ULONGLONG)PartitionOffset.QuadPart +
|
||||||
((ULONGLONG)PartitionTable->Partition[i].StartingBlock * (ULONGLONG)SectorSize);
|
((ULONGLONG)PartitionTable->Partition[i].StartingBlock * (ULONGLONG)SectorSize);
|
||||||
}
|
}
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionLength.QuadPart =
|
LayoutBuffer->PartitionEntry[Count].PartitionLength.QuadPart =
|
||||||
(ULONGLONG)PartitionTable->Partition[i].SectorCount * (ULONGLONG)SectorSize;
|
(ULONGLONG)PartitionTable->Partition[i].SectorCount * (ULONGLONG)SectorSize;
|
||||||
LayoutBuffer->PartitionEntry[Count].HiddenSectors = 0;
|
LayoutBuffer->PartitionEntry[Count].HiddenSectors = 0;
|
||||||
|
|
||||||
if (IsRecognizedPartition(PartitionTable->Partition[i].PartitionType))
|
if (IsRecognizedPartition(PartitionTable->Partition[i].PartitionType))
|
||||||
{
|
{
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionNumber = Number;
|
LayoutBuffer->PartitionEntry[Count].PartitionNumber = Number;
|
||||||
Number++;
|
Number++;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionNumber = 0;
|
LayoutBuffer->PartitionEntry[Count].PartitionNumber = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionType =
|
LayoutBuffer->PartitionEntry[Count].PartitionType =
|
||||||
PartitionTable->Partition[i].PartitionType;
|
PartitionTable->Partition[i].PartitionType;
|
||||||
LayoutBuffer->PartitionEntry[Count].BootIndicator =
|
LayoutBuffer->PartitionEntry[Count].BootIndicator =
|
||||||
(PartitionTable->Partition[i].BootFlags & 0x80)?TRUE:FALSE;
|
(PartitionTable->Partition[i].BootFlags & 0x80)?TRUE:FALSE;
|
||||||
LayoutBuffer->PartitionEntry[Count].RecognizedPartition =
|
LayoutBuffer->PartitionEntry[Count].RecognizedPartition =
|
||||||
IsRecognizedPartition (PartitionTable->Partition[i].PartitionType);
|
IsRecognizedPartition (PartitionTable->Partition[i].PartitionType);
|
||||||
LayoutBuffer->PartitionEntry[Count].RewritePartition = FALSE;
|
LayoutBuffer->PartitionEntry[Count].RewritePartition = FALSE;
|
||||||
|
|
||||||
DPRINT(" %ld: nr: %d boot: %1x type: %x start: 0x%I64x count: 0x%I64x\n",
|
DPRINT(" %ld: nr: %d boot: %1x type: %x start: 0x%I64x count: 0x%I64x\n",
|
||||||
Count,
|
Count,
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionNumber,
|
LayoutBuffer->PartitionEntry[Count].PartitionNumber,
|
||||||
LayoutBuffer->PartitionEntry[Count].BootIndicator,
|
LayoutBuffer->PartitionEntry[Count].BootIndicator,
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionType,
|
LayoutBuffer->PartitionEntry[Count].PartitionType,
|
||||||
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart,
|
LayoutBuffer->PartitionEntry[Count].StartingOffset.QuadPart,
|
||||||
LayoutBuffer->PartitionEntry[Count].PartitionLength.QuadPart);
|
LayoutBuffer->PartitionEntry[Count].PartitionLength.QuadPart);
|
||||||
|
|
||||||
LayoutBuffer->PartitionCount++;
|
LayoutBuffer->PartitionCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
if (IsContainerPartition(PartitionTable->Partition[i].PartitionType))
|
||||||
if (IsNormalPartition(PartitionTable->Partition[i].PartitionType))
|
{
|
||||||
{
|
ExtendedFound = TRUE;
|
||||||
PartitionOffset.QuadPart = (ULONGLONG)PartitionOffset.QuadPart +
|
if ((ULONGLONG) containerOffset.QuadPart == (ULONGLONG) 0)
|
||||||
(((ULONGLONG)PartitionTable->Partition[i].StartingBlock +
|
{
|
||||||
(ULONGLONG)PartitionTable->Partition[i].SectorCount)* (ULONGLONG)SectorSize);
|
containerOffset = PartitionOffset;
|
||||||
}
|
}
|
||||||
#endif
|
nextPartitionOffset.QuadPart = (ULONGLONG) containerOffset.QuadPart +
|
||||||
|
(ULONGLONG) PartitionTable->Partition[i].StartingBlock *
|
||||||
|
(ULONGLONG) SectorSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PartitionOffset = nextPartitionOffset;
|
||||||
|
}
|
||||||
|
while (ExtendedFound == TRUE);
|
||||||
|
|
||||||
if (IsExtendedPartition(PartitionTable->Partition[i].PartitionType))
|
*PartitionBuffer = LayoutBuffer;
|
||||||
{
|
ExFreePool(SectorBuffer);
|
||||||
ExtendedFound = TRUE;
|
|
||||||
if ((ULONGLONG) containerOffset.QuadPart == (ULONGLONG) 0)
|
|
||||||
{
|
|
||||||
containerOffset = PartitionOffset;
|
|
||||||
}
|
|
||||||
nextPartitionOffset.QuadPart = (ULONGLONG) containerOffset.QuadPart +
|
|
||||||
(ULONGLONG) PartitionTable->Partition[i].StartingBlock *
|
|
||||||
(ULONGLONG) SectorSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
PartitionOffset = nextPartitionOffset;
|
|
||||||
}
|
|
||||||
while (ExtendedFound == TRUE);
|
|
||||||
|
|
||||||
*PartitionBuffer = LayoutBuffer;
|
return(STATUS_SUCCESS);
|
||||||
ExFreePool(SectorBuffer);
|
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue