Migrated CreateFile
This commit is contained in:
parent
e9c761631b
commit
01fb988c89
@ -2,6 +2,9 @@
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using Windows.Win32;
|
||||
using Windows.Win32.Storage.FileSystem;
|
||||
using Microsoft.Win32.SafeHandles;
|
||||
using Nefarius.Peripherals.SerialPort.Win32PInvoke;
|
||||
|
||||
namespace Nefarius.Peripherals.SerialPort
|
||||
@ -19,7 +22,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
private bool _checkSends = true;
|
||||
|
||||
private Handshake _handShake;
|
||||
private IntPtr _hPort;
|
||||
private SafeFileHandle _hPort;
|
||||
private bool _online;
|
||||
private IntPtr _ptrUwo = IntPtr.Zero;
|
||||
private Exception _rxException;
|
||||
@ -188,14 +191,14 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
CheckOnline();
|
||||
if (value)
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.SETRTS))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.SETRTS))
|
||||
_stateRts = 1;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.CLRRTS))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.CLRRTS))
|
||||
_stateRts = 1;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
@ -220,14 +223,14 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
CheckOnline();
|
||||
if (value)
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.SETDTR))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.SETDTR))
|
||||
_stateDtr = 1;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.CLRDTR))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.CLRDTR))
|
||||
_stateDtr = 0;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
@ -247,14 +250,14 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
CheckOnline();
|
||||
if (value)
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.SETBREAK))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.SETBREAK))
|
||||
_stateBrk = 0;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Win32Com.EscapeCommFunction(_hPort, Win32Com.CLRBREAK))
|
||||
if (Win32Com.EscapeCommFunction(_hPort.DangerousGetHandle(), Win32Com.CLRBREAK))
|
||||
_stateBrk = 0;
|
||||
else
|
||||
ThrowException("Unexpected Failure");
|
||||
@ -345,10 +348,11 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
var wo = new OVERLAPPED();
|
||||
|
||||
if (_online) return false;
|
||||
|
||||
_hPort = PInvoke.CreateFile(PortName, FILE_ACCESS_FLAGS.FILE_GENERIC_READ | FILE_ACCESS_FLAGS.FILE_GENERIC_WRITE, 0,
|
||||
null, FILE_CREATION_DISPOSITION.OPEN_EXISTING, FILE_FLAGS_AND_ATTRIBUTES.FILE_FLAG_OVERLAPPED, null);
|
||||
|
||||
_hPort = Win32Com.CreateFile(PortName, Win32Com.GENERIC_READ | Win32Com.GENERIC_WRITE, 0, IntPtr.Zero,
|
||||
Win32Com.OPEN_EXISTING, Win32Com.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
|
||||
if (_hPort == (IntPtr) Win32Com.INVALID_HANDLE_VALUE)
|
||||
if (_hPort.IsInvalid)
|
||||
{
|
||||
if (Marshal.GetLastWin32Error() == Win32Com.ERROR_ACCESS_DENIED) return false;
|
||||
throw new CommPortException("Port Open Failure");
|
||||
@ -372,10 +376,10 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
portDcb.XoffLim = (short) RxHighWater;
|
||||
portDcb.XonLim = (short) RxLowWater;
|
||||
if (RxQueue != 0 || TxQueue != 0)
|
||||
if (!Win32Com.SetupComm(_hPort, (uint) RxQueue, (uint) TxQueue))
|
||||
if (!Win32Com.SetupComm(_hPort.DangerousGetHandle(), (uint) RxQueue, (uint) TxQueue))
|
||||
ThrowException("Bad queue settings");
|
||||
if (!Win32Com.SetCommState(_hPort, ref portDcb)) ThrowException("Bad com settings");
|
||||
if (!Win32Com.SetCommTimeouts(_hPort, ref commTimeouts)) ThrowException("Bad timeout settings");
|
||||
if (!Win32Com.SetCommState(_hPort.DangerousGetHandle(), ref portDcb)) ThrowException("Bad com settings");
|
||||
if (!Win32Com.SetCommTimeouts(_hPort.DangerousGetHandle(), ref commTimeouts)) ThrowException("Bad timeout settings");
|
||||
|
||||
_stateBrk = 0;
|
||||
switch (UseDtr)
|
||||
@ -445,14 +449,14 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
|
||||
private void InternalClose()
|
||||
{
|
||||
Win32Com.CancelIo(_hPort);
|
||||
Win32Com.CancelIo(_hPort.DangerousGetHandle());
|
||||
if (_rxThread != null)
|
||||
{
|
||||
_rxThread.Abort();
|
||||
_rxThread = null;
|
||||
}
|
||||
|
||||
Win32Com.CloseHandle(_hPort);
|
||||
_hPort.Dispose();
|
||||
if (_ptrUwo != IntPtr.Zero) Marshal.FreeHGlobal(_ptrUwo);
|
||||
_stateRts = 2;
|
||||
_stateDtr = 2;
|
||||
@ -505,7 +509,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
CheckOnline();
|
||||
CheckResult();
|
||||
_writeCount = toSend.GetLength(0);
|
||||
if (Win32Com.WriteFile(_hPort, toSend, (uint) _writeCount, out sent, _ptrUwo))
|
||||
if (Win32Com.WriteFile(_hPort.DangerousGetHandle(), toSend, (uint) _writeCount, out sent, _ptrUwo))
|
||||
{
|
||||
_writeCount -= (int) sent;
|
||||
}
|
||||
@ -557,7 +561,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
{
|
||||
if (_writeCount <= 0) return;
|
||||
uint sent;
|
||||
if (Win32Com.GetOverlappedResult(_hPort, _ptrUwo, out sent, _checkSends))
|
||||
if (Win32Com.GetOverlappedResult(_hPort.DangerousGetHandle(), _ptrUwo, out sent, _checkSends))
|
||||
{
|
||||
_writeCount -= (int) sent;
|
||||
if (_writeCount != 0) ThrowException("Send Timeout");
|
||||
@ -576,7 +580,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
public void SendImmediate(byte tosend)
|
||||
{
|
||||
CheckOnline();
|
||||
if (!Win32Com.TransmitCommChar(_hPort, tosend)) ThrowException("Transmission failure");
|
||||
if (!Win32Com.TransmitCommChar(_hPort.DangerousGetHandle(), tosend)) ThrowException("Transmission failure");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -588,7 +592,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
uint f;
|
||||
|
||||
CheckOnline();
|
||||
if (!Win32Com.GetCommModemStatus(_hPort, out f)) ThrowException("Unexpected failure");
|
||||
if (!Win32Com.GetCommModemStatus(_hPort.DangerousGetHandle(), out f)) ThrowException("Unexpected failure");
|
||||
return new ModemStatus(f);
|
||||
}
|
||||
|
||||
@ -604,8 +608,8 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
uint er;
|
||||
|
||||
CheckOnline();
|
||||
if (!Win32Com.ClearCommError(_hPort, out er, out cs)) ThrowException("Unexpected failure");
|
||||
if (!Win32Com.GetCommProperties(_hPort, out cp)) ThrowException("Unexpected failure");
|
||||
if (!Win32Com.ClearCommError(_hPort.DangerousGetHandle(), out er, out cs)) ThrowException("Unexpected failure");
|
||||
if (!Win32Com.GetCommProperties(_hPort.DangerousGetHandle(), out cp)) ThrowException("Unexpected failure");
|
||||
return new QueueStatus(cs.Flags, cs.cbInQue, cs.cbOutQue, cp.dwCurrentRxQueue, cp.dwCurrentTxQueue);
|
||||
}
|
||||
|
||||
@ -696,12 +700,12 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
if (!Win32Com.SetCommMask(_hPort,
|
||||
if (!Win32Com.SetCommMask(_hPort.DangerousGetHandle(),
|
||||
Win32Com.EV_RXCHAR | Win32Com.EV_TXEMPTY | Win32Com.EV_CTS | Win32Com.EV_DSR
|
||||
| Win32Com.EV_BREAK | Win32Com.EV_RLSD | Win32Com.EV_RING | Win32Com.EV_ERR))
|
||||
throw new CommPortException("IO Error [001]");
|
||||
Marshal.WriteInt32(uMask, 0);
|
||||
if (!Win32Com.WaitCommEvent(_hPort, uMask, unmanagedOv))
|
||||
if (!Win32Com.WaitCommEvent(_hPort.DangerousGetHandle(), uMask, unmanagedOv))
|
||||
{
|
||||
if (Marshal.GetLastWin32Error() == Win32Com.ERROR_IO_PENDING)
|
||||
sg.WaitOne();
|
||||
@ -713,7 +717,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
if ((eventMask & Win32Com.EV_ERR) != 0)
|
||||
{
|
||||
uint errs;
|
||||
if (Win32Com.ClearCommError(_hPort, out errs, IntPtr.Zero))
|
||||
if (Win32Com.ClearCommError(_hPort.DangerousGetHandle(), out errs, IntPtr.Zero))
|
||||
{
|
||||
var s = new StringBuilder("UART Error: ", 40);
|
||||
if ((errs & Win32Com.CE_FRAME) != 0) s = s.Append("Framing,");
|
||||
@ -734,11 +738,11 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
uint gotbytes;
|
||||
do
|
||||
{
|
||||
if (!Win32Com.ReadFile(_hPort, buf, 1, out gotbytes, unmanagedOv))
|
||||
if (!Win32Com.ReadFile(_hPort.DangerousGetHandle(), buf, 1, out gotbytes, unmanagedOv))
|
||||
{
|
||||
if (Marshal.GetLastWin32Error() == Win32Com.ERROR_IO_PENDING)
|
||||
{
|
||||
Win32Com.CancelIo(_hPort);
|
||||
Win32Com.CancelIo(_hPort.DangerousGetHandle());
|
||||
gotbytes = 0;
|
||||
}
|
||||
else
|
||||
@ -762,7 +766,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
if (i != 0)
|
||||
{
|
||||
uint f;
|
||||
if (!Win32Com.GetCommModemStatus(_hPort, out f)) throw new CommPortException("IO Error [005]");
|
||||
if (!Win32Com.GetCommModemStatus(_hPort.DangerousGetHandle(), out f)) throw new CommPortException("IO Error [005]");
|
||||
OnStatusChange(new ModemStatus(i), new ModemStatus(f));
|
||||
}
|
||||
}
|
||||
@ -790,7 +794,7 @@ namespace Nefarius.Peripherals.SerialPort
|
||||
if (_online)
|
||||
{
|
||||
uint f;
|
||||
if (Win32Com.GetHandleInformation(_hPort, out f)) return true;
|
||||
if (Win32Com.GetHandleInformation(_hPort.DangerousGetHandle(), out f)) return true;
|
||||
ThrowException("Offline");
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user