home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 9 Archive / 09-Archive.zip / PAX20.ZIP / DISKACC.C < prev    next >
C/C++ Source or Header  |  1990-11-12  |  3KB  |  160 lines

  1. /* DISKACC.C
  2.  *
  3.  * Autor:    Kai Uwe Rommel
  4.  * Datum:    Thu 28-Dec-1989
  5.  * Stand:    Thu 04-Jan-1990
  6.  *
  7.  * Compiler: MS C ab 5.00
  8.  * System:   OS/2 ab 1.1
  9.  *
  10.  */
  11.  
  12.  
  13. #define INCL_DOSDEVICES
  14. #define INCL_DOSDEVIOCTL
  15. #define INCL_NOPM
  16. #include <os2.h>
  17.  
  18. #include "diskacc.h" 
  19.  
  20. int _acrtused = 0;
  21.  
  22.  
  23. typedef struct
  24. {
  25.   BYTE   bCommand;
  26.   USHORT usHead;
  27.   USHORT usCylinder;
  28.   USHORT usFirstSector;
  29.   USHORT cSectors;
  30.   struct
  31.   {
  32.     USHORT usSectorNumber;
  33.     USHORT usSectorSize;
  34.   }
  35.   TrackTable[20];
  36. }
  37. TRACK;
  38.  
  39.  
  40. static int test_sector(int handle, int side, int track, int sector)
  41. {
  42.   char buffer[1024];
  43.   TRACK trk;
  44.  
  45.   trk.bCommand      = 0;
  46.   trk.usHead        = side;
  47.   trk.usCylinder    = track;
  48.   trk.usFirstSector = 0;
  49.   trk.cSectors      = 1;
  50.  
  51.   trk.TrackTable[0].usSectorNumber = sector;
  52.   trk.TrackTable[0].usSectorSize   = 512;
  53.  
  54.   return (DosDevIOCtl(buffer, &trk, DSK_READTRACK, IOCTL_DISK, handle) == 0);
  55. }
  56.  
  57.  
  58. INT APIENTRY DskOpen(USHORT drive, PUSHORT sides,
  59.                      PUSHORT tracks, PUSHORT sectors)
  60. {
  61.   BIOSPARAMETERBLOCK bpb;
  62.   HFILE handle;
  63.   USHORT action;
  64.   BYTE cmd = 0;
  65.   char name[3];
  66.  
  67.   name[0] = (char) drive + 'A';
  68.   name[1] = ':';
  69.   name[2] = 0;
  70.  
  71.   if ( DosOpen(name, &handle, &action, 0L, FILE_NORMAL, FILE_OPEN,
  72.                OPEN_FLAGS_DASD | OPEN_FLAGS_FAIL_ON_ERROR |
  73.                OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE, 0L) != 0 )
  74.     return -1;
  75.  
  76.   if ( DosDevIOCtl(0L, &cmd, DSK_LOCKDRIVE, IOCTL_DISK, handle) != 0 )
  77.   {
  78.     DosClose(handle);
  79.     return -1;
  80.   }
  81.  
  82.   if ( DosDevIOCtl(&bpb, &cmd, DSK_GETDEVICEPARAMS, IOCTL_DISK, handle) != 0 )
  83.   {
  84.     DosDevIOCtl(0L, &cmd, DSK_UNLOCKDRIVE, IOCTL_DISK, handle);
  85.     DosClose(handle);
  86.     return -1;
  87.   }
  88.  
  89.   *sectors = bpb.usSectorsPerTrack;
  90.   *tracks  = bpb.cCylinders;
  91.   *sides   = bpb.cHeads;
  92.  
  93.   if ( *sectors >= 15 )
  94.     if ( !test_sector(handle, 0, 0, 15) )
  95.     {
  96.       if ( *sectors == 15 )
  97.         *tracks = 40;
  98.  
  99.       *sectors = 9;
  100.     }
  101.  
  102.   return handle;
  103. }
  104.  
  105.  
  106. VOID APIENTRY DskClose(USHORT handle)
  107. {
  108.   BYTE cmd = 0;
  109.  
  110.   DosDevIOCtl(0L, &cmd, DSK_UNLOCKDRIVE, IOCTL_DISK, handle);
  111.   DosClose(handle);
  112. }
  113.  
  114.  
  115. INT APIENTRY DskRead(USHORT handle, USHORT side, USHORT  track,
  116.                      USHORT sector, USHORT nsects, PVOID buf)
  117. {
  118.   TRACK trk;
  119.   int cnt;
  120.  
  121.   trk.bCommand      = 0;
  122.   trk.usHead        = side;
  123.   trk.usCylinder    = track;
  124.   trk.usFirstSector = 0;
  125.   trk.cSectors      = nsects;
  126.  
  127.   for ( cnt = 0; cnt < nsects; cnt++ )
  128.   {
  129.     trk.TrackTable[cnt].usSectorNumber = sector + cnt;
  130.     trk.TrackTable[cnt].usSectorSize   = 512;
  131.   }
  132.  
  133.   return DosDevIOCtl(buf, &trk, DSK_READTRACK, IOCTL_DISK, handle);
  134. }
  135.  
  136.  
  137. INT APIENTRY DskWrite(USHORT handle, USHORT side, USHORT  track,
  138.                       USHORT sector, USHORT nsects, PVOID buf)
  139. {
  140.   TRACK trk;
  141.   int cnt;
  142.  
  143.   trk.bCommand      = 0;
  144.   trk.usHead        = side;
  145.   trk.usCylinder    = track;
  146.   trk.usFirstSector = 0;
  147.   trk.cSectors      = nsects;
  148.  
  149.   for ( cnt = 0; cnt < nsects; cnt++ )
  150.   {
  151.     trk.TrackTable[cnt].usSectorNumber = sector + cnt;
  152.     trk.TrackTable[cnt].usSectorSize   = 512;
  153.   }
  154.  
  155.   return DosDevIOCtl(buf, &trk, DSK_WRITETRACK, IOCTL_DISK, handle);
  156. }
  157.  
  158.  
  159. /* Ende DISKACC.C */
  160.