/********************************************************************* * ターゲット側メモリーを逆アセンブルする. ********************************************************************* * int adr :ターゲット側のメモリーアドレス * int arena :ターゲット側のメモリー種別(現在未使用) * int cnt :読み取りサイズ. */ int UsbDisasm (int adr, int arena, int cnt) { unsigned char buf[16]; int size = 8; int done = 0; int endadr = adr + cnt; int rc,disbytes; code_buf_init(); while(adr < endadr) { int rsize = check_region(adr,4); if( rsize < 0) break; #if USE_CODE_BUF rc = code_buf_read(adr,size,buf); //メモリー内容の読み出し. #else rc = dumpmem(adr,AREA_PGMEM,size,buf); //メモリー内容の読み出し. #endif if(rc != size) return done; disbytes = disasm_print(buf,size,adr); //結果印字. adr += disbytes; done+= disbytes; } return done; }
/********************************************************************* * ターゲット側メモリーを逆アセンブルする. ********************************************************************* * int adr :ターゲット側のメモリーアドレス * int arena :ターゲット側のメモリー種別(現在未使用) * int cnt :読み取りサイズ. */ int UsbDisasm (int adr, int arena, int cnt) { unsigned char buf[16]; int size = 8; int done = 0; int endadr = adr + cnt; int rc,disbytes; while(adr < endadr) { rc = dumpmem(adr,AREA_PGMEM,size,buf); //メモリー内容の読み出し. if(rc != size) return done; disbytes = disasm_print(buf,size,adr); //結果印字. adr += disbytes; done+= disbytes; } return done; }
APR_DECLARE(apr_status_t) port_disasm_to_file(port_disassembler_t * disassembler, const char * code, unsigned int len, apr_file_t * thefile) { #if defined(_IA32_) // check if nothing should be printed if (disassembler->line_size == 0) { return APR_SUCCESS; } if (disassembler->num_bytes_total == 0) { // Calculate required number of bytes disassembler->num_bytes_total = disassembler->line_size * BYTES_TOTAL / BYTES_PER_LINE; // initialize stream disassembler->real_stream = apr_palloc(disassembler->user_pool, disassembler->num_bytes_total); } // initialize file disassembler->user_file = thefile; strcpy(disassembler->real_stream, ""); disassembler->fprintf_func = disasm_fprint_default; disasm_print(disassembler, code, len); // flush apr_file_write(disassembler->user_file, disassembler->real_stream, &disassembler->num_bytes_used); apr_file_flush(disassembler->user_file); disassembler->user_file = NULL; disassembler->num_bytes_used = 0; return APR_SUCCESS; #else return APR_ENOTIMPL; #endif }
APR_DECLARE(apr_status_t) port_disasm(port_disassembler_t * disassembler, const char * code, unsigned int len, char ** disasm_code) { #if defined(_IA32_) // check if nothing should be printed if (disassembler->line_size == 0) { *disasm_code = NULL; return APR_SUCCESS; } if (disassembler->num_bytes_total == 0) { // Calculate required number of bytes disassembler->num_bytes_total = disassembler->line_size * len / BYTES_PER_LINE; // initialize stream disassembler->real_stream = apr_palloc(disassembler->user_pool, disassembler->num_bytes_total); } strcpy(disassembler->real_stream, ""); disassembler->fprintf_func = disasm_sprint_default; disasm_print(disassembler, code, len); *disasm_code = disassembler->real_stream; disassembler->real_stream = NULL; disassembler->num_bytes_total = 0; disassembler->num_bytes_used = 0; return APR_SUCCESS; #else return APR_ENOTIMPL; #endif }