# Using Deep Links

Deep links let you share an exact location in a database — a function, an address, a type — as a URL that anyone on your team can click to land in the right place.

This page walks through the three main usage scenarios: copying and following links inside IDA UI, setting up system-wide `ida://` handling with HCLI for cross-application use, and generating links programmatically from scripts and plugins.

For the URL format, supported parameters and other low-level details, see the [Deep Links](/9.4/core/user-interface/concepts/deep-links.md) concepts page.

## Using deep links from the IDA UI

### Copy link

Right-click any supported view (Disassembly, Pseudocode, Hex View, Functions, Names, Imports, Exports, Segments, Strings, Local Types, Bookmarks) and choose **Copy link**. IDA generates a deep link for the current cursor position or selected row and copies it to the system clipboard. The link is also echoed to the *Output* window.

The action is enabled whenever a database is open and a valid link can be generated for the current cursor location.

Links produced by **Copy link** are written in the **relative form** — `ida:///<idb-name>/<resource>?...`, with no source. IDA does not know about the sources you may have configured in `hcli`, so it cannot pick one for you; the empty source also happens to be the most portable choice — the link works inside IDA without any extra setup, and when followed via `hcli` on another machine it is resolved against *all* configured sources. If you want a link bound to a specific named source, edit the URL by hand to `ida://<source>/<idb-name>/<resource>?...`.

### Jump to link…

In the **Jump** menu, choose **Jump to link…** to open a prompt that accepts any `ida://` URL. This is the easiest way to follow a link that arrived in chat, an issue tracker, or a document — paste, press OK, and IDA navigates to the target inside the current instance. (For cross-process navigation — i.e., clicking a link in a browser — see the [next section](#using-deep-links-across-applications--hcli).)

## Using deep links across applications — HCLI

This approach is intended for teams working on the same binaries.

1. To make `ida://` links clickable system-wide, install [HCLI](https://hcli.docs.hex-rays.com/getting-started/installation/) and run:

```
hcli ida protocol register
```

This registers `hcli` as the system handler for the `ida` scheme.

2. After registration, clicking an `ida://` link in any application invokes `hcli ida open <uri>`, which then takes the steps described in [*How it fits together*](/9.4/core/user-interface/concepts/deep-links.md#how-it-fits-together).

You can run the same dispatch manually:

```
hcli ida open ida:///myfile.i64/functions?rva=0x1240&view=pseudocode
hcli ida open --list                # show running IDA instances (IPC)
hcli ida open --no-launch <uri>     # only navigate if an instance is already running
hcli ida protocol unregister        # remove the OS-level handler
```

### Named sources

A *source* is a name registered with `hcli` that maps to a directory on disk containing IDB files. Sources let you write portable URLs — the same `ida://malware-samples/trojan1.i64/...` link works on every teammate's machine, even when their files live in different directories.

```
hcli ida source add malware-samples /home/alice/idbs/malware
hcli ida source add reversing       ~/work/idbs
hcli ida source list
hcli ida source remove malware-samples
```

Source names are lowercase alphanumeric plus hyphens. The name `localhost` is reserved.

When a link without a source is followed (`ida:///<idb>/<resource>?...`), `hcli` searches *all* configured sources for the named IDB.

### IPC and IDA versions

In-place navigation into a *running* IDA depends on the IPC server that runs inside **IDA 9.4 and later**. On older versions, `hcli` can still launch IDA on the right IDB, but it cannot reach into a running instance to navigate; URLs against an already-open IDB will print a notice to that effect.

{% hint style="info" %}
The IPC Server can be disabled via `DisableIpcServer` registry setting but is enabled by default and is required for communicating with `hcli`.
{% endhint %}

## Using deep links from IDAPython

```python
import ida_kernwin

ida_kernwin.open_ida_link("ida:///functions?rva=0x1240&view=pseudocode")
```

`open_ida_link(uri)` returns `True` on success and `False` on any failure (invalid URL, unknown resource, address not in the database, view incompatible with resource, etc.). On failure a description is written to the *Output* window.

## Using deep links from C/C++ plugins

The SDK exposes the same call as a single inline function in `kernwin.hpp`:

```cpp
#include <kernwin.hpp>

bool ok = open_ida_link("ida:///functions?rva=0x1240&view=pseudocode");
```

## Notes and limitations

* Inside IDA, `open_ida_link` must be invoked on the UI thread. From a worker thread, marshal the call onto the main thread (e.g. `execute_sync` in C++ or `ida_kernwin.execute_sync` in Python).
* `open_ida_link` works in the IDA Pro GUI. It is not meaningful in headless / `idalib` contexts and returns `False` there.
* Cross-process navigation requires HCLI to be installed and the protocol handler to be registered (`hcli ida protocol register`).
* In-place navigation into a running instance requires IDA 9.4 or later (which ships the IPC server). Older IDA versions can still be launched on a specific IDB but cannot be steered after the fact.
* Because `idb-name` is matched against the basename of the open database, links remain valid if you move the database to a different directory, but not if you rename it. With `hcli` named sources, the source name is the stable handle even when paths differ across machines.
* If the same IDB filename exists in more than one configured source, a link written without a source — `ida:///<idb-name>/...` — resolves to the **first match** `hcli` finds. Sources are searched in the order they were registered, recursively, and `hcli` stops at the first hit; there is no warning about the collision. To disambiguate, pin the link to a specific source: `ida://<source>/<idb-name>/...`.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.hex-rays.com/9.4/core/user-interface/how-tos/using-deep-links.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
