67 : base(direction, transmissionMode, outBufferSize)
69 ValidateParameters(pipeName, direction, maxNumberOfServerInstances, transmissionMode,
options, inBufferSize, outBufferSize, inheritability);
70 Create(pipeName, direction, maxNumberOfServerInstances, transmissionMode,
options, inBufferSize, outBufferSize, inheritability);
79 if (pipeName.Length == 0)
83 if (direction < PipeDirection.In || direction >
PipeDirection.InOut)
87 if (transmissionMode < PipeTransmissionMode.Byte || transmissionMode >
PipeTransmissionMode.Message)
99 if (outBufferSize < 0)
103 if ((maxNumberOfServerInstances < 1 || maxNumberOfServerInstances > 254) && maxNumberOfServerInstances != -1)
107 if (inheritability < HandleInheritability.None || inheritability >
HandleInheritability.Inheritable)
113 base.IsCurrentUserOnly =
true;
120 if (safePipeHandle ==
null)
162 if (base.InternalHandle !=
null && base.InternalHandle.IsClosed)
174 if (base.State ==
PipeState.WaitingToConnect)
178 if (base.State ==
PipeState.Disconnected)
182 if (base.InternalHandle ==
null)
186 if (base.State ==
PipeState.Closed || (base.InternalHandle !=
null && base.InternalHandle.IsClosed))
193 : base(direction, transmissionMode, outBufferSize)
195 ValidateParameters(pipeName, direction, maxNumberOfServerInstances, transmissionMode,
options, inBufferSize, outBufferSize, inheritability);
196 if (pipeSecurity !=
null && base.IsCurrentUserOnly)
200 Create(pipeName, direction, maxNumberOfServerInstances, transmissionMode,
options, inBufferSize, outBufferSize, pipeSecurity, inheritability, additionalAccessRights);
203 protected override void Dispose(
bool disposing)
211 base.Dispose(disposing);
220 source._preallocatedOverlapped.Dispose();
226 Create(pipeName, direction, maxNumberOfServerInstances, transmissionMode,
options, inBufferSize, outBufferSize,
null, inheritability, (
PipeAccessRights)0);
232 if (
string.Equals(fullPath,
"\\\\.\\pipe\\anonymous",
StringComparison.OrdinalIgnoreCase))
236 if (base.IsCurrentUserOnly)
248 int openMode = (int)direction | ((maxNumberOfServerInstances == 1) ? 524288 : 0) | (
int)
options | (int)additionalAccessRights;
249 int pipeMode = ((int)transmissionMode << 2) | ((int)transmissionMode << 1);
250 if (maxNumberOfServerInstances == -1)
252 maxNumberOfServerInstances = 255;
257 global::Interop.Kernel32.SECURITY_ATTRIBUTES securityAttributes =
PipeStream.
GetSecAttrs(inheritability, pipeSecurity, ref pinningHandle);
258 SafePipeHandle safePipeHandle = global::Interop.Kernel32.CreateNamedPipe(fullPath, openMode, pipeMode, maxNumberOfServerInstances, outBufferSize, inBufferSize, 0, ref securityAttributes);
269 pinningHandle.
Free();
282 if (!global::Interop.Kernel32.ConnectNamedPipe(base.InternalHandle,
IntPtr.
Zero))
285 if (lastPInvokeError != 535)
289 if (lastPInvokeError == 535 && base.State ==
PipeState.Connected)
316 if (!global::Interop.Kernel32.DisconnectNamedPipe(base.InternalHandle))
326 char* ptr = stackalloc
char[514];
327 if (global::Interop.Kernel32.GetNamedPipeHandleStateW(base.InternalHandle,
null,
null,
null,
null, ptr, 514u))
334 public void RunAsClient(PipeStreamImpersonationWorker impersonationWorker)
338 bool exceptionThrown =
true;
342 exceptionThrown =
false;
361 if (global::Interop.Advapi32.ImpersonateNamedPipeClient(executeHelper.
_handle))
363 executeHelper._mustRevert =
true;
378 if (executeHelper.
_mustRevert && !global::Interop.Advapi32.RevertToSelf())
391 if (!global::Interop.Kernel32.ConnectNamedPipe(base.InternalHandle, connectionValueTaskSource.
_overlapped))
394 switch (lastPInvokeError)
400 connectionValueTaskSource.
Dispose();
408 connectionValueTaskSource.
Dispose();
415 connectionValueTaskSource.
Dispose();
419 return new ValueTask(connectionValueTaskSource, connectionValueTaskSource.
Version);
424 if (base.InternalHandle ==
null)
435 global::Interop.Kernel32.LoadLibraryEx(
"sspicli.dll",
IntPtr.
Zero, 2048);
436 if (global::Interop.Kernel32.GetNamedPipeHandleStateW(base.InternalHandle,
null,
null,
null,
null, userName, userNameMaxLength))
438 return new string(userName);
static bool Is64BitProcess
static Exception GetPipeNotOpen()
static string GetFullPath(string path)
ExecuteHelper(PipeStreamImpersonationWorker userCode, SafePipeHandle handle)
int _impersonateErrorCode
int _revertImpersonateErrorCode
PipeStreamImpersonationWorker _userCode
void EndWaitForConnection(IAsyncResult asyncResult)
void ValidateParameters(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize, HandleInheritability inheritability)
static void ImpersonateAndTryCode(object helper)
void Create(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize, HandleInheritability inheritability)
void CheckDisconnectOperations()
IAsyncResult BeginWaitForConnection(AsyncCallback? callback, object? state)
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize, HandleInheritability inheritability)
NamedPipeServerStream(string pipeName)
NamedPipeServerStream(string pipeName, PipeDirection direction)
unsafe ValueTask WaitForConnectionCoreAsync(CancellationToken cancellationToken)
Task WaitForConnectionAsync(CancellationToken cancellationToken)
NamedPipeServerStream(PipeDirection direction, bool isAsync, bool isConnected, SafePipeHandle safePipeHandle)
void Create(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize, PipeSecurity pipeSecurity, HandleInheritability inheritability, PipeAccessRights additionalAccessRights)
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize, PipeSecurity pipeSecurity, HandleInheritability inheritability=HandleInheritability.None, PipeAccessRights additionalAccessRights=(PipeAccessRights) 0)
Task WaitForConnectionAsync()
const int MaxAllowedServerInstances
unsafe string HandleGetImpersonationUserNameError(int error, uint userNameMaxLength, char *userName)
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances)
override void Dispose(bool disposing)
static void RevertImpersonationOnBackout(object helper, bool exceptionThrown)
void CheckConnectOperationsServer()
override void TryToReuse(PipeValueTaskSource source)
unsafe string GetImpersonationUserName()
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options)
ConnectionValueTaskSource _reusableConnectionValueTaskSource
void RunAsClient(PipeStreamImpersonationWorker impersonationWorker)
void CheckConnectOperationsServerWithHandle()
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode, PipeOptions options, int inBufferSize, int outBufferSize)
NamedPipeServerStream(string pipeName, PipeDirection direction, int maxNumberOfServerInstances, PipeTransmissionMode transmissionMode)
void AddAccessRule(PipeAccessRule rule)
unsafe void PrepareForOperation(ReadOnlyMemory< byte > memory=default(ReadOnlyMemory< byte >))
unsafe void RegisterForCancellation(CancellationToken cancellationToken)
void FinishedScheduling()
unsafe NativeOverlapped * _overlapped
void CheckWriteOperations()
void ValidateHandleIsPipe(SafePipeHandle safePipeHandle)
Exception WinIOError(int errorCode)
void InitializeHandle(SafePipeHandle? handle, bool isExposed, bool isAsync)
static unsafe global::Interop.Kernel32.SECURITY_ATTRIBUTES GetSecAttrs(HandleInheritability inheritability)
static Exception GetExceptionForLastWin32Error(string path="")
static Exception GetExceptionForWin32Error(int errorCode, string path="")
static Exception SetCurrentStackTrace(Exception source)
static int GetLastPInvokeError()
static string ArgumentOutOfRange_OptionsInvalid
static string ArgumentOutOfRange_MaxNumServerInstances
static string NotSupported_PipeSecurityIsCurrentUserOnly
static string ArgumentOutOfRange_HandleInheritabilityNoneOrInheritable
static string InvalidOperation_PipeAlreadyDisconnected
static string InvalidOperation_PipeAlreadyConnected
static string InvalidOperation_PipeHandleNotSet
static string ArgumentOutOfRange_TransmissionModeByteOrMsg
static string Argument_InvalidHandle
static string Argument_NeedNonemptyPipeName
static string InvalidOperation_PipeNotYetConnected
static string ArgumentOutOfRange_AnonymousReserved
static string IO_PipeBroken
static string ArgumentOutOfRange_NeedNonNegNum
static string ArgumentOutOfRange_DirectionModeInOutOrInOut
void SetOwner(IdentityReference identity)
SecurityIdentifier? Owner
static WindowsIdentity GetCurrent()
static int CompareExchange(ref int location1, int value, int comparand)
static int Exchange(ref int location1, int value)
static TaskScheduler Default
static IAsyncResult Begin(Task task, AsyncCallback callback, object state)
static void End(IAsyncResult asyncResult)
static new TaskFactory< TResult > Factory
static Task FromCanceled(CancellationToken cancellationToken)
new TaskAwaiter< TResult > GetAwaiter()
static readonly IntPtr Zero
static CancellationToken None
static ValueTask CompletedTask
static ValueTask FromException(Exception exception)