Cosmos/source/Cosmos.Debug.DebugConnectors/DebugConnectorTestPipeServer.cs

77 lines
2.3 KiB
C#

using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace Cosmos.Debug.DebugConnectors
{
public class DebugConnectorTestPipeServer : DebugConnectorStreamWithoutTimeouts
{
// private AutoResetEvent mWaitConnectEvent = new AutoResetEvent(false);
private FileStream mPipe;
private SafeFileHandle mHandle;
public DebugConnectorTestPipeServer(string aName)
{
mHandle = CreateNamedPipe(@"\\.\pipe\" + aName, 3 | 0x40000000,
0,
1,
1,
12,
0,
IntPtr.Zero
);
Start();
}
protected override int TryRead(byte[] buffer, int offset, int count, int timeout)
{
mStream.ReadTimeout = timeout;
var xStream = mStream;
if (xStream == null)
{
return 0;
}
return xStream.Read(buffer, offset, count);
}
protected override void InitializeBackground()
{
int success = ConnectNamedPipe(mHandle, IntPtr.Zero);
Console.WriteLine("A client connected");
//failed to connect client pipe
if (success != 1)
{
throw new Exception("Unable to connect pipe");
}
mPipe = new FileStream(mHandle, FileAccess.ReadWrite, 8192, false);
Start(mPipe);
}
protected override bool GetIsConnectedToDebugStub()
{
return mPipe.CanRead;
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern SafeFileHandle CreateNamedPipe(
String pipeName,
uint dwOpenMode,
uint dwPipeMode,
uint nMaxInstances,
uint nOutBufferSize,
uint nInBufferSize,
uint nDefaultTimeOut,
IntPtr lpSecurityAttributes
);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern int ConnectNamedPipe(
SafeFileHandle hNamedPipe,
IntPtr lpOverlapped
);
}
}