// ù Ä ÄÄÄÄÍÍ = Ä ù Ä = ÍÍÄÄÄÄ Ä ù // ³ ³ // ÜÛÛÛÛÛÛÛÜ ÜÛÜ ÜÛÛÛÛÛÛÛÛÜ ú úÄÄÄÍÄÄÍÄÍÍÄÄÍÍÍÍÄÍÍÍÍÍÍÍÍÍÎÄ // ³ ÛÛÛÛßßßÛÛÛÛ ÛÛÛÛÛ ÛÛÛß ßÛÛÛ ³ AiR-BOOT - Installer/2 º // º ÛÛÛÛÜÜÜÛÛÛÛ ÛÛÛÛÛ ÛÛÛÜ ÜÛÛÛ º ú ÄÄÄÄÍÄÍÍÄÄÍÍÍÍÄÍÍÍÍÍÍÍÍÄÍÍÍÍÍÎÄ // º ÛÛÛÛÛÛÛÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛÛÛÛÛÛß º Section: AiR-BOOTUP Package º // º ÛÛÛÛ ÛÛÛÛ ÛÛÛÛÛ ÛÛÛÛ ßÛÛÛÛÜ º ³ Created: 24/10/02 º // ³ ßÛÛß ßÛÛß ßÛß ßÛÛß ßÛÛß ³ ³ Last Modified: ³ // ÜÜÜ ³ Number Of Modifications: 000 ³ // ù ÜÛÛß ù ³ INCs required: *none* ³ // ÄÄÄÄÄÄÄ ÜÛÛß º Written By: Martin Kiewitz ³ // ³ Ú¿Ú¿³ÜÛÛÛÜÜÛÛÛÜ ³ º (c) Copyright by ³ // º ÀÙ³ÀÙßÛÛÛßßÜÛÛß º º AiR ON-Line Software '02 ú // º ÄÄÄÄÄÄÄ ÜÛÛÝ º º All rights reserved. // º ÜÛÛÛÄÄÄÄÄÄÄÄÄ º ÄÎÍÍÍÄÍÍÍÍÍÄÍÍÍÍÄÍÍÄÄÍÄÄÍÄÄÄúÄÄ ú // º ÜÛÛÛݳ ³Ú¿³³Ä º // ³ ÜÛÛÛÛ Àij³ÀÙ³Ä ³ // ßÛÛÛÛÝÄÄÄÄÄÄÄÄÄÄ // ³ ßß ³ // ù Ä´-=’iç éï-Liïî SéŸâW’çî=-ÃÄÄ ù #define INCL_NOPMAPI #define INCL_DOS #define INCL_DOSDEVIOCTL #include #include #include USHORT PHYS_EnumeratePhysicalDisks (void) { USHORT NumDrives = 0; if (DosPhysicalDisk(INFO_COUNT_PARTITIONABLE_DISKS, &NumDrives, sizeof(NumDrives),NULL, 0) != 0) return 0; return NumDrives; } USHORT PHYS_GetIOCTLHandle (PSZ DriveID) { USHORT IOCTLHandle = 0; if (DosPhysicalDisk(INFO_GETIOCTLHANDLE, &IOCTLHandle, sizeof(IOCTLHandle),DriveID, 3) != 0) return 0; return IOCTLHandle; } VOID PHYS_FreeIOCTLHandle (USHORT IOCTLHandle) { DosPhysicalDisk(INFO_FREEIOCTLHANDLE, NULL, 0, &IOCTLHandle, sizeof(IOCTLHandle)); return; } BOOL PHYS_ReadPhysicalSector (USHORT IOCTLHandle, UCHAR Cylinder, UCHAR Head, UCHAR SectorCount, PBYTE BufferPtr) { ULONG TrackLayoutLen = sizeof(TRACKLAYOUT)+sizeof(ULONG)*(SectorCount-1); TRACKLAYOUT *TrackLayoutPtr = malloc(TrackLayoutLen); ULONG cbParms = sizeof(TrackLayoutPtr); ULONG cbData = 512; INT i; TrackLayoutPtr->bCommand = 0x01; TrackLayoutPtr->usHead = Head; TrackLayoutPtr->usCylinder = Cylinder; TrackLayoutPtr->usFirstSector = 0; TrackLayoutPtr->cSectors = SectorCount; for (i=0; iTrackTable[i].usSectorNumber = i+1; TrackLayoutPtr->TrackTable[i].usSectorSize = 512; } i = 1; if (DosDevIOCtl(IOCTLHandle, IOCTL_PHYSICALDISK, PDSK_READPHYSTRACK, TrackLayoutPtr, cbParms, &cbParms, BufferPtr, cbData, &cbData)) i = 0; free (TrackLayoutPtr); return i; } BOOL PHYS_WritePhysicalSector (USHORT IOCTLHandle, UCHAR Cylinder, UCHAR Head, UCHAR SectorCount, PBYTE BufferPtr) { ULONG TrackLayoutLen = sizeof(TRACKLAYOUT)+sizeof(ULONG)*(SectorCount-1); TRACKLAYOUT *TrackLayoutPtr = malloc(TrackLayoutLen); ULONG cbParms = sizeof(TrackLayoutPtr); ULONG cbData = 512; INT i; TrackLayoutPtr->bCommand = 0x01; TrackLayoutPtr->usHead = Head; TrackLayoutPtr->usCylinder = Cylinder; TrackLayoutPtr->usFirstSector = 0; TrackLayoutPtr->cSectors = SectorCount; for (i=0; iTrackTable[i].usSectorNumber = i+1; TrackLayoutPtr->TrackTable[i].usSectorSize = 512; } i = 1; if (DosDevIOCtl(IOCTLHandle, IOCTL_PHYSICALDISK, PDSK_WRITEPHYSTRACK, TrackLayoutPtr, cbParms, &cbParms, BufferPtr, cbData, &cbData)) i = 0; free (TrackLayoutPtr); return i; } USHORT PHYS_GetGeometrySectorsPerTrack (USHORT IOCTLHandle) { DEVICEPARAMETERBLOCK DeviceParmBlock; ULONG ulDataLength; if (!DosDevIOCtl(IOCTLHandle, IOCTL_PHYSICALDISK, PDSK_GETPHYSDEVICEPARAMS, NULL, 0, NULL, &DeviceParmBlock, sizeof(DeviceParmBlock), &ulDataLength)) return DeviceParmBlock.cSectorsPerTrack; return 0; } USHORT PHYS_GetGeometryHeadsPerCylinder (USHORT IOCTLHandle) { DEVICEPARAMETERBLOCK DeviceParmBlock; ULONG ulDataLength; if (!DosDevIOCtl(IOCTLHandle, IOCTL_PHYSICALDISK, PDSK_GETPHYSDEVICEPARAMS, NULL, 0, NULL, &DeviceParmBlock, sizeof(DeviceParmBlock), &ulDataLength)) return DeviceParmBlock.cHeads; return 0; }