diff options
Diffstat (limited to 'dos/chudisk.c')
| -rw-r--r-- | dos/chudisk.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/dos/chudisk.c b/dos/chudisk.c index c7c0968..d822110 100644 --- a/dos/chudisk.c +++ b/dos/chudisk.c @@ -598,10 +598,13 @@ void interrupt_routine() return; } // If there's enough space, return our internal config string. - if (saved_drs->cmd.ioctlrw.len >= 3 + 2 + 1 + 5 + 1) { + if (saved_drs->cmd.ioctlrw.len >= 2 + /*B*/3 + /*3*/2 + /*R*/2 + /*S*/5 + /*L*/5 + 1) { uint8_t far * buf = saved_drs->cmd.ioctlrw.buffer; int len = 0; - // B = base port (2 byte) + // signature (2 bytes) + buf[len++] = 'C'; + buf[len++] = 'H'; + // B = base port (2 bytes) buf[len++] = 'B'; _fmemcpy(&buf[len], &ch375_dev.io_base, sizeof(ch375_dev.io_base)); len += sizeof(ch375_dev.io_base); @@ -615,6 +618,10 @@ void interrupt_routine() buf[len++] = 'S'; _fmemcpy(&buf[len], &data.unit[saved_drs->unit].start_sector, sizeof(uint32_t)); len += sizeof(uint32_t); + // L = partition len (4 bytes) + buf[len++] = 'L'; + _fmemcpy(&buf[len], &data.unit[saved_drs->unit].sectors, sizeof(uint32_t)); + len += sizeof(uint32_t); buf[len++] = '\0'; saved_drs->cmd.ioctlrw.len = len; } else { @@ -632,7 +639,14 @@ void interrupt_routine() if (saved_drs->cmd.ioctlrw.len >= 2) { uint8_t far * buf = saved_drs->cmd.ioctlrw.buffer; int i = 0; - do { + if (buf[i] != 'C' || buf[i+1] != 'H') { + dprintf(" invalid signature\n"); + saved_drs->cmd.ioctlrw.len = 0; + saved_drs->status = DOS_DD_ERR_UNKNOWN_COMMAND | DOS_DD_STATUS_ERROR_DONE; + return; + } + i += 2; + while (i < saved_drs->cmd.ioctlrw.len) { char c = buf[i++]; switch (c) { case 'S': // Partition start (5 bytes) @@ -659,7 +673,7 @@ void interrupt_routine() saved_drs->status = DOS_DD_ERR_WRITE_FAULT | DOS_DD_STATUS_ERROR_DONE; return; } - } while (i < saved_drs->cmd.ioctlrw.len); + } } else { saved_drs->cmd.ioctlrw.len = 0; saved_drs->status = DOS_DD_ERR_WRITE_FAULT | DOS_DD_STATUS_ERROR_DONE; |
