win32: fix close and improve cancel (no error when write is canceled)
diff --git a/serial/serialwin32.py b/serial/serialwin32.py
index d11a2c4..9cb2620 100644
--- a/serial/serialwin32.py
+++ b/serial/serialwin32.py
@@ -226,7 +226,7 @@
 
     def _close(self):
         """internal close port helper"""
-        if self._port_handle:
+        if self._port_handle is not None:
             # Restore original timeout values:
             win32.SetCommTimeouts(self._port_handle, self._orgTimeouts)
             if self._overlapped_read is not None:
@@ -237,6 +237,7 @@
                 self.cancel_write()
                 win32.CloseHandle(self._overlapped_write.hEvent)
                 self._overlapped_write = None
+            win32.CloseHandle(self._port_handle)
             self._port_handle = None
 
     def close(self):
@@ -312,6 +313,8 @@
                 # Wait for the write to complete.
                 #~ win32.WaitForSingleObject(self._overlapped_write.hEvent, win32.INFINITE)
                 err = win32.GetOverlappedResult(self._port_handle, self._overlapped_write, ctypes.byref(n), True)
+                if win32.GetLastError() == win32.ERROR_OPERATION_ABORTED:
+                    return n.value # canceled IO is no error
                 if n.value != len(data):
                     raise writeTimeoutError
             return n.value
diff --git a/serial/win32.py b/serial/win32.py
index 2fddf6b..31f21ee 100644
--- a/serial/win32.py
+++ b/serial/win32.py
@@ -219,6 +219,7 @@
 MAXDWORD = 4294967295  # Variable c_uint
 EV_RLSD = 32  # Variable c_int
 ERROR_SUCCESS = 0
+ERROR_OPERATION_ABORTED = 995
 ERROR_IO_INCOMPLETE = 996
 ERROR_IO_PENDING = 997  # Variable c_long
 MS_CTS_ON = 16  # Variable c_ulong