From 4bb7316ce5736881f0dd328f75657c57d45d6018 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Mon, 3 Jun 2024 11:11:20 +0800 Subject: [PATCH] apply suggestion --- .../Model/ElevationStatusResponse.cs | 9 +++ .../InterProcess/PipePacketCommand.cs | 6 +- .../InterProcess/PipeStreamExtension.cs | 20 ++++++ .../InterProcess/PrivateNamedPipeClient.cs | 19 ++---- .../InterProcess/PrivateNamedPipeServer.cs | 67 ++++++++++--------- .../Snap.Hutao/Properties/launchSettings.json | 2 +- 6 files changed, 73 insertions(+), 50 deletions(-) create mode 100644 src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/Model/ElevationStatusResponse.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/Model/ElevationStatusResponse.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/Model/ElevationStatusResponse.cs new file mode 100644 index 00000000..44828ded --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/Model/ElevationStatusResponse.cs @@ -0,0 +1,9 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +namespace Snap.Hutao.Core.LifeCycle.InterProcess.Model; + +internal sealed class ElevationStatusResponse +{ + public bool IsElevated { get; set; } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipePacketCommand.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipePacketCommand.cs index 252c9560..66c6099e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipePacketCommand.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipePacketCommand.cs @@ -6,9 +6,9 @@ namespace Snap.Hutao.Core.LifeCycle.InterProcess; internal enum PipePacketCommand : byte { None = 0, + Exit = 1, RedirectActivation = 10, - RequestElevatedStatus = 11, - - Exit = 30, + RequestElevationStatus = 11, + ResponseElevationStatus = 12, } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipeStreamExtension.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipeStreamExtension.cs index 1ac4c516..7a3deadc 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipeStreamExtension.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PipeStreamExtension.cs @@ -17,6 +17,26 @@ internal static class PipeStreamExtension return content; } + public static unsafe PipePacketHeader ReadPacket(this PipeStream stream, out TData? data) + where TData : class + { + data = default; + + Span headerSpan = stackalloc byte[sizeof(PipePacketHeader)]; + stream.ReadExactly(headerSpan); + fixed (byte* pHeader = headerSpan) + { + PipePacketHeader* header = (PipePacketHeader*)pHeader; + if (header->ContentType is PipePacketContentType.Json) + { + ReadOnlySpan content = stream.GetValidatedContent(header); + data = JsonSerializer.Deserialize(content); + } + + return *header; + } + } + public static unsafe void WritePacket(this PipeStream stream, PipePacketHeader* header, byte[] content) { header->ContentLength = content.Length; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeClient.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeClient.cs index 489e774a..34426b94 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeClient.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeClient.cs @@ -2,6 +2,7 @@ // Licensed under the MIT license. using Microsoft.Windows.AppLifecycle; +using Snap.Hutao.Core.LifeCycle.InterProcess.Model; using System.IO.Pipes; namespace Snap.Hutao.Core.LifeCycle.InterProcess; @@ -17,30 +18,20 @@ internal sealed partial class PrivateNamedPipeClient : IDisposable { if (clientStream.TryConnectOnce()) { - bool serverElevated = false; { // Connect PipePacketHeader connectPacket = default; connectPacket.Version = 1; connectPacket.Type = PipePacketType.Request; - connectPacket.Command = PipePacketCommand.RequestElevatedStatus; + connectPacket.Command = PipePacketCommand.RequestElevationStatus; clientStream.Write(new(&connectPacket, sizeof(PipePacketHeader))); } - { - // Get previous instance elevated status - Span headerSpan = stackalloc byte[sizeof(PipePacketHeader)]; - clientStream.ReadExactly(headerSpan); - fixed (byte* pHeader = headerSpan) - { - PipePacketHeader* header = (PipePacketHeader*)pHeader; - ReadOnlySpan content = clientStream.GetValidatedContent(header); - serverElevated = JsonSerializer.Deserialize(content); - } - } + clientStream.ReadPacket(out ElevationStatusResponse? serverElevationStatus); + ArgumentNullException.ThrowIfNull(serverElevationStatus); - if (!serverElevated && runtimeOptions.IsElevated) + if (runtimeOptions.IsElevated && !serverElevationStatus.IsElevated) { // Kill previous instance to use current elevated instance PipePacketHeader killPacket = default; diff --git a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs index f9a4e2b1..f39ee8f2 100644 --- a/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Core/LifeCycle/InterProcess/PrivateNamedPipeServer.cs @@ -1,6 +1,7 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. +using Snap.Hutao.Core.LifeCycle.InterProcess.Model; using System.IO.Pipes; using System.Security.AccessControl; using System.Security.Principal; @@ -74,42 +75,44 @@ internal sealed partial class PrivateNamedPipeServer : IDisposable private unsafe void RunPacketSession(NamedPipeServerStream serverStream, CancellationToken token) { - Span headerSpan = stackalloc byte[sizeof(PipePacketHeader)]; - bool sessionTerminated = false; - while (serverStream.IsConnected && !sessionTerminated && !token.IsCancellationRequested) + while (serverStream.IsConnected && !token.IsCancellationRequested) { - serverStream.ReadExactly(headerSpan); - fixed (byte* pHeader = headerSpan) + PipePacketHeader header = serverStream.ReadPacket(out HutaoActivationArguments? hutaoArgs); + switch ((header.Type, header.Command)) { - PipePacketHeader* header = (PipePacketHeader*)pHeader; + case (PipePacketType.Request, PipePacketCommand.RequestElevationStatus): + RespondElevationStatus(); + break; + case (PipePacketType.Request, PipePacketCommand.RedirectActivation): + messageDispatcher.RedirectActivation(hutaoArgs); + break; + case (PipePacketType.SessionTermination, _): + serverStream.Disconnect(); + if (header.Command is PipePacketCommand.Exit) + { + messageDispatcher.Exit(); + } - switch ((header->Type, header->Command, header->ContentType)) - { - case (PipePacketType.Request, PipePacketCommand.RequestElevatedStatus, _): - PipePacketHeader elevatedPacket = default; - elevatedPacket.Version = 1; - elevatedPacket.Type = PipePacketType.Response; - elevatedPacket.ContentType = PipePacketContentType.Json; - - byte[] elevatedBytes = JsonSerializer.SerializeToUtf8Bytes(runtimeOptions.IsElevated); - serverStream.WritePacket(&elevatedPacket, elevatedBytes); - - break; - case (PipePacketType.Request, PipePacketCommand.RedirectActivation, PipePacketContentType.Json): - ReadOnlySpan content = serverStream.GetValidatedContent(header); - messageDispatcher.RedirectActivation(JsonSerializer.Deserialize(content)); - break; - case (PipePacketType.SessionTermination, _, _): - serverStream.Disconnect(); - sessionTerminated = true; - if (header->Command is PipePacketCommand.Exit) - { - messageDispatcher.Exit(); - } - - return; - } + return; } } + + void RespondElevationStatus() + { + PipePacketHeader elevatedPacket = default; + elevatedPacket.Version = 1; + elevatedPacket.Type = PipePacketType.Response; + elevatedPacket.Command = PipePacketCommand.ResponseElevationStatus; + elevatedPacket.ContentType = PipePacketContentType.Json; + + ElevationStatusResponse resp = new() + { + IsElevated = runtimeOptions.IsElevated, + }; + + byte[] elevatedBytes = JsonSerializer.SerializeToUtf8Bytes(resp); + serverStream.WritePacket(&elevatedPacket, elevatedBytes); + serverStream.Flush(); + } } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json index 36a6b395..a5fb2a14 100644 --- a/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json +++ b/src/Snap.Hutao/Snap.Hutao/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "Snap.Hutao": { "commandName": "MsixPackage", - "nativeDebugging": true, + "nativeDebugging": false, "doNotLaunchApp": false, "allowLocalNetworkLoopbackProperty": true },