From b2ef0712e0f826a6b3fdc4cbca2366c209444446 Mon Sep 17 00:00:00 2001 From: Howard Kapustein Date: Tue, 14 Jun 2022 10:52:31 -0700 Subject: [PATCH] Detoured GetCurrentPackageInfo3() should route to the OS any PackageInfoType value it doesn't handle --- .../API/MddDetourPackageGraph.cpp | 12 +++++++++++ .../API/MddDetourPackageGraph.h | 11 +++++++++- .../API/PackageGraphManager.cpp | 20 +++++++++++++------ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp index 9000491f7a..27340df0f1 100644 --- a/dev/DynamicDependency/API/MddDetourPackageGraph.cpp +++ b/dev/DynamicDependency/API/MddDetourPackageGraph.cpp @@ -225,3 +225,15 @@ LONG MddGetPackageInfo1Or2( return ::GetPackageInfo(packageInfoReference, flags, bufferLength, buffer, count); } } + +HRESULT MddTrueGetCurrentPackageInfo3( + UINT32 flags, + PackageInfoType packageInfoType, + UINT32* bufferLength, + void* buffer, + UINT32* count) +{ + // Passthru to the original (not-Detoured) Windows API + RETURN_IF_FAILED(TrueGetCurrentPackageInfo3(flags, packageInfoType, bufferLength, buffer, count)); + return S_OK; +} diff --git a/dev/DynamicDependency/API/MddDetourPackageGraph.h b/dev/DynamicDependency/API/MddDetourPackageGraph.h index 278b2c0fc9..75c9afc884 100644 --- a/dev/DynamicDependency/API/MddDetourPackageGraph.h +++ b/dev/DynamicDependency/API/MddDetourPackageGraph.h @@ -1,9 +1,11 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. +// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. See LICENSE in the project root for license information. #if !defined(MDDDETOURPACKAGEGRAPH_H) #define MDDDETOURPACKAGEGRAPH_H +#include "appmodel_msixdynamicdependency.h" + HRESULT WINAPI MddDetourPackageGraphInitialize() noexcept; void WINAPI MddDetourPackageGraphShutdown() noexcept; @@ -22,4 +24,11 @@ LONG MddGetPackageInfo1Or2( BYTE* buffer, UINT32* count); +HRESULT MddTrueGetCurrentPackageInfo3( + UINT32 flags, + PackageInfoType packageInfoType, + UINT32* bufferLength, + void* buffer, + UINT32* count); + #endif // MDDDETOURPACKAGEGRAPH_H diff --git a/dev/DynamicDependency/API/PackageGraphManager.cpp b/dev/DynamicDependency/API/PackageGraphManager.cpp index 911ced7541..21e3e1d18d 100644 --- a/dev/DynamicDependency/API/PackageGraphManager.cpp +++ b/dev/DynamicDependency/API/PackageGraphManager.cpp @@ -5,6 +5,8 @@ #include "PackageGraphManager.h" +#include "MddDetourPackageGraph.h" + std::recursive_mutex MddCore::PackageGraphManager::s_lock; MddCore::PackageGraph MddCore::PackageGraphManager::s_packageGraph; volatile ULONG MddCore::PackageGraphManager::s_generationId{}; @@ -133,12 +135,18 @@ HRESULT MddCore::PackageGraphManager::GetCurrentPackageInfo3( *generationId = GetGenerationId(); return S_OK; } - RETURN_HR_IF(E_INVALIDARG, (packageInfoType != PackageInfoType_PackageInfoInstallPath) && - (packageInfoType != PackageInfoType_PackageInfoMutablePath) && - (packageInfoType != PackageInfoType_PackageInfoEffectivePath) && - (packageInfoType != PackageInfoType_PackageInfoMachineExternalPath) && - (packageInfoType != PackageInfoType_PackageInfoUserExternalPath) && - (packageInfoType != PackageInfoType_PackageInfoEffectiveExternalPath)); + else if ((packageInfoType != PackageInfoType_PackageInfoInstallPath) && + (packageInfoType != PackageInfoType_PackageInfoMutablePath) && + (packageInfoType != PackageInfoType_PackageInfoEffectivePath) && + (packageInfoType != PackageInfoType_PackageInfoMachineExternalPath) && + (packageInfoType != PackageInfoType_PackageInfoUserExternalPath) && + (packageInfoType != PackageInfoType_PackageInfoEffectiveExternalPath)) + { + // packageInfoType isn't a value we recognize and/or handle + // Pass the call on down to Windows to handle the request + RETURN_IF_FAILED(MddTrueGetCurrentPackageInfo3(flags, packageInfoType, bufferLength, buffer, count)); + return S_OK; + } // We manage the package graph as a list of nodes, where each contain contains information about 1+ package. //