mirror of
https://gitea.tendokyu.moe/TeamTofuShop/capnhook.git
synced 2026-09-22 22:38:12 +03:00
uart: add modem IOCTLS
This commit is contained in:
@@ -35,7 +35,6 @@ struct irp {
|
||||
uint32_t seek_origin;
|
||||
int64_t seek_offset;
|
||||
uint64_t seek_pos;
|
||||
uint16_t modem_state;
|
||||
};
|
||||
|
||||
typedef HRESULT (*iohook_fn_t)(struct irp *irp);
|
||||
|
||||
+3
-4
@@ -745,7 +745,8 @@ static BOOL WINAPI my_GetCommModemStatus(HANDLE fd, DWORD modem_stat)
|
||||
irp.op = IRP_OP_IOCTL;
|
||||
irp.fd = fd;
|
||||
irp.ioctl = IOCTL_SERIAL_GET_MODEMSTATUS;
|
||||
modem_stat = 0;
|
||||
irp.read.bytes = (uint8_t *) &modem_stat;
|
||||
irp.read.nbytes = sizeof(modem_stat);
|
||||
|
||||
hr = iohook_invoke_next(&irp);
|
||||
|
||||
@@ -755,7 +756,5 @@ static BOOL WINAPI my_GetCommModemStatus(HANDLE fd, DWORD modem_stat)
|
||||
|
||||
SetLastError(ERROR_SUCCESS);
|
||||
|
||||
modem_stat = irp.modem_state;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
+26
-5
@@ -241,6 +241,13 @@ static HRESULT uart_handle_ioctl(struct uart *uart, struct irp *irp)
|
||||
case IOCTL_SERIAL_GET_WAIT_MASK:
|
||||
return iobuf_write(&irp->read, &uart->mask, sizeof(uart->mask));
|
||||
|
||||
case IOCTL_SERIAL_GET_MODEM_CONTROL:
|
||||
return iobuf_write(&irp->read, &uart->modem_control, sizeof(uart->modem_control));
|
||||
|
||||
case IOCTL_SERIAL_GET_MODEMSTATUS:
|
||||
ULONG status = (uart->cts_on << 4) | (uart->dsr_on << 5) | (uart->ring_on << 6) | (uart->rlsd_on << 7);
|
||||
return iobuf_write(&irp->read, &status, sizeof(status));
|
||||
|
||||
case IOCTL_SERIAL_SET_BAUD_RATE:
|
||||
return iobuf_read(&irp->write, &uart->baud, sizeof(uart->baud));
|
||||
|
||||
@@ -259,16 +266,30 @@ static HRESULT uart_handle_ioctl(struct uart *uart, struct irp *irp)
|
||||
case IOCTL_SERIAL_SET_WAIT_MASK:
|
||||
return iobuf_read(&irp->write, &uart->mask, sizeof(uart->mask));
|
||||
|
||||
case IOCTL_SERIAL_SET_MODEM_CONTROL:
|
||||
return iobuf_read(&irp->write, &uart->modem_control, sizeof(uart->modem_control));
|
||||
|
||||
case IOCTL_SERIAL_CLR_DTR:
|
||||
uart->dtr_on = false;
|
||||
return S_OK;
|
||||
|
||||
case IOCTL_SERIAL_CLR_RTS:
|
||||
uart->rts_on = false;
|
||||
return S_OK;
|
||||
|
||||
case IOCTL_SERIAL_SET_DTR:
|
||||
uart->dtr_on = true;
|
||||
return S_OK;
|
||||
|
||||
case IOCTL_SERIAL_SET_RTS:
|
||||
uart->rts_on = true;
|
||||
return S_OK;
|
||||
|
||||
/* These can be safely ignored */
|
||||
case IOCTL_SERIAL_SET_BREAK_ON:
|
||||
case IOCTL_SERIAL_SET_BREAK_OFF:
|
||||
case IOCTL_SERIAL_CLR_DTR:
|
||||
case IOCTL_SERIAL_CLR_RTS:
|
||||
case IOCTL_SERIAL_SET_DTR:
|
||||
case IOCTL_SERIAL_SET_RTS:
|
||||
case IOCTL_SERIAL_SET_XOFF:
|
||||
case IOCTL_SERIAL_SET_XON:
|
||||
|
||||
case IOCTL_SERIAL_PURGE:
|
||||
case IOCTL_SERIAL_SET_QUEUE_SIZE:
|
||||
return S_OK;
|
||||
|
||||
@@ -25,6 +25,13 @@ struct uart {
|
||||
SERIAL_LINE_CONTROL line;
|
||||
SERIAL_TIMEOUTS timeouts;
|
||||
DWORD mask;
|
||||
bool cts_on;
|
||||
bool dsr_on;
|
||||
bool ring_on;
|
||||
bool rlsd_on;
|
||||
bool dtr_on;
|
||||
bool rts_on;
|
||||
ULONG modem_control;
|
||||
struct iobuf written;
|
||||
struct iobuf readable;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user