From 4192d34dd9694660df8de7303a53979e3e387f7a Mon Sep 17 00:00:00 2001 From: Christoph von Wittich Date: Thu, 5 Feb 2009 14:37:46 +0100 Subject: [PATCH] kernel32: DeviceIoControl: lpBytesReturned must not be NULL if lpOverlapped is NULL. --- dlls/kernel32/comm.c | 54 ++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/dlls/kernel32/comm.c b/dlls/kernel32/comm.c index d83eacbaa6c..0fbd7e39684 100644 --- a/dlls/kernel32/comm.c +++ b/dlls/kernel32/comm.c @@ -551,7 +551,8 @@ BOOL WINAPI BuildCommDCBW( */ BOOL WINAPI SetCommBreak(HANDLE handle) { - return DeviceIoControl(handle, IOCTL_SERIAL_SET_BREAK_ON, NULL, 0, NULL, 0, NULL, NULL); + DWORD dwBytesReturned; + return DeviceIoControl(handle, IOCTL_SERIAL_SET_BREAK_ON, NULL, 0, NULL, 0, &dwBytesReturned, NULL); } /***************************************************************************** @@ -573,7 +574,8 @@ BOOL WINAPI SetCommBreak(HANDLE handle) */ BOOL WINAPI ClearCommBreak(HANDLE handle) { - return DeviceIoControl(handle, IOCTL_SERIAL_SET_BREAK_OFF, NULL, 0, NULL, 0, NULL, NULL); + DWORD dwBytesReturned; + return DeviceIoControl(handle, IOCTL_SERIAL_SET_BREAK_OFF, NULL, 0, NULL, 0, &dwBytesReturned, NULL); } /***************************************************************************** @@ -595,6 +597,7 @@ BOOL WINAPI ClearCommBreak(HANDLE handle) BOOL WINAPI EscapeCommFunction(HANDLE handle, UINT func) { DWORD ioc; + DWORD dwBytesReturned; switch (func) { @@ -612,7 +615,7 @@ BOOL WINAPI EscapeCommFunction(HANDLE handle, UINT func) SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - return DeviceIoControl(handle, ioc, NULL, 0, NULL, 0, NULL, NULL); + return DeviceIoControl(handle, ioc, NULL, 0, NULL, 0, &dwBytesReturned, NULL); } /******************************************************************** @@ -632,8 +635,9 @@ BOOL WINAPI EscapeCommFunction(HANDLE handle, UINT func) */ BOOL WINAPI PurgeComm(HANDLE handle, DWORD flags) { + DWORD dwBytesReturned; return DeviceIoControl(handle, IOCTL_SERIAL_PURGE, &flags, sizeof(flags), - NULL, 0, NULL, NULL); + NULL, 0, &dwBytesReturned, NULL); } /***************************************************************************** @@ -654,9 +658,10 @@ BOOL WINAPI PurgeComm(HANDLE handle, DWORD flags) BOOL WINAPI ClearCommError(HANDLE handle, LPDWORD errors, LPCOMSTAT lpStat) { SERIAL_STATUS ss; + DWORD dwBytesReturned; if (!DeviceIoControl(handle, IOCTL_SERIAL_GET_COMMSTATUS, NULL, 0, - &ss, sizeof(ss), NULL, NULL)) + &ss, sizeof(ss), &dwBytesReturned, NULL)) return FALSE; if (errors) @@ -708,11 +713,12 @@ BOOL WINAPI ClearCommError(HANDLE handle, LPDWORD errors, LPCOMSTAT lpStat) BOOL WINAPI SetupComm(HANDLE handle, DWORD insize, DWORD outsize) { SERIAL_QUEUE_SIZE sqs; + DWORD dwBytesReturned; sqs.InSize = insize; sqs.OutSize = outsize; return DeviceIoControl(handle, IOCTL_SERIAL_SET_QUEUE_SIZE, - &sqs, sizeof(sqs), NULL, 0, NULL, NULL); + &sqs, sizeof(sqs), NULL, 0, &dwBytesReturned, NULL); } /***************************************************************************** @@ -732,9 +738,10 @@ BOOL WINAPI SetupComm(HANDLE handle, DWORD insize, DWORD outsize) */ BOOL WINAPI GetCommMask(HANDLE handle, LPDWORD evtmask) { + DWORD dwBytesReturned; TRACE("handle %p, mask %p\n", handle, evtmask); return DeviceIoControl(handle, IOCTL_SERIAL_GET_WAIT_MASK, - NULL, 0, evtmask, sizeof(*evtmask), NULL, NULL); + NULL, 0, evtmask, sizeof(*evtmask), &dwBytesReturned, NULL); } /***************************************************************************** @@ -755,9 +762,10 @@ BOOL WINAPI GetCommMask(HANDLE handle, LPDWORD evtmask) */ BOOL WINAPI SetCommMask(HANDLE handle, DWORD evtmask) { + DWORD dwBytesReturned; TRACE("handle %p, mask %x\n", handle, evtmask); return DeviceIoControl(handle, IOCTL_SERIAL_SET_WAIT_MASK, - &evtmask, sizeof(evtmask), NULL, 0, NULL, NULL); + &evtmask, sizeof(evtmask), NULL, 0, &dwBytesReturned, NULL); } static void dump_dcb(const DCB* lpdcb) @@ -797,6 +805,7 @@ BOOL WINAPI SetCommState( HANDLE handle, LPDCB lpdcb) SERIAL_LINE_CONTROL slc; SERIAL_HANDFLOW shf; SERIAL_CHARS sc; + DWORD dwBytesReturned; if (lpdcb == NULL) { @@ -858,13 +867,13 @@ BOOL WINAPI SetCommState( HANDLE handle, LPDCB lpdcb) * so flow control does not interfere. */ return (DeviceIoControl(handle, IOCTL_SERIAL_SET_BAUD_RATE, - &sbr, sizeof(sbr), NULL, 0, NULL, NULL) && + &sbr, sizeof(sbr), NULL, 0, &dwBytesReturned, NULL) && DeviceIoControl(handle, IOCTL_SERIAL_SET_LINE_CONTROL, - &slc, sizeof(slc), NULL, 0, NULL, NULL) && + &slc, sizeof(slc), NULL, 0, &dwBytesReturned, NULL) && DeviceIoControl(handle, IOCTL_SERIAL_SET_HANDFLOW, - &shf, sizeof(shf), NULL, 0, NULL, NULL) && + &shf, sizeof(shf), NULL, 0, &dwBytesReturned, NULL) && DeviceIoControl(handle, IOCTL_SERIAL_SET_CHARS, - &sc, sizeof(sc), NULL, 0, NULL, NULL)); + &sc, sizeof(sc), NULL, 0, &dwBytesReturned, NULL)); } @@ -891,6 +900,7 @@ BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) SERIAL_LINE_CONTROL slc; SERIAL_HANDFLOW shf; SERIAL_CHARS sc; + DWORD dwBytesReturned; TRACE("handle %p, ptr %p\n", handle, lpdcb); @@ -901,13 +911,13 @@ BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) } if (!DeviceIoControl(handle, IOCTL_SERIAL_GET_BAUD_RATE, - NULL, 0, &sbr, sizeof(sbr), NULL, NULL) || + NULL, 0, &sbr, sizeof(sbr), &dwBytesReturned, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_LINE_CONTROL, - NULL, 0, &slc, sizeof(slc), NULL, NULL) || + NULL, 0, &slc, sizeof(slc), &dwBytesReturned, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_HANDFLOW, - NULL, 0, &shf, sizeof(shf), NULL, NULL) || + NULL, 0, &shf, sizeof(shf), &dwBytesReturned, NULL) || !DeviceIoControl(handle, IOCTL_SERIAL_GET_CHARS, - NULL, 0, &sc, sizeof(sc), NULL, NULL)) + NULL, 0, &sc, sizeof(sc), &dwBytesReturned, NULL)) return FALSE; memset(lpdcb, 0, sizeof(*lpdcb)); @@ -980,8 +990,9 @@ BOOL WINAPI GetCommState(HANDLE handle, LPDCB lpdcb) */ BOOL WINAPI TransmitCommChar(HANDLE hComm, CHAR chTransmit) { + DWORD dwBytesReturned; return DeviceIoControl(hComm, IOCTL_SERIAL_IMMEDIATE_CHAR, - &chTransmit, sizeof(chTransmit), NULL, 0, NULL, NULL); + &chTransmit, sizeof(chTransmit), NULL, 0, &dwBytesReturned, NULL); } @@ -1002,6 +1013,7 @@ BOOL WINAPI TransmitCommChar(HANDLE hComm, CHAR chTransmit) BOOL WINAPI GetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) { SERIAL_TIMEOUTS st; + DWORD dwBytesReturned; TRACE("(%p, %p)\n", hComm, lptimeouts); if (!lptimeouts) @@ -1010,7 +1022,7 @@ BOOL WINAPI GetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) return FALSE; } if (!DeviceIoControl(hComm, IOCTL_SERIAL_GET_TIMEOUTS, - NULL, 0, &st, sizeof(st), NULL, NULL)) + NULL, 0, &st, sizeof(st), &dwBytesReturned, NULL)) return FALSE; lptimeouts->ReadIntervalTimeout = st.ReadIntervalTimeout; lptimeouts->ReadTotalTimeoutMultiplier = st.ReadTotalTimeoutMultiplier; @@ -1043,6 +1055,7 @@ BOOL WINAPI GetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) BOOL WINAPI SetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) { SERIAL_TIMEOUTS st; + DWORD dwBytesReturned; TRACE("(%p, %p)\n", hComm, lptimeouts); @@ -1058,7 +1071,7 @@ BOOL WINAPI SetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) st.WriteTotalTimeoutConstant = lptimeouts->WriteTotalTimeoutConstant; return DeviceIoControl(hComm, IOCTL_SERIAL_SET_TIMEOUTS, - &st, sizeof(st), NULL, 0, NULL, NULL); + &st, sizeof(st), NULL, 0, &dwBytesReturned, NULL); } /*********************************************************************** @@ -1078,8 +1091,9 @@ BOOL WINAPI SetCommTimeouts(HANDLE hComm, LPCOMMTIMEOUTS lptimeouts) */ BOOL WINAPI GetCommModemStatus(HANDLE hFile, LPDWORD lpModemStat) { + DWORD dwBytesReturned; return DeviceIoControl(hFile, IOCTL_SERIAL_GET_MODEMSTATUS, - NULL, 0, lpModemStat, sizeof(DWORD), NULL, NULL); + NULL, 0, lpModemStat, sizeof(DWORD), &dwBytesReturned, NULL); } /***********************************************************************