(mostly from Lucho) deal with the correct structure for generic and

query ioctls. Fixes issues with 3rd party device drivers (or ones that use
dsk.c)


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@965 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-05-28 12:57:41 +00:00
parent 0168037d73
commit dace548223
3 changed files with 65 additions and 27 deletions

View File

@ -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
*/

View File

@ -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;

View File

@ -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)