ntdll: Implemented COMM IOCTL for modem status: GET_MODEMSTATUS.
This commit is contained in:
parent
58e719ce93
commit
5973955e4e
@ -1801,55 +1801,20 @@ BOOL WINAPI SetCommTimeouts(
|
|||||||
*
|
*
|
||||||
* Obtains the four control register bits if supported by the hardware.
|
* Obtains the four control register bits if supported by the hardware.
|
||||||
*
|
*
|
||||||
|
* PARAMS
|
||||||
|
*
|
||||||
|
* hFile [in] The communications device
|
||||||
|
* lpModemStat [out] The control register bits
|
||||||
|
*
|
||||||
* RETURNS
|
* RETURNS
|
||||||
*
|
*
|
||||||
* True if the communications handle was good and for hardware that
|
* True if the communications handle was good and for hardware that
|
||||||
* control register access, false otherwise.
|
* control register access, false otherwise.
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI GetCommModemStatus(
|
BOOL WINAPI GetCommModemStatus(HANDLE hFile, LPDWORD lpModemStat)
|
||||||
HANDLE hFile, /* [in] The communications device. */
|
|
||||||
LPDWORD lpModemStat) /* [out] The control register bits. */
|
|
||||||
{
|
{
|
||||||
int fd,mstat, result=FALSE;
|
return DeviceIoControl(hFile, IOCTL_SERIAL_GET_MODEMSTATUS,
|
||||||
|
NULL, 0, lpModemStat, sizeof(DWORD), NULL, NULL);
|
||||||
*lpModemStat=0;
|
|
||||||
#ifdef TIOCMGET
|
|
||||||
fd = get_comm_fd( hFile, FILE_READ_DATA );
|
|
||||||
if(fd<0)
|
|
||||||
return FALSE;
|
|
||||||
result = ioctl(fd, TIOCMGET, &mstat);
|
|
||||||
release_comm_fd( hFile, fd );
|
|
||||||
if (result == -1)
|
|
||||||
{
|
|
||||||
WARN("ioctl failed\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
#ifdef TIOCM_CTS
|
|
||||||
if (mstat & TIOCM_CTS)
|
|
||||||
*lpModemStat |= MS_CTS_ON;
|
|
||||||
#endif
|
|
||||||
#ifdef TIOCM_DSR
|
|
||||||
if (mstat & TIOCM_DSR)
|
|
||||||
*lpModemStat |= MS_DSR_ON;
|
|
||||||
#endif
|
|
||||||
#ifdef TIOCM_RNG
|
|
||||||
if (mstat & TIOCM_RNG)
|
|
||||||
*lpModemStat |= MS_RING_ON;
|
|
||||||
#endif
|
|
||||||
#ifdef TIOCM_CAR
|
|
||||||
/*FIXME: Not really sure about RLSD UB 990810*/
|
|
||||||
if (mstat & TIOCM_CAR)
|
|
||||||
*lpModemStat |= MS_RLSD_ON;
|
|
||||||
#endif
|
|
||||||
TRACE("%04x -> %s%s%s%s\n", mstat,
|
|
||||||
(*lpModemStat &MS_RLSD_ON)?"MS_RLSD_ON ":"",
|
|
||||||
(*lpModemStat &MS_RING_ON)?"MS_RING_ON ":"",
|
|
||||||
(*lpModemStat &MS_DSR_ON)?"MS_DSR_ON ":"",
|
|
||||||
(*lpModemStat &MS_CTS_ON)?"MS_CTS_ON ":"");
|
|
||||||
return TRUE;
|
|
||||||
#else
|
|
||||||
return FALSE;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static DWORD WINAPI Comm_CheckEvents(int fd, DWORD mask, serial_irq_info *new, serial_irq_info *old, DWORD new_mstat, DWORD old_mstat)
|
static DWORD WINAPI Comm_CheckEvents(int fd, DWORD mask, serial_irq_info *new, serial_irq_info *old, DWORD new_mstat, DWORD old_mstat)
|
||||||
|
@ -129,6 +129,45 @@ static const char* iocode2str(DWORD ioc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static NTSTATUS get_modem_status(int fd, DWORD* lpModemStat)
|
||||||
|
{
|
||||||
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
|
int mstat;
|
||||||
|
|
||||||
|
#ifdef TIOCMGET
|
||||||
|
if (ioctl(fd, TIOCMGET, &mstat) == -1)
|
||||||
|
{
|
||||||
|
WARN("ioctl failed\n");
|
||||||
|
status = FILE_GetNtStatus();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*lpModemStat = 0;
|
||||||
|
#ifdef TIOCM_CTS
|
||||||
|
if (mstat & TIOCM_CTS) *lpModemStat |= MS_CTS_ON;
|
||||||
|
#endif
|
||||||
|
#ifdef TIOCM_DSR
|
||||||
|
if (mstat & TIOCM_DSR) *lpModemStat |= MS_DSR_ON;
|
||||||
|
#endif
|
||||||
|
#ifdef TIOCM_RNG
|
||||||
|
if (mstat & TIOCM_RNG) *lpModemStat |= MS_RING_ON;
|
||||||
|
#endif
|
||||||
|
#ifdef TIOCM_CAR
|
||||||
|
/* FIXME: Not really sure about RLSD UB 990810 */
|
||||||
|
if (mstat & TIOCM_CAR) *lpModemStat |= MS_RLSD_ON;
|
||||||
|
#endif
|
||||||
|
TRACE("%04x -> %s%s%s%s\n", mstat,
|
||||||
|
(*lpModemStat & MS_RLSD_ON) ? "MS_RLSD_ON " : "",
|
||||||
|
(*lpModemStat & MS_RING_ON) ? "MS_RING_ON " : "",
|
||||||
|
(*lpModemStat & MS_DSR_ON) ? "MS_DSR_ON " : "",
|
||||||
|
(*lpModemStat & MS_CTS_ON) ? "MS_CTS_ON " : "");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
status = STATUS_NOT_SUPPORTED;
|
||||||
|
#endif
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
static NTSTATUS get_wait_mask(HANDLE hDevice, DWORD* mask)
|
static NTSTATUS get_wait_mask(HANDLE hDevice, DWORD* mask)
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
@ -199,6 +238,14 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDevice,
|
|||||||
|
|
||||||
switch (dwIoControlCode)
|
switch (dwIoControlCode)
|
||||||
{
|
{
|
||||||
|
case IOCTL_SERIAL_GET_MODEMSTATUS:
|
||||||
|
if (lpOutBuffer && nOutBufferSize == sizeof(DWORD))
|
||||||
|
{
|
||||||
|
if (!(status = get_modem_status(fd, (DWORD*)lpOutBuffer)))
|
||||||
|
sz = sizeof(DWORD);
|
||||||
|
}
|
||||||
|
else status = STATUS_INVALID_PARAMETER;
|
||||||
|
break;
|
||||||
case IOCTL_SERIAL_GET_WAIT_MASK:
|
case IOCTL_SERIAL_GET_WAIT_MASK:
|
||||||
if (lpOutBuffer && nOutBufferSize == sizeof(DWORD))
|
if (lpOutBuffer && nOutBufferSize == sizeof(DWORD))
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user