mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
Moved disk manager related offset calculation to class2.
Implemented dynamic partition management. Removed unused header files. svn path=/trunk/; revision=4596
This commit is contained in:
parent
879b1f5754
commit
a950079369
4 changed files with 305 additions and 356 deletions
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ReactOS kernel
|
* ReactOS kernel
|
||||||
* Copyright (C) 2001, 2002 ReactOS Team
|
* Copyright (C) 2001, 2002, 2003 ReactOS Team
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -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: class2.c,v 1.32 2003/03/21 21:09:41 hbirr Exp $
|
/* $Id: class2.c,v 1.33 2003/04/27 10:49:06 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -1528,7 +1528,8 @@ ScsiClassReadWrite(IN PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Adjust partition-relative starting offset to absolute offset */
|
/* Adjust partition-relative starting offset to absolute offset */
|
||||||
IrpStack->Parameters.Read.ByteOffset.QuadPart += DeviceExtension->StartingOffset.QuadPart;
|
IrpStack->Parameters.Read.ByteOffset.QuadPart +=
|
||||||
|
(DeviceExtension->StartingOffset.QuadPart + DeviceExtension->DMByteSkew);
|
||||||
|
|
||||||
/* Calculate number of pages in this transfer */
|
/* Calculate number of pages in this transfer */
|
||||||
CurrentTransferPages =
|
CurrentTransferPages =
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* ReactOS kernel
|
* ReactOS kernel
|
||||||
* Copyright (C) 2001, 2002 ReactOS Team
|
* Copyright (C) 2001, 2002, 2003 ReactOS Team
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -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: disk.c,v 1.24 2003/04/05 15:36:34 chorns Exp $
|
/* $Id: disk.c,v 1.25 2003/04/27 10:50:07 ekohl Exp $
|
||||||
*
|
*
|
||||||
* COPYRIGHT: See COPYING in the top level directory
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
* PROJECT: ReactOS kernel
|
* PROJECT: ReactOS kernel
|
||||||
|
@ -40,6 +40,7 @@
|
||||||
|
|
||||||
typedef struct _DISK_DATA
|
typedef struct _DISK_DATA
|
||||||
{
|
{
|
||||||
|
PDEVICE_EXTENSION NextPartition;
|
||||||
ULONG HiddenSectors;
|
ULONG HiddenSectors;
|
||||||
ULONG PartitionNumber;
|
ULONG PartitionNumber;
|
||||||
ULONG PartitionOrdinal;
|
ULONG PartitionOrdinal;
|
||||||
|
@ -48,13 +49,6 @@ typedef struct _DISK_DATA
|
||||||
BOOLEAN DriveNotReady;
|
BOOLEAN DriveNotReady;
|
||||||
} DISK_DATA, *PDISK_DATA;
|
} DISK_DATA, *PDISK_DATA;
|
||||||
|
|
||||||
typedef enum _DISK_MANAGER
|
|
||||||
{
|
|
||||||
NoDiskManager,
|
|
||||||
OntrackDiskManager,
|
|
||||||
EZ_Drive
|
|
||||||
} DISK_MANAGER;
|
|
||||||
|
|
||||||
|
|
||||||
BOOLEAN STDCALL
|
BOOLEAN STDCALL
|
||||||
DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
|
DiskClassFindDevices(PDRIVER_OBJECT DriverObject,
|
||||||
|
@ -89,28 +83,35 @@ NTSTATUS STDCALL
|
||||||
DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
|
DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PIRP Irp);
|
IN PIRP Irp);
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
DiskClassUpdatePartitionDeviceObjects (IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp);
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS ****************************************************************/
|
/* FUNCTIONS ****************************************************************/
|
||||||
|
|
||||||
// DriverEntry
|
/**********************************************************************
|
||||||
//
|
* NAME EXPORTED
|
||||||
// DESCRIPTION:
|
* DriverEntry
|
||||||
// This function initializes the driver, locates and claims
|
*
|
||||||
// hardware resources, and creates various NT objects needed
|
* DESCRIPTION
|
||||||
// to process I/O requests.
|
* This function initializes the driver, locates and claims
|
||||||
//
|
* hardware resources, and creates various NT objects needed
|
||||||
// RUN LEVEL:
|
* to process I/O requests.
|
||||||
// PASSIVE_LEVEL
|
*
|
||||||
//
|
* RUN LEVEL
|
||||||
// ARGUMENTS:
|
* PASSIVE_LEVEL
|
||||||
// IN PDRIVER_OBJECT DriverObject System allocated Driver Object
|
*
|
||||||
// for this driver
|
* ARGUMENTS
|
||||||
// IN PUNICODE_STRING RegistryPath Name of registry driver service
|
* DriverObject
|
||||||
// key
|
* System allocated Driver Object for this driver
|
||||||
//
|
*
|
||||||
// RETURNS:
|
* RegistryPath
|
||||||
// NTSTATUS
|
* Name of registry driver service key
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* Status
|
||||||
|
*/
|
||||||
|
|
||||||
NTSTATUS STDCALL
|
NTSTATUS STDCALL
|
||||||
DriverEntry(IN PDRIVER_OBJECT DriverObject,
|
DriverEntry(IN PDRIVER_OBJECT DriverObject,
|
||||||
|
@ -360,7 +361,7 @@ DiskClassCheckReadWrite(IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* NAME EXPORTED
|
* NAME INTERNAL
|
||||||
* DiskClassCreateDeviceObject
|
* DiskClassCreateDeviceObject
|
||||||
*
|
*
|
||||||
* DESCRIPTION
|
* DESCRIPTION
|
||||||
|
@ -410,7 +411,6 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
ULONG PartitionNumber;
|
ULONG PartitionNumber;
|
||||||
PVOID MbrBuffer;
|
PVOID MbrBuffer;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
DISK_MANAGER DiskManager = NoDiskManager;
|
|
||||||
|
|
||||||
DPRINT("DiskClassCreateDeviceObject() called\n");
|
DPRINT("DiskClassCreateDeviceObject() called\n");
|
||||||
|
|
||||||
|
@ -556,31 +556,18 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
&MbrBuffer);
|
&MbrBuffer);
|
||||||
if (MbrBuffer != NULL)
|
if (MbrBuffer != NULL)
|
||||||
{
|
{
|
||||||
|
/* Start disk at sector 63 if the Ontrack Disk Manager was found */
|
||||||
DPRINT("Found 'Ontrack Disk Manager'!\n");
|
DPRINT("Found 'Ontrack Disk Manager'!\n");
|
||||||
DiskManager = OntrackDiskManager;
|
|
||||||
|
DiskDeviceExtension->DMSkew = 63;
|
||||||
|
DiskDeviceExtension->DMByteSkew =
|
||||||
|
63 * DiskDeviceExtension->DiskGeometry->BytesPerSector;
|
||||||
|
DiskDeviceExtension->DMActive = TRUE;
|
||||||
|
|
||||||
ExFreePool(MbrBuffer);
|
ExFreePool(MbrBuffer);
|
||||||
MbrBuffer = NULL;
|
MbrBuffer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HalExamineMBR(DiskDeviceObject,
|
|
||||||
DiskDeviceExtension->DiskGeometry->BytesPerSector,
|
|
||||||
0x55,
|
|
||||||
&MbrBuffer);
|
|
||||||
if (MbrBuffer != NULL)
|
|
||||||
{
|
|
||||||
DPRINT("Found 'EZ-Drive' disk manager!\n");
|
|
||||||
DiskManager = EZ_Drive;
|
|
||||||
ExFreePool(MbrBuffer);
|
|
||||||
MbrBuffer = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Start disk at sector 63 if the Ontrack Disk Manager was found */
|
|
||||||
if (DiskManager == OntrackDiskManager)
|
|
||||||
{
|
|
||||||
DiskDeviceExtension->StartingOffset.QuadPart =
|
|
||||||
(ULONGLONG)(63 * DiskDeviceExtension->DiskGeometry->BytesPerSector);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) &&
|
if ((DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA) &&
|
||||||
(DiskDeviceExtension->DiskGeometry->MediaType == RemovableMedia))
|
(DiskDeviceExtension->DiskGeometry->MediaType == RemovableMedia))
|
||||||
{
|
{
|
||||||
|
@ -679,19 +666,13 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
PartitionDeviceExtension->DiskGeometry = DiskDeviceExtension->DiskGeometry;
|
PartitionDeviceExtension->DiskGeometry = DiskDeviceExtension->DiskGeometry;
|
||||||
PartitionDeviceExtension->PhysicalDevice = DiskDeviceExtension->PhysicalDevice;
|
PartitionDeviceExtension->PhysicalDevice = DiskDeviceExtension->PhysicalDevice;
|
||||||
PartitionDeviceExtension->PortCapabilities = Capabilities;
|
PartitionDeviceExtension->PortCapabilities = Capabilities;
|
||||||
if (DiskManager == OntrackDiskManager)
|
PartitionDeviceExtension->StartingOffset.QuadPart =
|
||||||
{
|
PartitionEntry->StartingOffset.QuadPart;
|
||||||
PartitionDeviceExtension->StartingOffset.QuadPart =
|
|
||||||
PartitionEntry->StartingOffset.QuadPart +
|
|
||||||
(ULONGLONG)(63 * DiskDeviceExtension->DiskGeometry->BytesPerSector);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
PartitionDeviceExtension->StartingOffset.QuadPart =
|
|
||||||
PartitionEntry->StartingOffset.QuadPart;
|
|
||||||
}
|
|
||||||
PartitionDeviceExtension->PartitionLength.QuadPart =
|
PartitionDeviceExtension->PartitionLength.QuadPart =
|
||||||
PartitionEntry->PartitionLength.QuadPart;
|
PartitionEntry->PartitionLength.QuadPart;
|
||||||
|
PartitionDeviceExtension->DMSkew = DiskDeviceExtension->DMSkew;
|
||||||
|
PartitionDeviceExtension->DMByteSkew = DiskDeviceExtension->DMByteSkew;
|
||||||
|
PartitionDeviceExtension->DMActive = DiskDeviceExtension->DMActive;
|
||||||
PartitionDeviceExtension->PortNumber = (UCHAR)PortNumber;
|
PartitionDeviceExtension->PortNumber = (UCHAR)PortNumber;
|
||||||
PartitionDeviceExtension->PathId = InquiryData->PathId;
|
PartitionDeviceExtension->PathId = InquiryData->PathId;
|
||||||
PartitionDeviceExtension->TargetId = InquiryData->TargetId;
|
PartitionDeviceExtension->TargetId = InquiryData->TargetId;
|
||||||
|
@ -702,7 +683,12 @@ DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject,
|
||||||
ScsiClassInitializeSrbLookasideList(PartitionDeviceExtension,
|
ScsiClassInitializeSrbLookasideList(PartitionDeviceExtension,
|
||||||
8);
|
8);
|
||||||
|
|
||||||
|
/* Link current partition device extension to previous disk data */
|
||||||
|
DiskData->NextPartition = PartitionDeviceExtension;
|
||||||
|
|
||||||
|
/* Initialize current disk data */
|
||||||
DiskData = (PDISK_DATA)(PartitionDeviceExtension + 1);
|
DiskData = (PDISK_DATA)(PartitionDeviceExtension + 1);
|
||||||
|
DiskData->NextPartition = NULL;
|
||||||
DiskData->PartitionType = PartitionEntry->PartitionType;
|
DiskData->PartitionType = PartitionEntry->PartitionType;
|
||||||
DiskData->PartitionNumber = PartitionNumber + 1;
|
DiskData->PartitionNumber = PartitionNumber + 1;
|
||||||
DiskData->PartitionOrdinal = PartitionNumber + 1;
|
DiskData->PartitionOrdinal = PartitionNumber + 1;
|
||||||
|
@ -923,6 +909,11 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Update partition device objects */
|
||||||
|
DiskClassUpdatePartitionDeviceObjects (DeviceObject,
|
||||||
|
Irp);
|
||||||
|
|
||||||
|
/* Write partition table */
|
||||||
Status = IoWritePartitionTable(DeviceExtension->PhysicalDevice,
|
Status = IoWritePartitionTable(DeviceExtension->PhysicalDevice,
|
||||||
DeviceExtension->DiskGeometry->BytesPerSector,
|
DeviceExtension->DiskGeometry->BytesPerSector,
|
||||||
DeviceExtension->DiskGeometry->SectorsPerTrack,
|
DeviceExtension->DiskGeometry->SectorsPerTrack,
|
||||||
|
@ -930,8 +921,6 @@ DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
|
||||||
PartitionList);
|
PartitionList);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* FIXME: Update partition device objects */
|
|
||||||
|
|
||||||
Information = TableSize;
|
Information = TableSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1074,4 +1063,254 @@ DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject,
|
||||||
return(IoCallDriver(DeviceExtension->PortDeviceObject, Irp));
|
return(IoCallDriver(DeviceExtension->PortDeviceObject, Irp));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* NAME INTERNAL
|
||||||
|
* DiskClassUpdatePartitionDeviceObjects
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* Deletes, modifies or creates partition device objects.
|
||||||
|
*
|
||||||
|
* RUN LEVEL
|
||||||
|
* PASSIVE_LEVEL
|
||||||
|
*
|
||||||
|
* ARGUMENTS
|
||||||
|
* DeviceObject
|
||||||
|
* Pointer to the device.
|
||||||
|
*
|
||||||
|
* Irp
|
||||||
|
* Pointer to the IRP
|
||||||
|
*
|
||||||
|
* RETURN VALUE
|
||||||
|
* None
|
||||||
|
*/
|
||||||
|
|
||||||
|
static VOID
|
||||||
|
DiskClassUpdatePartitionDeviceObjects (IN PDEVICE_OBJECT DiskDeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
PDRIVE_LAYOUT_INFORMATION PartitionList;
|
||||||
|
PPARTITION_INFORMATION PartitionEntry;
|
||||||
|
PDEVICE_EXTENSION DeviceExtension;
|
||||||
|
PDEVICE_EXTENSION DiskDeviceExtension;
|
||||||
|
PDISK_DATA DiskData;
|
||||||
|
ULONG PartitionCount;
|
||||||
|
ULONG PartitionOrdinal;
|
||||||
|
ULONG PartitionNumber;
|
||||||
|
ULONG LastPartitionNumber;
|
||||||
|
ULONG i;
|
||||||
|
BOOLEAN Found;
|
||||||
|
WCHAR NameBuffer[MAX_PATH];
|
||||||
|
UNICODE_STRING DeviceName;
|
||||||
|
PDEVICE_OBJECT DeviceObject;
|
||||||
|
NTSTATUS Status;
|
||||||
|
|
||||||
|
/* Get partition list */
|
||||||
|
PartitionList = Irp->AssociatedIrp.SystemBuffer;
|
||||||
|
|
||||||
|
/* Round partition count up by 4 */
|
||||||
|
PartitionCount = ((PartitionList->PartitionCount + 3) / 4) * 4;
|
||||||
|
|
||||||
|
/* Remove the partition numbers from the partition list */
|
||||||
|
for (i = 0; i < PartitionCount; i++)
|
||||||
|
{
|
||||||
|
PartitionList->PartitionEntry[i].PartitionNumber = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
DiskDeviceExtension = DiskDeviceObject->DeviceExtension;
|
||||||
|
|
||||||
|
/* Traverse on-disk partition list */
|
||||||
|
LastPartitionNumber = 0;
|
||||||
|
DeviceExtension = DiskDeviceExtension;
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
DeviceExtension = DiskData->NextPartition;
|
||||||
|
if (DeviceExtension == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Get disk data */
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
|
||||||
|
/* Update last partition number */
|
||||||
|
if (DiskData->PartitionNumber > LastPartitionNumber)
|
||||||
|
LastPartitionNumber = DiskData->PartitionNumber;
|
||||||
|
|
||||||
|
/* Ignore unused on-disk partitions */
|
||||||
|
if (DeviceExtension->PartitionLength.QuadPart == 0ULL)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Found = FALSE;
|
||||||
|
PartitionOrdinal = 0;
|
||||||
|
for (i = 0; i < PartitionCount; i++)
|
||||||
|
{
|
||||||
|
/* Get current partition entry */
|
||||||
|
PartitionEntry = &PartitionList->PartitionEntry[i];
|
||||||
|
|
||||||
|
/* Ignore empty (aka unused) or extended partitions */
|
||||||
|
if (PartitionEntry->PartitionType == PARTITION_ENTRY_UNUSED ||
|
||||||
|
IsContainerPartition (PartitionEntry->PartitionType))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PartitionOrdinal++;
|
||||||
|
|
||||||
|
/* Check for matching partition start offset and length */
|
||||||
|
if ((PartitionEntry->StartingOffset.QuadPart !=
|
||||||
|
DeviceExtension->StartingOffset.QuadPart) ||
|
||||||
|
(PartitionEntry->PartitionLength.QuadPart !=
|
||||||
|
DeviceExtension->PartitionLength.QuadPart))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
DPRINT1("Found matching partition entry for partition %lu\n",
|
||||||
|
DiskData->PartitionNumber);
|
||||||
|
|
||||||
|
/* Found matching partition */
|
||||||
|
Found = TRUE;
|
||||||
|
|
||||||
|
/* Update partition number in partition list */
|
||||||
|
PartitionEntry->PartitionNumber = DiskData->PartitionNumber;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Found == TRUE)
|
||||||
|
{
|
||||||
|
/* Get disk data for current partition */
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
|
||||||
|
/* Update partition type if partiton will be rewritten */
|
||||||
|
if (PartitionEntry->RewritePartition == TRUE)
|
||||||
|
DiskData->PartitionType = PartitionEntry->PartitionType;
|
||||||
|
|
||||||
|
/* Assign new partiton ordinal */
|
||||||
|
DiskData->PartitionOrdinal = PartitionOrdinal;
|
||||||
|
|
||||||
|
DPRINT1("Partition ordinal %lu was assigned to partition %lu\n",
|
||||||
|
DiskData->PartitionOrdinal,
|
||||||
|
DiskData->PartitionNumber);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Delete this partition */
|
||||||
|
DeviceExtension->PartitionLength.QuadPart = 0ULL;
|
||||||
|
|
||||||
|
DPRINT1("Deleting partition %lu\n",
|
||||||
|
DiskData->PartitionNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Traverse partiton list and create new partiton devices */
|
||||||
|
PartitionOrdinal = 0;
|
||||||
|
for (i = 0; i < PartitionCount; i++)
|
||||||
|
{
|
||||||
|
/* Get current partition entry */
|
||||||
|
PartitionEntry = &PartitionList->PartitionEntry[i];
|
||||||
|
|
||||||
|
/* Ignore empty (aka unused) or extended partitions */
|
||||||
|
if (PartitionEntry->PartitionType == PARTITION_ENTRY_UNUSED ||
|
||||||
|
IsContainerPartition (PartitionEntry->PartitionType))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
PartitionOrdinal++;
|
||||||
|
|
||||||
|
/* Ignore unchanged partition entries */
|
||||||
|
if (PartitionEntry->RewritePartition == FALSE)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* Check for an unused device object */
|
||||||
|
PartitionNumber = 0;
|
||||||
|
DeviceExtension = DiskDeviceExtension;
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
DeviceExtension = DiskData->NextPartition;
|
||||||
|
if (DeviceExtension == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Get partition disk data */
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
|
||||||
|
/* Found a free (unused) partition (device object) */
|
||||||
|
if (DeviceExtension->PartitionLength.QuadPart == 0ULL)
|
||||||
|
{
|
||||||
|
PartitionNumber = DiskData->PartitionNumber;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PartitionNumber == 0)
|
||||||
|
{
|
||||||
|
/* Create a new partition device object */
|
||||||
|
DPRINT1("Create new partition device object\n");
|
||||||
|
|
||||||
|
/* Get new partiton number */
|
||||||
|
LastPartitionNumber++;
|
||||||
|
PartitionNumber = LastPartitionNumber;
|
||||||
|
|
||||||
|
/* Create partition device object */
|
||||||
|
swprintf(NameBuffer,
|
||||||
|
L"\\Device\\Harddisk%lu\\Partition%lu",
|
||||||
|
DiskDeviceExtension->DeviceNumber,
|
||||||
|
PartitionNumber);
|
||||||
|
RtlInitUnicodeString(&DeviceName,
|
||||||
|
NameBuffer);
|
||||||
|
|
||||||
|
Status = IoCreateDevice(DiskDeviceObject->DriverObject,
|
||||||
|
sizeof(DEVICE_EXTENSION) + sizeof(DISK_DATA),
|
||||||
|
&DeviceName,
|
||||||
|
FILE_DEVICE_DISK,
|
||||||
|
0,
|
||||||
|
FALSE,
|
||||||
|
&DeviceObject);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("IoCreateDevice() failed (Status %lx)\n", Status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
DeviceObject->Flags |= DO_DIRECT_IO;
|
||||||
|
DeviceObject->StackSize = DiskDeviceObject->StackSize;
|
||||||
|
DeviceObject->Characteristics = DiskDeviceObject->Characteristics;
|
||||||
|
DeviceObject->AlignmentRequirement = DiskDeviceObject->AlignmentRequirement;
|
||||||
|
|
||||||
|
/* Initialize device extension */
|
||||||
|
DeviceExtension = DeviceObject->DeviceExtension;
|
||||||
|
RtlCopyMemory(DeviceExtension,
|
||||||
|
DiskDeviceObject->DeviceExtension,
|
||||||
|
sizeof(DEVICE_EXTENSION));
|
||||||
|
DeviceExtension->DeviceObject = DeviceObject;
|
||||||
|
|
||||||
|
/* Initialize lookaside list for SRBs */
|
||||||
|
ScsiClassInitializeSrbLookasideList(DeviceExtension,
|
||||||
|
8);
|
||||||
|
|
||||||
|
/* Link current partition device extension to previous disk data */
|
||||||
|
DiskData->NextPartition = DeviceExtension;
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
DiskData->NextPartition = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Reuse an existing partition device object */
|
||||||
|
DPRINT1("Reuse an exisiting partition device object\n");
|
||||||
|
DiskData = (PDISK_DATA)(DeviceExtension + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Update partition data and device extension */
|
||||||
|
DiskData->PartitionNumber = PartitionNumber;
|
||||||
|
DiskData->PartitionOrdinal = PartitionOrdinal;
|
||||||
|
DiskData->PartitionType = PartitionEntry->PartitionType;
|
||||||
|
DiskData->BootIndicator = PartitionEntry->BootIndicator;
|
||||||
|
DiskData->HiddenSectors = PartitionEntry->HiddenSectors;
|
||||||
|
DeviceExtension->StartingOffset = PartitionEntry->StartingOffset;
|
||||||
|
DeviceExtension->PartitionLength = PartitionEntry->PartitionLength;
|
||||||
|
|
||||||
|
/* Update partition number in the partition list */
|
||||||
|
PartitionEntry->PartitionNumber = PartitionNumber;
|
||||||
|
|
||||||
|
DPRINT1("Partition ordinal %lu was assigned to partition %lu\n",
|
||||||
|
DiskData->PartitionOrdinal,
|
||||||
|
DiskData->PartitionNumber);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* EOF */
|
/* EOF */
|
||||||
|
|
|
@ -1,250 +0,0 @@
|
||||||
//
|
|
||||||
// IDE.H - defines and typedefs for the IDE Driver module.
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef __IDE_H
|
|
||||||
#define __IDE_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define IDE_MAXIMUM_DEVICES 8
|
|
||||||
|
|
||||||
#define IDE_MAX_NAME_LENGTH 50
|
|
||||||
|
|
||||||
#define IDE_SECTOR_BUF_SZ 512
|
|
||||||
#define IDE_MAX_SECTORS_PER_XFER 256
|
|
||||||
#define IDE_MAX_RESET_RETRIES 10000
|
|
||||||
#define IDE_MAX_POLL_RETRIES 100000
|
|
||||||
#define IDE_MAX_WRITE_RETRIES 1000
|
|
||||||
#define IDE_MAX_BUSY_RETRIES 100
|
|
||||||
//#define IDE_MAX_BUSY_RETRIES 100000
|
|
||||||
#define IDE_MAX_DRQ_RETRIES 10000
|
|
||||||
//#define IDE_MAX_CMD_RETRIES 1
|
|
||||||
#define IDE_MAX_CMD_RETRIES 0
|
|
||||||
#define IDE_CMD_TIMEOUT 5
|
|
||||||
#define IDE_RESET_PULSE_LENGTH 500 /* maybe a little too long */
|
|
||||||
#define IDE_RESET_BUSY_TIMEOUT 31
|
|
||||||
#define IDE_RESET_DRDY_TIMEOUT 120
|
|
||||||
|
|
||||||
// Control Block offsets and masks
|
|
||||||
#define IDE_REG_ALT_STATUS 0x0000
|
|
||||||
#define IDE_REG_DEV_CNTRL 0x0000 /* device control register */
|
|
||||||
#define IDE_DC_SRST 0x04 /* drive reset (both drives) */
|
|
||||||
#define IDE_DC_nIEN 0x02 /* IRQ enable (active low) */
|
|
||||||
#define IDE_REG_DRV_ADDR 0x0001
|
|
||||||
|
|
||||||
// Command Block offsets and masks
|
|
||||||
#define IDE_REG_DATA_PORT 0x0000
|
|
||||||
#define IDE_REG_ERROR 0x0001 /* error register */
|
|
||||||
#define IDE_ER_AMNF 0x01 /* addr mark not found */
|
|
||||||
#define IDE_ER_TK0NF 0x02 /* track 0 not found */
|
|
||||||
#define IDE_ER_ABRT 0x04 /* command aborted */
|
|
||||||
#define IDE_ER_MCR 0x08 /* media change requested */
|
|
||||||
#define IDE_ER_IDNF 0x10 /* ID not found */
|
|
||||||
#define IDE_ER_MC 0x20 /* Media changed */
|
|
||||||
#define IDE_ER_UNC 0x40 /* Uncorrectable data error */
|
|
||||||
#define IDE_REG_PRECOMP 0x0001
|
|
||||||
#define IDE_REG_SECTOR_CNT 0x0002
|
|
||||||
#define IDE_REG_SECTOR_NUM 0x0003
|
|
||||||
#define IDE_REG_CYL_LOW 0x0004
|
|
||||||
#define IDE_REG_CYL_HIGH 0x0005
|
|
||||||
#define IDE_REG_DRV_HEAD 0x0006
|
|
||||||
#define IDE_DH_FIXED 0xA0
|
|
||||||
#define IDE_DH_LBA 0x40
|
|
||||||
#define IDE_DH_HDMASK 0x0F
|
|
||||||
#define IDE_DH_DRV0 0x00
|
|
||||||
#define IDE_DH_DRV1 0x10
|
|
||||||
#define IDE_REG_STATUS 0x0007
|
|
||||||
#define IDE_SR_BUSY 0x80
|
|
||||||
#define IDE_SR_DRDY 0x40
|
|
||||||
#define IDE_SR_DRQ 0x08
|
|
||||||
#define IDE_SR_ERR 0x01
|
|
||||||
#define IDE_REG_COMMAND 0x0007
|
|
||||||
#define IDE_CMD_READ 0x20
|
|
||||||
#define IDE_CMD_READ_RETRY 0x21
|
|
||||||
#define IDE_CMD_WRITE 0x30
|
|
||||||
#define IDE_CMD_WRITE_RETRY 0x31
|
|
||||||
#define IDE_CMD_IDENT_DRV 0xEC
|
|
||||||
|
|
||||||
//
|
|
||||||
// Access macros for command registers
|
|
||||||
// Each macro takes an address of the command port block, and data
|
|
||||||
//
|
|
||||||
#define IDEReadError(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_ERROR)))
|
|
||||||
#define IDEWritePrecomp(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_PRECOMP), (Data)))
|
|
||||||
#define IDEReadSectorCount(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT)))
|
|
||||||
#define IDEWriteSectorCount(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_CNT), (Data)))
|
|
||||||
#define IDEReadSectorNum(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM)))
|
|
||||||
#define IDEWriteSectorNum(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_SECTOR_NUM), (Data)))
|
|
||||||
#define IDEReadCylinderLow(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW)))
|
|
||||||
#define IDEWriteCylinderLow(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_LOW), (Data)))
|
|
||||||
#define IDEReadCylinderHigh(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH)))
|
|
||||||
#define IDEWriteCylinderHigh(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_CYL_HIGH), (Data)))
|
|
||||||
#define IDEReadDriveHead(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD)))
|
|
||||||
#define IDEWriteDriveHead(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DRV_HEAD), (Data)))
|
|
||||||
#define IDEReadStatus(Address) \
|
|
||||||
(READ_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_STATUS)))
|
|
||||||
#define IDEWriteCommand(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_COMMAND), (Data)))
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Data block read and write commands
|
|
||||||
//
|
|
||||||
#define IDEReadBlock(Address, Buffer, Count) \
|
|
||||||
(READ_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
|
|
||||||
#define IDEWriteBlock(Address, Buffer, Count) \
|
|
||||||
(WRITE_PORT_BUFFER_USHORT((PUSHORT)((Address) + IDE_REG_DATA_PORT), (PUSHORT)(Buffer), (Count) / 2))
|
|
||||||
|
|
||||||
//
|
|
||||||
// Access macros for control registers
|
|
||||||
// Each macro takes an address of the control port blank and data
|
|
||||||
//
|
|
||||||
#define IDEWriteDriveControl(Address, Data) \
|
|
||||||
(WRITE_PORT_UCHAR((PUCHAR)((Address) + IDE_REG_DEV_CNTRL), (Data)))
|
|
||||||
|
|
||||||
// IDE_DEVICE_EXTENSION
|
|
||||||
//
|
|
||||||
// DESCRIPTION:
|
|
||||||
// Extension to be placed in each device object
|
|
||||||
//
|
|
||||||
// ACCESS:
|
|
||||||
// Allocated from NON-PAGED POOL
|
|
||||||
// Available at any IRQL
|
|
||||||
//
|
|
||||||
|
|
||||||
typedef struct _IDE_DEVICE_EXTENSION {
|
|
||||||
PDEVICE_OBJECT DeviceObject;
|
|
||||||
PCONTROLLER_OBJECT ControllerObject;
|
|
||||||
struct _IDE_DEVICE_EXTESION *DiskExtension;
|
|
||||||
int UnitNumber;
|
|
||||||
BOOLEAN LBASupported;
|
|
||||||
BOOLEAN DMASupported;
|
|
||||||
int BytesPerSector;
|
|
||||||
int LogicalHeads;
|
|
||||||
int SectorsPerLogCyl;
|
|
||||||
int SectorsPerLogTrk;
|
|
||||||
int Offset;
|
|
||||||
int Size;
|
|
||||||
|
|
||||||
int Operation;
|
|
||||||
ULONG BytesRequested;
|
|
||||||
ULONG BytesToTransfer;
|
|
||||||
ULONG BytesRemaining;
|
|
||||||
ULONG StartingSector;
|
|
||||||
int SectorsTransferred;
|
|
||||||
BYTE *TargetAddress;
|
|
||||||
|
|
||||||
} IDE_DEVICE_EXTENSION, *PIDE_DEVICE_EXTENSION;
|
|
||||||
|
|
||||||
// IDE_TIMER_STATES
|
|
||||||
//
|
|
||||||
// DESCRIPTION:
|
|
||||||
// An enumeration containing the states in the timer DFA
|
|
||||||
//
|
|
||||||
|
|
||||||
typedef enum _IDE_TIMER_STATES {
|
|
||||||
IDETimerIdle,
|
|
||||||
IDETimerCmdWait,
|
|
||||||
IDETimerResetWaitForBusyNegate,
|
|
||||||
IDETimerResetWaitForDrdyAssert
|
|
||||||
} IDE_TIMER_STATES;
|
|
||||||
|
|
||||||
// IDE_CONTROLLER_EXTENSION
|
|
||||||
//
|
|
||||||
// DESCRIPTION:
|
|
||||||
// Driver-defined structure used to hold miscellaneous controller information.
|
|
||||||
//
|
|
||||||
// ACCESS:
|
|
||||||
// Allocated from NON-PAGED POOL
|
|
||||||
// Available at any IRQL
|
|
||||||
//
|
|
||||||
|
|
||||||
typedef struct _IDE_CONTROLLER_EXTENSION {
|
|
||||||
KSPIN_LOCK SpinLock;
|
|
||||||
int Number;
|
|
||||||
int Vector;
|
|
||||||
int CommandPortBase;
|
|
||||||
int ControlPortBase;
|
|
||||||
BOOLEAN DMASupported;
|
|
||||||
BOOLEAN ControllerInterruptBug;
|
|
||||||
PKINTERRUPT Interrupt;
|
|
||||||
|
|
||||||
BOOLEAN OperationInProgress;
|
|
||||||
BYTE DeviceStatus;
|
|
||||||
PIDE_DEVICE_EXTENSION DeviceForOperation;
|
|
||||||
PIRP CurrentIrp;
|
|
||||||
int Retries;
|
|
||||||
|
|
||||||
IDE_TIMER_STATES TimerState;
|
|
||||||
LONG TimerCount;
|
|
||||||
PDEVICE_OBJECT TimerDevice;
|
|
||||||
|
|
||||||
} IDE_CONTROLLER_EXTENSION, *PIDE_CONTROLLER_EXTENSION;
|
|
||||||
|
|
||||||
// IDE_DRIVE_IDENTIFY
|
|
||||||
|
|
||||||
typedef struct _IDE_DRIVE_IDENTIFY {
|
|
||||||
WORD ConfigBits; /*00*/
|
|
||||||
WORD LogicalCyls; /*01*/
|
|
||||||
WORD Reserved02; /*02*/
|
|
||||||
WORD LogicalHeads; /*03*/
|
|
||||||
WORD BytesPerTrack; /*04*/
|
|
||||||
WORD BytesPerSector; /*05*/
|
|
||||||
WORD SectorsPerTrack; /*06*/
|
|
||||||
BYTE InterSectorGap; /*07*/
|
|
||||||
BYTE InterSectorGapSize;
|
|
||||||
BYTE Reserved08H; /*08*/
|
|
||||||
BYTE BytesInPLO;
|
|
||||||
WORD VendorUniqueCnt; /*09*/
|
|
||||||
char SerialNumber[20]; /*10*/
|
|
||||||
WORD ControllerType; /*20*/
|
|
||||||
WORD BufferSize; /*21*/
|
|
||||||
WORD ECCByteCnt; /*22*/
|
|
||||||
char FirmwareRev[8]; /*23*/
|
|
||||||
char ModelNumber[40]; /*27*/
|
|
||||||
WORD RWMultImplemented; /*47*/
|
|
||||||
WORD Reserved48; /*48*/
|
|
||||||
WORD Capabilities; /*49*/
|
|
||||||
#define IDE_DRID_STBY_SUPPORTED 0x2000
|
|
||||||
#define IDE_DRID_IORDY_SUPPORTED 0x0800
|
|
||||||
#define IDE_DRID_IORDY_DISABLE 0x0400
|
|
||||||
#define IDE_DRID_LBA_SUPPORTED 0x0200
|
|
||||||
#define IDE_DRID_DMA_SUPPORTED 0x0100
|
|
||||||
WORD Reserved50; /*50*/
|
|
||||||
WORD MinPIOTransTime; /*51*/
|
|
||||||
WORD MinDMATransTime; /*52*/
|
|
||||||
WORD TMFieldsValid; /*53*/
|
|
||||||
WORD TMCylinders; /*54*/
|
|
||||||
WORD TMHeads; /*55*/
|
|
||||||
WORD TMSectorsPerTrk; /*56*/
|
|
||||||
WORD TMCapacityLo; /*57*/
|
|
||||||
WORD TMCapacityHi; /*58*/
|
|
||||||
WORD Reserved59; /*59*/
|
|
||||||
WORD TMSectorCountLo; /*60*/
|
|
||||||
WORD TMSectorCountHi; /*61*/
|
|
||||||
WORD Reserved62[194]; /*62*/
|
|
||||||
} IDE_DRIVE_IDENTIFY, *PIDE_DRIVE_IDENTIFY;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* __IDE_H */
|
|
||||||
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
/**
|
|
||||||
*** Partition.h - defines and structs for harddrive partition info
|
|
||||||
***
|
|
||||||
*** 05/30/98 RJJ Created
|
|
||||||
**/
|
|
||||||
|
|
||||||
#ifndef __PARTITION_H
|
|
||||||
#define __PARTITION_H
|
|
||||||
|
|
||||||
#define PARTITION_MAGIC 0xaa55
|
|
||||||
#define PART_MAGIC_OFFSET 0x01fe
|
|
||||||
#define PARTITION_OFFSET 0x01be
|
|
||||||
#define PARTITION_TBL_SIZE 4
|
|
||||||
#define PTCHSToLBA(c, h, s, scnt, hcnt) ((s) & 0x3f) + \
|
|
||||||
(scnt) * ( (h) + (hcnt) * ((c) | (((s) & 0xc0) << 2)))
|
|
||||||
#define PTLBAToCHS(lba, c, h, s, scnt, hcnt) ( \
|
|
||||||
(s) = (lba) % (scnt) + 1, \
|
|
||||||
(lba) /= (scnt), \
|
|
||||||
(h) = (lba) % (hcnt), \
|
|
||||||
(lba) /= (heads), \
|
|
||||||
(c) = (lba) & 0xff, \
|
|
||||||
(s) |= ((lba) >> 2) & 0xc0)
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct Partition {
|
|
||||||
unsigned char BootFlags;
|
|
||||||
unsigned char StartingHead;
|
|
||||||
unsigned char StartingSector;
|
|
||||||
unsigned char StartingCylinder;
|
|
||||||
unsigned char PartitionType;
|
|
||||||
unsigned char EndingHead;
|
|
||||||
unsigned char EndingSector;
|
|
||||||
unsigned char EndingCylinder;
|
|
||||||
unsigned int StartingBlock;
|
|
||||||
unsigned int SectorCount;
|
|
||||||
|
|
||||||
} PARTITION;
|
|
||||||
|
|
||||||
#endif // PARTITION_H
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue