(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:
parent
0168037d73
commit
dace548223
22
hdr/device.h
22
hdr/device.h
@ -366,6 +366,19 @@ typedef struct {
|
|||||||
struct {
|
struct {
|
||||||
unsigned char _r_ndbyte; /* Byte Read From Device */
|
unsigned char _r_ndbyte; /* Byte Read From Device */
|
||||||
} _r_nd;
|
} _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;
|
} _r_x;
|
||||||
} request;
|
} request;
|
||||||
|
|
||||||
@ -403,6 +416,15 @@ typedef struct {
|
|||||||
/* ndread packet macros */
|
/* ndread packet macros */
|
||||||
#define r_ndbyte _r_x._r_nd._r_ndbyte
|
#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
|
*interrupt support (spl & splx) support - IBM style
|
||||||
*/
|
*/
|
||||||
|
52
kernel/dsk.c
52
kernel/dsk.c
@ -472,19 +472,23 @@ STATIC WORD IoctlQueblk(rqptr rp, ddt * pddt)
|
|||||||
{
|
{
|
||||||
UNREFERENCED_PARAMETER(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:
|
switch (rp->r_fun)
|
||||||
case 0x0847:
|
{
|
||||||
case 0x0860:
|
case 0x46:
|
||||||
case 0x0866:
|
case 0x47:
|
||||||
case 0x0867:
|
case 0x60:
|
||||||
break;
|
case 0x66:
|
||||||
default:
|
case 0x67:
|
||||||
return failure(E_CMD);
|
|
||||||
}
|
|
||||||
return S_DONE;
|
return S_DONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return failure(E_CMD);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track,
|
STATIC COUNT Genblockio(ddt * pddt, UWORD mode, WORD head, WORD track,
|
||||||
@ -506,18 +510,18 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
#ifdef WITHFAT32
|
#ifdef WITHFAT32
|
||||||
int extended = 0;
|
int extended = 0;
|
||||||
|
|
||||||
if ((rp->r_count >> 8) == 0x48)
|
if (rp->r_cat == 0x48)
|
||||||
extended = 1;
|
extended = 1;
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
if ((rp->r_count >> 8) != 8)
|
if (rp->r_cat != 8)
|
||||||
return failure(E_CMD);
|
return failure(E_CMD);
|
||||||
|
|
||||||
switch (rp->r_count & 0xff)
|
switch (rp->r_fun)
|
||||||
{
|
{
|
||||||
case 0x40: /* set device parameters */
|
case 0x40: /* set device parameters */
|
||||||
{
|
{
|
||||||
struct gblkio FAR *gblp = (struct gblkio FAR *)rp->r_trans;
|
struct gblkio FAR *gblp = rp->r_io;
|
||||||
bpb *pbpb;
|
bpb *pbpb;
|
||||||
|
|
||||||
pddt->ddt_type = gblp->gbio_devtype;
|
pddt->ddt_type = gblp->gbio_devtype;
|
||||||
@ -539,7 +543,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
}
|
}
|
||||||
case 0x41: /* write track */
|
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,
|
ret = Genblockio(pddt, LBA_WRITE, rw->gbrw_head, rw->gbrw_cyl,
|
||||||
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
|
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -548,7 +552,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
break;
|
break;
|
||||||
case 0x42: /* format/verify track */
|
case 0x42: /* format/verify track */
|
||||||
{
|
{
|
||||||
struct gblkfv FAR *fv = (struct gblkfv FAR *)rp->r_trans;
|
struct gblkfv FAR *fv = rp->r_fv;
|
||||||
COUNT tracks;
|
COUNT tracks;
|
||||||
struct thst {
|
struct thst {
|
||||||
UBYTE track, head, sector, type;
|
UBYTE track, head, sector, type;
|
||||||
@ -650,7 +654,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
|
|
||||||
case 0x62: /* verify track */
|
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,
|
ret = Genblockio(pddt, LBA_VERIFY, fv->gbfv_head, fv->gbfv_cyl, 0,
|
||||||
(fv->gbfv_spcfunbit ?
|
(fv->gbfv_spcfunbit ?
|
||||||
@ -663,7 +667,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
break;
|
break;
|
||||||
case 0x46: /* set volume serial number */
|
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;
|
struct FS_info *fs;
|
||||||
|
|
||||||
ret = getbpb(pddt);
|
ret = getbpb(pddt);
|
||||||
@ -682,14 +686,14 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
break;
|
break;
|
||||||
case 0x47: /* set access flag */
|
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) |
|
pddt->ddt_descflags = (descflags & ~DF_NOACCESS) |
|
||||||
(ai->AI_Flag ? 0 : DF_NOACCESS);
|
(ai->AI_Flag ? 0 : DF_NOACCESS);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x60: /* get device parameters */
|
case 0x60: /* get device parameters */
|
||||||
{
|
{
|
||||||
struct gblkio FAR *gblp = (struct gblkio FAR *)rp->r_trans;
|
struct gblkio FAR *gblp = rp->r_io;
|
||||||
bpb *pbpb;
|
bpb *pbpb;
|
||||||
|
|
||||||
gblp->gbio_devtype = pddt->ddt_type;
|
gblp->gbio_devtype = pddt->ddt_type;
|
||||||
@ -712,7 +716,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
}
|
}
|
||||||
case 0x61: /* read track */
|
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,
|
ret = Genblockio(pddt, LBA_READ, rw->gbrw_head, rw->gbrw_cyl,
|
||||||
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
|
rw->gbrw_sector, rw->gbrw_nsecs, rw->gbrw_buffer);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -721,7 +725,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
break;
|
break;
|
||||||
case 0x66: /* get volume serial number */
|
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);
|
ret = getbpb(pddt);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -734,7 +738,7 @@ STATIC WORD Genblkdev(rqptr rp, ddt * pddt)
|
|||||||
break;
|
break;
|
||||||
case 0x67: /* get access flag */
|
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 */
|
ai->AI_Flag = descflags & DF_NOACCESS ? 0 : 1; /* bit 9 */
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -59,13 +59,25 @@ COUNT DosDevIOctl(lregs * r)
|
|||||||
sft FAR *s;
|
sft FAR *s;
|
||||||
struct dpb FAR *dpbp;
|
struct dpb FAR *dpbp;
|
||||||
COUNT nMode;
|
COUNT nMode;
|
||||||
|
unsigned char al = r->AL;
|
||||||
|
|
||||||
|
if (al > 0x11)
|
||||||
|
return DE_INVLDFUNC;
|
||||||
|
|
||||||
/* commonly used, shouldn't harm to do front up */
|
/* commonly used, shouldn't harm to do front up */
|
||||||
|
if (al == 0x0C || al == 0x0D || al >= 0x10) /* generic or query */
|
||||||
CharReqHdr.r_length = sizeof(request);
|
{
|
||||||
CharReqHdr.r_trans = MK_FP(r->DS, r->DX);
|
CharReqHdr.r_cat = r->CH; /* category (major) code */
|
||||||
CharReqHdr.r_status = 0;
|
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_count = r->CX;
|
||||||
|
CharReqHdr.r_trans = MK_FP(r->DS, r->DX);
|
||||||
|
}
|
||||||
|
CharReqHdr.r_length = sizeof(request);
|
||||||
|
CharReqHdr.r_status = 0;
|
||||||
|
|
||||||
/* Test that the handle is valid */
|
/* Test that the handle is valid */
|
||||||
switch (r->AL)
|
switch (r->AL)
|
||||||
|
Loading…
Reference in New Issue
Block a user