mirror of
https://github.com/reactos/reactos.git
synced 2025-05-31 23:18:39 +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;
|
DiskEntry->Id = ScsiAddress.TargetId;
|
||||||
|
|
||||||
GetDriverName(DiskEntry);
|
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);
|
InsertAscendingList(&List->DiskListHead, DiskEntry, DISKENTRY, ListEntry, DiskNumber);
|
||||||
|
|
||||||
|
@ -1329,8 +1344,204 @@ DestroyPartitionList(
|
||||||
RtlFreeHeap(ProcessHeap, 0, List);
|
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
|
BOOLEAN
|
||||||
SelectPartition(
|
SelectPartition(
|
||||||
|
@ -1340,44 +1551,24 @@ SelectPartition(
|
||||||
{
|
{
|
||||||
PDISKENTRY DiskEntry;
|
PDISKENTRY DiskEntry;
|
||||||
PPARTENTRY PartEntry;
|
PPARTENTRY PartEntry;
|
||||||
PLIST_ENTRY Entry1, Entry2;
|
|
||||||
|
|
||||||
/* Check for empty disks */
|
DiskEntry = GetDiskByNumber(List, DiskNumber);
|
||||||
if (IsListEmpty(&List->DiskListHead))
|
if (!DiskEntry)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Check for first usable entry on next disk */
|
PartEntry = GetPartition(/*List,*/ DiskEntry, PartitionNumber);
|
||||||
Entry1 = List->CurrentDisk->ListEntry.Flink;
|
if (!PartEntry)
|
||||||
while (Entry1 != &List->DiskListHead)
|
return FALSE;
|
||||||
{
|
|
||||||
DiskEntry = CONTAINING_RECORD(Entry1, DISKENTRY, ListEntry);
|
|
||||||
|
|
||||||
if (DiskEntry->DiskNumber == DiskNumber)
|
ASSERT(PartEntry->DiskEntry == DiskEntry);
|
||||||
{
|
ASSERT(DiskEntry->DiskNumber == DiskNumber);
|
||||||
Entry2 = DiskEntry->PrimaryPartListHead.Flink;
|
ASSERT(PartEntry->PartitionNumber == PartitionNumber);
|
||||||
while (Entry2 != &DiskEntry->PrimaryPartListHead)
|
|
||||||
{
|
|
||||||
PartEntry = CONTAINING_RECORD(Entry2, PARTENTRY, ListEntry);
|
|
||||||
|
|
||||||
if (PartEntry->PartitionNumber == PartitionNumber)
|
|
||||||
{
|
|
||||||
List->CurrentDisk = DiskEntry;
|
List->CurrentDisk = DiskEntry;
|
||||||
List->CurrentPartition = PartEntry;
|
List->CurrentPartition = PartEntry;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Entry2 = Entry2->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Entry1 = Entry1->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
PPARTENTRY
|
PPARTENTRY
|
||||||
GetNextPartition(
|
GetNextPartition(
|
||||||
IN PPARTLIST List)
|
IN PPARTLIST List)
|
||||||
|
|
|
@ -87,11 +87,12 @@ typedef struct _DISKENTRY
|
||||||
/* BIOS parameters */
|
/* BIOS parameters */
|
||||||
BOOLEAN BiosFound;
|
BOOLEAN BiosFound;
|
||||||
ULONG BiosDiskNumber;
|
ULONG BiosDiskNumber;
|
||||||
// ULONG Signature;
|
// ULONG Signature; // Obtained from LayoutBuffer->Signature
|
||||||
// ULONG Checksum;
|
// ULONG Checksum;
|
||||||
|
|
||||||
/* SCSI parameters */
|
/* SCSI parameters */
|
||||||
ULONG DiskNumber;
|
ULONG DiskNumber;
|
||||||
|
// SCSI_ADDRESS;
|
||||||
USHORT Port;
|
USHORT Port;
|
||||||
USHORT Bus;
|
USHORT Bus;
|
||||||
USHORT Id;
|
USHORT Id;
|
||||||
|
@ -217,6 +218,42 @@ VOID
|
||||||
DestroyPartitionList(
|
DestroyPartitionList(
|
||||||
IN PPARTLIST List);
|
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
|
BOOLEAN
|
||||||
SelectPartition(
|
SelectPartition(
|
||||||
IN PPARTLIST List,
|
IN PPARTLIST List,
|
||||||
|
|
Loading…
Reference in a new issue