static int _decode_interactive_composition(BITBUFFER *bb, BD_IG_INTERACTIVE_COMPOSITION *p) { unsigned ii; uint32_t data_len = bb_read(bb, 24); uint32_t buf_len = bb->p_end - bb->p; if (data_len != buf_len) { ERROR("ig_decode_interactive(): buffer size mismatch (expected %d, have %d)\n", data_len, buf_len); return 0; } p->stream_model = bb_read(bb, 1); p->ui_model = bb_read(bb, 1); bb_skip(bb, 6); if (p->stream_model == 0) { bb_skip(bb, 7); p->composition_timeout_pts = bb_read_u64(bb, 33); bb_skip(bb, 7); p->selection_timeout_pts = bb_read_u64(bb, 33); } p->user_timeout_duration = bb_read(bb, 24); p->num_pages = bb_read(bb, 8); p->page = calloc(p->num_pages, sizeof(BD_IG_PAGE)); for (ii = 0; ii < p->num_pages; ii++) { _decode_page(bb, &p->page[ii]); } return 1; }
static int _decode_button(BITBUFFER *bb, BD_IG_BUTTON *p) { unsigned ii; p->id = bb_read(bb, 16); p->numeric_select_value = bb_read(bb, 16); p->auto_action_flag = bb_read(bb, 1); bb_skip(bb, 7); p->x_pos = bb_read(bb, 16); p->y_pos = bb_read(bb, 16); p->upper_button_id_ref = bb_read(bb, 16); p->lower_button_id_ref = bb_read(bb, 16); p->left_button_id_ref = bb_read(bb, 16); p->right_button_id_ref = bb_read(bb, 16); p->normal_start_object_id_ref = bb_read(bb, 16); p->normal_end_object_id_ref = bb_read(bb, 16); p->normal_repeat_flag = bb_read(bb, 1); bb_skip(bb, 7); p->selected_sound_id_ref = bb_read(bb, 8); p->selected_start_object_id_ref = bb_read(bb, 16); p->selected_end_object_id_ref = bb_read(bb, 16); p->selected_repeat_flag = bb_read(bb, 1); bb_skip(bb, 7); p->activated_sound_id_ref = bb_read(bb, 8); p->activated_start_object_id_ref = bb_read(bb, 16); p->activated_end_object_id_ref = bb_read(bb, 16); p->num_nav_cmds = bb_read(bb, 16); p->nav_cmds = calloc(p->num_nav_cmds, sizeof(MOBJ_CMD)); if (!p->nav_cmds) { BD_DEBUG(DBG_DECODE | DBG_CRIT, "out of memory\n"); return 0; } for (ii = 0; ii < p->num_nav_cmds; ii++) { uint8_t buf[12]; bb_read_bytes(bb, buf, 12); mobj_parse_cmd(buf, &p->nav_cmds[ii]); } return 1; }
void pg_decode_video_descriptor(BITBUFFER *bb, BD_PG_VIDEO_DESCRIPTOR *p) { p->video_width = bb_read(bb, 16); p->video_height = bb_read(bb, 16); p->frame_rate = bb_read(bb, 4); bb_skip(bb, 4); }
void mobj_parse_cmd(uint8_t *buf, MOBJ_CMD *cmd) { BITBUFFER bb; bb_init(&bb, buf, 12); cmd->insn.op_cnt = bb_read(&bb, 3); cmd->insn.grp = bb_read(&bb, 2); cmd->insn.sub_grp = bb_read(&bb, 3); cmd->insn.imm_op1 = bb_read(&bb, 1); cmd->insn.imm_op2 = bb_read(&bb, 1); bb_skip(&bb, 2); /* reserved */ cmd->insn.branch_opt = bb_read(&bb, 4); bb_skip(&bb, 4); /* reserved */ cmd->insn.cmp_opt = bb_read(&bb, 4); bb_skip(&bb, 3); /* reserved */ cmd->insn.set_opt = bb_read(&bb, 5); cmd->dst = bb_read(&bb, 32); cmd->src = bb_read(&bb, 32); }
void fat_read_partition(byte_buffer *bb, fat_partition *part) { // Keep the byte address of the start of the partiton part->start_pos = bb->pos; // Boot sector fat_read_boot_sector(bb, part); // FAT32: Jump to FSINFO and read it if(part->type == PT_FAT32) { // Boot sector is always at sector 0 so skip to the relative sector offset of the FSINFO // We subtract 1 from the fsinfo_sector to account for the boot sector ("first sector") bb_skip(bb, part->boot_sector->bpb.bytes_per_sector * (part->boot_sector->bpb.fsinfo_sector_f32 - 1)); fat_read_fsinfo(bb, part); } // Move to the start of the FAT tables bb->pos = part->start_pos + (part->boot_sector->bpb.reserved_sectors * part->boot_sector->bpb.bytes_per_sector); }
void pg_decode_composition_object(BITBUFFER *bb, BD_PG_COMPOSITION_OBJECT *p) { p->object_id_ref = bb_read(bb, 16); p->window_id_ref = bb_read(bb, 8); p->crop_flag = bb_read(bb, 1); p->forced_on_flag = bb_read(bb, 1); bb_skip(bb, 6); p->x = bb_read(bb, 16); p->y = bb_read(bb, 16); if (p->crop_flag) { p->crop_x = bb_read(bb, 16); p->crop_y = bb_read(bb, 16); p->crop_w = bb_read(bb, 16); p->crop_h = bb_read(bb, 16); } }
int pg_decode_composition(BITBUFFER *bb, BD_PG_COMPOSITION *p) { unsigned ii; pg_decode_video_descriptor(bb, &p->video_descriptor); pg_decode_composition_descriptor(bb, &p->composition_descriptor); p->palette_update_flag = bb_read(bb, 1); bb_skip(bb, 7); p->palette_id_ref = bb_read(bb, 8); p->num_composition_objects = bb_read(bb, 8); p->composition_object = calloc(p->num_composition_objects, sizeof(BD_PG_COMPOSITION_OBJECT)); for (ii = 0; ii < p->num_composition_objects; ii++) { pg_decode_composition_object(bb, &p->composition_object[ii]); } return 1; }
void pg_decode_sequence_descriptor(BITBUFFER *bb, BD_PG_SEQUENCE_DESCRIPTOR *p) { p->first_in_seq = bb_read(bb, 1); p->last_in_seq = bb_read(bb, 1); bb_skip(bb, 6); }
void pg_decode_composition_descriptor(BITBUFFER *bb, BD_PG_COMPOSITION_DESCRIPTOR *p) { p->number = bb_read(bb, 16); p->state = bb_read(bb, 2); bb_skip(bb, 6); }
/* * Read's the FAT volume boot record in the byte buffer and sets the relevant information in the partition structure's boot_sector */ void fat_read_boot_sector(byte_buffer *bb, fat_partition *part) { part->boot_sector = fat_new_boot_sector(); fat_bs *bs = part->boot_sector; // Jump instruction bb_get_bytes_in(bb, bs->jmp, sizeof(bs->jmp)); // OEM ID string bb_get_bytes_in(bb, bs->oem_id, sizeof(bs->oem_id)); // BPB bs->bpb.bytes_per_sector = bb_get_short(bb); bs->bpb.sectors_per_cluster = bb_get(bb); bs->bpb.reserved_sectors = bb_get_short(bb); bs->bpb.num_fats = bb_get(bb); bs->bpb.root_entries_f16 = bb_get_short(bb); bs->bpb.total_sectors_16bit = bb_get_short(bb); bs->bpb.media_descriptor = bb_get(bb); bs->bpb.sectors_per_fat_f16 = bb_get_short(bb); bs->bpb.sectors_per_track = bb_get_short(bb); bs->bpb.num_heads = bb_get_short(bb); bs->bpb.hidden_sectors = bb_get_int(bb); bs->bpb.total_sectors_32bit = bb_get_int(bb); // Make proper determination of the FAT partition type according to MSFT docs uint32_t cluster_count = fat_count_clusters(part); if(cluster_count < 4085) { part->type = PT_FAT12; } else if(cluster_count < 65525) { part->type = PT_FAT16B; } else { part->type = PT_FAT32; } //printf("Detected FAT type: %s\n", get_partition_str(part->type)); // delete this after testing // FAT32 portion of the BPB if(part->type == PT_FAT32) { bs->bpb.sectors_per_fat_f32 = bb_get_int(bb); bs->bpb.eflags_f32 = bb_get_short(bb); bs->bpb.version_f32 = bb_get_short(bb); bs->bpb.root_cluster_f32 = bb_get_int(bb); bs->bpb.fsinfo_sector_f32 = bb_get_short(bb); bs->bpb.backup_sector_f32 = bb_get_short(bb); bb_skip(bb, sizeof(bs->bpb.reserved_f32)); // Skip 12 byte reserved } // EBPB bs->ebpb.physical_drive_num = bb_get(bb); bs->ebpb.reserved = bb_get(bb); bs->ebpb.eb_sig = bb_get(bb); bs->ebpb.volume_serial = bb_get_int(bb); bb_get_bytes_in(bb, bs->ebpb.volume_label, sizeof(bs->ebpb.volume_label)); bb_get_bytes_in(bb, bs->ebpb.system_id, sizeof(bs->ebpb.system_id)); // Bootstrap code if(part->type == PT_FAT32) { bs->bootstrap_code = bb_get_bytes(bb, FAT32_BOOTSTRAP_SIZE); } else { bs->bootstrap_code = bb_get_bytes(bb, FAT16_BOOTSTRAP_SIZE); } // End signature bs->sig_end1 = bb_get(bb); bs->sig_end2 = bb_get(bb); if(bs->sig_end1 != 0x55 || bs->sig_end2 != 0xAA) { printf("Warning: FAT VBR boot signature does not match 0x55 0xAA!. sig1: %X, sig2: %X\n", bs->sig_end1, bs->sig_end2); } }