📄 comm.c
字号:
}
RtlFreeHeap(hProcessHeap, 0, lpComPort);
return (ReturnValue);
}
/*
* @implemented
*/
BOOL
STDCALL
GetCommMask(HANDLE hFile, LPDWORD lpEvtMask)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_GET_WAIT_MASK,
NULL, 0, lpEvtMask, sizeof(DWORD), &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
GetCommModemStatus(HANDLE hFile, LPDWORD lpModemStat)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_GET_MODEMSTATUS,
NULL, 0, lpModemStat, sizeof(DWORD), &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
GetCommProperties(HANDLE hFile, LPCOMMPROP lpCommProp)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_GET_PROPERTIES, 0, 0,
lpCommProp, sizeof(COMMPROP), &dwBytesReturned, 0);
}
/*
* @implemented
*/
BOOL
STDCALL
GetCommState(HANDLE hFile, LPDCB lpDCB)
{
BOOL result = FALSE;
DWORD dwBytesReturned;
SERIAL_BAUD_RATE BaudRate;
SERIAL_HANDFLOW HandFlow;
SERIAL_CHARS SpecialChars;
SERIAL_LINE_CONTROL LineControl;
DPRINT("GetCommState(%d, %p)\n", hFile, lpDCB);
if (lpDCB == NULL) {
DPRINT("ERROR: GetCommState() - NULL DCB pointer\n");
return FALSE;
}
lpDCB->DCBlength = sizeof(DCB);
/* FIXME: need to fill following fields (1 bit):
* fBinary: binary mode, no EOF check
* fParity: enable parity checking
* fOutX : XON/XOFF out flow control
* fInX : XON/XOFF in flow control
*/
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_BAUD_RATE,
NULL, 0, &BaudRate, sizeof(BaudRate),&dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_BAUD_RATE) Failed.\n");
return FALSE;
}
lpDCB->BaudRate = BaudRate.BaudRate;
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_HANDFLOW,
NULL, 0, &HandFlow, sizeof(HandFlow), &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_HANDFLOW) Failed.\n");
return FALSE;
}
if (HandFlow.ControlHandShake & SERIAL_CTS_HANDSHAKE) {
lpDCB->fOutxCtsFlow = 1;
}
if (HandFlow.ControlHandShake & SERIAL_DSR_HANDSHAKE) {
lpDCB->fOutxDsrFlow = 1;
}
if (HandFlow.ControlHandShake & SERIAL_DTR_CONTROL) {
lpDCB->fDtrControl = 1;
}
if (HandFlow.ControlHandShake & SERIAL_DTR_HANDSHAKE) {
lpDCB->fDtrControl = 2;
}
if (HandFlow.ControlHandShake & SERIAL_RTS_CONTROL) {
lpDCB->fRtsControl = 1;
}
if (HandFlow.ControlHandShake & SERIAL_RTS_HANDSHAKE) {
lpDCB->fRtsControl = 2;
}
if (HandFlow.ControlHandShake & SERIAL_DSR_SENSITIVITY) {
lpDCB->fDsrSensitivity = 1;
}
if (HandFlow.ControlHandShake & SERIAL_ERROR_ABORT) {
lpDCB->fAbortOnError = 1;
}
if (HandFlow.FlowReplace & SERIAL_ERROR_CHAR) {
lpDCB->fErrorChar = 1;
}
if (HandFlow.FlowReplace & SERIAL_NULL_STRIPPING) {
lpDCB->fNull = 1;
}
if (HandFlow.FlowReplace & SERIAL_XOFF_CONTINUE) {
lpDCB->fTXContinueOnXoff = 1;
}
lpDCB->XonLim = HandFlow.XonLimit;
lpDCB->XoffLim = HandFlow.XoffLimit;
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_CHARS,
NULL, 0, &SpecialChars, sizeof(SpecialChars), &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_CHARS) Failed.\n");
return FALSE;
}
lpDCB->EofChar = SpecialChars.EofChar;
lpDCB->ErrorChar = SpecialChars.ErrorChar;
// = SpecialChars.BreakChar;
lpDCB->EvtChar = SpecialChars.EventChar;
lpDCB->XonChar = SpecialChars.XonChar;
lpDCB->XoffChar = SpecialChars.XoffChar;
result = DeviceIoControl(hFile, IOCTL_SERIAL_GET_LINE_CONTROL,
NULL, 0, &LineControl, sizeof(LineControl), &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: GetCommState() - DeviceIoControl(IOCTL_SERIAL_GET_LINE_CONTROL) Failed.\n");
return FALSE;
}
lpDCB->StopBits = LineControl.StopBits;
lpDCB->Parity = LineControl.Parity;
lpDCB->ByteSize = LineControl.WordLength;
DPRINT("GetCommState() - COMPLETED SUCCESSFULLY\n");
return TRUE;
}
/*
* @implemented
*/
BOOL
STDCALL
GetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)
{
DWORD dwBytesReturned;
if (lpCommTimeouts == NULL) {
return FALSE;
}
return DeviceIoControl(hFile, IOCTL_SERIAL_GET_TIMEOUTS,
NULL, 0,
lpCommTimeouts, sizeof(COMMTIMEOUTS),
&dwBytesReturned, NULL);
}
/*
* @unimplemented
*/
BOOL
STDCALL
GetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @unimplemented
*/
BOOL
STDCALL
GetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @implemented
*/
BOOL
STDCALL
PurgeComm(HANDLE hFile, DWORD dwFlags)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_PURGE,
&dwFlags, sizeof(DWORD), NULL, 0, &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
SetCommBreak(HANDLE hFile)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_SET_BREAK_ON, NULL, 0, NULL, 0, &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
SetCommConfig(HANDLE hCommDev, LPCOMMCONFIG lpCC, DWORD dwSize)
{
BOOL ReturnValue = FALSE;
DPRINT("SetCommConfig(%d, %p, %d)\n", hCommDev, lpCC, dwSize);
if(NULL == lpCC)
{
DPRINT("SetCommConfig() - invalid parameter\n");
SetLastError(ERROR_INVALID_PARAMETER);
ReturnValue = FALSE;
}
else
{
ReturnValue = SetCommState(hCommDev, &lpCC->dcb);
}
return ReturnValue;
}
/*
* @implemented
*/
BOOL
STDCALL
SetCommMask(HANDLE hFile, DWORD dwEvtMask)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_SET_WAIT_MASK,
&dwEvtMask, sizeof(DWORD), NULL, 0, &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
SetCommState(HANDLE hFile, LPDCB lpDCB)
{
BOOL result = FALSE;
DWORD dwBytesReturned;
SERIAL_BAUD_RATE BaudRate;
SERIAL_HANDFLOW HandFlow;
SERIAL_CHARS SpecialChars;
SERIAL_LINE_CONTROL LineControl;
DPRINT("SetCommState(%d, %p) - ENTERED\n", hFile, lpDCB);
if (lpDCB == NULL) {
DPRINT("SetCommState() - ERROR: NULL DCB pointer passed\n");
return FALSE;
}
BaudRate.BaudRate = lpDCB->BaudRate;
result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_BAUD_RATE,
&BaudRate, sizeof(BaudRate), NULL, 0, &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_BAUD_RATE) Failed.\n");
return FALSE;
}
/*
#define SERIAL_DTR_MASK ((ULONG)0x03)
#define SERIAL_DTR_CONTROL ((ULONG)0x01)
#define SERIAL_DTR_HANDSHAKE ((ULONG)0x02)
#define SERIAL_CTS_HANDSHAKE ((ULONG)0x08)
#define SERIAL_DSR_HANDSHAKE ((ULONG)0x10)
#define SERIAL_DCD_HANDSHAKE ((ULONG)0x20)
#define SERIAL_OUT_HANDSHAKEMASK ((ULONG)0x38)
#define SERIAL_DSR_SENSITIVITY ((ULONG)0x40)
#define SERIAL_ERROR_ABORT ((ULONG)0x80000000)
#define SERIAL_CONTROL_INVALID ((ULONG)0x7fffff84)
*/
HandFlow.ControlHandShake = 0;
if (lpDCB->fOutxCtsFlow) {
HandFlow.ControlHandShake |= SERIAL_CTS_HANDSHAKE;
}
if (lpDCB->fOutxDsrFlow) {
HandFlow.ControlHandShake |= SERIAL_DSR_HANDSHAKE;
}
if (lpDCB->fDtrControl) {
HandFlow.ControlHandShake |= SERIAL_DTR_CONTROL;
}
if (lpDCB->fDtrControl) {
HandFlow.ControlHandShake |= SERIAL_DTR_HANDSHAKE;
}
if (lpDCB->fRtsControl) {
HandFlow.ControlHandShake |= SERIAL_RTS_CONTROL;
}
if (lpDCB->fRtsControl) {
HandFlow.ControlHandShake |= SERIAL_RTS_HANDSHAKE;
}
if (lpDCB->fDsrSensitivity) {
HandFlow.ControlHandShake |= SERIAL_DSR_SENSITIVITY;
}
if (lpDCB->fAbortOnError) {
HandFlow.ControlHandShake |= SERIAL_ERROR_ABORT;
}
/*
#define SERIAL_AUTO_TRANSMIT ((ULONG)0x01)
#define SERIAL_AUTO_RECEIVE ((ULONG)0x02)
#define SERIAL_ERROR_CHAR ((ULONG)0x04)
#define SERIAL_NULL_STRIPPING ((ULONG)0x08)
#define SERIAL_BREAK_CHAR ((ULONG)0x10)
#define SERIAL_RTS_MASK ((ULONG)0xc0)
#define SERIAL_RTS_CONTROL ((ULONG)0x40)
#define SERIAL_RTS_HANDSHAKE ((ULONG)0x80)
#define SERIAL_TRANSMIT_TOGGLE ((ULONG)0xc0)
#define SERIAL_XOFF_CONTINUE ((ULONG)0x80000000)
#define SERIAL_FLOW_INVALID ((ULONG)0x7fffff20)
*/
HandFlow.FlowReplace = 0;
if (lpDCB->fErrorChar) {
HandFlow.FlowReplace |= SERIAL_ERROR_CHAR;
}
if (lpDCB->fNull) {
HandFlow.FlowReplace |= SERIAL_NULL_STRIPPING;
}
if (lpDCB->fTXContinueOnXoff) {
HandFlow.FlowReplace |= SERIAL_XOFF_CONTINUE;
}
HandFlow.XonLimit = lpDCB->XonLim;
HandFlow.XoffLimit = lpDCB->XoffLim;
result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_HANDFLOW,
&HandFlow, sizeof(HandFlow), NULL, 0, &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_HANDFLOW) Failed.\n");
return FALSE;
}
SpecialChars.EofChar = lpDCB->EofChar;
SpecialChars.ErrorChar = lpDCB->ErrorChar;
SpecialChars.BreakChar = 0;
SpecialChars.EventChar = lpDCB->EvtChar;
SpecialChars.XonChar = lpDCB->XonChar;
SpecialChars.XoffChar = lpDCB->XoffChar;
result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_CHARS,
&SpecialChars, sizeof(SpecialChars), NULL, 0, &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_CHARS) Failed.\n");
return FALSE;
}
LineControl.StopBits = lpDCB->StopBits;
LineControl.Parity = lpDCB->Parity;
LineControl.WordLength = lpDCB->ByteSize;
result = DeviceIoControl(hFile, IOCTL_SERIAL_SET_LINE_CONTROL,
&LineControl, sizeof(LineControl), NULL, 0, &dwBytesReturned, NULL);
if (!NT_SUCCESS(result)) {
DPRINT("ERROR: SetCommState() - DeviceIoControl(IOCTL_SERIAL_SET_LINE_CONTROL) Failed.\n");
return FALSE;
}
DPRINT("SetCommState() - COMPLETED SUCCESSFULLY\n");
return TRUE;
}
/*
* @implemented
*/
BOOL
STDCALL
SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts)
{
DWORD dwBytesReturned;
SERIAL_TIMEOUTS Timeouts;
if (lpCommTimeouts == NULL) {
return FALSE;
}
Timeouts.ReadIntervalTimeout = lpCommTimeouts->ReadIntervalTimeout;
Timeouts.ReadTotalTimeoutMultiplier = lpCommTimeouts->ReadTotalTimeoutMultiplier;
Timeouts.ReadTotalTimeoutConstant = lpCommTimeouts->ReadTotalTimeoutConstant;
Timeouts.WriteTotalTimeoutMultiplier = lpCommTimeouts->WriteTotalTimeoutMultiplier;
Timeouts.WriteTotalTimeoutConstant = lpCommTimeouts->WriteTotalTimeoutConstant;
return DeviceIoControl(hFile, IOCTL_SERIAL_SET_TIMEOUTS,
&Timeouts, sizeof(Timeouts), NULL, 0, &dwBytesReturned, NULL);
}
/*
* @unimplemented
*/
BOOL
STDCALL
SetDefaultCommConfigA(LPCSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @unimplemented
*/
BOOL
STDCALL
SetDefaultCommConfigW(LPCWSTR lpszName, LPCOMMCONFIG lpCC, DWORD dwSize)
{
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
* @implemented
*/
BOOL
STDCALL
SetupComm(HANDLE hFile, DWORD dwInQueue, DWORD dwOutQueue)
{
DWORD dwBytesReturned;
SERIAL_QUEUE_SIZE QueueSize;
QueueSize.InSize = dwInQueue;
QueueSize.OutSize = dwOutQueue;
return DeviceIoControl(hFile, IOCTL_SERIAL_SET_QUEUE_SIZE,
&QueueSize, sizeof(QueueSize), NULL, 0, &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
TransmitCommChar(HANDLE hFile, char cChar)
{
DWORD dwBytesReturned;
return DeviceIoControl(hFile, IOCTL_SERIAL_IMMEDIATE_CHAR,
&cChar, sizeof(cChar), NULL, 0, &dwBytesReturned, NULL);
}
/*
* @implemented
*/
BOOL
STDCALL
WaitCommEvent(HANDLE hFile, LPDWORD lpEvtMask, LPOVERLAPPED lpOverlapped)
{
DWORD dwBytesReturned;
if (lpEvtMask == NULL) {
return FALSE;
}
return DeviceIoControl(hFile, IOCTL_SERIAL_WAIT_ON_MASK,
NULL, 0, lpEvtMask, sizeof(DWORD), &dwBytesReturned, lpOverlapped);
}
/* EOF */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -