home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 September / Simtel20_Sept92.cdr / msdos / sysutl / emsuit11.arc / EMSLIST.C < prev    next >
Text File  |  1990-02-22  |  6KB  |  186 lines

  1. /***************************************************************************
  2.  *     EMSLIST vers 1.11, DOS                                              *
  3.  *     Lists EMS handle numbers, names, and pages allocated                *
  4.  *     02/09/90                                                            *
  5.  *     by James W. Birdsall                                                *
  6.  *                                                                         *
  7.  *     compiles under Turbo C 2.0                                          *
  8.  *                                                                         *
  9.  *   EMSLIST lists EMS handle numbers and pages allocated for all versions *
  10.  *   of the LIM EMS specification 3.0 and greater (specifically 3.0, 3.2,  *
  11.  *   and 4.0). For version 4.0, EMSLIST also displays the names, if any,   *
  12.  *   associated with the handles. The character ■ is displayed when no     *
  13.  *   name is associated with a handle.                                     *
  14.  *                                                                         *
  15.  ***************************************************************************/
  16.  
  17. #include <stdio.h>
  18. #include <io.h>
  19. #include <dos.h>
  20.  
  21.  
  22.  
  23. #define VERSION 1.11
  24.  
  25.  
  26.  
  27. char copyright[] = "Copyright (c) 1990 James W. Birdsall. All Rights Reserved";
  28.  
  29.  
  30.  
  31. struct hanbuff {                  /* structure to hold data returned by  */
  32.    unsigned int handle;           /* EMS function 4Dh: Get Pages for All */
  33.    unsigned int pages;            /* Handles                             */
  34.    };
  35.  
  36.  
  37.  
  38. int checkEMM(void);
  39.  
  40.  
  41.  
  42. /***************************************************************************
  43.  *     FUNCTION MAIN                                                       *
  44.  ***************************************************************************/
  45. main(int argc)
  46. {
  47.    int loop;
  48.    int tothand;
  49.    union REGS r;
  50.    struct SREGS s;
  51.    struct hanbuff *buffer;
  52.    char vers;
  53.    char buffer2[9];
  54.  
  55.  
  56.    /* check for arguments */
  57.    if (argc > 1) {
  58.       printf("\n");
  59.       printf("EMSLIST vers %.2f by James W. Birdsall\n", VERSION);
  60.       printf("   Lists active EMS handles, names, and pages for each.\n");
  61.       printf("   Usage: EMSLIST\n");
  62.       printf("\n");
  63.       printf("   EMSLIST lists all active handles, including handle 0 (the\n");
  64.       printf("   OS handle) for LIM EMS versions 3.0 and greater. EMSLIST\n");
  65.       printf("   also displays the names, if any, associated with the\n");
  66.       printf("   handles under version 4.0. If there is no name, ■ is\n");
  67.       printf("   printed.\n\n");
  68.       exit(1);
  69.       }
  70.  
  71.    /* check for functioning EMM */
  72.    if (checkEMM() != 1) {
  73.       printf("EMS manager not present or malfunctioning.\n");
  74.       exit(3);
  75.       }
  76.  
  77.    /* get version */
  78.    r.h.ah = 0x46;
  79.    int86(0x67, &r, &r);
  80.    if (r.h.ah != 0) {
  81.       printf("Error 0x%x talking to EMS manager.\n", r.h.ah);
  82.       exit(3);
  83.       }
  84.    vers = r.h.al;
  85.    /* check version */
  86.    if ((vers >> 4) < 3) {
  87.       printf("EMSLIST requires LIM EMS version 3.0 or greater.\n");
  88.       exit(2);
  89.       }
  90.    /* get number of active handles */
  91.    r.h.ah = 0x4B;
  92.    int86(0x67, &r, &r);
  93.    if (r.h.ah != 0) {
  94.       printf("Error 0x%x talking to EMS manager.\n", r.h.ah);
  95.       exit(3);
  96.       }
  97.    tothand = r.x.bx;
  98.    /* print version, number of active handles */
  99.    printf("LIM EMS %d.%d     ", (vers>>4), (vers&0x0F));
  100.    /* set up vers:  0 if less than 4.0, 1 otherwise */
  101.    vers = ((vers >> 4) <= 4) ? 1 : 0;
  102.    /* get total and free pages */
  103.    r.h.ah = 0x42;
  104.    int86(0x67, &r, &r);
  105.    if (r.h.ah != 0) {
  106.       printf("\nError 0x%x talking to EMS manager.\n", r.h.ah);
  107.       exit(3);
  108.       }
  109.    printf("%d total pages, %d free     ", r.x.dx, r.x.bx);
  110.    printf("%d handles:\n", tothand);
  111.  
  112.    /* allocate buffer for handle/page list */
  113.    if ((buffer = (struct hanbuff *) calloc(tothand, sizeof(struct hanbuff)))
  114.                                                        == NULL) {
  115.       printf("Error allocating memory.\n");
  116.       exit(3);
  117.       }
  118.    /* get list of handles and pages allocated to each */
  119.    r.h.ah = 0x4D;
  120.    r.x.di = (unsigned int) buffer;
  121.    s.es = _DS;
  122.    int86x(0x67, &r, &r, &s);
  123.    if (r.h.ah != 0) {
  124.       printf("Error 0x%x talking to EMS manager.\n", r.h.ah);
  125.       exit(3);
  126.       }
  127.  
  128.    /* print out data */
  129.    buffer2[8] = 0x0;
  130.    for(loop = 0; loop < tothand; loop++) {
  131.       printf("Handle number: %d  ", buffer[loop].handle);
  132.       /* if version 4.0 or greater, get handle name and print */
  133.       if (vers) {
  134.          r.x.ax = 0x5300;
  135.          r.x.dx = buffer[loop].handle;
  136.          r.x.di = (unsigned int) buffer2;
  137.          s.es = _DS;
  138.          int86x(0x67, &r, &r, &s);
  139.          if (r.h.ah != 0) {
  140.             printf("Error 0x%x talking to EMS manager.\n", r.h.ah);
  141.             exit(3);
  142.             }
  143.          /* if handle not named, print ■ */
  144.          if (buffer2[0] == 0x0) {
  145.             buffer2[0] = '■';
  146.             }
  147.          printf("%8s", buffer2);
  148.          }
  149.       printf("   %d page", buffer[loop].pages);
  150.       if (buffer[loop].pages != 1) {
  151.          printf("s");
  152.          }
  153.       printf("\n");
  154.       }
  155.  
  156.    /* cleanup and exit */
  157.    free(buffer);
  158.    exit(0);
  159. } /* end of function main */
  160.  
  161.  
  162. /***************************************************************************
  163.  *     FUNCTION CHECKEMM                                                   *
  164.  *   Checks for function EMM. 1 = OK, 0 = error                            *
  165.  ***************************************************************************/
  166. int checkEMM(void)
  167. {
  168.    FILE *tempfile;
  169.    int temphandle;
  170.  
  171.    /* check if EMM is present */
  172.    if ((tempfile = fopen("EMMXXXX0","rb")) == NULL)
  173.       return 0;
  174.    /* make sure we've found a device and not a file */
  175.    temphandle = fileno(tempfile);
  176.    if ((ioctl(temphandle, 0) & 0x80) != 0x80)
  177.       return 0;
  178.    /* check status of EMM */
  179.    if (ioctl(temphandle, 7) <= 0)
  180.       return 0;
  181.    /* close and return */
  182.    fclose(tempfile);
  183.    return 1;
  184. } /* end of function checkEMM */
  185.  
  186. /* end of file EMSLIST.C */