Initial commit
This commit is contained in:
368
xbdm/imp/contentpkg.h
Normal file
368
xbdm/imp/contentpkg.h
Normal 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_
|
||||
Reference in New Issue
Block a user