home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / m / m003_1 / sdk_dos.ddi / C / TC / INCLUDE / LOADDRV.C
Encoding:
C/C++ Source or Header  |  1991-10-25  |  5.1 KB  |  135 lines

  1. /* ------------------------------------------------------------------------ */
  2. /*  @@ Usage                                         *** TC Version ***     */
  3. /*                                                                          */
  4. /*  Copyright (c) Creative Technology Pte Ltd, 1991. All rights reserved.   */
  5. /*                                                                          */
  6. /*   char far *LoadDriver (char *szDrvName)                                 */
  7. /*                                                                          */
  8. /*   DESCRIPTION:                                                           */
  9. /*       Loads driver into memory with the driver name specified. The       */
  10. /*       driver is always loaded to the offset 0 of a segement.             */
  11. /*                                                                          */
  12. /*   ENTRY:                                                                 */
  13. /*       szDrvName :- Driver name to be loaded.                             */
  14. /*                                                                          */
  15. /*   EXIT:                                                                  */
  16. /*       Pointer to the loaded driver if successful, else returns NULL      */
  17. /*                                                                          */
  18. /* ------------------------------------------------------------------------ */
  19.  
  20. #include  <dir.h>
  21. #include  <stdlib.h>
  22. #include  <io.h>
  23. #include  <fcntl.h>
  24. #include  <dos.h>
  25. #include  <string.h>
  26.  
  27. char far *LoadDriver (char *szDrvName)
  28. {
  29.     char        far *lpDrvPtr = 0 ;
  30.     char        far *lpPtr ;
  31.     char        szDrvFile[100] ;
  32.     char        *pPtr ;
  33.     int         Handle = 1, NotDone = 1;
  34.     unsigned    wDrvSize, wTemp, wDrvSeg ;
  35.     struct ffblk     stFile ;
  36.  
  37.  
  38.     /* set the default file mode to binary mode */
  39.     _fmode = O_BINARY;
  40.  
  41.     /* locate driver through environment parameter */
  42.     if ((pPtr = getenv("SOUND")) != 0)
  43.     {
  44.         strcat(strcpy(szDrvFile,pPtr),"\\DRV\\") ;
  45.         strcat(szDrvFile,szDrvName);
  46.  
  47.         /* NotDone set to 0, if found */
  48.         NotDone = findfirst(szDrvFile,&stFile,0) ;
  49.      }
  50.  
  51.      /* locate driver in current directory */
  52.      if (NotDone)
  53.      {
  54.         strcpy(szDrvFile,szDrvName) ;
  55.  
  56.         /* NotDone set to 0, if found */
  57.         NotDone = findfirst(szDrvFile,&stFile,0) ;
  58.      }
  59.  
  60.      if (NotDone)
  61.         printf("Driver file does not exist.\n") ;
  62.      else
  63.      {
  64.         if ((Handle=_open(szDrvFile,O_RDONLY)) == -1)
  65.             printf("Open %s error.\n",szDrvFile) ;
  66.         else
  67.         {
  68.             wDrvSize = (unsigned) filelength(Handle) ;
  69.  
  70.             if ( allocmem((unsigned)((wDrvSize + 15) >> 4),&wDrvSeg) == -1 )
  71.             {
  72.                 lpDrvPtr = (char far *)((unsigned long)wDrvSeg << 16);
  73.                 lpPtr = lpDrvPtr;
  74.  
  75.                 if ( DosReadDrv(Handle,lpPtr,wDrvSize,&wTemp) == 0 )
  76.                 {
  77.                     freemem(wDrvSeg) ;
  78.                     lpDrvPtr = 0 ;
  79.                 }
  80.             }
  81.             else
  82.                 printf("Memory allocation error.\n");
  83.  
  84.            _close(Handle) ;
  85.         }
  86.     }
  87.  
  88.  
  89.     return(lpDrvPtr) ;
  90. }
  91.  
  92.  
  93. /* ------------------------------------------------------------------------ */
  94. /*  @@ Usage                                                                */
  95. /*                                                                          */
  96. /*   DosReadDrv (int Handle, char far *Buffer,                              */
  97. /*                unsigned wLen, unsigned *lpByteRead)                      */
  98. /*                                                                          */
  99. /*   DESCRIPTION:                                                           */
  100. /*       Read driver to buffer using DOS interrupt 0x21 function 0x3F.      */
  101. /*                                                                          */
  102. /*   ENTRY:                                                                 */
  103. /*       Handle :- File handle to read.                                     */
  104. /*       Buffer :- Buffer to write to.                                      */
  105. /*       wLen   :- Number of byte to read.                                  */
  106. /*       lpByteRead :- pointer to number of byte actually read.             */
  107. /*                                                                          */
  108. /*   EXIT:                                                                  */
  109. /*       Byte read if successful, else returns 0.                           */
  110. /*                                                                          */
  111. /* ------------------------------------------------------------------------ */
  112.  
  113. DosReadDrv (int Handle, char far *Buffer, unsigned wLen, unsigned *wByteRead)
  114. {
  115.     union REGS regs;
  116.     struct SREGS segregs;
  117.  
  118.  
  119.     regs.h.ah = 0x3f ;
  120.     regs.x.bx = Handle;
  121.     regs.x.dx = FP_OFF(Buffer);
  122.     regs.x.cx = wLen;
  123.     segregs.ds = FP_SEG(Buffer);
  124.  
  125.     intdosx(®s, ®s, &segregs);
  126.  
  127.     if(regs.x.cflag)    /* error */
  128.         *wByteRead = 0;
  129.     else
  130.         *wByteRead = regs.x.ax ;
  131.  
  132.  
  133.     return(*wByteRead);
  134. }
  135.