Initial commit

This commit is contained in:
Xoro-1337
2025-11-06 15:36:24 -05:00
parent a738b93280
commit b24c1ddcbc
45 changed files with 65790 additions and 0 deletions

368
xbdm/imp/contentpkg.h Normal file
View File

@@ -0,0 +1,368 @@
/************************************************************************
* *
* contentpkg.h -- Xenon Content Package Definition *
* *
* Copyright (c) Microsoft Corp. All rights reserved. *
* *
************************************************************************/
#ifndef _CONTENTPKG_H_
#define _CONTENTPKG_H_
#include "consolecert.h"
#pragma pack(push, 1)
//
// Everything in the header is stored in big-endian format.
//
//------------------------------------------------------------------------------
typedef enum _XCONTENT_SIGNATURE_TYPE
{
CONSOLE_SIGNED = 'CON ',
LIVE_SIGNED = 'LIVE',
PIRS_SIGNED = 'PIRS',
} XCONTENT_SIGNATURE_TYPE;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_SIGNATURE {
BYTE Signature[256];
BYTE Reserved[296];
} XCONTENT_SIGNATURE, *PXCONTENT_SIGNATURE;
C_ASSERT(sizeof(XE_CONSOLE_SIGNATURE) == sizeof(XCONTENT_SIGNATURE));
//------------------------------------------------------------------------------
#define XCONTENT_UNRESTRICTED_LICENSEE ((ULONGLONG) 0xFFFFFFFFFFFFFFFF)
#define XCONTENT_LICENSE_FLAG_REQUIRE_ONLINE 0x00000001
typedef struct _XCONTENT_LICENSE {
ULONGLONG LicenseeId;
DWORD LicenseBits;
DWORD LicenseFlags;
} XCONTENT_LICENSE, *PXCONTENT_LICENSE;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_HEADER {
//
// Indicates how the content was signed.
//
XCONTENT_SIGNATURE_TYPE SignatureType;
//
// Signature information. The signature covers the remainder of this
// XCONTENT_HEADER structure starting immediately after the signature
// field.
//
union {
XE_CONSOLE_SIGNATURE ConsoleSignature;
XCONTENT_SIGNATURE ContentSignature;
} Signature;
//
// Licensing information a fixed array of 16 license descriptors.
//
XCONTENT_LICENSE LicenseDescriptors[16];
//
// ContentId is the SHA-1 digest of the XCONTENT_METADATA header and all
// subsequent headers. This digests everything up to the start of the
// package file system blob, including the alignment padding, even though
// the padding is not included in SizeOfHeaders below. In other words,
// round the SizeOfHeaders value up to the next alignment boundary, then
// subtract sizeof(XCONTENT_HEADER), and that's how many bytes to hash
// starting after immediately this XCONTENT_HEADER structure.
//
BYTE ContentId[XECRYPT_SHA_DIGEST_SIZE];
//
// Specifies the total size of useable header information, including this
// header, but not including any alignment padding (even though the
// padding is included in the ContentId digest).
//
ULONG SizeOfHeaders;
} XCONTENT_HEADER, *PXCONTENT_HEADER;
//------------------------------------------------------------------------------
#define XCONTENT_THUMBNAIL_WIDTH 64
#define XCONTENT_THUMBNAIL_HEIGHT 64
#define XCONTENT_THUMBNAIL_BITDEPTH 32
#define XCONTENT_THUMBNAIL_SIZE (XCONTENT_THUMBNAIL_WIDTH * XCONTENT_THUMBNAIL_HEIGHT * (XCONTENT_THUMBNAIL_BITDEPTH / 8))
typedef struct _XCONTENT_METADATA {
//
// Type of content represented (XCONTENTTYPE_*).
//
DWORD ContentType;
//
// Reserved value for future extensibility, must be zero.
//
DWORD Reserved1;
//
// Size of file system blob after headers. Note that some helper routines
// choose to add in the size of the header block as well when passing this
// information around for convenience, but in storage/when hashed this
// should only include the file system blob.
//
LARGE_INTEGER ContentSize;
//
// Execution ID of the title for which content package was generated.
//
XEX_EXECUTION_ID ExecutionId;
//
// ID of console on which this content was created, or all zeros if not
// created by a console.
//
BYTE ConsoleId[CONSOLE_ID_SIZE];
//
// XUID of user that created this content package, or all zeros if not
// created by a user.
//
ULONGLONG Creator;
//
// Root digest of files and other information generated by the embedded
// file system.
//
BYTE StfsVolumeDescriptor[36];
//
// Reserved bytes for future extensibility, must be zero.
//
BYTE Reserved2[96];
//
// ID of device on which content package was created.
//
BYTE DeviceId[20];
//
// Display name for content package.
//
WCHAR DisplayName[9][XCONTENT_MAX_DISPLAYNAME_LENGTH];
//
// Description of content package.
//
WCHAR Description[9][XCONTENT_MAX_DISPLAYNAME_LENGTH];
//
// Name of publisher of content package.
//
WCHAR Publisher[64];
//
// Title Name for content package.
//
WCHAR TitleName[64];
//
// Package flags.
//
union {
struct {
//
// Bit indicating whether this content package may be transferred
// to another profile.
//
BYTE ProfileTransfer : 1;
//
// Bit indicating whether this content package may be transferred
// to another device.
//
BYTE DeviceTransfer : 1;
//
// Reserved bits, must be 0.
//
BYTE Reserved : 6;
} Bits;
BYTE FlagsAsBYTE;
} Flags;
//
// Embedded content package thumbnail size in bytes.
//
DWORD ThumbnailSize;
//
// Embedded content package title thumbnail size in bytes.
//
DWORD TitleThumbnailSize;
//
// Embedded content package thumbnail graphic icon.
//
BYTE Thumbnail[XCONTENT_THUMBNAIL_SIZE];
//
// Embedded content package title thumbnail graphic icon.
//
BYTE TitleThumbnail[XCONTENT_THUMBNAIL_SIZE];
} XCONTENT_METADATA, *PXCONTENT_METADATA;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_METADATA_TITLE_CONTENT {
//
// Reserved, must be zero. This is used to make the structure the same
// size as XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE (when part of the
// XCONTENT_METADATA_INSTALLER structure).
//
BYTE Reserved[5620];
} XCONTENT_METADATA_TITLE_CONTENT;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_METADATA_INSTALLER_SYSTEM_UPDATE {
//
// Current version for which update applies, or 0 for all derivatives of
// the base version.
//
DWORD CurrentVersion;
//
// New version to which the update will upgrade.
//
DWORD NewVersion;
//
// Reserved, must be zero. This is used to make the structure the same
// size as XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE when combined with
// the XCONTENT_METADATA_INSTALLER structure.
//
BYTE Reserved[5608];
} XCONTENT_METADATA_INSTALLER_SYSTEM_UPDATE;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_METADATA_INSTALLER_TITLE_UPDATE {
//
// System version to which update is restricted, or 0 for all system
// versions.
//
DWORD SystemVersion;
//
// New version to which the update will upgrade.
//
DWORD NewVersion;
//
// Reserved, must be zero. This is used to make the structure the same
// size as XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE when combined with
// the XCONTENT_METADATA_INSTALLER structure.
//
BYTE Reserved[5608];
} XCONTENT_METADATA_INSTALLER_TITLE_UPDATE;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE {
//
// Download installer progress cache information.
//
XONLINECONTENT_RESUME_HEADER ResumeHeader;
//
// Extra storage space for CAB resume information.
//
BYTE CabResumeData[XONLINECONTENT_MAX_SINGLE_FILE_RESUME_DATA_SIZE];
} XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE;
//------------------------------------------------------------------------------
typedef enum _INSTALLER_METADATA_TYPE
{
INSTALLER_METADATA_TYPE_SYSTEM_UPDATE = 'SUPD',
INSTALLER_METADATA_TYPE_TITLE_UPDATE = 'TUPD',
INSTALLER_METADATA_TYPE_PROGRESS_CACHE_SYSTEM_UPDATE = 'P$SU',
INSTALLER_METADATA_TYPE_PROGRESS_CACHE_TITLE_UPDATE = 'P$TU',
INSTALLER_METADATA_TYPE_PROGRESS_CACHE_TITLE_CONTENT = 'P$TC',
} INSTALLER_METADATA_TYPE;
//------------------------------------------------------------------------------
typedef struct _XCONTENT_METADATA_INSTALLER {
//
// Type of installer package.
//
INSTALLER_METADATA_TYPE MetaDataType;
//
// Union of type specific metadata structures.
//
union {
XCONTENT_METADATA_INSTALLER_SYSTEM_UPDATE SystemUpdate;
XCONTENT_METADATA_INSTALLER_TITLE_UPDATE TitleUpdate;
XCONTENT_METADATA_INSTALLER_PROGRESS_CACHE InstallProgressCache;
} MetaData;
} XCONTENT_METADATA_INSTALLER;
C_ASSERT(sizeof(XCONTENT_METADATA_TITLE_CONTENT) == sizeof(XCONTENT_METADATA_INSTALLER));
//------------------------------------------------------------------------------
//
// Headers must be zero padded to meet this alignment requirement for the start
// of the embedded file system volume.
//
#define XCONTENT_FILE_SYSTEM_ALIGNMENT (4 * 1024)
#define XCONTENT_ROUND_UP_TO_ALIGNMENT(size) (((size) + (XCONTENT_FILE_SYSTEM_ALIGNMENT - 1)) & (~(XCONTENT_FILE_SYSTEM_ALIGNMENT - 1)))
#define XCONTENT_ALIGNMENT_PADDING_NEEDED(size) (XCONTENT_ROUND_UP_TO_ALIGNMENT(size) - (size))
//
// The file system blob/tools expect to deal with volumes that are marked as
// having sizes that are even multiples of a megabyte.
//
#define XCONTENT_FILE_SYSTEM_VOLUME_SIZE_UNITS (1024 * 1024)
#define XCONTENT_ROUND_UP_TO_VOLUME_SIZE(size) (((size) + (XCONTENT_FILE_SYSTEM_VOLUME_SIZE_UNITS - 1)) & (~(XCONTENT_FILE_SYSTEM_VOLUME_SIZE_UNITS - 1)))
//
// Define reasonable maximum values for content package header fields (or
// implied values). The constants are somewhat arbitrary, but chosen to be
// small enough so as to to avoid 32 bit integer overflow issues. This
// simplifies validation for the consumer to just needing to validate the
// individual pieces against their respective values.
//
#define XCONTENT_MIN_HEADERS_SIZE (sizeof(XCONTENT_HEADER) + sizeof(XCONTENT_METADATA))
#define XCONTENT_MAX_OTHER_METADATA_SIZE 0x01000000
#define XCONTENT_MAX_HEADERS_SIZE 0x10000000
C_ASSERT(((DWORD) XCONTENT_MAX_HEADERS_SIZE + (DWORD) sizeof(XCONTENT_HEADER)) > (DWORD) XCONTENT_MAX_HEADERS_SIZE);
C_ASSERT(((DWORD) XCONTENT_MAX_HEADERS_SIZE + (DWORD) sizeof(XCONTENT_HEADER) + (DWORD) sizeof(XCONTENT_METADATA)) > (DWORD) XCONTENT_MAX_HEADERS_SIZE);
C_ASSERT(((DWORD) XCONTENT_MAX_HEADERS_SIZE + (DWORD) sizeof(XCONTENT_HEADER) + (DWORD) sizeof(XCONTENT_METADATA) + (DWORD) XCONTENT_MAX_OTHER_METADATA_SIZE) > (DWORD) XCONTENT_MAX_HEADERS_SIZE);
C_ASSERT(((DWORD) XCONTENT_MAX_HEADERS_SIZE + (DWORD) sizeof(XCONTENT_HEADER) + (DWORD) sizeof(XCONTENT_METADATA) + (DWORD) XCONTENT_MAX_OTHER_METADATA_SIZE + (DWORD) XCONTENT_FILE_SYSTEM_ALIGNMENT) > (DWORD) XCONTENT_MAX_HEADERS_SIZE);
#define XCONTENT_MIN_CONTENT_SIZE 256
#define XCONTENT_MAX_CONTENT_SIZE 0x00000000FFFFFFFF
#pragma pack(pop)
#endif // _CONTENTPKG_H_