(pool_path: Path)
| 411 | if tgt in prologues or count >= 2: |
| 412 | starts.add(tgt) |
| 413 | |
| 414 | sorted_starts = sorted(s for s in starts if base_va <= s < hi) |
| 415 | out: List[dict] = [] |
| 416 | for i, start in enumerate(sorted_starts): |
| 417 | nxt = sorted_starts[i + 1] if i + 1 < len(sorted_starts) else hi |
| 418 | size = min(nxt - start, 0x8000) |
| 419 | if size <= 0: |
| 420 | continue |
| 421 | out.append( |
| 422 | { |
| 423 | "id": len(out), |
| 424 | "name": None, |
| 425 | "owner": None, |
| 426 | "code": {"start_va": int(start), "size": int(size)}, |
| 427 | "code_section_va": int(base_va), |
| 428 | "provenance": HEURISTIC, |
| 429 | } |
| 430 | ) |
| 431 | return out |
| 432 | |
| 433 | |
| 434 | def _build_internal_model(request: dict) -> dict: |
| 435 | vm_data = _read_region(request, VM_DATA) |
| 436 | iso_data = _read_region(request, ISOLATE_DATA) |
| 437 | iso_instr = _read_region(request, ISOLATE_INSTRUCTIONS) |
| 438 | iso_va = _region_va(request, ISOLATE_INSTRUCTIONS) |
| 439 | |
| 440 | strings = _extract_strings(vm_data + iso_data) |
| 441 | uris = _library_uris(strings) |
| 442 | functions = _recover_code_ranges(iso_instr, iso_va) |
| 443 | entries = [ |
| 444 | { |
| 445 | "index": i, |
| 446 | "kind": "string", |
| 447 | "value": s, |
| 448 | "target_va": None, |
| 449 | "provenance": HEURISTIC, |
| 450 | "confidence": None, |
| 451 | } |
| 452 | for i, s in enumerate(strings) |
| 453 | ] |
| 454 | |
| 455 | capabilities = { |
| 456 | "libraries": PARTIAL if uris else UNAVAILABLE, |
| 457 | "classes": UNAVAILABLE, |
| 458 | "class_relationships": UNAVAILABLE, |
| 459 | "functions": PARTIAL if functions else UNAVAILABLE, |
| 460 | "function_names": UNAVAILABLE, |
| 461 | "object_pool": PARTIAL if entries else UNAVAILABLE, |
| 462 | "pool_index_space": UNAVAILABLE, |
| 463 | } |
| 464 | diagnostics = [ |
| 465 | _diagnostic( |
no test coverage detected