home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP2 / LASTDRV5.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-09-25  |  2.3 KB  |  90 lines

  1. /* LASTDRV5.C */
  2.  
  3. #include <stdlib.h>
  4. #include <dos.h>
  5.  
  6. #ifndef MK_FP
  7. #define MK_FP(seg,ofs) \
  8.     ((void far *)(((unsigned long)(seg) << 16) | (ofs)))
  9. #endif
  10.  
  11. #pragma pack(1)
  12.  
  13. #define LISTOFLISTS_DECR        12
  14.  
  15. typedef struct {
  16.     unsigned shareretrycount;
  17.     unsigned shareretrydelay;
  18.     void far *currdiskbuff;
  19.     void near *unreadcon;
  20.     unsigned mcb;
  21.     void far *dpb;
  22.     void far *filetable;
  23.     void far *clock;
  24.     void far *con;
  25.     union {
  26.         struct {
  27.             unsigned char numdrive;
  28.             unsigned maxbytes;
  29.             void far *first_diskbuff;
  30.             unsigned char nul[18];
  31.             } dos2;
  32.         struct {
  33.             unsigned char numblkdev;
  34.             unsigned maxbytes;
  35.             void far *first_diskbuff;
  36.             void far *currdir;
  37.             unsigned char lastdrive;
  38.             void far *stringarea;
  39.             unsigned size_stringarea;
  40.             void far *fcbtab;
  41.             unsigned fcb_y;
  42.             unsigned char nul[18];
  43.             } dos30;
  44.         struct {
  45.             unsigned maxbytes;
  46.             void far *diskbuff;
  47.             void far *currdir;
  48.             void far *fcb;
  49.             unsigned numprotfcb;
  50.             unsigned char numblkdev;
  51.             unsigned char lastdrive;
  52.             unsigned char nul[18];
  53.             unsigned numjoin;
  54.             } dos31;    /* and higher */
  55.         } vers;
  56.     } ListOfLists; 
  57.  
  58. main()
  59. {
  60.     union REGS r;
  61.     struct SREGS s;
  62.     ListOfLists far *doslist;
  63.     unsigned lastdrive;
  64.  
  65.     /* No List Of Lists in DOS 1.x */
  66.     if (_osmajor < 2)
  67.         return 0;
  68.  
  69.     /* Get DOS List Of Lists */
  70.     r.h.ah = 0x52;
  71.     segread(&s);
  72.     s.es = r.x.bx = 0;
  73.     intdosx(&r, &r, &s);
  74.     if (! s.es && ! r.x.bx)
  75.         return 0;
  76.     doslist = MK_FP(s.es, r.x.bx - LISTOFLISTS_DECR);
  77.  
  78.     /* Get LASTDRIVE value, depending on DOS version */
  79.     if (_osmajor == 3 && _osminor == 0)
  80.         lastdrive = doslist->vers.dos30.lastdrive;
  81.     else if (_osmajor == 2)
  82.         lastdrive = doslist->vers.dos2.numdrive;
  83.     else
  84.         lastdrive = doslist->vers.dos31.lastdrive;
  85.  
  86.     /* print LASTDRIVE letter, return LASTDRIVE number */
  87.     printf("LASTDRIVE=%c\n", 'A' - 1 + lastdrive);
  88.     return lastdrive;
  89. }
  90.