| 445 | }; |
| 446 | |
| 447 | static ssize_t idaapi mgr_callback(void *ud, int code, va_list va) |
| 448 | { |
| 449 | MicrocodeGraphContainer *gcont = (MicrocodeGraphContainer *)ud; |
| 450 | mbl_array_t *mba = *gcont->m_MBA; |
| 451 | bool result = false; |
| 452 | |
| 453 | switch (code) |
| 454 | { |
| 455 | #if IDA_SDK_VERSION < 760 |
| 456 | case grcode_user_gentext: |
| 457 | result = true; |
| 458 | break; |
| 459 | #endif // IDA_SDK_VERSION < 760 |
| 460 | |
| 461 | // refresh user-defined graph nodes and edges |
| 462 | case grcode_user_refresh: |
| 463 | // in: interactive_graph_t *g |
| 464 | // out: success |
| 465 | { |
| 466 | interactive_graph_t*mg = va_arg(va, interactive_graph_t*); |
| 467 | |
| 468 | // we have to resize |
| 469 | mg->resize(mba->qty); |
| 470 | |
| 471 | for (int i = 0; i < mba->qty; ++i) |
| 472 | for (auto dst : mba->get_mblock(i)->succset) |
| 473 | mg->add_edge(i, dst, NULL); |
| 474 | |
| 475 | result = true; |
| 476 | } |
| 477 | break; |
| 478 | |
| 479 | // retrieve text for user-defined graph node |
| 480 | case grcode_user_text: |
| 481 | //interactive_graph_t *g |
| 482 | // int node |
| 483 | // const char **result |
| 484 | // bgcolor_t *bg_color (maybe NULL) |
| 485 | // out: must return 0, result must be filled |
| 486 | // NB: do not use anything calling GDI! |
| 487 | { |
| 488 | va_arg(va, interactive_graph_t*); |
| 489 | int node = va_arg(va, int); |
| 490 | const char **text = va_arg(va, const char **); |
| 491 | |
| 492 | gcont->m_MQD.qStr.clear(); |
| 493 | mba->get_mblock(node)->print(gcont->m_MQD); |
| 494 | *text = gcont->m_MQD.qStr.begin(); |
| 495 | result = true; |
| 496 | } |
| 497 | break; |
| 498 | } |
| 499 | return (int)result; |
| 500 | } |
| 501 | |
| 502 | static void cv_jump(sample_info_t* si) |
| 503 | { |