|
|
/*++
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); }
|