Eric Pouech : ntdll: Implemented IOCTL for serial: SET_WAIT_MASK,
GET_WAIT_MASK.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Feb 6 05:10:27 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 58e719ce93f9dd621af22003f3981da0f3e6a68c
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=58e719ce93f9dd621af22003f3981da0f3e6a68c
Author: Eric Pouech <eric.pouech at wanadoo.fr>
Date: Mon Feb 6 11:37:06 2006 +0100
ntdll: Implemented IOCTL for serial: SET_WAIT_MASK, GET_WAIT_MASK.
---
dlls/kernel/comm.c | 47 ++++++++++++++++-------------------------------
dlls/ntdll/serial.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+), 31 deletions(-)
diff --git a/dlls/kernel/comm.c b/dlls/kernel/comm.c
index 41ae790..3a63c02 100644
--- a/dlls/kernel/comm.c
+++ b/dlls/kernel/comm.c
@@ -952,28 +952,20 @@ BOOL WINAPI SetupComm(
* Obtain the events associated with a communication device that will cause
* a call WaitCommEvent to return.
*
+ * PARAMS
+ *
+ * handle [in] The communications device
+ * evtmask [out] The events which cause WaitCommEvent to return
+ *
* RETURNS
*
* True on success, fail on bad device handle etc.
*/
-BOOL WINAPI GetCommMask(
- HANDLE handle, /* [in] The communications device. */
- LPDWORD evtmask) /* [out] The events which cause WaitCommEvent to return. */
+BOOL WINAPI GetCommMask(HANDLE handle, LPDWORD evtmask)
{
- BOOL ret;
-
TRACE("handle %p, mask %p\n", handle, evtmask);
-
- SERVER_START_REQ( get_serial_info )
- {
- req->handle = handle;
- if ((ret = !wine_server_call_err( req )))
- {
- if (evtmask) *evtmask = reply->eventmask;
- }
- }
- SERVER_END_REQ;
- return ret;
+ return DeviceIoControl(handle, IOCTL_SERIAL_GET_WAIT_MASK,
+ NULL, 0, evtmask, sizeof(*evtmask), NULL, NULL);
}
/*****************************************************************************
@@ -983,27 +975,20 @@ BOOL WINAPI GetCommMask(
* (Set which events associated with a communication device should cause
* a call WaitCommEvent to return.)
*
+ * PARAMS
+ *
+ * handle [in] The communications device
+ * evtmask [in] The events that are to be monitored
+ *
* RETURNS
*
* True on success, false on bad handle etc.
*/
-BOOL WINAPI SetCommMask(
- HANDLE handle, /* [in] The communications device. */
- DWORD evtmask) /* [in] The events that are to be monitored. */
+BOOL WINAPI SetCommMask(HANDLE handle, DWORD evtmask)
{
- BOOL ret;
-
TRACE("handle %p, mask %lx\n", handle, evtmask);
-
- SERVER_START_REQ( set_serial_info )
- {
- req->handle = handle;
- req->flags = SERIALINFO_SET_MASK;
- req->eventmask = evtmask;
- ret = !wine_server_call_err( req );
- }
- SERVER_END_REQ;
- return ret;
+ return DeviceIoControl(handle, IOCTL_SERIAL_SET_WAIT_MASK,
+ &evtmask, sizeof(evtmask), NULL, 0, NULL, NULL);
}
/*****************************************************************************
diff --git a/dlls/ntdll/serial.c b/dlls/ntdll/serial.c
index ecf025c..b364376 100644
--- a/dlls/ntdll/serial.c
+++ b/dlls/ntdll/serial.c
@@ -129,6 +129,20 @@ static const char* iocode2str(DWORD ioc)
}
}
+static NTSTATUS get_wait_mask(HANDLE hDevice, DWORD* mask)
+{
+ NTSTATUS status;
+
+ SERVER_START_REQ( get_serial_info )
+ {
+ req->handle = hDevice;
+ if (!(status = wine_server_call( req )))
+ *mask = reply->eventmask;
+ }
+ SERVER_END_REQ;
+ return status;
+}
+
static NTSTATUS purge(int fd, DWORD flags)
{
/*
@@ -143,6 +157,21 @@ static NTSTATUS purge(int fd, DWORD flag
return STATUS_SUCCESS;
}
+static NTSTATUS set_wait_mask(HANDLE hDevice, DWORD mask)
+{
+ NTSTATUS status;
+
+ SERVER_START_REQ( set_serial_info )
+ {
+ req->handle = hDevice;
+ req->flags = SERIALINFO_SET_MASK;
+ req->eventmask = mask;
+ status = wine_server_call( req );
+ }
+ SERVER_END_REQ;
+ return status;
+}
+
/******************************************************************
* COMM_DeviceIoControl
*
@@ -170,6 +199,15 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
switch (dwIoControlCode)
{
+ case IOCTL_SERIAL_GET_WAIT_MASK:
+ if (lpOutBuffer && nOutBufferSize == sizeof(DWORD))
+ {
+ if (!(status = get_wait_mask(hDevice, (DWORD*)lpOutBuffer)))
+ sz = sizeof(DWORD);
+ }
+ else
+ status = STATUS_INVALID_PARAMETER;
+ break;
case IOCTL_SERIAL_PURGE:
if (lpInBuffer && nInBufferSize == sizeof(DWORD))
status = purge(fd, *(DWORD*)lpInBuffer);
@@ -200,6 +238,13 @@ NTSTATUS COMM_DeviceIoControl(HANDLE hDe
status = STATUS_NOT_SUPPORTED;
#endif
break;
+ case IOCTL_SERIAL_SET_WAIT_MASK:
+ if (lpInBuffer && nInBufferSize == sizeof(DWORD))
+ {
+ status = set_wait_mask(hDevice, *(DWORD*)lpInBuffer);
+ }
+ else status = STATUS_INVALID_PARAMETER;
+ break;
default:
FIXME("Unsupported IOCTL %lx (type=%lx access=%lx func=%lx meth=%lx)\n",
dwIoControlCode, dwIoControlCode >> 16, (dwIoControlCode >> 14) & 3,
More information about the wine-cvs
mailing list