* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <freeldr.h>
ULONGLONG SectorOffset = 0;
ULONGLONG SectorCount = 0;
PARTITION_TABLE_ENTRY PartitionTableEntry;
+ GEOMETRY Geometry;
+ EXTENDED_GEOMETRY ExtGeometry;
CHAR FileName[1];
if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
return EINVAL;
- SectorSize = (DrivePartition == 0xff ? 2048 : 512);
+
+ ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
+ if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size))
+ {
+ SectorSize = ExtGeometry.BytesPerSector;
+ SectorCount = ExtGeometry.Sectors;
+ }
+ else if (MachDiskGetDriveGeometry(DriveNumber, &Geometry))
+ {
+ SectorSize = Geometry.BytesPerSector;
+ SectorCount = Geometry.Sectors;
+ }
+ else
+ return EINVAL;
+
if (DrivePartition != 0xff && DrivePartition != 0)
{
- if (!MachDiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry))
+ if (!DiskGetPartitionEntry(DriveNumber, DrivePartition, &PartitionTableEntry))
return EINVAL;
SectorOffset = PartitionTableEntry.SectorCountBeforePartition;
SectorCount = PartitionTableEntry.PartitionSectorCount;
}
- else
- {
- SectorCount = 0; /* FIXME */
- }
Context = MmHeapAlloc(sizeof(DISKCONTEXT));
if (!Context)
/* Add partitions */
i = 1;
DiskReportError(FALSE);
- while (MachDiskGetPartitionEntry(DriveNumber, i, &PartitionTableEntry))
+ while (DiskGetPartitionEntry(DriveNumber, i, &PartitionTableEntry))
{
if (PartitionTableEntry.SystemIndicator != PARTITION_ENTRY_UNUSED)
{
//
// Return number of disks
//
- DPRINTM(DPRINT_HWDETECT, "Retrieving %lu INT13 disks\\0\n");
+ DPRINTM(DPRINT_HWDETECT, "Retrieving %lu INT13 disks\\0\n", DiskCount);
return DiskCount;
};
DiskIsDriveRemovable(BootDrive))
{
/* TODO: Check if it's really a cdrom drive */
+ ULONG* Buffer;
+ ULONG Checksum = 0;
+
+ /* Read the MBR */
+ if (!MachDiskReadLogicalSectors(BootDrive, 16ULL, 1, (PVOID)DISKREADBUFFER))
+ {
+ DPRINTM(DPRINT_HWDETECT, "Reading MBR failed\n");
+ return;
+ }
+
+ Buffer = (ULONG*)DISKREADBUFFER;
+
+ /* Calculate the MBR checksum */
+ for (i = 0; i < 2048 / sizeof(ULONG); i++) Checksum += Buffer[i];
+ DPRINTM(DPRINT_HWDETECT, "Checksum: %x\n", Checksum);
+
+ /* Fill out the ARC disk block */
+ reactos_arc_disk_info[reactos_disk_count].CheckSum = Checksum;
+ strcpy(reactos_arc_strings[reactos_disk_count], BootPath);
+ reactos_arc_disk_info[reactos_disk_count].ArcName =
+ reactos_arc_strings[reactos_disk_count];
+ reactos_disk_count++;
+
FsRegisterDevice(BootPath, &DiskVtbl);
}
}