Updated to new libnx ipc

This commit is contained in:
Adubbz 2019-09-24 20:31:56 +10:00
parent ecbc77840e
commit 3d7e3c52f7
2 changed files with 494 additions and 1001 deletions

View File

@ -1,7 +1,7 @@
/**
* @file ncm.h
* @brief Content Manager (ncm) service IPC wrapper.
* @author zhuowei & Adubbz
* @author Adubbz & zhuowei
* @copyright libnx Authors
*/
#pragma once
@ -9,32 +9,6 @@
#include "../services/fs.h"
#include "../services/sm.h"
typedef enum {
NcmContentType_CNMT = 0,
NcmContentType_Program = 1,
NcmContentType_Data = 2,
NcmContentType_Icon = 3,
NcmContentType_Doc = 4,
NcmContentType_Info = 5,
} NcmContentType;
typedef enum {
NcmContentMetaType_SystemProgram = 0x01,
NcmContentMetaType_SystemData = 0x02,
NcmContentMetaType_SystemUpdate = 0x03,
NcmContentMetaType_BootImagePackage = 0x04,
NcmContentMetaType_BootImagePackageSafe = 0x05,
NcmContentMetaType_Application = 0x80,
NcmContentMetaType_Patch = 0x81,
NcmContentMetaType_AddOnContent = 0x82,
NcmContentMetaType_Delta = 0x83,
} NcmContentMetaType;
typedef enum {
NcmContentMetaAttribute_Exfat = (1 << 0),
NcmContentMetaAttribute_Rebootless = (1 << 1),
} NcmContentMetaAttribute;
typedef struct {
Service s;
} NcmContentStorage;
@ -43,68 +17,165 @@ typedef struct {
Service s;
} NcmContentMetaDatabase;
typedef enum {
NcmContentType_Meta = 0,
NcmContentType_Program = 1,
NcmContentType_Data = 2,
NcmContentType_Control = 3,
NcmContentType_HtmlDocument = 4,
NcmContentType_LegalInformation = 5,
NcmContentType_DeltaFragment = 6,
} NcmContentType;
typedef enum {
NcmContentMetaType_Unknown = 0x0,
NcmContentMetaType_SystemProgram = 0x1,
NcmContentMetaType_SystemData = 0x2,
NcmContentMetaType_SystemUpdate = 0x3,
NcmContentMetaType_BootImagePackage = 0x4,
NcmContentMetaType_BootImagePackageSafe = 0x5,
NcmContentMetaType_Application = 0x80,
NcmContentMetaType_Patch = 0x81,
NcmContentMetaType_AddOnContent = 0x82,
NcmContentMetaType_Delta = 0x83,
} NcmContentMetaType;
typedef enum {
NcmContentMetaAttribute_None = 0,
NcmContentMetaAttribute_IncludesExFatDriver = BIT(0),
NcmContentMetaAttribute_Rebootless = BIT(1),
} NcmContentMetaAttribute;
typedef enum {
NcmContentInstallType_Full = 0,
NcmContentInstallType_FragmentOnly = 1,
NcmContentInstallType_Unknown = 7,
} NcmContentInstallType;
typedef struct {
u8 c[0x10];
} NcmNcaId;
typedef struct {
u64 titleId;
u64 id;
u32 version;
u8 type;
u8 flags;
u8 padding[2];
} NcmMetaRecord;
NcmContentMetaType type;
NcmContentInstallType install_type;
u8 padding[2];
} NcmContentMetaKey;
typedef struct {
NcmNcaId ncaId;
u8 size[0x6];
u8 type;
u8 padding;
} NcmContentRecord;
typedef struct {
u16 numExtraBytes; ///< Size of optional struct that comes after this one.
u16 numContentRecords; ///< Number of NcmContentRecord entries after the extra bytes.
u16 numMetaRecords; ///< Number of NcmMetaRecord entries that come after the NcmContentRecords.
u16 padding; ///< Always zero.
} NcmContentMetaRecordsHeader;
typedef struct {
NcmMetaRecord metaRecord;
u64 baseTitleId;
NcmContentMetaKey key;
u64 application_id;
} NcmApplicationContentMetaKey;
typedef struct {
NcmNcaId content_id;
u8 size[0x6];
NcmContentType content_type;
u8 id_offset;
} NcmContentInfo;
/* Used by system updates. They share the exact same struct as NcmContentMetaKey */
typedef NcmContentMetaKey NcmContentMetaInfo;
typedef struct {
u16 extended_header_size; ///< Size of optional struct that comes after this one.
u16 content_count; ///< Number of NcmContentInfos after the extra bytes.
u16 content_meta_count; ///< Number of NcmContentMetaInfos that come after the NcmContentInfos.
NcmContentMetaAttribute attributes; ///< Usually None (0).
FsStorageId storage_id; ///< Usually None (0).
} NcmContentMetaHeader;
typedef struct {
u64 patch_id;
u32 required_system_version;
u32 padding;
} NcmApplicationMetaExtendedHeader;
typedef struct {
u64 application_id;
u32 required_system_version;
u32 extended_data_size;
u8 reserved[0x8];
} NcmPatchMetaExtendedHeader;
typedef struct {
u64 application_id;
u32 required_application_version;
u32 padding;
} NcmAddOnContentMetaExtendedHeader;
typedef struct {
u32 extended_data_size;
} NcmSystemUpdateMetaExtendedHeader;
Result ncmInitialize(void);
void ncmExit(void);
Service* ncmGetServiceSession(void);
Result ncmOpenContentStorage(FsStorageId storage, NcmContentStorage* out);
Result ncmOpenContentMetaDatabase(FsStorageId storage, NcmContentMetaDatabase* out);
Result ncmCreateContentStorage(FsStorageId storage_id);
Result ncmCreateContentMetaDatabase(FsStorageId storage_id);
Result ncmVerifyContentStorage(FsStorageId storage_id);
Result ncmVerifyContentMetaDatabase(FsStorageId storage_id);
Result ncmOpenContentStorage(NcmContentStorage* out_content_storage, FsStorageId storage_id);
Result ncmOpenContentMetaDatabase(NcmContentMetaDatabase* out_content_meta_database, FsStorageId storage_id);
Result ncmCloseContentStorageForcibly(FsStorageId storage_id);
Result ncmCloseContentMetaDatabaseForcibly(FsStorageId storage_id);
Result ncmCleanupContentMetaDatabase(FsStorageId storage_id);
Result ncmActivateContentStorage(FsStorageId storage_id);
Result ncmInactivateContentStorage(FsStorageId storage_id);
Result ncmActivateContentMetaDatabase(FsStorageId storage_id);
Result ncmInactivateContentMetaDatabase(FsStorageId storage_id);
Result ncmInvalidateRightsIdCache(void);
Result ncmContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmNcaId* outputId);
Result ncmContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmNcaId* registeredId, const NcmNcaId* placeholderId, u64 size);
Result ncmContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmNcaId* placeholderId);
Result ncmContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmNcaId* placeholderId, u64 offset, const void* srcData, size_t srcDataSize);
Result ncmContentStorageRegister(NcmContentStorage* cs, const NcmNcaId* registeredId, const NcmNcaId* placeholderId);
Result ncmContentStorageDelete(NcmContentStorage* cs, const NcmNcaId* registeredId);
Result ncmContentStorageHas(NcmContentStorage* cs, const NcmNcaId* ncaId, bool* out);
Result ncmContentStorageGetPath(NcmContentStorage* cs, const NcmNcaId* ncaId, char* out, size_t outSize);
Result ncmContentStorageGetPlaceHolderPath(NcmContentStorage* cs, const NcmNcaId* ncaId, char* out, size_t outSize);
Result ncmContentStorageGeneratePlaceHolderId(NcmContentStorage* cs, NcmNcaId* out_id);
Result ncmContentStorageCreatePlaceHolder(NcmContentStorage* cs, const NcmNcaId* content_id, const NcmNcaId* placeholder_id, u64 size);
Result ncmContentStorageDeletePlaceHolder(NcmContentStorage* cs, const NcmNcaId* placeholder_id);
Result ncmContentStorageHasPlaceHolder(NcmContentStorage* cs, bool* out, const NcmNcaId* placeholder_id);
Result ncmContentStorageWritePlaceHolder(NcmContentStorage* cs, const NcmNcaId* placeholder_id, u64 offset, const void* data, size_t data_size);
Result ncmContentStorageRegister(NcmContentStorage* cs, const NcmNcaId* content_id, const NcmNcaId* placeholder_id);
Result ncmContentStorageDelete(NcmContentStorage* cs, const NcmNcaId* content_id);
Result ncmContentStorageHas(NcmContentStorage* cs, bool* out, const NcmNcaId* content_id);
Result ncmContentStorageGetPath(NcmContentStorage* cs, char* out_path, size_t out_size, const NcmNcaId* content_id);
Result ncmContentStorageGetPlaceHolderPath(NcmContentStorage* cs, const char* out_path, size_t out_size, NcmNcaId* placeholder_id);
Result ncmContentStorageCleanupAllPlaceHolder(NcmContentStorage* cs);
Result ncmContentStorageGetSize(NcmContentStorage* cs, const NcmNcaId* ncaId, u64* out);
Result ncmContentStorageListPlaceHolder(NcmContentStorage* cs, NcmNcaId* out_ids, size_t out_ids_size, u32* out_count);
Result ncmContentStorageGetContentCount(NcmContentStorage* cs, u32* out_count);
Result ncmContentStorageListContentId(NcmContentStorage* cs, NcmNcaId* out_ids, size_t out_ids_size, u32* out_count, u32 start_offset);
Result ncmContentStorageGetSizeFromContentId(NcmContentStorage* cs, u64* out_size, const NcmNcaId* content_id);
Result ncmContentStorageDisableForcibly(NcmContentStorage* cs);
Result ncmContentStorageReadContentIdFile(NcmContentStorage* cs, const NcmNcaId* ncaId, u64 offset, void* outBuf, size_t bufSize);
Result ncmContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, const NcmNcaId* ncaId, FsRightsId* rightsIdOut, u32* keyGenerationOut);
Result ncmContentStorageRevertToPlaceHolder(NcmContentStorage* cs, const NcmNcaId* placeholder_id, const NcmNcaId* old_content_id, const NcmNcaId* new_content_id);
Result ncmContentStorageSetPlaceHolderSize(NcmContentStorage* cs, const NcmNcaId* placeholder_id, u64 size);
Result ncmContentStorageReadContentIdFile(NcmContentStorage* cs, void* out_data, size_t out_data_size, const NcmNcaId* content_id, u64 offset);
Result ncmContentStorageGetRightsIdFromPlaceHolderId(NcmContentStorage* cs, FsRightsId* out_rights_id, u32* out_key_generation, const NcmNcaId* placeholder_id);
Result ncmContentStorageGetRightsIdFromContentId(NcmContentStorage* cs, FsRightsId* out_rights_id, u32* out_key_generation, const NcmNcaId* content_id);
Result ncmContentStorageWriteContentForDebug(NcmContentStorage* cs, const NcmNcaId* content_id, u64 offset, const void* data, size_t data_size);
Result ncmContentStorageGetFreeSpaceSize(NcmContentStorage* cs, u64* out_size);
Result ncmContentStorageGetTotalSpaceSize(NcmContentStorage* cs, u64* out_size);
Result ncmContentStorageFlushPlaceHolder(NcmContentStorage* cs);
Result ncmContentStorageGetSizeFromPlaceHolderId(NcmContentStorage* cs, u64* out_size, const NcmNcaId* placeholder_id);
Result ncmContentStorageRepairInvalidFileAttribute(NcmContentStorage* cs);
Result ncmContentStorageGetRightsIdFromPlaceHolderIdWithCache(NcmContentStorage* cs, FsRightsId* out_rights_id, u32* out_key_generation, const NcmNcaId* placeholder_id, const NcmNcaId* cache_content_id);
Result ncmContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmMetaRecord* record, u64 inDataSize, const NcmContentMetaRecordsHeader* srcRecordsData);
Result ncmContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmMetaRecord* record, u64 outDataSize, NcmContentMetaRecordsHeader* outRecordsData, u64* sizeRead);
Result ncmContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmMetaRecord *record);
Result ncmContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmContentType contentType, const NcmMetaRecord* record, NcmNcaId* out);
Result ncmContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, const NcmMetaRecord* record, u32 index, NcmContentRecord* contentRecordsOut, size_t contentRecordsBufSize, u32* numEntriesRead);
Result ncmContentMetaDatabaseList(NcmContentMetaDatabase* db, u32 titleType, u64 titleIdExact, u64 titleIdLow, u64 titleIdHigh, NcmMetaRecord* metaRecordsOut, size_t metaRecordsBufSize, u32* numEntriesWritten, u32* numEntriesTotal);
Result ncmContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, u64 titleId, NcmMetaRecord* out);
Result ncmContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, u8 filter, NcmApplicationContentMetaKey* outBuf, size_t outBufSize, u32* numEntriesWritten, u32* numEntriesTotal);
Result ncmContentMetaDatabaseHas(NcmContentMetaDatabase* db, const NcmMetaRecord* record, bool* out);
Result ncmContentMetaDatabaseSet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, const void* data, u64 data_size);
Result ncmContentMetaDatabaseGet(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u64* out_size, void* out_data, u64 out_data_size);
Result ncmContentMetaDatabaseRemove(NcmContentMetaDatabase* db, const NcmContentMetaKey *key);
Result ncmContentMetaDatabaseGetContentIdByType(NcmContentMetaDatabase* db, NcmNcaId* out_content_id, const NcmContentMetaKey* key, NcmContentType type);
Result ncmContentMetaDatabaseListContentInfo(NcmContentMetaDatabase* db, u32* out_entries_written, NcmContentInfo* out_info, size_t out_info_size, const NcmContentMetaKey* key, u32 start_index);
Result ncmContentMetaDatabaseList(NcmContentMetaDatabase* db, u32* out_entries_total, u32* out_entries_written, NcmContentMetaKey* out_keys, size_t out_keys_size, NcmContentMetaType meta_type, u64 application_title_id, u64 title_id_min, u64 title_id_max, NcmContentInstallType install_type);
Result ncmContentMetaDatabaseGetLatestContentMetaKey(NcmContentMetaDatabase* db, NcmContentMetaKey* out_key, u64 title_id);
Result ncmContentMetaDatabaseListApplication(NcmContentMetaDatabase* db, u32* out_entries_total, u32* out_entries_written, NcmApplicationContentMetaKey* out_keys, size_t out_keys_size, NcmContentMetaType meta_type);
Result ncmContentMetaDatabaseHas(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key);
Result ncmContentMetaDatabaseHasAll(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* keys, size_t keys_size);
Result ncmContentMetaDatabaseGetSize(NcmContentMetaDatabase* db, u64* out_size, const NcmContentMetaKey* key);
Result ncmContentMetaDatabaseGetRequiredSystemVersion(NcmContentMetaDatabase* db, u64* out_version, const NcmContentMetaKey* key);
Result ncmContentMetaDatabaseGetPatchId(NcmContentMetaDatabase* db, u64* out_patch_id, const NcmContentMetaKey* key);
Result ncmContentMetaDatabaseDisableForcibly(NcmContentMetaDatabase* db);
Result ncmContentMetaDatabaseLookupOrphanContent(NcmContentMetaDatabase* db, bool* out_orphaned, size_t out_orphaned_size, const NcmNcaId* content_ids, size_t content_ids_size);
Result ncmContentMetaDatabaseCommit(NcmContentMetaDatabase* db);
Result ncmContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmMetaRecord* record, u8* out);
Result ncmContentMetaDatabaseHasContent(NcmContentMetaDatabase* db, bool* out, const NcmContentMetaKey* key, const NcmNcaId* content_id);
Result ncmContentMetaDatabaseListContentMetaInfo(NcmContentMetaDatabase* db, u32* out_entries_written, void* out_meta_info, size_t out_meta_info_size, const NcmContentMetaKey* key, u32 start_index);
Result ncmContentMetaDatabaseGetAttributes(NcmContentMetaDatabase* db, const NcmContentMetaKey* key, u8* out);
Result ncmContentMetaDatabaseGetRequiredApplicationVersion(NcmContentMetaDatabase* db, u64* out_version, const NcmContentMetaKey* key);
Result ncmContentMetaDatabaseGetContentIdByTypeAndIdOffset(NcmContentMetaDatabase* db, NcmNcaId* out_content_id, const NcmContentMetaKey* key, NcmContentType type, u8 id_offset);

File diff suppressed because it is too large Load Diff