Skip to content
This repository has been archived by the owner on Sep 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #128 from parameshbabu/master
Browse files Browse the repository at this point in the history
Tools update to support appxbundle
  • Loading branch information
parameshbabu authored Sep 1, 2017
2 parents 13933d0 + ab88296 commit ef2baee
Show file tree
Hide file tree
Showing 7 changed files with 207 additions and 73 deletions.
9 changes: 5 additions & 4 deletions Common/Packages/Recovery.GPT-BcdEdit/Recovery.BcdEdit.cmd
Original file line number Diff line number Diff line change
@@ -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 )
Binary file modified Tools/GetAppxInfo.exe
Binary file not shown.
2 changes: 1 addition & 1 deletion Tools/LaunchTool.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -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%
Expand Down
229 changes: 176 additions & 53 deletions Tools/Source/GetAppxInfo/GetAppxInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

#include <AppxPackaging.h>
#include <msopc.h>
#include <experimental\filesystem>

#define RETURN_IF_FAILED(hr) do { HRESULT __hrRet = (hr); if (FAILED(__hrRet)) { return __hrRet; }} while (0, 0)

Expand All @@ -22,43 +23,8 @@ using namespace Microsoft::WRL::Wrappers;

const int column1 = 20;

HRESULT GetPackageIdFromAppxInternal(const wstring& packagePath)
HRESULT PrintPackageIdInternal(const ComPtr<IAppxManifestPackageId>& 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<IAppxManifestProperties> properties;
ComPtr<IAppxManifestPackageId> packageId;
ComPtr<IAppxManifestApplicationsEnumerator> applications;
ComPtr<IAppxFactory> appxFactory;
ComPtr<IOpcFactory> opcFactory;
ComPtr<IStream> packageStream;
ComPtr<IAppxPackageReader> packageReader;
ComPtr<IAppxManifestReader> manifestReader;
ComPtr<IAppxManifestApplication> 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));
Expand All @@ -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<WORD>((version & 0xFFFF000000000000ui64) >> 48);
WORD minor = static_cast<WORD>((version & 0x0000FFFF00000000ui64) >> 32);
WORD build = static_cast<WORD>((version & 0x00000000FFFF0000ui64) >> 16);
WORD major = static_cast<WORD>((version & 0xFFFF000000000000ui64) >> 48);
WORD minor = static_cast<WORD>((version & 0x0000FFFF00000000ui64) >> 32);
WORD build = static_cast<WORD>((version & 0x00000000FFFF0000ui64) >> 16);
WORD revision = static_cast<WORD>((version & 0x000000000000FFFFui64));
wcout << setw(column1) << left << L"Version" << L" : " << major << L"." << minor << L"." << build << L"." << revision << endl;

Expand All @@ -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<IAppxPackageReader>& packageReader)
{
HRESULT hr = S_OK;

ComPtr<IAppxManifestReader> manifestReader;
ComPtr<IAppxManifestApplication> application;
ComPtr<IAppxManifestProperties> properties;
ComPtr<IAppxManifestPackageId> packageId;
ComPtr<IAppxManifestApplicationsEnumerator> 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))
{
Expand Down Expand Up @@ -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<IAppxBundleFactory> appxBundleFactory;
Microsoft::WRL::ComPtr<IOpcFactory> opcFactory;
Microsoft::WRL::ComPtr<IStream> bundleStream;
Microsoft::WRL::ComPtr<IAppxBundleReader> bundleReader;
Microsoft::WRL::ComPtr<IAppxBundleManifestReader> bundleManifestReader;
ComPtr<IAppxManifestProperties> properties;
ComPtr<IAppxManifestPackageId> packageId;
ComPtr<IAppxManifestApplicationsEnumerator> applications;
ComPtr<IAppxBundleManifestPackageInfo> packageInfo;
ComPtr<IAppxBundleManifestPackageInfoEnumerator> 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<IAppxBundleManifestPackageInfo> currentPackageInfo;
RETURN_IF_FAILED(packageInfoItems->GetCurrent(&currentPackageInfo));

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<IAppxFile> applicationPackageFile;
ComPtr<IStream> applicationPackageStream;
ComPtr<IAppxFactory> appxFactory;
ComPtr<IAppxPackageReader> 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<IAppxManifestPackageId> 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<IAppxFactory> appxFactory;
ComPtr<IOpcFactory> opcFactory;
ComPtr<IStream> packageStream;
ComPtr<IAppxPackageReader> 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;
}

Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion Tools/Source/GetAppxInfo/GetAppxInfo.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<ProjectGuid>{C54AAE36-6C88-489A-A0D9-599CB6DA4E07}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>GetAppxInfo</RootNamespace>
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
Expand Down
20 changes: 14 additions & 6 deletions Tools/appx2pkg.cmd
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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"
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -244,7 +252,7 @@ REM Printing APP Install
call :PRINT_TO_CUSTFILE " <UniversalAppInstall>"
call :PRINT_TO_CUSTFILE " <UserContextApp>"
call :PRINT_TO_CUSTFILE " <Application PackageFamilyName="%PACKAGE_FNAME%" Name="%PACKAGE_FNAME%">"
call :PRINT_TO_CUSTFILE " <ApplicationFile>%SHORT_FILE_NAME%.appx</ApplicationFile>"
call :PRINT_TO_CUSTFILE " <ApplicationFile>%SHORT_FILE_NAME%%FILE_TYPE%</ApplicationFile>"
REM Printing Dependencies
for %%B in ("%FILE_PATH%\appx_deplist_trim.txt") do if %%~zB gtr 0 (
call :PRINT_TO_CUSTFILE " <DependencyAppxFiles>"
Expand Down
Loading

0 comments on commit ef2baee

Please sign in to comment.