#include #include #include /* * MSCGET * * Operation: * This collects the CD information for MSCDEX calls 02h,03h and 04h * and stores them in a file for MSCSUB. MSCGET scans all the drives * connected to the PC via MSCDEX. * * Syntax: * MSCGET -v Verbose mode (see MSCDEX calls) * MSCGET -g xxxx Generate data for 02h, 03h & 04h calls, putting * the data in the file called xxxx * * Example: * MSCGET -v -g C:\DATA\MSCSUB.DAT * * Compiler Used: * Borland C++, 3.1 * * Compile: bcc -1 -ml mscmon.c * * Test History: * Works okay on 486's and 386's. I haven't tried it out on any 286's yet. * * Author: Colin Ian King, Templeman Library, University of Kent. * * Modification Record: * 15/03/93 Creation. */ void exit(int foo); struct DHD { char far* next; int devattr; int devstratep; int devintep; char devname[8]; int reserved; char driveletter; char numofunits; }; void lstrncpy(char *ptr1,char far *ptr2, int size) { while (size--) { *ptr1++ = *ptr2++; } *ptr1 = '\0'; } main(int argc, char **argv) { struct DHD far *devhead; struct DDL { char subunit; char far *devhead; } ddl[26]; char filler[100]; char letters[26]; char buffer[38]; char *genname; int verbose = 0; int generate = 0; int drives; int fromdrive; int i, j; FILE *fp; union REGS inregs,outregs; struct SREGS segregs; genname = "MSCSUB.DAT"; if (argc < 2) { fprintf(stderr,"Syntax: MSCGET -v Verbose display of INT2F calls\n"); fprintf(stderr," MSCGET -g file Generate 02h, 03h, 04h information\n"); fprintf(stderr," in file for MSCSUB\n"); } for (i = 1; i=argc) { fprintf(stderr,"Filename required for -g flag\n"); exit(1); } else { generate = 1; genname = argv[i]; if ((fp = fopen(genname,"w")) == NULL) { fprintf(stderr,"Cannot create file %s\n",genname); exit(1); } } } } inregs.x.ax =0x1500; int86x(0x2f, &inregs, &outregs, &segregs); drives = outregs.x.bx; fromdrive = outregs.x.cx; if (verbose) { printf("INT2F, 0x1500, Get Number of CD-ROM Drives,\n"); printf("There are %d CD Drives, Starting from Drive %c\n\n",drives,fromdrive+'A'); } inregs.x.ax = 0x150D; inregs.x.bx = FP_OFF(letters); segregs.es = FP_SEG(letters); int86x(0x2f, &inregs, &outregs, &segregs); if (verbose) { printf("INT2F, 0x150D, Get CD-ROM Drive Letters,\n"); printf("Drives are: "); for (i=0;idevname,8); if (verbose) { printf("\tDevice name = %s\n",buffer); printf("\tDrive letter = %c\n",(int)devhead->driveletter + '@'); printf("\tNo. of units = %d\n",(int)devhead->numofunits); printf("\tNext link = %ld\n",(long)devhead->next); printf("\tThis link = %ld\n",(long)devhead); printf("\tStrategy addr= %d\n",(int)devhead->devstratep); printf("%s", (devhead->devattr && 32768) ? "\t\t Character device\n" : ""); printf("%s", (devhead->devattr && 16384) ? "\t\t IOCTL supported\n" : ""); printf("%s", (devhead->devattr && 2048) ? "\t\t Open/Close/RM supported\n" : ""); // devhead = devhead->next; printf("\n"); } } if (generate) { fprintf(fp,"1502\n"); } for (j=0; j