windows-nt/Source/XPSP1/NT/base/ntsetup/mpk/misclib/disksel.c

141 lines
2.9 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
disksel.c
Abstract:
Routine to allow the user to select a disk
from a list of disks. The UI is a simple character-based
deal.
Author:
Ted Miller (tedm) 29-May-1997
Revision History:
--*/
#include <mytypes.h>
#include <misclib.h>
#include <diskio.h>
#include <partimag.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef
BOOL
(*PDISKSEL_VALIDATION_ROUTINE) (
IN USHORT DiskId
);
INT
_far
SelectDisk(
IN UINT DiskCount,
IN FPCHAR Prompt,
IN PDISKSEL_VALIDATION_ROUTINE Validate, OPTIONAL
OUT char *AlternateResponse, OPTIONAL
IN FPCHAR textDisk,
IN FPCHAR textPaddedMbCount,
IN FPCHAR textInvalidSelection,
IN FPCHAR textMasterDisk
)
{
UINT i,l;
BYTE Int13Unit;
BYTE SectorsPerTrack;
USHORT Heads;
USHORT Cylinders;
ULONG SectorCount;
UINT Selection;
CHAR line[256];
FPVOID Buffer,OriginalBuffer;
if(!AllocTrackBuffer(1,&Buffer,&OriginalBuffer)) {
Buffer = NULL;
OriginalBuffer = NULL;
}
select:
printf("\n\n");
for(i=0; i<DiskCount; i++) {
if(Validate ? Validate(i) : TRUE) {
printf("%2u) ",i+1);
GetDiskInfoById(
i,
0,
&Int13Unit,
&SectorsPerTrack,
&Heads,
&Cylinders,
&SectorCount
);
if(!SectorCount) {
SectorCount = (ULONG)Heads * (ULONG)Cylinders * (ULONG)SectorsPerTrack;
}
printf(" ");
if(Int13Unit) {
printf(textDisk);
printf(" ");
printf("%2x",Int13Unit);
} else {
l = strlen(textDisk) + 3;
while(l) {
printf(" ");
l--;
}
}
printf(" ");
printf(textPaddedMbCount,SectorCount / 2048);
if(Buffer && IsMasterDisk(i,Buffer)) {
printf(" %s",textMasterDisk);
}
printf("\n");
}
}
printf("\n%s ",Prompt);
gets(line);
Selection = atoi(line);
if(!Selection || (Selection > DiskCount)) {
if(AlternateResponse) {
strcpy(AlternateResponse,line);
if(OriginalBuffer) {
free(OriginalBuffer);
}
return(-1);
} else {
printf("\n\n%s\n",textInvalidSelection);
goto select;
}
}
if(Validate && !Validate(Selection-1)) {
printf("\n\n%s\n",textInvalidSelection);
goto select;
}
if(OriginalBuffer) {
free(OriginalBuffer);
}
return(Selection-1);
}