mirror of
https://github.com/reactos/reactos.git
synced 2025-05-29 14:08:22 +00:00
[USETUP] PartList module: Add a couple of disk/partition getters: GetDiskByBiosNumber, GetDiskByNumber, GetDiskBySCSI, GetDiskBySignature, GetPartition, GetDiskOrPartition.
They will be used in the subsequent commits. svn path=/branches/setup_improvements/; revision=74617
This commit is contained in:
parent
b76fa34121
commit
2c76ce526c
2 changed files with 261 additions and 33 deletions
|
@ -1067,6 +1067,21 @@ AddDiskToList(
|
|||
DiskEntry->Id = ScsiAddress.TargetId;
|
||||
|
||||
GetDriverName(DiskEntry);
|
||||
/*
|
||||
* Actually it would be more correct somehow to use:
|
||||
*
|
||||
* OBJECT_NAME_INFORMATION NameInfo; // ObjectNameInfo;
|
||||
* ULONG ReturnedLength;
|
||||
*
|
||||
* Status = NtQueryObject(SomeHandleToTheDisk,
|
||||
* ObjectNameInformation,
|
||||
* &NameInfo,
|
||||
* sizeof(NameInfo),
|
||||
* &ReturnedLength);
|
||||
* etc...
|
||||
*
|
||||
* See examples in https://git.reactos.org/?p=reactos.git;a=blob;f=reactos/ntoskrnl/io/iomgr/error.c;hb=2f3a93ee9cec8322a86bf74b356f1ad83fc912dc#l267
|
||||
*/
|
||||
|
||||
InsertAscendingList(&List->DiskListHead, DiskEntry, DISKENTRY, ListEntry, DiskNumber);
|
||||
|
||||
|
@ -1329,8 +1344,204 @@ DestroyPartitionList(
|
|||
RtlFreeHeap(ProcessHeap, 0, List);
|
||||
}
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskByBiosNumber(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG BiosDiskNumber)
|
||||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PLIST_ENTRY Entry;
|
||||
|
||||
/* Check for empty disks */
|
||||
if (IsListEmpty(&List->DiskListHead))
|
||||
return NULL;
|
||||
|
||||
/* Loop over the disks and find the correct one */
|
||||
Entry = List->DiskListHead.Flink;
|
||||
while (Entry != &List->DiskListHead)
|
||||
{
|
||||
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (DiskEntry->BiosDiskNumber == BiosDiskNumber)
|
||||
{
|
||||
/* Disk found */
|
||||
return DiskEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disk not found, stop there */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskByNumber(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG DiskNumber)
|
||||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PLIST_ENTRY Entry;
|
||||
|
||||
/* Check for empty disks */
|
||||
if (IsListEmpty(&List->DiskListHead))
|
||||
return NULL;
|
||||
|
||||
/* Loop over the disks and find the correct one */
|
||||
Entry = List->DiskListHead.Flink;
|
||||
while (Entry != &List->DiskListHead)
|
||||
{
|
||||
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (DiskEntry->DiskNumber == DiskNumber)
|
||||
{
|
||||
/* Disk found */
|
||||
return DiskEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disk not found, stop there */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskBySCSI(
|
||||
IN PPARTLIST List,
|
||||
IN USHORT Port,
|
||||
IN USHORT Bus,
|
||||
IN USHORT Id)
|
||||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PLIST_ENTRY Entry;
|
||||
|
||||
/* Check for empty disks */
|
||||
if (IsListEmpty(&List->DiskListHead))
|
||||
return NULL;
|
||||
|
||||
/* Loop over the disks and find the correct one */
|
||||
Entry = List->DiskListHead.Flink;
|
||||
while (Entry != &List->DiskListHead)
|
||||
{
|
||||
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (DiskEntry->Port == Port &&
|
||||
DiskEntry->Bus == Bus &&
|
||||
DiskEntry->Id == Id)
|
||||
{
|
||||
/* Disk found */
|
||||
return DiskEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disk not found, stop there */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskBySignature(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG Signature)
|
||||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PLIST_ENTRY Entry;
|
||||
|
||||
/* Check for empty disks */
|
||||
if (IsListEmpty(&List->DiskListHead))
|
||||
return NULL;
|
||||
|
||||
/* Loop over the disks and find the correct one */
|
||||
Entry = List->DiskListHead.Flink;
|
||||
while (Entry != &List->DiskListHead)
|
||||
{
|
||||
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (DiskEntry->LayoutBuffer->Signature == Signature)
|
||||
{
|
||||
/* Disk found */
|
||||
return DiskEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Disk not found, stop there */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PPARTENTRY
|
||||
GetPartition(
|
||||
// IN PPARTLIST List,
|
||||
IN PDISKENTRY DiskEntry,
|
||||
IN ULONG PartitionNumber)
|
||||
{
|
||||
PPARTENTRY PartEntry;
|
||||
PLIST_ENTRY Entry;
|
||||
|
||||
/* Disk found, loop over the primary partitions first... */
|
||||
Entry = DiskEntry->PrimaryPartListHead.Flink;
|
||||
while (Entry != &DiskEntry->PrimaryPartListHead)
|
||||
{
|
||||
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (PartEntry->PartitionNumber == PartitionNumber)
|
||||
{
|
||||
/* Partition found */
|
||||
return PartEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* ... then over the logical partitions if needed */
|
||||
Entry = DiskEntry->LogicalPartListHead.Flink;
|
||||
while (Entry != &DiskEntry->LogicalPartListHead)
|
||||
{
|
||||
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
|
||||
Entry = Entry->Flink;
|
||||
|
||||
if (PartEntry->PartitionNumber == PartitionNumber)
|
||||
{
|
||||
/* Partition found */
|
||||
return PartEntry;
|
||||
}
|
||||
}
|
||||
|
||||
/* The partition was not found on the disk, stop there */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
BOOLEAN
|
||||
GetDiskOrPartition(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG DiskNumber,
|
||||
IN ULONG PartitionNumber OPTIONAL,
|
||||
OUT PDISKENTRY* pDiskEntry,
|
||||
OUT PPARTENTRY* pPartEntry OPTIONAL)
|
||||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PPARTENTRY PartEntry = NULL;
|
||||
|
||||
/* Find the disk */
|
||||
DiskEntry = GetDiskByNumber(List, DiskNumber);
|
||||
if (!DiskEntry)
|
||||
return FALSE;
|
||||
|
||||
/* If we have a partition (PartitionNumber != 0), find it */
|
||||
if (PartitionNumber != 0)
|
||||
{
|
||||
PartEntry = GetPartition(/*List,*/ DiskEntry, PartitionNumber);
|
||||
if (!PartEntry)
|
||||
return FALSE;
|
||||
ASSERT(PartEntry->DiskEntry == DiskEntry);
|
||||
}
|
||||
|
||||
/* Return the disk (and optionally the partition) */
|
||||
*pDiskEntry = DiskEntry;
|
||||
if (pPartEntry) *pPartEntry = PartEntry;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//
|
||||
// FIXME: This function is COMPLETELY BROKEN!!!!
|
||||
// NOTE: Was introduced broken in r6258 by Casper
|
||||
//
|
||||
BOOLEAN
|
||||
SelectPartition(
|
||||
|
@ -1340,42 +1551,22 @@ SelectPartition(
|
|||
{
|
||||
PDISKENTRY DiskEntry;
|
||||
PPARTENTRY PartEntry;
|
||||
PLIST_ENTRY Entry1, Entry2;
|
||||
|
||||
/* Check for empty disks */
|
||||
if (IsListEmpty(&List->DiskListHead))
|
||||
DiskEntry = GetDiskByNumber(List, DiskNumber);
|
||||
if (!DiskEntry)
|
||||
return FALSE;
|
||||
|
||||
/* Check for first usable entry on next disk */
|
||||
Entry1 = List->CurrentDisk->ListEntry.Flink;
|
||||
while (Entry1 != &List->DiskListHead)
|
||||
{
|
||||
DiskEntry = CONTAINING_RECORD(Entry1, DISKENTRY, ListEntry);
|
||||
PartEntry = GetPartition(/*List,*/ DiskEntry, PartitionNumber);
|
||||
if (!PartEntry)
|
||||
return FALSE;
|
||||
|
||||
if (DiskEntry->DiskNumber == DiskNumber)
|
||||
{
|
||||
Entry2 = DiskEntry->PrimaryPartListHead.Flink;
|
||||
while (Entry2 != &DiskEntry->PrimaryPartListHead)
|
||||
{
|
||||
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
|
||||
ASSERT(PartEntry->DiskEntry == DiskEntry);
|
||||
ASSERT(DiskEntry->DiskNumber == DiskNumber);
|
||||
ASSERT(PartEntry->PartitionNumber == PartitionNumber);
|
||||
|
||||
if (PartEntry->PartitionNumber == PartitionNumber)
|
||||
{
|
||||
List->CurrentDisk = DiskEntry;
|
||||
List->CurrentPartition = PartEntry;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
Entry2 = Entry2->Flink;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Entry1 = Entry1->Flink;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
List->CurrentDisk = DiskEntry;
|
||||
List->CurrentPartition = PartEntry;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
PPARTENTRY
|
||||
|
|
|
@ -87,11 +87,12 @@ typedef struct _DISKENTRY
|
|||
/* BIOS parameters */
|
||||
BOOLEAN BiosFound;
|
||||
ULONG BiosDiskNumber;
|
||||
// ULONG Signature;
|
||||
// ULONG Signature; // Obtained from LayoutBuffer->Signature
|
||||
// ULONG Checksum;
|
||||
|
||||
/* SCSI parameters */
|
||||
ULONG DiskNumber;
|
||||
// SCSI_ADDRESS;
|
||||
USHORT Port;
|
||||
USHORT Bus;
|
||||
USHORT Id;
|
||||
|
@ -217,6 +218,42 @@ VOID
|
|||
DestroyPartitionList(
|
||||
IN PPARTLIST List);
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskByBiosNumber(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG BiosDiskNumber);
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskByNumber(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG DiskNumber);
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskBySCSI(
|
||||
IN PPARTLIST List,
|
||||
IN USHORT Port,
|
||||
IN USHORT Bus,
|
||||
IN USHORT Id);
|
||||
|
||||
PDISKENTRY
|
||||
GetDiskBySignature(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG Signature);
|
||||
|
||||
PPARTENTRY
|
||||
GetPartition(
|
||||
// IN PPARTLIST List,
|
||||
IN PDISKENTRY DiskEntry,
|
||||
IN ULONG PartitionNumber);
|
||||
|
||||
BOOLEAN
|
||||
GetDiskOrPartition(
|
||||
IN PPARTLIST List,
|
||||
IN ULONG DiskNumber,
|
||||
IN ULONG PartitionNumber OPTIONAL,
|
||||
OUT PDISKENTRY* pDiskEntry,
|
||||
OUT PPARTENTRY* pPartEntry OPTIONAL);
|
||||
|
||||
BOOLEAN
|
||||
SelectPartition(
|
||||
IN PPARTLIST List,
|
||||
|
|
Loading…
Reference in a new issue