//------------------------------------------------------------------------------ static int get_instruction_length(void* addr) { unsigned prolog; int i; struct asm_tag_t { unsigned expected; unsigned mask; }; struct asm_tag_t asm_tags[] = { #ifdef _M_X64 { 0x38ec8348, 0xffffffff }, // sub rsp,38h { 0x0000f3ff, 0x0000ffff }, // push rbx { 0x00005340, 0x0000ffff }, // push rbx { 0x00dc8b4c, 0x00ffffff }, // mov r11, rsp { 0x0000b848, 0x0000f8ff }, // mov reg64, imm64 = 10-byte length #elif defined _M_IX86 { 0x0000ff8b, 0x0000ffff }, // mov edi,edi { 0x000000e9, 0x000000ff }, // jmp addr32 = 5-byte length #endif }; prolog = *(unsigned*)(addr); for (i = 0; i < sizeof_array(asm_tags); ++i) { int length; unsigned expected = asm_tags[i].expected; unsigned mask = asm_tags[i].mask; if (expected != (prolog & mask)) { continue; } length = get_mask_size(mask); // Checks for instructions that "expected" only partially matches. if (expected == 0x0000b848) { length = 10; } else if (expected == 0xe9) { // jmp [imm32] length = 5; } LOG_INFO("Matched prolog %08X (mask = %08X)", prolog, mask); return length; } return 0; }
void main(int argc, char **argv) { FILE *file, *fout, *mask_file; // arquivos de entrada e saída char line[MAX], header_type[MAX]; // strings int matrix_width, matrix_height, grayscale, weight, soma, mask_size; // colunas, linhas, escala de cinza, weight da máscara, soma dos elementos int i, j, w, z, x, y; // contadores e auxiliares int **array, **output, **mask; // matriz da imagem original, matriz da imagem de saída, matriz da mascara int c, r = 0; // colunas, linhas // verifica se os argumentos foram passados corretamente if (argc != 5 && argc != 4) { printf( "Os argumentos foram passados incorretamente. Por favor, consulte a documentação."); exit(EXIT_FAILURE); } else { if (!(file = fopen(argv[1], "r"))) { printf("Não foi possível abrir a imagem."); exit(EXIT_FAILURE); } if (!(fout = fopen(argv[argc - 1], "w+"))) { printf("Não foi possível abrir a imagem."); exit(EXIT_FAILURE); } } // se for utilizado o filtro de média, abre a imagem if (argc == 4) { if (!(mask_file = fopen(argv[2], "r"))) { printf("Não foi possível abrir a máscara."); exit(EXIT_FAILURE); } } // tipo da imagem: P5 ou P2 get_image_type(file, &header_type); // tamanho da matrix: col lin get_matrix_size(file, &matrix_width, &matrix_height); // maior valor da escala de cinza get_grayscale(file, &grayscale); // verifica se o nível de cinza é o permitido if (grayscale > MAX_GRAYSCALE) { printf("O valor da escala de cinza é maior do que o permitido."); exit(EXIT_FAILURE); } // escreve o cabeçalho da imagem no arquivo write_image_header(fout, header_type, matrix_width, matrix_height, grayscale); // aloca memória para a imagem de saída output = (int **) (mallocc(sizeof(int *) * matrix_height)); for (i = 0; i < matrix_height; i++) { output[i] = (int *) (mallocc(sizeof(int) * matrix_width)); } // copia o corpo da imagem para a matriz array = read_matrix_elements(file, matrix_width, matrix_height); output = read_matrix_elements(file, matrix_width, matrix_height); // filtro da média mask_size = get_mask_size(mask_file); if(argc == 4){ // aloca memória para a imagem de saída mask = (int **) (mallocc(sizeof(int *) * mask_size)); for (i = 0; i < mask_size; i++) { mask[i] = (int *) (mallocc(sizeof(int) * mask_size)); } // passa os elementos do arquivo para uma array mask = read_matrix_elements(mask_file, mask_size, mask_size); // verifica se o tamanho da mascara está correto if ((mask_size % 2 == 0) || mask_size < 3) { printf("Tamanho da máscara incorreto."); exit(EXIT_FAILURE); } // calcula o weight da máscara for (i = 0; i < mask_size; i++) { for (j = 0; j < mask_size; j++) { weight = weight + mask[i][j]; } } // aplica o filtro media( matrix_height, matrix_width, mask_size, weight, array, output ); } else mediana(matrix_height, matrix_width, mask_size, array, output); // grava imagem write_image_body(fout, matrix_width, matrix_height, output); // libera a memória alocada free(array); free(output); // fecha o buffer dos arquivos fclose(file); fclose(fout); return; }