| 464 | |
| 465 | CAPSTONE_EXPORT |
| 466 | cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle) |
| 467 | { |
| 468 | cs_err err; |
| 469 | struct cs_struct *ud; |
| 470 | if (!cs_mem_malloc || !cs_mem_calloc || !cs_mem_realloc || !cs_mem_free || !cs_vsnprintf) |
| 471 | // Error: before cs_open(), dynamic memory management must be initialized |
| 472 | // with cs_option(CS_OPT_MEM) |
| 473 | return CS_ERR_MEMSETUP; |
| 474 | |
| 475 | if (arch < CS_ARCH_MAX && arch_configs[arch].arch_init) { |
| 476 | // verify if requested mode is valid |
| 477 | if (mode & arch_configs[arch].arch_disallowed_mode_mask) { |
| 478 | *handle = 0; |
| 479 | return CS_ERR_MODE; |
| 480 | } |
| 481 | |
| 482 | ud = cs_mem_calloc(1, sizeof(*ud)); |
| 483 | if (!ud) { |
| 484 | // memory insufficient |
| 485 | return CS_ERR_MEM; |
| 486 | } |
| 487 | |
| 488 | ud->errnum = CS_ERR_OK; |
| 489 | ud->arch = arch; |
| 490 | ud->mode = mode; |
| 491 | // by default, do not break instruction into details |
| 492 | ud->detail = CS_OPT_OFF; |
| 493 | |
| 494 | // default skipdata setup |
| 495 | ud->skipdata_setup.mnemonic = SKIPDATA_MNEM; |
| 496 | |
| 497 | err = arch_configs[ud->arch].arch_init(ud); |
| 498 | if (err) { |
| 499 | cs_mem_free(ud); |
| 500 | *handle = 0; |
| 501 | return err; |
| 502 | } |
| 503 | |
| 504 | *handle = (uintptr_t)ud; |
| 505 | |
| 506 | return CS_ERR_OK; |
| 507 | } else { |
| 508 | *handle = 0; |
| 509 | return CS_ERR_ARCH; |
| 510 | } |
| 511 | } |
| 512 | |
| 513 | CAPSTONE_EXPORT |
| 514 | cs_err CAPSTONE_API cs_close(csh *handle) |
no outgoing calls
searching dependent graphs…