mirror of https://github.com/dahall/Vanara.git
104 lines
3.8 KiB
C#
104 lines
3.8 KiB
C#
using NUnit.Framework;
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using Vanara.InteropServices;
|
|
using static Vanara.PInvoke.AdvApi32;
|
|
using static Vanara.PInvoke.Kernel32;
|
|
|
|
namespace Vanara.PInvoke.Tests
|
|
{
|
|
[TestFixture]
|
|
public class NamedPipeApiTests
|
|
{
|
|
[Test]
|
|
public unsafe void ConnectNamedPipeTest()
|
|
{
|
|
using (var hPipe = CreateNamedPipe(PipeClientWriter.pipeName, PIPE_ACCESS.PIPE_ACCESS_DUPLEX, PIPE_TYPE.PIPE_TYPE_BYTE | PIPE_TYPE.PIPE_READMODE_BYTE | PIPE_TYPE.PIPE_WAIT, 10, 1024 * 16, 1024 * 16, 60000))
|
|
{
|
|
Assert.That(hPipe, ResultIs.ValidHandle);
|
|
|
|
var p = CSharpRunner.RunProcess(typeof(PipeClientWriter));
|
|
Assert.That(ConnectNamedPipe(hPipe), ResultIs.Successful);
|
|
|
|
var buffer = new byte[1024];
|
|
Assert.That(PeekNamedPipe(hPipe, buffer, (uint)buffer.Length - 1, out var peekRead, out var peekAvail, out var peekLeft), ResultIs.Successful);
|
|
//Assert.That(peekRead, Is.EqualTo(PipeClientWriter.bytesToWrite.Length));
|
|
Assert.That(ReadFile(hPipe, buffer, (uint)buffer.Length - 1, out var nRead), ResultIs.Successful);
|
|
Assert.That(nRead, Is.EqualTo(PipeClientWriter.bytesToWrite.Length));
|
|
|
|
Assert.That(DisconnectNamedPipe(hPipe), ResultIs.Successful);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void CreatePipeTest()
|
|
{
|
|
var saAttr = new SECURITY_ATTRIBUTES { bInheritHandle = true };
|
|
Assert.That(CreatePipe(out var g_hChildStd_OUT_Rd, out var g_hChildStd_OUT_Wr, saAttr, 0), ResultIs.Successful);
|
|
g_hChildStd_OUT_Rd.Dispose();
|
|
g_hChildStd_OUT_Wr.Dispose();
|
|
}
|
|
|
|
[Test]
|
|
public void CreateNamedPipeTest()
|
|
{
|
|
using (var hPipe = CreateNamedPipe(@"\\.\pipe\PipeName", PIPE_ACCESS.PIPE_ACCESS_DUPLEX, PIPE_TYPE.PIPE_WAIT, 1, 4096, 4096, 0))
|
|
Assert.That(hPipe, ResultIs.ValidHandle);
|
|
}
|
|
|
|
[Test]
|
|
public void GetNamedPipeClientComputerNameTest()
|
|
{
|
|
using (var hPipe = CreateNamedPipe(@"\\.\pipe\PipeName", PIPE_ACCESS.PIPE_ACCESS_DUPLEX, PIPE_TYPE.PIPE_WAIT, 1, 4096, 4096, 0))
|
|
{
|
|
var sb = new StringBuilder(100, 100);
|
|
Assert.That(GetNamedPipeClientComputerName(hPipe, sb, (uint)sb.Capacity), ResultIs.Failure);
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void GetNamedPipeIdTest()
|
|
{
|
|
var saAttr = new SECURITY_ATTRIBUTES { bInheritHandle = true };
|
|
Assert.That(CreatePipe(out var g_hChildStd_OUT_Rd, out var g_hChildStd_OUT_Wr, saAttr, 0), ResultIs.Successful);
|
|
try
|
|
{
|
|
Assert.That(GetNamedPipeClientProcessId(g_hChildStd_OUT_Rd, out var cpid), ResultIs.Successful);
|
|
Assert.That(cpid, Is.Not.Zero);
|
|
Assert.That(GetNamedPipeClientSessionId(g_hChildStd_OUT_Rd, out var csid), ResultIs.Successful);
|
|
Assert.That(csid, Is.Not.Zero);
|
|
Assert.That(GetNamedPipeServerProcessId(g_hChildStd_OUT_Rd, out var spid), ResultIs.Successful);
|
|
Assert.That(spid, Is.Not.Zero);
|
|
Assert.That(GetNamedPipeServerSessionId(g_hChildStd_OUT_Rd, out var ssid), ResultIs.Successful);
|
|
Assert.That(ssid, Is.Not.Zero);
|
|
Assert.That(GetNamedPipeHandleState(g_hChildStd_OUT_Wr, out var type, out var inst), ResultIs.Successful);
|
|
(cpid, csid, spid, ssid, type, inst).WriteValues();
|
|
Assert.That(SetNamedPipeHandleState(g_hChildStd_OUT_Wr, new PinnedObject(0)), ResultIs.Successful);
|
|
}
|
|
finally
|
|
{
|
|
g_hChildStd_OUT_Rd.Dispose();
|
|
g_hChildStd_OUT_Wr.Dispose();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class PipeClientWriter
|
|
{
|
|
public static readonly byte[] bytesToWrite = new byte[] { 1, 2, 4, 8, 16, 32 };
|
|
public const string pipeName = @"\\.\pipe\PipeName";
|
|
|
|
public static int Main()
|
|
{
|
|
Sleep(2000);
|
|
using (var hPipe = CreateFile(pipeName, FileAccess.GENERIC_WRITE, 0, null, System.IO.FileMode.Open, 0))
|
|
{
|
|
if (hPipe.IsInvalid) return (int)(uint)Win32Error.GetLastError();
|
|
if (!WriteFile(hPipe, bytesToWrite, (uint)bytesToWrite.Length, out var written) || written != bytesToWrite.Length)
|
|
return (int)(uint)Win32Error.GetLastError();
|
|
}
|
|
return 0;
|
|
}
|
|
}
|
|
} |