| 4274 | } |
| 4275 | |
| 4276 | ZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest( |
| 4277 | const ZydisDecodedInstruction *instruction, const ZydisDecodedOperand* operands, |
| 4278 | ZyanU8 operand_count, ZydisEncoderRequest *request) |
| 4279 | { |
| 4280 | if (!instruction || !request || (operand_count && !operands)) |
| 4281 | { |
| 4282 | return ZYAN_STATUS_INVALID_ARGUMENT; |
| 4283 | } |
| 4284 | |
| 4285 | ZYAN_MEMSET(request, 0, sizeof(ZydisEncoderRequest)); |
| 4286 | request->machine_mode = instruction->machine_mode; |
| 4287 | request->mnemonic = instruction->mnemonic; |
| 4288 | request->prefixes = instruction->attributes & ZYDIS_ENCODABLE_PREFIXES; |
| 4289 | request->branch_type = instruction->meta.branch_type; |
| 4290 | if (!(instruction->attributes & ZYDIS_ATTRIB_ACCEPTS_SEGMENT)) |
| 4291 | { |
| 4292 | request->prefixes &= ~ZYDIS_ATTRIB_HAS_SEGMENT; |
| 4293 | } |
| 4294 | |
| 4295 | switch (instruction->address_width) |
| 4296 | { |
| 4297 | case 16: |
| 4298 | request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_16; |
| 4299 | break; |
| 4300 | case 32: |
| 4301 | request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_32; |
| 4302 | break; |
| 4303 | case 64: |
| 4304 | request->address_size_hint = ZYDIS_ADDRESS_SIZE_HINT_64; |
| 4305 | break; |
| 4306 | default: |
| 4307 | return ZYAN_STATUS_INVALID_ARGUMENT; |
| 4308 | } |
| 4309 | |
| 4310 | switch (instruction->operand_width) |
| 4311 | { |
| 4312 | case 8: |
| 4313 | request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_8; |
| 4314 | break; |
| 4315 | case 16: |
| 4316 | request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_16; |
| 4317 | break; |
| 4318 | case 32: |
| 4319 | request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_32; |
| 4320 | break; |
| 4321 | case 64: |
| 4322 | request->operand_size_hint = ZYDIS_OPERAND_SIZE_HINT_64; |
| 4323 | break; |
| 4324 | default: |
| 4325 | return ZYAN_STATUS_INVALID_ARGUMENT; |
| 4326 | } |
| 4327 | |
| 4328 | switch (request->branch_type) |
| 4329 | { |
| 4330 | case ZYDIS_BRANCH_TYPE_NONE: |
| 4331 | request->branch_width = ZYDIS_BRANCH_WIDTH_NONE; |
| 4332 | break; |
| 4333 | case ZYDIS_BRANCH_TYPE_SHORT: |
no test coverage detected