Author: ion
Date: Sun Jan  7 03:50:41 2007
New Revision: 25336
URL: 
http://svn.reactos.org/svn/reactos?rev=25336&view=rev
Log:
- Fix multiple bugs in HalpCalculateChsValues.
- Fix lots of typecast warnings.
- Fix potentially uninitialized variables.
- This should fix the partitioning problems/regression. Thanks to hto for finding out the
source of the bug.
Modified:
    trunk/reactos/ntoskrnl/fstub/disksup.c
Modified: trunk/reactos/ntoskrnl/fstub/disksup.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/fstub/disksup.c?r…
==============================================================================
--- trunk/reactos/ntoskrnl/fstub/disksup.c (original)
+++ trunk/reactos/ntoskrnl/fstub/disksup.c Sun Jan  7 03:50:41 2007
@@ -1009,24 +1009,23 @@
                           IN ULONGLONG MaxOffset,
                           IN ULONGLONG MaxSector)
 {
-    ULONGLONG endingSector;
+    ULONGLONG EndingSector;
     PAGED_CODE();
     /* Unused partitions are considered valid */
     if (Entry->PartitionType == PARTITION_ENTRY_UNUSED) return TRUE;
     /* Get the last sector of the partition */
-    endingSector = GET_STARTING_SECTOR(Entry) +
-                   GET_PARTITION_LENGTH(Entry);
+    EndingSector = GET_STARTING_SECTOR(Entry) +  GET_PARTITION_LENGTH(Entry);
     /* Check if it's more then the maximum sector */
-    if (endingSector > MaxSector)
+    if (EndingSector > MaxSector)
     {
         /* Invalid partition */
         DPRINT1("FSTUB: entry is invalid\n");
         DPRINT1("FSTUB: offset %#08lx\n", GET_STARTING_SECTOR(Entry));
         DPRINT1("FSTUB: length %#08lx\n", GET_PARTITION_LENGTH(Entry));
-        DPRINT1("FSTUB: end %#I64x\n", endingSector);
+        DPRINT1("FSTUB: end %#I64x\n", EndingSector);
         DPRINT1("FSTUB: max %#I64x\n", MaxSector);
         return FALSE;
     }
@@ -1036,7 +1035,7 @@
         DPRINT1("FSTUB: entry is invalid\n");
         DPRINT1("FSTUB: offset %#08lx\n", GET_STARTING_SECTOR(Entry));
         DPRINT1("FSTUB: length %#08lx\n", GET_PARTITION_LENGTH(Entry));
-        DPRINT1("FSTUB: end %#I64x\n", endingSector);
+        DPRINT1("FSTUB: end %#I64x\n", EndingSector);
         DPRINT1("FSTUB: maxOffset %#I64x\n", MaxOffset);
         return FALSE;
     }
@@ -1055,59 +1054,69 @@
                        IN ULONG ConventionalCylinders,
                        OUT PPARTITION_DESCRIPTOR PartitionDescriptor)
 {
-    LARGE_INTEGER FirstSector, SectorCount, LastSector;
-    ULONG SectorsPerCylinder, StartCluster, EndCluster;
-    ULONG StartHead, EndHead;
-    ULONG StartSector, EndSector;
-    ULONG Remainder;
+    LARGE_INTEGER FirstSector, SectorCount;
+    ULONG LastSector, Remainder, SectorsPerCylinder;
+    ULONG StartingCylinder, EndingCylinder;
+    ULONG StartingTrack, EndingTrack;
+    ULONG StartingSector, EndingSector;
     PAGED_CODE();
     /* Calculate the number of sectors for each cylinder */
     SectorsPerCylinder = SectorsPerTrack * NumberOfTracks;
-    /* Calculate the start and end sector, as well as the count */
+    /* Calculate the first sector, and the sector count */
     FirstSector.QuadPart = PartitionOffset->QuadPart >> ShiftCount;
     SectorCount.QuadPart = PartitionLength->QuadPart >> ShiftCount;
-    LastSector.QuadPart = FirstSector.QuadPart + SectorCount.QuadPart - 1;
-
-    /* Calculate the start and end clusters */
-    StartCluster = FirstSector.LowPart / SectorsPerCylinder;
-    EndCluster = LastSector.LowPart / SectorsPerCylinder;
+
+    /* Now calculate the last sector */
+    LastSector = FirstSector.LowPart + SectorCount.LowPart - 1;
+
+    /* Calculate the first and last cylinders */
+    StartingCylinder = FirstSector.LowPart / SectorsPerCylinder;
+    EndingCylinder = LastSector / SectorsPerCylinder;
     /* Set the default number of cylinders */
     if (!ConventionalCylinders) ConventionalCylinders = 1024;
     /* Normalize the values */
-    if (StartCluster >= ConventionalCylinders)
+    if (StartingCylinder >= ConventionalCylinders)
     {
         /* Set the maximum to 1023 */
-        StartCluster = ConventionalCylinders - 1;
-    }
-    if (EndCluster >= ConventionalCylinders)
+        StartingCylinder = ConventionalCylinders - 1;
+    }
+    if (EndingCylinder >= ConventionalCylinders)
     {
         /* Set the maximum to 1023 */
-        EndCluster = ConventionalCylinders - 1;
+        EndingCylinder = ConventionalCylinders - 1;
     }
     /* Calculate the starting head and sector that still remain */
-    Remainder = StartCluster % SectorsPerCylinder;
-    StartHead = Remainder / SectorsPerTrack;
-    StartSector = Remainder % SectorsPerTrack;
+    Remainder = FirstSector.LowPart % SectorsPerCylinder;
+    StartingTrack = Remainder / SectorsPerTrack;
+    StartingSector = Remainder % SectorsPerTrack;
     /* Calculate the ending head and sector that still remain */
-    Remainder = EndCluster % SectorsPerCylinder;
-    EndHead = Remainder / SectorsPerTrack;
-    EndSector = Remainder % SectorsPerTrack;
-
-    /* Write the values in the descriptor */
-    PartitionDescriptor->StartingCylinderMsb = StartCluster;
-    PartitionDescriptor->EndingCylinderMsb = EndCluster;
-    PartitionDescriptor->StartingTrack = StartHead;
-    PartitionDescriptor->EndingTrack = EndHead;
-    PartitionDescriptor->StartingCylinderLsb =  ((StartSector + 1) & 0x3F) |
-                                                ((StartCluster >> 2) & 0xC0);
-    PartitionDescriptor->EndingCylinderLsb = ((EndSector + 1) & 0x3F) |
-                                             ((EndCluster >> 2) & 0xC0);
+    Remainder = LastSector % SectorsPerCylinder;
+    EndingTrack = Remainder / SectorsPerTrack;
+    EndingSector = Remainder % SectorsPerTrack;
+
+    /* Set cylinder data for the MSB */
+    PartitionDescriptor->StartingCylinderMsb = (UCHAR)StartingCylinder;
+    PartitionDescriptor->EndingCylinderMsb = (UCHAR)EndingCylinder;
+
+    /* Set the track data */
+    PartitionDescriptor->StartingTrack = (UCHAR)StartingTrack;
+    PartitionDescriptor->EndingTrack = (UCHAR)EndingTrack;
+
+    /* Update cylinder data for the LSB */
+    StartingCylinder = ((StartingSector + 1) & 0x3F) |
+                       ((StartingCylinder >> 2) & 0xC0);
+    EndingCylinder = ((EndingSector + 1) & 0x3F) |
+                     ((EndingCylinder >> 2) & 0xC0);
+
+    /* Set the cylinder data for the LSB */
+    PartitionDescriptor->StartingCylinderLsb = (UCHAR)StartingCylinder;
+    PartitionDescriptor->EndingCylinderLsb = (UCHAR)EndingCylinder;
 }
 VOID
@@ -1338,6 +1347,7 @@
     PIO_STACK_LOCATION IoStackLocation;
     PBOOT_SECTOR_INFO BootSectorInfo = (PBOOT_SECTOR_INFO)Buffer;
     UCHAR PartitionType;
+    LARGE_INTEGER HiddenSectors64;
     VolumeOffset.QuadPart = Offset.QuadPart = 0;
     PAGED_CODE();
@@ -1584,18 +1594,19 @@
                 PartitionInfo->StartingOffset.QuadPart =
                     StartOffset +
                     UInt32x32To64(GET_STARTING_SECTOR(PartitionDescriptor),
-                    SectorSize);
+                                  SectorSize);
                 /* Calculate the number of hidden sectors */
-                PartitionInfo->HiddenSectors = (PartitionInfo->
-                                                StartingOffset.QuadPart -
-                                                StartOffset) /
-                                                SectorSize;
+                HiddenSectors64.QuadPart = (PartitionInfo->
+                                            StartingOffset.QuadPart -
+                                            StartOffset) /
+                                            SectorSize;
+                PartitionInfo->HiddenSectors = HiddenSectors64.LowPart;
                 /* Get the partition length */
                 PartitionInfo->PartitionLength.QuadPart =
                     UInt32x32To64(GET_PARTITION_LENGTH(PartitionDescriptor),
-                    SectorSize);
+                                  SectorSize);
                 /* FIXME: REACTOS HACK */
                 PartitionInfo->PartitionNumber = i + 1;
@@ -1845,9 +1856,9 @@
             if (++i == PartitionNumber)
             {
                 /* We found a match, set the type */
-                PartitionDescriptor->PartitionType = PartitionType;
-
-                /* Reset the resusable event */
+                PartitionDescriptor->PartitionType = (UCHAR)PartitionType;
+
+                /* Reset the reusable event */
                 KeResetEvent(&Event);
                 /* Build the write IRP */
@@ -1947,7 +1958,8 @@
     PPARTITION_TABLE PartitionTable;
     LARGE_INTEGER Offset, NextOffset, ExtendedOffset, SectorOffset;
     LARGE_INTEGER StartOffset, PartitionLength;
-    ULONG i, j, k;
+    ULONG i, j;
+    CCHAR k;
     BOOLEAN IsEzDrive = FALSE, IsSuperFloppy = FALSE, DoRewrite = FALSE, IsMbr;
     ULONG ConventionalCylinders;
     LONGLONG DiskSize;
@@ -1957,7 +1969,7 @@
     PIO_STACK_LOCATION IoStackLocation;
     PPARTITION_INFORMATION PartitionInfo = PartitionBuffer->PartitionEntry;
     PPARTITION_INFORMATION TableEntry;
-    NextOffset.QuadPart = Offset.QuadPart = 0;
+    ExtendedOffset.QuadPart = NextOffset.QuadPart = Offset.QuadPart = 0;
     PAGED_CODE();
     /* Normalize the buffer size */
@@ -2011,14 +2023,15 @@
     Buffer = ExAllocatePoolWithTag(NonPagedPool, PAGE_SIZE, TAG_FILE_SYSTEM);
     if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES;
+    /* Loop the entries */
     Entry = (PPTE)&Buffer[PARTITION_TABLE_OFFSET];
     for (i = 0; i < DiskLayout->TableCount; i++)
     {
         /* Set if this is the MBR partition */
-        IsMbr= !i;
+        IsMbr= (BOOLEAN)!i;
         /* Initialize th event */
-        KeInitializeEvent( &Event, NotificationEvent, FALSE );
+        KeInitializeEvent(&Event, NotificationEvent, FALSE);
         /* Build the read IRP */
         Irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,