void RestoreConfig() { int n; char *envname; char envbuf[256]; char *name; char *ptr; char buf[80]; SetColor(LIGHTWHITE); SetBackColor(BLUE); OpenWindow(10,10,3,60); SetColor(YELLOW); Print_At(10,13," Restore Predefined Configuration "); SetColor(LIGHTWHITE); Print_At(11,12,"Enter file name:"); name=InputString(11,30,37,cfgfilename); if(name!=NULL && name[0]!=0) { strcpy(buf,name); ptr=(char *)strchr(buf,'.'); if(ptr!=NULL) strset(ptr,0); strcpy(cfgfilename,buf); strcat(buf,".d32"); n=open(buf,O_RDONLY | O_BINARY); if(n==-1) { envname=getenv("DOS32A"); if(envname!=NULL) { ptr=strchr(envname,' '); if(ptr==NULL) ptr=strchr(envname,0); memset(envbuf,0,256); strncpy(envbuf,envname,(dword)ptr-(dword)envname); strcat(envbuf,"\\D32\\"); strcat(envbuf,buf); n=open(envbuf,O_RDWR | O_BINARY); } } if(n!=-1) { read(n,&id32,24); close(n); SetColor(LIGHTWHITE); SetBackColor(BLUE); strupr(buf); for(n=0; n<13; n++) { SetPos(24,66+n); PrintC(' '); } Print_At(24,66,"%.13s",buf); } else DiskError(); } ValidateConfig(); CloseWindow(); if(mainmenu_sel==1) ShowBannerStatus(); }
void CreateConfig() { int n; char *name; char *ptr; char buf[80]; SetColor(LIGHTWHITE); SetBackColor(BLUE); OpenWindow(10,10,3,60); SetColor(YELLOW); Print_At(10,13," Create Predefined Configuration "); SetColor(LIGHTWHITE); Print_At(11,12,"Enter file name:"); name=InputString(11,30,37,cfgfilename); if(name!=NULL && name[0]!=0) { strcpy(buf,name); ptr=(char *)strchr(buf,'.'); if(ptr!=NULL) strset(ptr,0); strcpy(cfgfilename,buf); strcat(buf,".D32"); n=open(buf,O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRWXU); if(n!=-1) { write(n,&id32,24); close(n); SetColor(LIGHTWHITE); SetBackColor(BLUE); strupr(buf); for(n=0; n<13; n++) { SetPos(24,66+n); PrintC(' '); } Print_At(24,66,"%.13s",buf); } else DiskError(); } CloseWindow(); }
static BOOLEAN PcDiskReadLogicalSectorsCHS(UCHAR DriveNumber, ULONGLONG SectorNumber, ULONG SectorCount, PVOID Buffer) { UCHAR PhysicalSector; UCHAR PhysicalHead; ULONG PhysicalTrack; GEOMETRY DriveGeometry; ULONG NumberOfSectorsToRead; REGS RegsIn, RegsOut; ULONG RetryCount; TRACE("PcDiskReadLogicalSectorsCHS()\n"); /* Get the drive geometry */ if (!MachDiskGetDriveGeometry(DriveNumber, &DriveGeometry) || DriveGeometry.Sectors == 0 || DriveGeometry.Heads == 0) { return FALSE; } while (SectorCount) { /* * Calculate the physical disk offsets. * Note: DriveGeometry.Sectors < 64 */ PhysicalSector = 1 + (UCHAR)(SectorNumber % DriveGeometry.Sectors); PhysicalHead = (UCHAR)((SectorNumber / DriveGeometry.Sectors) % DriveGeometry.Heads); PhysicalTrack = (ULONG)((SectorNumber / DriveGeometry.Sectors) / DriveGeometry.Heads); /* Calculate how many sectors we need to read this round */ if (PhysicalSector > 1) { if (SectorCount >= (DriveGeometry.Sectors - (PhysicalSector - 1))) NumberOfSectorsToRead = (DriveGeometry.Sectors - (PhysicalSector - 1)); else NumberOfSectorsToRead = SectorCount; } else { if (SectorCount >= DriveGeometry.Sectors) NumberOfSectorsToRead = DriveGeometry.Sectors; else NumberOfSectorsToRead = SectorCount; } /* Make sure the read is within the geometry boundaries */ if ((PhysicalHead >= DriveGeometry.Heads) || (PhysicalTrack >= DriveGeometry.Cylinders) || ((NumberOfSectorsToRead + PhysicalSector) > (DriveGeometry.Sectors + 1)) || (PhysicalSector > DriveGeometry.Sectors)) { DiskError("Disk read exceeds drive geometry limits.", 0); return FALSE; } /* * BIOS Int 13h, function 2 - Read Disk Sectors * AH = 02h * AL = number of sectors to read (must be nonzero) * CH = low eight bits of cylinder number * CL = sector number 1-63 (bits 0-5) * high two bits of cylinder (bits 6-7, hard disk only) * DH = head number * DL = drive number (bit 7 set for hard disk) * ES:BX -> data buffer * Return: * CF set on error * if AH = 11h (corrected ECC error), AL = burst length * CF clear if successful * AH = status * AL = number of sectors transferred * (only valid if CF set for some BIOSes) */ RegsIn.b.ah = 0x02; RegsIn.b.al = (UCHAR)NumberOfSectorsToRead; RegsIn.b.ch = (PhysicalTrack & 0xFF); RegsIn.b.cl = (UCHAR)(PhysicalSector + ((PhysicalTrack & 0x300) >> 2)); RegsIn.b.dh = PhysicalHead; RegsIn.b.dl = DriveNumber; RegsIn.w.es = (USHORT)(((ULONG_PTR)Buffer) >> 4); RegsIn.w.bx = ((ULONG_PTR)Buffer) & 0x0F; /* Perform the read. Retry 3 times. */ for (RetryCount=0; RetryCount<3; RetryCount++) { Int386(0x13, &RegsIn, &RegsOut); /* If it worked break out */ if (INT386_SUCCESS(RegsOut)) { break; } /* If it was a corrected ECC error then the data is still good */ else if (RegsOut.b.ah == 0x11) { break; } /* If it failed the do the next retry */ else { DiskResetController(DriveNumber); continue; } } /* If we retried 3 times then fail */ if (RetryCount >= 3) { ERR("Disk Read Failed in CHS mode, after retrying 3 times: %x\n", RegsOut.b.ah); return FALSE; } // I have learned that not all BIOSes return // the sector read count in the AL register (at least mine doesn't) // even if the sectors were read correctly. So instead // of checking the sector read count we will rely solely // on the carry flag being set on error Buffer = (PVOID)((ULONG_PTR)Buffer + (NumberOfSectorsToRead * DriveGeometry.BytesPerSector)); SectorCount -= NumberOfSectorsToRead; SectorNumber += NumberOfSectorsToRead; } return TRUE; }