- Implemented: SetDefaultCommConfigW, SetDefaultCommConfigA, GetDefaultCommConfigW, GetDefaultCommConfigA

- Fixed: GetCommState

svn path=/trunk/; revision=32828
This commit is contained in:
Dmitry Chapyshev 2008-04-03 10:50:57 +00:00
parent fe24e2761f
commit f835ee0323

View file

@ -45,6 +45,10 @@
/* BUILDCOMMDCB & BUILDCOMMDCBANDTIMEOUTS */ /* BUILDCOMMDCB & BUILDCOMMDCBANDTIMEOUTS */
/* STRINGS */
static const WCHAR lpszSerialUI[] = {
's','e','r','i','a','l','u','i','.','d','l','l',0 };
/* TYPES */ /* TYPES */
/* Pointer to a callback that handles a particular parameter */ /* Pointer to a callback that handles a particular parameter */
@ -1069,33 +1073,32 @@ GetCommState(HANDLE hFile, LPDCB lpDCB)
DPRINT("GetCommState(%d, %p)\n", hFile, lpDCB); DPRINT("GetCommState(%d, %p)\n", hFile, lpDCB);
if (lpDCB == NULL) { if (lpDCB == NULL) {
SetLastError(ERROR_INVALID_PARAMETER);
DPRINT("ERROR: GetCommState() - NULL DCB pointer\n"); DPRINT("ERROR: GetCommState() - NULL DCB pointer\n");
return FALSE; return FALSE;
} }
lpDCB->DCBlength = sizeof(DCB); if (!DeviceIoControl(hFile, IOCTL_SERIAL_GET_BAUD_RATE,
NULL, 0, &BaudRate, sizeof(BaudRate), NULL, NULL) ||
!DeviceIoControl(hFile, IOCTL_SERIAL_GET_LINE_CONTROL,
NULL, 0, &LineControl, sizeof(LineControl), NULL, NULL) ||
!DeviceIoControl(hFile, IOCTL_SERIAL_GET_HANDFLOW,
NULL, 0, &HandFlow, sizeof(HandFlow), NULL, NULL) ||
!DeviceIoControl(hFile, IOCTL_SERIAL_GET_CHARS,
NULL, 0, &SpecialChars, sizeof(SpecialChars), NULL, NULL))
return FALSE;
/* FIXME: need to fill following fields (1 bit): memset(lpDCB, 0, sizeof(*lpDCB));
* fBinary: binary mode, no EOF check lpDCB->DCBlength = sizeof(*lpDCB);
* fParity: enable parity checking
* fOutX : XON/XOFF out flow control
* fInX : XON/XOFF in flow control
*/
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_BAUD_RATE, lpDCB->fBinary = 1;
NULL, 0, &BaudRate, sizeof(BaudRate),&dwBytesReturned, NULL); lpDCB->fParity = 0;
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_BAUD_RATE) Failed.\n");
return FALSE;
}
lpDCB->BaudRate = BaudRate.BaudRate; lpDCB->BaudRate = BaudRate.BaudRate;
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_HANDFLOW, lpDCB->StopBits = LineControl.StopBits;
NULL, 0, &HandFlow, sizeof(HandFlow), &dwBytesReturned, NULL); lpDCB->Parity = LineControl.Parity;
if (!NT_SUCCESS(result)) { lpDCB->ByteSize = LineControl.WordLength;
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_HANDFLOW) Failed.\n");
return FALSE;
}
if (HandFlow.ControlHandShake & SERIAL_CTS_HANDSHAKE) { if (HandFlow.ControlHandShake & SERIAL_CTS_HANDSHAKE) {
lpDCB->fOutxCtsFlow = 1; lpDCB->fOutxCtsFlow = 1;
} }
@ -1182,26 +1185,50 @@ GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
GetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize) GetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); FARPROC pGetDefaultCommConfig;
return FALSE; HMODULE hConfigModule;
DWORD res = ERROR_INVALID_PARAMETER;
DPRINT("(%s, %p, %p) *lpdwSize: %u\n", lpszName, lpCC, lpdwSize, lpdwSize ? *lpdwSize : 0 );
hConfigModule = LoadLibraryW(lpszSerialUI);
if (hConfigModule) {
pGetDefaultCommConfig = GetProcAddress(hConfigModule, "drvGetDefaultCommConfigW");
if (pGetDefaultCommConfig) {
res = pGetDefaultCommConfig(lpszName, lpCC, lpdwSize);
}
FreeLibrary(hConfigModule);
}
if (res) SetLastError(res);
return (res == ERROR_SUCCESS);
} }
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
GetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize) GetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); BOOL ret = FALSE;
return FALSE; UNICODE_STRING lpszNameW;
DPRINT("(%s, %p, %p) *lpdwSize: %u\n", lpszName, lpCC, lpdwSize, lpdwSize ? *lpdwSize : 0 );
if(lpszName) RtlCreateUnicodeStringFromAsciiz(&lpszNameW,lpszName);
else lpszNameW.Buffer = NULL;
ret = GetDefaultCommConfigW(lpszNameW.Buffer,lpCC,lpdwSize);
RtlFreeUnicodeString(&lpszNameW);
return ret;
} }
@ -1424,26 +1451,54 @@ SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
SetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize) SetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); BOOL r;
return FALSE; LPWSTR lpDeviceW = NULL;
DWORD len;
DPRINT("(%s, %p, %u)\n", lpszName, lpCC, dwSize);
if (lpszName)
{
len = MultiByteToWideChar( CP_ACP, 0, lpszName, -1, NULL, 0 );
lpDeviceW = HeapAlloc( GetProcessHeap(), 0, len*sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, 0, lpszName, -1, lpDeviceW, len );
}
r = SetDefaultCommConfigW(lpDeviceW,lpCC,dwSize);
HeapFree( GetProcessHeap(), 0, lpDeviceW );
return r;
} }
/* /*
* @unimplemented * @implemented
*/ */
BOOL BOOL
STDCALL STDCALL
SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize) SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize)
{ {
SetLastError(ERROR_CALL_NOT_IMPLEMENTED); FARPROC pGetDefaultCommConfig;
return FALSE; HMODULE hConfigModule;
DWORD res = ERROR_INVALID_PARAMETER;
DPRINT("(%s, %p, %p) *dwSize: %u\n", lpszName, lpCC, dwSize, dwSize ? dwSize : 0 );
hConfigModule = LoadLibraryW(lpszSerialUI);
if (hConfigModule) {
pGetDefaultCommConfig = GetProcAddress(hConfigModule, "drvGetDefaultCommConfigW");
if (pGetDefaultCommConfig) {
res = pGetDefaultCommConfig(lpszName, lpCC, &dwSize);
}
FreeLibrary(hConfigModule);
}
if (res) SetLastError(res);
return (res == ERROR_SUCCESS);
} }