diff --git a/Drone/Interop/Methods.cs b/Drone/Interop/Methods.cs index 4c37f79..2b22916 100644 --- a/Drone/Interop/Methods.cs +++ b/Drone/Interop/Methods.cs @@ -208,15 +208,19 @@ public static bool CreatePipe(out IntPtr hReadPipe, out IntPtr hWritePipe, ref S return result; } - public static bool PeekNamedPipe(IntPtr hPipe) + public static bool PeekNamedPipe(IntPtr hPipe, ref uint nbBytesAvailable) { - object[] parameters = { hPipe, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, (uint)0, IntPtr.Zero }; - - return (bool)Generic.DynamicApiInvoke( + object[] parameters = { hPipe, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, nbBytesAvailable, IntPtr.Zero }; + + var result = (bool)Generic.DynamicApiInvoke( "kernel32.dll", "PeekNamedPipe", typeof(PeekNamedPipe), ref parameters); + + nbBytesAvailable = (uint)parameters[4]; + + return result; } public static bool FreeLibrary(IntPtr hModule) diff --git a/Drone/Utilities/Extensions.cs b/Drone/Utilities/Extensions.cs index 8f42b62..6ed11d5 100644 --- a/Drone/Utilities/Extensions.cs +++ b/Drone/Utilities/Extensions.cs @@ -50,7 +50,12 @@ public static bool DataAvailable(this TcpClient client) public static bool DataAvailable(this PipeStream pipe) { var hPipe = pipe.SafePipeHandle.DangerousGetHandle(); - return Interop.Methods.PeekNamedPipe(hPipe); + uint nbBytesAvailable = 0; + bool result = Interop.Methods.PeekNamedPipe(hPipe, ref nbBytesAvailable); + if (result == false) + throw new System.ComponentModel.Win32Exception("Named Pipe is not available."); + + return nbBytesAvailable > 0; } public static async Task ReadStream(this Stream stream)