ErrorStack ArrayMetadataSerializer::save(tinyxml2::XMLElement* element) const { CHECK_ERROR(save_base(element)); CHECK_ERROR(add_element(element, "payload_size_", "", data_casted_->payload_size_)); CHECK_ERROR(add_element( element, "snapshot_drop_volatile_pages_threshold_", "", data_casted_->snapshot_drop_volatile_pages_threshold_)); CHECK_ERROR(add_element(element, "array_size_", "", data_casted_->array_size_)); return kRetOk; }
ErrorStack MasstreeMetadataSerializer::save(tinyxml2::XMLElement* element) const { CHECK_ERROR(save_base(element)); CHECK_ERROR(add_element( element, "border_early_split_threshold_", "", data_casted_->border_early_split_threshold_)); CHECK_ERROR(add_element( element, "snapshot_drop_volatile_pages_layer_threshold_", "", data_casted_->snapshot_drop_volatile_pages_layer_threshold_)); CHECK_ERROR(add_element( element, "snapshot_drop_volatile_pages_btree_levels_", "", data_casted_->snapshot_drop_volatile_pages_btree_levels_)); CHECK_ERROR(add_element(element, "min_layer_hint_", "", data_casted_->min_layer_hint_)); return kRetOk; }
ErrorStack SequentialMetadataSerializer::save(tinyxml2::XMLElement* element) const { CHECK_ERROR(save_base(element)); return kRetOk; }
int main(int argc, char *argv[]) { NPBASE *np_base; MAC_KEY mkey; CIPHER_KEY ckey; FILE *iso_fp, *pbp_fp; char *npb_name, *iso_name, *pbp_name; int i, ap, do_comp, do_crypt, do_save_base, builtin_base; int total_block, block_size; int iso_size, iso_offset, iso_block; int table_offset, table_size; u8 *iso_buf, *lzrc_buf, *table_buf; ap = 1; npb_name = NULL; iso_name = NULL; pbp_name = NULL; do_comp = 0; do_crypt = 1; do_save_base = 0; builtin_base = 1; np_base = NULL; // parameter process while(ap<argc){ if(argv[ap][0]=='-'){ if(argv[ap][1]=='b'){ if(ap+1==argc) goto _help; npb_name = argv[ap+1]; builtin_base = 0; ap += 1; }else if(argv[ap][1]=='c'){ do_comp = 1; }else if(argv[ap][1]=='w'){ do_save_base = 1; }else if(argv[ap][1]=='e'){ do_crypt = 1; }else{ printf(" unkonw param: %s\n", argv[ap]); goto _help; } }else{ if(iso_name==NULL){ iso_name = argv[ap]; }else if(pbp_name==NULL){ pbp_name = argv[ap]; } } ap += 1; } if(iso_name==NULL) iso_name = "NP.ISO"; if(pbp_name==NULL) pbp_name = "EBOOT.PBP"; if(builtin_base==0){ np_base = load_base(npb_name); if(np_base==NULL){ printf("Load base %s faield!\n", npb_name); goto _help; } show_npinfo(np_base); if(do_save_base==1){ save_base(np_base); } } iso_fp = open_file(iso_name, &iso_size); if(iso_fp==NULL){ printf("Open file %s faield!\n", iso_name); goto _help; } if(builtin_base==1){ np_base = find_base(iso_size); show_npinfo(np_base); } if(iso_size>np_base->max_size){ printf("ISO is too big to fake! %d>%d\n", iso_size, np_base->max_size); goto _help; } // ready to fake! total_block = np_base->total_block; block_size = np_base->block_size; iso_block = (iso_size+block_size-1)/block_size; show_isoinfo(iso_name, iso_block, iso_size); printf("Output: %s\n", pbp_name); // create PBP file pbp_fp = fopen(pbp_name, "wb"); if(pbp_fp==NULL){ printf("Create %s failed!\n", pbp_name); exit(-1); } // write pbp header and icon file table_offset = write_pbp_part1(np_base, pbp_fp, iso_name); // write empty table first. table_size = total_block*0x20; table_buf = malloc(table_size); memset(table_buf, 0, table_size); fwrite(table_buf, table_size, 1, pbp_fp); iso_offset = 256+table_size; iso_buf = malloc(block_size*2); lzrc_buf = malloc(block_size*2); printf(" write iso block ...\n"); // process iso block for(i=0; i<iso_block; i++){ u8 *tb = table_buf+i*0x20; u8 *wbuf; int wsize, lzrc_size, ratio; fread(iso_buf, block_size, 1, iso_fp); wbuf = iso_buf; wsize = block_size; if(do_comp==1){ lzrc_size = lzrc_compress(lzrc_buf, block_size*2, iso_buf, block_size); memset(lzrc_buf+lzrc_size, 0, 16); ratio = (lzrc_size*100)/block_size; if(ratio<RATIO_LIMIT){ wbuf = lzrc_buf; wsize = (lzrc_size+15)&~15; } } *(u32*)(tb+0x10) = iso_offset; *(u32*)(tb+0x14) = wsize; *(u32*)(tb+0x18) = 0; // bit0=1: skip MAC check. // bit2=1: skip CIPHER encrypt *(u32*)(tb+0x1c) = 0; // encrypt block if(do_crypt==1){ sceDrmBBCipherInit(&ckey, 1, 2, np_base->np_header+0xa0, np_base->key, iso_offset>>4); sceDrmBBCipherUpdate(&ckey, wbuf, wsize); sceDrmBBCipherFinal(&ckey); } // generic MAC sceDrmBBMacInit(&mkey, 3); sceDrmBBMacUpdate(&mkey, wbuf, wsize); sceDrmBBMacFinal(&mkey, tb, np_base->key); bbmac_build_final2(3, tb); encrypt_table(tb); // write iso data wsize = (wsize+15)&~15; fwrite(wbuf, wsize, 1, pbp_fp); // update offset iso_offset += wsize; printf("\r %02d%% ", i*100/iso_block); }