diff --git a/Common/Packages/Recovery.GPT-BcdEdit/Recovery.BcdEdit.cmd b/Common/Packages/Recovery.GPT-BcdEdit/Recovery.BcdEdit.cmd index 5ecefca8..8ecab4fc 100644 --- a/Common/Packages/Recovery.GPT-BcdEdit/Recovery.BcdEdit.cmd +++ b/Common/Packages/Recovery.GPT-BcdEdit/Recovery.BcdEdit.cmd @@ -1,10 +1,11 @@ @echo off -reg query HKLM\Software\IoT /v RecoveryBcdEdit >nul 2>&1 +REM Settings are applied on every boot, in case it gets overrwritten during update +REM reg query HKLM\Software\IoT /v RecoveryBcdEdit >nul 2>&1 -if %errorlevel% == 1 ( +REM if %errorlevel% == 1 ( bcdedit /set bootstatuspolicy IgnoreShutdownFailures bcdedit /set recoveryenabled yes bcdedit /set recoverysequence {a5935ff2-32ba-4617-bf36-5ac314b3f9bf} - reg add HKLM\Software\IoT /v RecoveryBcdEdit /t REG_DWORD /d 1 /f >nul 2>&1 -) +REM reg add HKLM\Software\IoT /v RecoveryBcdEdit /t REG_DWORD /d 1 /f >nul 2>&1 +REM ) diff --git a/Tools/GetAppxInfo.exe b/Tools/GetAppxInfo.exe index 2f6b2d77..d5b7873a 100644 Binary files a/Tools/GetAppxInfo.exe and b/Tools/GetAppxInfo.exe differ diff --git a/Tools/LaunchTool.cmd b/Tools/LaunchTool.cmd index 06ed8b4e..38572bd8 100644 --- a/Tools/LaunchTool.cmd +++ b/Tools/LaunchTool.cmd @@ -106,7 +106,7 @@ REM Change to Working directory cd /D %IOTADK_ROOT%\Tools call setOEM.cmd doskey /macrofile=alias.txt -set IOT_ADDON_VERSION=3.1 +set IOT_ADDON_VERSION=3.2 echo IOTADK_ROOT : %IOTADK_ROOT% echo ADK_VERSION : %ADK_VERSION% diff --git a/Tools/Source/GetAppxInfo/GetAppxInfo.cpp b/Tools/Source/GetAppxInfo/GetAppxInfo.cpp index 7288d46f..400d348f 100644 --- a/Tools/Source/GetAppxInfo/GetAppxInfo.cpp +++ b/Tools/Source/GetAppxInfo/GetAppxInfo.cpp @@ -12,6 +12,7 @@ #include #include +#include #define RETURN_IF_FAILED(hr) do { HRESULT __hrRet = (hr); if (FAILED(__hrRet)) { return __hrRet; }} while (0, 0) @@ -22,43 +23,8 @@ using namespace Microsoft::WRL::Wrappers; const int column1 = 20; -HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath) +HRESULT PrintPackageIdInternal(const ComPtr& packageId) { - if (packagePath.length() == 0) - { - return E_INVALIDARG; - } - - HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); - if (FAILED(hr)) - { - wcout << L"CoInitializeEx failed" << endl; - return hr; - } - - ComPtr properties; - ComPtr packageId; - ComPtr applications; - ComPtr appxFactory; - ComPtr opcFactory; - ComPtr packageStream; - ComPtr packageReader; - ComPtr manifestReader; - ComPtr application; - - // read the manifest - RETURN_IF_FAILED(CoCreateInstance(__uuidof(AppxFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(appxFactory.GetAddressOf()))); - RETURN_IF_FAILED(CoCreateInstance(__uuidof(OpcFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(opcFactory.GetAddressOf()))); - RETURN_IF_FAILED(opcFactory->CreateStreamOnFile(packagePath.c_str(), OPC_STREAM_IO_READ, NULL, FILE_ATTRIBUTE_NORMAL, &packageStream)); - RETURN_IF_FAILED(appxFactory->CreatePackageReader(packageStream.Get(), &packageReader)); - RETURN_IF_FAILED(packageReader->GetManifest(&manifestReader)); - - // get the manifest info - RETURN_IF_FAILED(manifestReader->GetProperties(properties.GetAddressOf())); - RETURN_IF_FAILED(manifestReader->GetPackageId(packageId.GetAddressOf())); - RETURN_IF_FAILED(manifestReader->GetApplications(applications.GetAddressOf())); - RETURN_IF_FAILED(applications->GetCurrent(application.GetAddressOf())); - LPWSTR value; RETURN_IF_FAILED(packageId->GetName(&value)); @@ -73,36 +39,36 @@ HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath) RETURN_IF_FAILED(packageId->GetArchitecture(&architecture)); switch (architecture) { - case APPX_PACKAGE_ARCHITECTURE_ARM: - wcout << setw(column1) << left << L"Architecture" << L" : " << L"ARM" << endl; - break; + case APPX_PACKAGE_ARCHITECTURE_ARM: + wcout << setw(column1) << left << L"Architecture" << L" : " << L"ARM" << endl; + break; //case APPX_PACKAGE_ARCHITECTURE_ARM64: // wcout << setw(column1) << left << L"Architecture" << L" : " << L"ARM64" << endl; // break; - case APPX_PACKAGE_ARCHITECTURE_X64: - wcout << setw(column1) << left << L"Architecture" << L" : " << L"X64" << endl; - break; + case APPX_PACKAGE_ARCHITECTURE_X64: + wcout << setw(column1) << left << L"Architecture" << L" : " << L"X64" << endl; + break; - case APPX_PACKAGE_ARCHITECTURE_X86: - wcout << setw(column1) << left << L"Architecture" << L" : " << L"X86" << endl; - break; + case APPX_PACKAGE_ARCHITECTURE_X86: + wcout << setw(column1) << left << L"Architecture" << L" : " << L"X86" << endl; + break; - case APPX_PACKAGE_ARCHITECTURE_NEUTRAL: - wcout << setw(column1) << left << L"Architecture" << L" : " << L"Neutral" << endl; - break; + case APPX_PACKAGE_ARCHITECTURE_NEUTRAL: + wcout << setw(column1) << left << L"Architecture" << L" : " << L"Neutral" << endl; + break; } RETURN_IF_FAILED(packageId->GetResourceId(&value)); - wcout << setw(column1) << left << L"ResourceId" << L" : " << (value?value:L" ") << endl; + wcout << setw(column1) << left << L"ResourceId" << L" : " << (value ? value : L" ") << endl; CoTaskMemFree(value); UINT64 version; RETURN_IF_FAILED(packageId->GetVersion(&version)); - WORD major = static_cast((version & 0xFFFF000000000000ui64) >> 48); - WORD minor = static_cast((version & 0x0000FFFF00000000ui64) >> 32); - WORD build = static_cast((version & 0x00000000FFFF0000ui64) >> 16); + WORD major = static_cast((version & 0xFFFF000000000000ui64) >> 48); + WORD minor = static_cast((version & 0x0000FFFF00000000ui64) >> 32); + WORD build = static_cast((version & 0x00000000FFFF0000ui64) >> 16); WORD revision = static_cast((version & 0x000000000000FFFFui64)); wcout << setw(column1) << left << L"Version" << L" : " << major << L"." << minor << L"." << build << L"." << revision << endl; @@ -117,6 +83,31 @@ HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath) wcout << setw(column1) << left << L"PackageFamilyName" << L" : " << value << endl; CoTaskMemFree(value); + return S_OK; +} + +HRESULT PrintPackageReaderInternal(const ComPtr& packageReader) +{ + HRESULT hr = S_OK; + + ComPtr manifestReader; + ComPtr application; + ComPtr properties; + ComPtr packageId; + ComPtr applications; + + RETURN_IF_FAILED(packageReader->GetManifest(&manifestReader)); + + // get the manifest info + RETURN_IF_FAILED(manifestReader->GetProperties(properties.GetAddressOf())); + RETURN_IF_FAILED(manifestReader->GetPackageId(packageId.GetAddressOf())); + RETURN_IF_FAILED(manifestReader->GetApplications(applications.GetAddressOf())); + RETURN_IF_FAILED(applications->GetCurrent(application.GetAddressOf())); + + LPWSTR value; + + RETURN_IF_FAILED(PrintPackageIdInternal(packageId)); + hr = properties->GetStringValue(L"DisplayName", &value); if (SUCCEEDED(hr)) { @@ -147,6 +138,124 @@ HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath) // PackageDependencies? // Prerequisites? (OSMinVersion, OSMaxVersionTested) + return S_OK; + +} + +HRESULT GetPackageIdFromAppxBundleInternal(const std::wstring& packagePath) +{ + if (packagePath.length() == 0) + { + return E_INVALIDARG; + } + + HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if (FAILED(hr)) + { + wcout << L"CoInitializeEx failed" << endl; + return hr; + } + + Microsoft::WRL::ComPtr appxBundleFactory; + Microsoft::WRL::ComPtr opcFactory; + Microsoft::WRL::ComPtr bundleStream; + Microsoft::WRL::ComPtr bundleReader; + Microsoft::WRL::ComPtr bundleManifestReader; + ComPtr properties; + ComPtr packageId; + ComPtr applications; + ComPtr packageInfo; + ComPtr packageInfoItems; + + RETURN_IF_FAILED(CoCreateInstance(__uuidof(AppxBundleFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(appxBundleFactory.GetAddressOf()))); + RETURN_IF_FAILED(CoCreateInstance(__uuidof(OpcFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(opcFactory.GetAddressOf()))); +#pragma warning(suppress: 25086) // Use default security descriptor. + RETURN_IF_FAILED(opcFactory->CreateStreamOnFile(packagePath.c_str(), OPC_STREAM_IO_READ, NULL, FILE_ATTRIBUTE_NORMAL, &bundleStream)); + RETURN_IF_FAILED(appxBundleFactory->CreateBundleReader(bundleStream.Get(), &bundleReader)); + RETURN_IF_FAILED(bundleReader->GetManifest(&bundleManifestReader)); + + // get the manifest info + RETURN_IF_FAILED(bundleManifestReader->GetPackageId(packageId.GetAddressOf())); + RETURN_IF_FAILED(bundleManifestReader->GetPackageInfoItems(&packageInfoItems)); + + BOOL hasCurrent = FALSE; + RETURN_IF_FAILED(packageInfoItems->GetHasCurrent(&hasCurrent)); + + while (hasCurrent) + { + ComPtr currentPackageInfo; + RETURN_IF_FAILED(packageInfoItems->GetCurrent(¤tPackageInfo)); + + APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE packageType; + RETURN_IF_FAILED(currentPackageInfo->GetPackageType(&packageType)); + + LPWSTR fileName; + RETURN_IF_FAILED(currentPackageInfo->GetFileName(&fileName)); + wcout << setw(column1) << left << L"File Name" << L" : " << fileName << endl; + + switch (packageType) + { + case APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_APPLICATION: + { + ComPtr applicationPackageFile; + ComPtr applicationPackageStream; + ComPtr appxFactory; + ComPtr packageReader; + + wcout << setw(column1) << left << L"Package Type" << L" : " << L"application" << endl; + RETURN_IF_FAILED(bundleReader->GetPayloadPackage(fileName, &applicationPackageFile)); + RETURN_IF_FAILED(applicationPackageFile->GetStream(&applicationPackageStream)); + RETURN_IF_FAILED(CoCreateInstance(__uuidof(AppxFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(appxFactory.GetAddressOf()))); + RETURN_IF_FAILED(appxFactory->CreatePackageReader(applicationPackageStream.Get(), &packageReader)); + RETURN_IF_FAILED(PrintPackageReaderInternal(packageReader)); + } + break; + + case APPX_BUNDLE_PAYLOAD_PACKAGE_TYPE_RESOURCE: + wcout << setw(column1) << left << L"Package Type" << L" : " << L"resource" << endl; + break; + } + + ComPtr packageId; + RETURN_IF_FAILED(currentPackageInfo->GetPackageId(&packageId)); + RETURN_IF_FAILED(PrintPackageIdInternal(packageId)); + + //RETURN_IF_FAILED(bundleManifestReader->GetApplications(applications.GetAddressOf())); + //GetProperties(properties.GetAddressOf())); + + wcout << endl; + RETURN_IF_FAILED(packageInfoItems->MoveNext(&hasCurrent)); + } + + return S_OK; +} + +HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath) +{ + if (packagePath.length() == 0) + { + return E_INVALIDARG; + } + + HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if (FAILED(hr)) + { + wcout << L"CoInitializeEx failed" << endl; + return hr; + } + + ComPtr appxFactory; + ComPtr opcFactory; + ComPtr packageStream; + ComPtr packageReader; + + // read the manifest + RETURN_IF_FAILED(CoCreateInstance(__uuidof(AppxFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(appxFactory.GetAddressOf()))); + RETURN_IF_FAILED(CoCreateInstance(__uuidof(OpcFactory), NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(opcFactory.GetAddressOf()))); + RETURN_IF_FAILED(opcFactory->CreateStreamOnFile(packagePath.c_str(), OPC_STREAM_IO_READ, NULL, FILE_ATTRIBUTE_NORMAL, &packageStream)); + RETURN_IF_FAILED(appxFactory->CreatePackageReader(packageStream.Get(), &packageReader)); + RETURN_IF_FAILED(PrintPackageReaderInternal(packageReader)); + return S_OK; } @@ -158,7 +267,21 @@ int wmain(int argc, wchar_t *argv[]) return -1; } - HRESULT hr = GetPackageIdFromAppxInternal(argv[1]); + std::wstring packagePath(argv[1]); + std::experimental::filesystem::path appxPath(packagePath); + std::wstring fileExtension = appxPath.extension(); + transform(fileExtension.begin(), fileExtension.end(), fileExtension.begin(), ::towlower); + + HRESULT hr = S_OK; + if (fileExtension == L".appx") + { + hr = GetPackageIdFromAppxInternal(argv[1]); + } + else if (fileExtension == L".appxbundle") + { + hr = GetPackageIdFromAppxBundleInternal(argv[1]); + } + if (FAILED(hr)) { wcout << L"ERROR: " << std::hex << hr << endl; diff --git a/Tools/Source/GetAppxInfo/GetAppxInfo.vcxproj b/Tools/Source/GetAppxInfo/GetAppxInfo.vcxproj index 5efefbed..0408f3fb 100644 --- a/Tools/Source/GetAppxInfo/GetAppxInfo.vcxproj +++ b/Tools/Source/GetAppxInfo/GetAppxInfo.vcxproj @@ -22,7 +22,7 @@ {C54AAE36-6C88-489A-A0D9-599CB6DA4E07} Win32Proj GetAppxInfo - 8.1 + 10.0.15063.0 diff --git a/Tools/appx2pkg.cmd b/Tools/appx2pkg.cmd index 1e89945f..bb87adf9 100644 --- a/Tools/appx2pkg.cmd +++ b/Tools/appx2pkg.cmd @@ -6,13 +6,14 @@ goto START :Usage echo Usage: appx2pkg input.appx [fga/bgt/none] [CompName.SubCompName] [skipcert] -echo input.appx.............. Required, input .appx file +echo input.appx.............. Required, input .appx file or .appxbundle echo fga/bgt/none............ Required, Startup ForegroundApp / Startup BackgroundTask / No startup echo CompName.SubCompName.... Optional, default is Appx.AppxName; Mandatory if you want to specify skipcert echo skipcert................ Optional, specify this to skip adding cert information to pkg xml file echo [/?].................... Displays this usage string. echo Example: echo appx2pkg C:\test\sample_1.0.0.0_arm.appx none +echo appx2pkg C:\test\sample_1.0.0.0_arm.appxbundle none endlocal exit /b 1 @@ -26,7 +27,11 @@ if [%1] == [-?] goto Usage if [%1] == [] goto Usage if [%2] == [] goto Usage -if not [%~x1] == [.appx] goto Usage +set FILE_TYPE=%~x1 +if not [%FILE_TYPE%] == [.appx] ( + if not [%FILE_TYPE%] == [.appxbundle] goto Usage +) + set LONG_NAME=%~n1 set FILE_NAME=%~n1 set "FILE_PATH=%~dp1" @@ -40,7 +45,10 @@ for /f "tokens=1 delims=_" %%i in ("%FILE_NAME%") do ( call %TOOLS_DIR%\GetAppxInfo.exe "%1" > "%FILE_PATH%\appx_info.txt" 2>nul for /f "tokens=1,2,3 delims=:,!, " %%i in (%FILE_PATH%\appx_info.txt) do ( - set APPX_%%i=%%j + REM set APPX_%%i=%%j + if [%%i] == [Version] ( + set APPX_Version=%%j + ) if [%%i] == [AppUserModelId] ( set PACKAGE_FNAME=%%j set ENTRY=%%k @@ -114,7 +122,7 @@ if exist "%FILE_PATH%\%COMP_NAME%.%SUB_NAME%.pkg.xml" (del "%FILE_PATH%\%COMP_NA call :CREATE_PKGFILE set SRC_INFO_FILE=%OUTPUT_PATH%\SourceDetails.txt -echo Source Appx: %FILE_PATH%%FILE_NAME%.appx>> "%SRC_INFO_FILE%" +echo Source Appx: %FILE_PATH%%FILE_NAME%%FILE_TYPE%>> "%SRC_INFO_FILE%" echo Dependencies :>> "%SRC_INFO_FILE%" REM Renaming files to shorten the names @@ -140,7 +148,7 @@ set /p NEWGUID=<%PRODSRC_DIR%\uuid.txt del %PRODSRC_DIR%\uuid.txt call :CREATE_CUSTFILE -copy "%FILE_PATH%\%FILE_NAME%.appx" "%OUTPUT_PATH%\%SHORT_FILE_NAME%.appx" >nul 2>nul +copy "%FILE_PATH%\%FILE_NAME%%FILE_TYPE%" "%OUTPUT_PATH%\%SHORT_FILE_NAME%%FILE_TYPE%" >nul 2>nul move "%FILE_PATH%\customizations.xml" "%OUTPUT_PATH%\customizations.xml" >nul 2>nul move "%FILE_PATH%\%COMP_NAME%.%SUB_NAME%.pkg.xml" "%OUTPUT_PATH%\%COMP_NAME%.%SUB_NAME%.pkg.xml" >nul 2>nul @@ -244,7 +252,7 @@ REM Printing APP Install call :PRINT_TO_CUSTFILE " " call :PRINT_TO_CUSTFILE " " call :PRINT_TO_CUSTFILE " " -call :PRINT_TO_CUSTFILE " %SHORT_FILE_NAME%.appx" +call :PRINT_TO_CUSTFILE " %SHORT_FILE_NAME%%FILE_TYPE%" REM Printing Dependencies for %%B in ("%FILE_PATH%\appx_deplist_trim.txt") do if %%~zB gtr 0 ( call :PRINT_TO_CUSTFILE " " diff --git a/Tools/newappxpkg.cmd b/Tools/newappxpkg.cmd index 21dbf72a..577ead2b 100644 --- a/Tools/newappxpkg.cmd +++ b/Tools/newappxpkg.cmd @@ -7,7 +7,7 @@ goto START :Usage echo Usage: newappxpkg filename.appx [fga/bgt/none] [CompName.SubCompName] [skipcert] -echo filename.appx........... Required, Input appx package. Expects dependencies in a sub folder +echo filename.appx........... Required, Input appx package/appxbundle. Expects dependencies in a sub folder echo fga/bgt/none............ Required, Startup ForegroundApp / Startup BackgroundTask / No startup echo CompName.SubCompName.... Optional, default is Appx.AppxName; Mandatory if you want to specify skipcert echo skipcert................ Optional, specify this to skip adding cert information to pkg xml file @@ -32,14 +32,11 @@ set FILE_TYPE=%~x1 set FILE_NAME=%~n1 set "FILE_PATH=%~dp1" -if [%FILE_TYPE%] == [.appx] ( - set COMP_NAME=Appx - for /f "tokens=1 delims=_" %%i in ("%FILE_NAME%") do ( - set SUB_NAME=%%i +if not [%FILE_TYPE%] == [.appx] ( + if not [%FILE_TYPE%] == [.appxbundle] ( + echo. Unsupported filetype. + goto Usage ) -) else ( - echo. Unsupported filetype. - goto Usage ) set STARTUP_OPTIONS=fga bgt none @@ -59,6 +56,11 @@ if not [%3] == [] ( set SUB_NAME=%%j ) if /I [%4] == [skipcert] ( set SKIPCERT=1) +) else ( + set COMP_NAME=Appx + for /f "tokens=1 delims=_" %%i in ("%FILE_NAME%") do ( + set SUB_NAME=%%i + ) ) if not defined SRC_DIR (