mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-19 20:39:01 +00:00
78 lines
2.3 KiB
C#
78 lines
2.3 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.IO.Pipes;
|
|
using System.Runtime.InteropServices;
|
|
using Microsoft.Win32.SafeHandles;
|
|
|
|
namespace Cosmos.Debug.Common
|
|
{
|
|
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
|
|
);
|
|
}
|
|
}
|