diff --git a/hdr/device.h b/hdr/device.h index f8f2f5e..6a35f61 100644 --- a/hdr/device.h +++ b/hdr/device.h @@ -366,6 +366,19 @@ typedef struct { struct { unsigned char _r_ndbyte; /* Byte Read From Device */ } _r_nd; + struct { + UBYTE _r_cat; /* Category code */ + UBYTE _r_fun; /* Function code */ + UBYTE unused[4]; /* SI or DI contents or DS:reqhdr */ + union + { + struct gblkio FAR *_r_io; + struct gblkrw FAR *_r_rw; + struct gblkfv FAR *_r_fv; + struct Gioc_media FAR *_r_gioc; + struct Access_info FAR *_r_ai; + } _r_par; /* Pointer to param. block from 440C/440D */ + } _r_gen; } _r_x; } request; @@ -403,6 +416,15 @@ typedef struct { /* ndread packet macros */ #define r_ndbyte _r_x._r_nd._r_ndbyte +/* generic IOCTL and IOCTL query macros */ +#define r_cat _r_x._r_gen._r_cat +#define r_fun _r_x._r_gen._r_fun +#define r_rw _r_x._r_gen._r_par._r_rw +#define r_io _r_x._r_gen._r_par._r_io +#define r_fv _r_x._r_gen._r_par._r_fv +#define r_gioc _r_x._r_gen._r_par._r_gioc +#define r_ai _r_x._r_gen._r_par._r_ai + /* *interrupt support (spl & splx) support - IBM style */ diff --git a/kernel/dsk.c b/kernel/dsk.c index 1928e24..66d5ed1 100644 --- a/kernel/dsk.c +++ b/kernel/dsk.c @@ -472,19 +472,23 @@ STATIC WORD IoctlQueblk(rqptr rp, ddt * pddt) { UNREFERENCED_PARAMETER(pddt); - switch (rp->r_count) +#ifdef WITHFAT32 + if (rp->r_cat == 8 || rp->r_cat == 0x48) +#else + if (rp->r_cat == 8) +#endif { - case 0x0846: - case 0x0847: - case 0x0860: - case 0x0866: - case 0x0867: - break; - default: - return failure(E_CMD); + switch (rp->r_fun) + { + case 0x46: + case 0x47: + case 0x60: + case 0x66: + case 0x67: + return S_DONE; + } } - return S_DONE; - + return failure(E_CMD); } STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track, @@ -506,18 +510,18 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) #ifdef WITHFAT32 int extended = 0; - if ((rp->r_count >> 8) == 0x48) + if (rp->r_cat == 0x48) extended = 1; else #endif - if ((rp->r_count >> 8) != 8) + if (rp->r_cat != 8) return failure(E_CMD); - switch (rp->r_count & 0xff) + switch (rp->r_fun) { case 0x40: /* set device parameters */ { - struct gblkio FAR *gblp = (struct gblkio FAR *)rp->r_trans; + struct gblkio FAR *gblp = rp->r_io; bpb *pbpb; pddt->ddt_type = gblp->gbio_devtype; @@ -539,7 +543,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) } case 0x41: /* write track */ { - struct gblkrw FAR *rw = (struct gblkrw FAR *)rp->r_trans; + struct gblkrw FAR *rw = rp->r_rw; ret = Genblockio(pddt, LBA_WRITE, rw->gbrw_head, rw->gbrw_cyl, rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer); if (ret != 0) @@ -548,7 +552,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) break; case 0x42: /* format/verify track */ { - struct gblkfv FAR *fv = (struct gblkfv FAR *)rp->r_trans; + struct gblkfv FAR *fv = rp->r_fv; COUNT tracks; struct thst { UBYTE track, head, sector, type; @@ -650,7 +654,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) case 0x62: /* verify track */ { - struct gblkfv FAR *fv = (struct gblkfv FAR *)rp->r_trans; + struct gblkfv FAR *fv = rp->r_fv; ret = Genblockio(pddt, LBA_VERIFY, fv->gbfv_head, fv->gbfv_cyl, 0, (fv->gbfv_spcfunbit ? @@ -663,7 +667,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) break; case 0x46: /* set volume serial number */ { - struct Gioc_media FAR *gioc = (struct Gioc_media FAR *)rp->r_trans; + struct Gioc_media FAR *gioc = rp->r_gioc; struct FS_info *fs; ret = getbpb(pddt); @@ -682,14 +686,14 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) break; case 0x47: /* set access flag */ { - struct Access_info FAR *ai = (struct Access_info FAR *)rp->r_trans; + struct Access_info FAR *ai = rp->r_ai; pddt->ddt_descflags = (descflags & ~DF_NOACCESS) | (ai->AI_Flag ? 0 : DF_NOACCESS); } break; case 0x60: /* get device parameters */ { - struct gblkio FAR *gblp = (struct gblkio FAR *)rp->r_trans; + struct gblkio FAR *gblp = rp->r_io; bpb *pbpb; gblp->gbio_devtype = pddt->ddt_type; @@ -712,7 +716,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) } case 0x61: /* read track */ { - struct gblkrw FAR *rw = (struct gblkrw FAR *)rp->r_trans; + struct gblkrw FAR *rw = rp->r_rw; ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl, rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer); if (ret != 0) @@ -721,7 +725,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) break; case 0x66: /* get volume serial number */ { - struct Gioc_media FAR *gioc = (struct Gioc_media FAR *)rp->r_trans; + struct Gioc_media FAR *gioc = rp->r_gioc; ret = getbpb(pddt); if (ret != 0) @@ -734,7 +738,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt) break; case 0x67: /* get access flag */ { - struct Access_info FAR *ai = (struct Access_info FAR *)rp->r_trans; + struct Access_info FAR *ai = rp->r_ai; ai->AI_Flag = descflags & DF_NOACCESS ? 0 : 1; /* bit 9 */ } break; diff --git a/kernel/ioctl.c b/kernel/ioctl.c index 157d6f8..38677ad 100644 --- a/kernel/ioctl.c +++ b/kernel/ioctl.c @@ -59,13 +59,25 @@ COUNT DosDevIOctl(lregs * r) sft FAR *s; struct dpb FAR *dpbp; COUNT nMode; + unsigned char al = r->AL; + + if (al > 0x11) + return DE_INVLDFUNC; /* commonly used, shouldn't harm to do front up */ - + if (al == 0x0C || al == 0x0D || al >= 0x10) /* generic or query */ + { + CharReqHdr.r_cat = r->CH; /* category (major) code */ + CharReqHdr.r_fun = r->CL; /* function (minor) code */ + CharReqHdr.r_io = MK_FP(r->DS, r->DX); /* parameter block */ + } + else + { + CharReqHdr.r_count = r->CX; + CharReqHdr.r_trans = MK_FP(r->DS, r->DX); + } CharReqHdr.r_length = sizeof(request); - CharReqHdr.r_trans = MK_FP(r->DS, r->DX); CharReqHdr.r_status = 0; - CharReqHdr.r_count = r->CX; /* Test that the handle is valid */ switch (r->AL)