Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
NamedPipeClientStream.cs
Go to the documentation of this file.
8
9namespace System.IO.Pipes;
10
11public sealed class NamedPipeClientStream : PipeStream
12{
13 private readonly string _normalizedPipePath;
14
16
17 private readonly PipeOptions _pipeOptions;
18
20
21 private readonly PipeDirection _direction;
22
23 [SupportedOSPlatform("windows")]
24 public unsafe int NumberOfServerInstances
25 {
26 get
27 {
29 Unsafe.SkipInit(out uint result);
30 if (!global::Interop.Kernel32.GetNamedPipeHandleStateW(base.InternalHandle, null, &result, null, null, null, 0u))
31 {
33 }
34 return (int)result;
35 }
36 }
37
38 public NamedPipeClientStream(string pipeName)
40 {
41 }
42
43 public NamedPipeClientStream(string serverName, string pipeName)
45 {
46 }
47
48 public NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction)
49 : this(serverName, pipeName, direction, PipeOptions.None, TokenImpersonationLevel.None, HandleInheritability.None)
50 {
51 }
52
53 public NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options)
54 : this(serverName, pipeName, direction, options, TokenImpersonationLevel.None, HandleInheritability.None)
55 {
56 }
57
58 public NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options, TokenImpersonationLevel impersonationLevel)
59 : this(serverName, pipeName, direction, options, impersonationLevel, HandleInheritability.None)
60 {
61 }
62
63 public NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options, TokenImpersonationLevel impersonationLevel, HandleInheritability inheritability)
64 : base(direction, 0)
65 {
66 if (pipeName == null)
67 {
68 throw new ArgumentNullException("pipeName");
69 }
70 if (serverName == null)
71 {
73 }
74 if (pipeName.Length == 0)
75 {
77 }
78 if (serverName.Length == 0)
79 {
81 }
82 if ((options & (PipeOptions)536870911) != 0)
83 {
85 }
86 if (impersonationLevel < TokenImpersonationLevel.None || impersonationLevel > TokenImpersonationLevel.Delegation)
87 {
89 }
90 if (inheritability < HandleInheritability.None || inheritability > HandleInheritability.Inheritable)
91 {
93 }
94 if ((options & PipeOptions.CurrentUserOnly) != 0)
95 {
96 base.IsCurrentUserOnly = true;
97 }
98 _normalizedPipePath = PipeStream.GetPipePath(serverName, pipeName);
99 _direction = direction;
100 _inheritability = inheritability;
101 _impersonationLevel = impersonationLevel;
103 }
104
105 public NamedPipeClientStream(PipeDirection direction, bool isAsync, bool isConnected, SafePipeHandle safePipeHandle)
106 : base(direction, 0)
107 {
108 if (safePipeHandle == null)
109 {
110 throw new ArgumentNullException("safePipeHandle");
111 }
112 if (safePipeHandle.IsInvalid)
113 {
114 throw new ArgumentException(System.SR.Argument_InvalidHandle, "safePipeHandle");
115 }
116 ValidateHandleIsPipe(safePipeHandle);
117 InitializeHandle(safePipeHandle, isExposed: true, isAsync);
118 if (isConnected)
119 {
120 base.State = PipeState.Connected;
121 }
122 }
123
125 {
126 Dispose(disposing: false);
127 }
128
129 public void Connect()
130 {
131 Connect(-1);
132 }
133
143
145 {
146 int num = 0;
147 SpinWait spinWait = default(SpinWait);
148 do
149 {
150 cancellationToken.ThrowIfCancellationRequested();
151 int num2 = timeout - num;
152 if (cancellationToken.CanBeCanceled && num2 > 50)
153 {
154 num2 = 50;
155 }
156 if (TryConnect(num2, cancellationToken))
157 {
158 return;
159 }
160 spinWait.SpinOnce();
161 }
162 while (timeout == -1 || (num = Environment.TickCount - startTime) < timeout);
163 throw new TimeoutException();
164 }
165
167 {
169 }
170
172 {
174 }
175
180
182 {
184 if (timeout < 0 && timeout != -1)
185 {
187 }
188 if (cancellationToken.IsCancellationRequested)
189 {
191 }
192 int startTime = Environment.TickCount;
193 return Task.Run(delegate
194 {
197 }
198
199 protected internal override void CheckPipePropertyOperations()
200 {
201 base.CheckPipePropertyOperations();
202 if (base.State == PipeState.WaitingToConnect)
203 {
205 }
206 if (base.State == PipeState.Broken)
207 {
209 }
210 }
211
213 {
214 if (base.State == PipeState.Connected)
215 {
217 }
218 if (base.State == PipeState.Closed)
219 {
220 throw Error.GetPipeNotOpen();
221 }
222 }
223
225 {
226 global::Interop.Kernel32.SECURITY_ATTRIBUTES secAttrs = PipeStream.GetSecAttrs(_inheritability);
227 int num = (int)(_pipeOptions & ~PipeOptions.CurrentUserOnly);
228 if (_impersonationLevel != 0)
229 {
230 num |= 0x100000;
231 num |= (int)(_impersonationLevel - 1) << 16;
232 }
233 int num2 = 0;
234 if ((PipeDirection.In & _direction) != 0)
235 {
236 num2 |= int.MinValue;
237 }
238 if ((PipeDirection.Out & _direction) != 0)
239 {
240 num2 |= 0x40000000;
241 }
242 SafePipeHandle safePipeHandle = global::Interop.Kernel32.CreateNamedPipeClient(_normalizedPipePath, num2, FileShare.None, ref secAttrs, FileMode.Open, num, IntPtr.Zero);
243 if (safePipeHandle.IsInvalid)
244 {
245 int lastPInvokeError = Marshal.GetLastPInvokeError();
246 if (lastPInvokeError != 231 && lastPInvokeError != 2)
247 {
248 throw System.IO.Win32Marshal.GetExceptionForWin32Error(lastPInvokeError);
249 }
250 if (!global::Interop.Kernel32.WaitNamedPipe(_normalizedPipePath, timeout))
251 {
252 lastPInvokeError = Marshal.GetLastPInvokeError();
253 if (lastPInvokeError == 2 || lastPInvokeError == 121)
254 {
255 return false;
256 }
257 throw System.IO.Win32Marshal.GetExceptionForWin32Error(lastPInvokeError);
258 }
259 safePipeHandle = global::Interop.Kernel32.CreateNamedPipeClient(_normalizedPipePath, num2, FileShare.None, ref secAttrs, FileMode.Open, num, IntPtr.Zero);
260 if (safePipeHandle.IsInvalid)
261 {
262 lastPInvokeError = Marshal.GetLastPInvokeError();
263 if (lastPInvokeError == 231)
264 {
265 return false;
266 }
267 throw System.IO.Win32Marshal.GetExceptionForWin32Error(lastPInvokeError);
268 }
269 }
270 InitializeHandle(safePipeHandle, isExposed: false, (_pipeOptions & PipeOptions.Asynchronous) != 0);
271 base.State = PipeState.Connected;
273 return true;
274 }
275
277 {
278 if (!base.IsCurrentUserOnly)
279 {
280 return;
281 }
282 PipeSecurity accessControl = this.GetAccessControl();
283 IdentityReference owner = accessControl.GetOwner(typeof(SecurityIdentifier));
284 using WindowsIdentity windowsIdentity = WindowsIdentity.GetCurrent();
285 SecurityIdentifier owner2 = windowsIdentity.Owner;
286 if (owner != owner2)
287 {
288 base.State = PipeState.Closed;
290 }
291 }
292}
static int TickCount
static Exception GetPipeNotOpen()
Definition Error.cs:10
NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options, TokenImpersonationLevel impersonationLevel)
readonly TokenImpersonationLevel _impersonationLevel
NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options)
NamedPipeClientStream(string serverName, string pipeName)
NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction, PipeOptions options, TokenImpersonationLevel impersonationLevel, HandleInheritability inheritability)
void ConnectInternal(int timeout, CancellationToken cancellationToken, int startTime)
bool TryConnect(int timeout, CancellationToken cancellationToken)
Task ConnectAsync(int timeout, CancellationToken cancellationToken)
NamedPipeClientStream(string serverName, string pipeName, PipeDirection direction)
NamedPipeClientStream(PipeDirection direction, bool isAsync, bool isConnected, SafePipeHandle safePipeHandle)
readonly HandleInheritability _inheritability
Task ConnectAsync(CancellationToken cancellationToken)
void ValidateHandleIsPipe(SafePipeHandle safePipeHandle)
Exception WinIOError(int errorCode)
static string GetPipePath(string serverName, string pipeName)
void InitializeHandle(SafePipeHandle? handle, bool isExposed, bool isAsync)
static unsafe global::Interop.Kernel32.SECURITY_ATTRIBUTES GetSecAttrs(HandleInheritability inheritability)
void Dispose()
Definition Stream.cs:639
static Exception GetExceptionForWin32Error(int errorCode, string path="")
static string ArgumentOutOfRange_OptionsInvalid
Definition SR.cs:36
static string ArgumentOutOfRange_ImpersonationInvalid
Definition SR.cs:34
static string Argument_EmptyServerName
Definition SR.cs:22
static string ArgumentOutOfRange_HandleInheritabilityNoneOrInheritable
Definition SR.cs:38
static string ArgumentOutOfRange_InvalidTimeout
Definition SR.cs:40
static string InvalidOperation_PipeAlreadyConnected
Definition SR.cs:52
static string ArgumentNull_ServerName
Definition SR.cs:26
static string Argument_InvalidHandle
Definition SR.cs:24
static string Argument_NeedNonemptyPipeName
Definition SR.cs:18
static string InvalidOperation_PipeNotYetConnected
Definition SR.cs:44
static string IO_PipeBroken
Definition SR.cs:74
static string UnauthorizedAccess_NotOwnedByCurrentUser
Definition SR.cs:102
Definition SR.cs:7
IdentityReference? GetOwner(Type targetType)
static Task FromCanceled(CancellationToken cancellationToken)
Definition Task.cs:3363
static Task Run(Action action)
Definition Task.cs:3395
static readonly IntPtr Zero
Definition IntPtr.cs:18