Cherry-pick fix for break away process creation attribute from release/1.1-stable to main (#2588)
* Return Extended Hresult instead of Hresult to help customers by providing them with unbucketed error codes instead of bucketed error codes, in a best effort manner. * Deployment agent break away process creation fixes (#2554) * Create Breakaway process for DeplomentAgent.exe in Running state (not in suspended state) * And remove Resume * Don't inherent parent handles in breakaway process * Create process outside desktop app runtime environment instead * Don't return a copy but a reference to tracelogger activity class object Co-authored-by: Santosh Chintalapati <sachinta@ntdev.microsoft.com>
This commit is contained in:
Родитель
5385ff2e0f
Коммит
d86b223274
|
@ -68,7 +68,7 @@ namespace WindowsAppRuntime::Deployment::Activity
|
|||
return m_deploymentErrorActivityId;
|
||||
}
|
||||
|
||||
WindowsAppRuntimeDeployment_TraceLogger::Initialize GetActivity() const
|
||||
WindowsAppRuntimeDeployment_TraceLogger::Initialize& GetActivity()
|
||||
{
|
||||
return m_activity;
|
||||
}
|
||||
|
|
|
@ -332,10 +332,10 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem
|
|||
THROW_IF_WIN32_BOOL_FALSE(InitializeProcThreadAttributeList(attributeList, attributeCount, 0, &attributeListSize));
|
||||
auto freeAttributeList{ wil::scope_exit([&] { DeleteProcThreadAttributeList(attributeList); }) };
|
||||
|
||||
// Desktop Bridge applications by default have their child processes break away from the parent process.
|
||||
// In order to recreate the calling process' environment correctly, we must prevent child breakaway semantics
|
||||
// when calling the agent. Additionally the agent must do the same when restarting the caller.
|
||||
DWORD policy{ PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_OVERRIDE };
|
||||
// https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-updateprocthreadattribute
|
||||
// The process being created will create any child processes outside of the desktop app runtime environment.
|
||||
// This behavior is the default for processes for which no policy has been set
|
||||
DWORD policy{ PROCESS_CREATION_DESKTOP_APP_BREAKAWAY_ENABLE_PROCESS_TREE };
|
||||
THROW_IF_WIN32_BOOL_FALSE(UpdateProcThreadAttribute(attributeList, 0, PROC_THREAD_ATTRIBUTE_DESKTOP_APP_POLICY, &policy, sizeof(policy), nullptr, nullptr));
|
||||
|
||||
STARTUPINFOEX info{};
|
||||
|
@ -343,12 +343,7 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::implem
|
|||
info.lpAttributeList = attributeList;
|
||||
|
||||
wil::unique_process_information processInfo;
|
||||
THROW_IF_WIN32_BOOL_FALSE(CreateProcess(nullptr, cmdLine.get(), nullptr, nullptr, TRUE, CREATE_SUSPENDED | EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr,
|
||||
&info.StartupInfo, &processInfo));
|
||||
|
||||
// Transfer foreground rights to the new process before resuming it.
|
||||
AllowSetForegroundWindow(processInfo.dwProcessId);
|
||||
ResumeThread(processInfo.hThread);
|
||||
THROW_IF_WIN32_BOOL_FALSE(CreateProcess(nullptr, cmdLine.get(), nullptr, nullptr, FALSE, EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr, &info.StartupInfo, &processInfo));
|
||||
|
||||
// This API is designed to only return to the caller on failure, otherwise block until process termination.
|
||||
// Wait for the agent to exit. If the agent succeeds, it will terminate this process. If the agent fails,
|
||||
|
|
|
@ -40,4 +40,3 @@ namespace winrt::Microsoft::Windows::ApplicationModel::WindowsAppRuntime::factor
|
|||
{
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -67,12 +67,12 @@ namespace WindowsAppRuntime::MddBootstrap::Activity
|
|||
return m_initializationPackageFullName;
|
||||
}
|
||||
|
||||
WindowsAppRuntimeBootstrap_TraceLogger::Initialize GetInitializeActivity()
|
||||
WindowsAppRuntimeBootstrap_TraceLogger::Initialize& GetInitializeActivity()
|
||||
{
|
||||
return m_bootstrapInitializeActivity;
|
||||
}
|
||||
|
||||
WindowsAppRuntimeBootstrap_TraceLogger::Shutdown GetShutdownActivity()
|
||||
WindowsAppRuntimeBootstrap_TraceLogger::Shutdown& GetShutdownActivity()
|
||||
{
|
||||
return m_bootstrapShutdownActivity;
|
||||
}
|
||||
|
|
|
@ -19,10 +19,12 @@ void WindowsAppRuntimeInstaller::InstallActivity::Context::Reset()
|
|||
}
|
||||
|
||||
void WindowsAppRuntimeInstaller::InstallActivity::Context::SetDeploymentErrorInfo(
|
||||
const HRESULT& deploymentErrorHresult,
|
||||
const HRESULT& deploymentErrorExtendedHresult,
|
||||
const std::wstring& deploymentErrorText,
|
||||
const GUID& deploymentErrorActivityId)
|
||||
{
|
||||
m_deploymentErrorHresult = deploymentErrorHresult;
|
||||
m_deploymentErrorExtendedHresult = deploymentErrorExtendedHresult;
|
||||
m_deploymentErrorText = deploymentErrorText;
|
||||
SetDeploymentErrorActivityId(deploymentErrorActivityId);
|
||||
|
|
|
@ -32,6 +32,7 @@ namespace WindowsAppRuntimeInstaller::InstallActivity
|
|||
{
|
||||
InstallStage m_installStage{};
|
||||
std::wstring m_currentResourceId;
|
||||
HRESULT m_deploymentErrorHresult{};
|
||||
HRESULT m_deploymentErrorExtendedHresult{};
|
||||
std::wstring m_deploymentErrorText;
|
||||
GUID m_deploymentErrorActivityId{};
|
||||
|
@ -54,6 +55,12 @@ namespace WindowsAppRuntimeInstaller::InstallActivity
|
|||
return m_currentResourceId;
|
||||
}
|
||||
|
||||
const HRESULT& GetdeploymentErrorHresult() const
|
||||
{
|
||||
return m_deploymentErrorHresult;
|
||||
}
|
||||
|
||||
|
||||
const HRESULT& GetDeploymentErrorExtendedHResult() const
|
||||
{
|
||||
return m_deploymentErrorExtendedHresult;
|
||||
|
@ -90,6 +97,7 @@ namespace WindowsAppRuntimeInstaller::InstallActivity
|
|||
}
|
||||
|
||||
void SetDeploymentErrorInfo(
|
||||
const HRESULT& deploymentErrorHresult,
|
||||
const HRESULT& deploymentErrorExtendedHresult,
|
||||
const std::wstring& deploymentErrorText,
|
||||
const GUID& deploymentErrorActivityId);
|
||||
|
|
|
@ -27,11 +27,12 @@ namespace WindowsAppRuntimeInstaller
|
|||
{
|
||||
const auto deploymentResult{ deploymentOperation.GetResults() };
|
||||
WindowsAppRuntimeInstaller::InstallActivity::Context::Get().SetDeploymentErrorInfo(
|
||||
deploymentOperation.ErrorCode(),
|
||||
deploymentResult.ExtendedErrorCode(),
|
||||
deploymentResult.ErrorText().c_str(),
|
||||
deploymentResult.ActivityId());
|
||||
|
||||
return static_cast<HRESULT>(deploymentOperation.ErrorCode());
|
||||
return static_cast<HRESULT>(deploymentResult.ExtendedErrorCode());
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
|
@ -61,9 +62,9 @@ namespace WindowsAppRuntimeInstaller
|
|||
else
|
||||
{
|
||||
const auto deploymentResult{ deploymentOperation.GetResults() };
|
||||
WindowsAppRuntimeInstaller::InstallActivity::Context::Get().SetDeploymentErrorInfo(deploymentResult.ExtendedErrorCode(), deploymentResult.ErrorText().c_str(), deploymentResult.ActivityId());
|
||||
WindowsAppRuntimeInstaller::InstallActivity::Context::Get().SetDeploymentErrorInfo(hrAddPackage, deploymentResult.ExtendedErrorCode(), deploymentResult.ErrorText().c_str(), deploymentResult.ActivityId());
|
||||
|
||||
RETURN_HR(hrAddPackage);
|
||||
RETURN_HR(static_cast<HRESULT>(deploymentResult.ExtendedErrorCode()));
|
||||
}
|
||||
}
|
||||
return S_OK;
|
||||
|
|
|
@ -136,7 +136,7 @@ int wmain(int argc, wchar_t *argv[])
|
|||
installActivityContext.GetLastFailure().message.c_str(),
|
||||
static_cast<UINT32>(installActivityContext.GetInstallStage()),
|
||||
installActivityContext.GetCurrentResourceId().c_str(),
|
||||
installActivityContext.GetDeploymentErrorExtendedHResult(),
|
||||
installActivityContext.GetdeploymentErrorHresult(),
|
||||
installActivityContext.GetDeploymentErrorText().c_str(),
|
||||
installActivityContext.GetDeploymentErrorActivityId());
|
||||
}
|
||||
|
|
|
@ -77,7 +77,7 @@ void __stdcall wilResultLoggingCallback(const wil::FailureInfo& failure) noexcep
|
|||
failure.pszMessage,
|
||||
static_cast<UINT32>(installActivityContext.GetInstallStage()),
|
||||
installActivityContext.GetCurrentResourceId().c_str(),
|
||||
installActivityContext.GetDeploymentErrorExtendedHResult(),
|
||||
installActivityContext.GetdeploymentErrorHresult(),
|
||||
installActivityContext.GetDeploymentErrorText().c_str(),
|
||||
installActivityContext.GetDeploymentErrorActivityId());
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ public:
|
|||
PCWSTR failureMessage,
|
||||
UINT32 failedInstallStage,
|
||||
PCWSTR currentResourceId,
|
||||
HRESULT deploymentErrorExtendedHResult,
|
||||
HRESULT deploymentErrorHresult,
|
||||
PCWSTR deploymentErrorText,
|
||||
GUID deploymentErrorActivityId)
|
||||
{
|
||||
|
@ -70,7 +70,7 @@ public:
|
|||
TraceLoggingValue(failureMessage, "FailureMessage"),
|
||||
TraceLoggingValue(failedInstallStage, "FailedInstallStage"),
|
||||
TraceLoggingValue(currentResourceId, "CurrentResourceId"),
|
||||
TraceLoggingValue(deploymentErrorExtendedHResult, "DeploymentErrorExtendedHResult"),
|
||||
TraceLoggingValue(deploymentErrorHresult, "DeploymentErrorHResult"),
|
||||
TraceLoggingValue(deploymentErrorText, "DeploymentErrorText"),
|
||||
TraceLoggingValue(deploymentErrorActivityId, "DeploymentErrorActivityId"));
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче