winpr-comm: implemented IOCTL_SERIAL_RESET_DEVICE
authorEmmanuel Ledoux <eledoux@hp.com>
Tue, 17 Jun 2014 15:49:06 +0000 (17:49 +0200)
committerEmmanuel Ledoux <emmanuel.ledoux@hp.com>
Tue, 17 Jun 2014 15:49:06 +0000 (17:49 +0200)
winpr/include/winpr/comm.h
winpr/libwinpr/comm/comm_ioctl.c
winpr/libwinpr/comm/comm_ioctl.h
winpr/libwinpr/comm/comm_sercx2_sys.c
winpr/libwinpr/comm/comm_sercx_sys.c
winpr/libwinpr/comm/comm_serial_sys.c

index 3b1e34b..5580374 100644 (file)
@@ -417,7 +417,7 @@ WINPR_API HANDLE CommCreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD
 
 #define IOCTL_SERIAL_SET_DTR           0x001B0024
 #define IOCTL_SERIAL_CLR_DTR           0x001B0028
-/* IOCTL_SERIAL_RESET_DEVICE 0x001B002C */
+#define IOCTL_SERIAL_RESET_DEVICE      0x001B002C
 #define IOCTL_SERIAL_SET_RTS           0x001B0030
 #define IOCTL_SERIAL_CLR_RTS           0x001B0034
 #define IOCTL_SERIAL_SET_XOFF          0x001B0038
@@ -483,7 +483,7 @@ static const _SERIAL_IOCTL_NAME _SERIAL_IOCTL_NAMES[] =
        {IOCTL_SERIAL_SET_CHARS,        "IOCTL_SERIAL_SET_CHARS"},
        {IOCTL_SERIAL_SET_DTR,          "IOCTL_SERIAL_SET_DTR"},
        {IOCTL_SERIAL_CLR_DTR,          "IOCTL_SERIAL_CLR_DTR"},
-       // {IOCTL_SERIAL_RESET_DEVICE,  "IOCTL_SERIAL_RESET_DEVICE"},
+       {IOCTL_SERIAL_RESET_DEVICE,     "IOCTL_SERIAL_RESET_DEVICE"},
        {IOCTL_SERIAL_SET_RTS,          "IOCTL_SERIAL_SET_RTS"},
        {IOCTL_SERIAL_CLR_RTS,          "IOCTL_SERIAL_CLR_RTS"},
        {IOCTL_SERIAL_SET_XOFF,         "IOCTL_SERIAL_SET_XOFF"},
index 9c5985e..7420020 100644 (file)
@@ -619,11 +619,19 @@ static BOOL _CommDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, LPVOID l
                        }
                        break;
                }
+               case IOCTL_SERIAL_RESET_DEVICE:
+               {
+                       if (pRemoteSerialDriver->reset_device)
+                       {
+                               return pRemoteSerialDriver->reset_device(pComm);
+                       }
+                       break;
+               }
        }
 
        DEBUG_WARN(_T("unsupported IoControlCode=[0x%lX] %s (remote serial driver: %s)"),
                dwIoControlCode, _comm_serial_ioctl_name(dwIoControlCode), pRemoteSerialDriver->name);
-       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+       SetLastError(ERROR_CALL_NOT_IMPLEMENTED); /* => STATUS_NOT_IMPLEMENTED */
        return FALSE;
 
 }
index c3c1ee2..661963e 100644 (file)
@@ -243,6 +243,7 @@ typedef struct _REMOTE_SERIAL_DRIVER
        BOOL (*get_dtrrts)(WINPR_COMM *pComm, ULONG *pMask);
        BOOL (*config_size)(WINPR_COMM *pComm, ULONG *pSize);
        BOOL (*immediate_char)(WINPR_COMM *pComm, const UCHAR *pChar);
+       BOOL (*reset_device)(WINPR_COMM *pComm);
 
 } REMOTE_SERIAL_DRIVER;
 
index 0790cd7..e74df12 100644 (file)
@@ -153,6 +153,7 @@ static REMOTE_SERIAL_DRIVER _SerCx2Sys =
        .get_dtrrts       = NULL,
        .config_size      = NULL, /* not supported by SerCx2.sys */
        .immediate_char   = NULL, /* not supported by SerCx2.sys */
+       .reset_device     = NULL, /* not supported by SerCx2.sys */
 };
 
 
index b86919c..0a6e683 100644 (file)
@@ -402,6 +402,7 @@ static REMOTE_SERIAL_DRIVER _SerCxSys =
        .get_dtrrts       = NULL,
        .config_size      = NULL, /* not supported by SerCx.sys */
        .immediate_char   = NULL,
+       .reset_device     = NULL, /* not supported by SerCx.sys */
 };
 
 
index 632eddf..3fcf0ab 100644 (file)
@@ -1506,6 +1506,12 @@ BOOL _immediate_char(WINPR_COMM *pComm, const UCHAR *pChar)
 }
 
 
+BOOL _reset_device(WINPR_COMM *pComm)
+{
+       /* http://msdn.microsoft.com/en-us/library/dn265347%28v=vs.85%29.aspx */
+       return TRUE;
+}
+
 static REMOTE_SERIAL_DRIVER _SerialSys =
 {
        .id               = RemoteSerialDriverSerialSys,
@@ -1539,6 +1545,7 @@ static REMOTE_SERIAL_DRIVER _SerialSys =
        .get_dtrrts       = _get_dtrrts,
        .config_size      = _config_size,
        .immediate_char   = _immediate_char,
+       .reset_device     = _reset_device,
 };