post

ickza: a dayz radar over dma

For the past while we've been building a DayZ ESP and radar, and it's grown into the biggest thing we've made: about 15,000 lines of C++ across the overlay, a radar screen, an offset dumper and a live stats dashboard. This post is a tour of how it fits together.

the setup: two pcs

Nothing runs on the gaming PC except the game. A PCIe DMA card sits in that machine and reads its memory, and the card is driven from a laptop through MemProcFS / LeechCore. Ickza runs on the laptop.

The laptop has two jobs. Its fullscreen output goes through a fuser, which lays it over the gaming PC's picture, so boxes and bones show up on top of the game. Its own screen shows the radar.

[ gaming pc ] --pcie dma card--> [ laptop: Ickza ]
      |                              |          |
      |                         fuser output   own screen
      v                              |          |
 [ monitor ] <---- overlay ----------+       [ radar ]

drawing for a fuser

The fuser treats pure black as "see-through". That sounds simple until you try to draw nice smooth shapes. An anti-aliased edge fades towards black, so the fuser keys out half of it and you're left with ragged fringes around everything.

So the fullscreen view is drawn aliased on purpose, on the GPU with a plain 8-bit swap chain. Text shadows are RGB(1,1,1) instead of black: one step off, so the fuser still shows them. The radar is on the laptop's own screen and never goes through the fuser, so that one gets anti-aliasing and filtered map textures.

The other problem is latency. By the time a frame has been read over DMA, drawn and shown, the camera has moved, so boxes drift behind targets when you turn. Ickza predicts the camera a few milliseconds ahead to cover that gap. The amount is a setting you tune live until the boxes stay on target.

the radar

Ickza radar: a map of Elektrozavodsk covered in coloured loot badges, with a category list down the left side
every loot category on, Elektrozavodsk

The radar is a north-up map centred on you, built on Dear ImGui and D3D11. Each loot item gets a round badge with a small icon and a colour for its category: guns, ammo, attachments, medical, food, tools, clothing, vehicle parts and so on. Survivors get a heading line so you can see which way they're facing.

An item's category comes from a few places, in order: a dayz_rare.txt list (NVGs, plate carriers, M4s and so on, drawn gold and bigger), your own overrides, the item's engine class from RTTI (Weapon → gun, Magazine → ammo), then built-in classname rules.

Ickza radar zoomed out to 2.5 km with range rings, showing only food as small dots near the player
food only, zoomed out to ~2.5 km

When you zoom out far enough, badges turn into coloured dots so a whole town's loot still reads at a glance. Click a category to toggle it, right-click to show only that category.

acdump: finding the offsets

Game updates move things around, and hand-hunting offsets every patch gets old fast. So there's a second tool, acdump, that does it automatically. MSVC leaves RTTI in the binary: every vtable has a pointer just before it to a Complete Object Locator, which leads to the class name and its base classes. acdump walks those to find the entity classes by name.

Then it samples the live entities' memory over time and works out which bytes act like a position, a rotation, health or a name. DayZ keeps position and orientation in a separate VisualState object, so it follows pointers one level deep too. Out the other end come offsets.h, structs.h, a JSON dump and an ida_apply.py to label everything in IDA.

knowing why it's slow

DMA reads aren't free, and when the overlay stutters you want to know why. The DMA layer and the ESP loops feed lock-free counters and latency histograms (p50 / p95 / p99). A 1 Hz sampler keeps five minutes of history, and a small set of rules guesses where the bottleneck is. All of it is served as a web dashboard straight from the exe, with a button to benchmark the link.

the boring bits that matter

Ickza setup window: pick a display, toggle fullscreen, press Start
the whole setup screen

Setup is one screen: pick a display, press Start. Every draw option lives on the radar's side panel. On the dev side, one deploy.bat builds, shrinks the map images and copies everything to the laptop over a network share. A running copy notices the update and restarts itself. Crashes write a line you can decode against the linker map, which has saved a lot of guesswork.

what's next

More maps are already in (Chernarus, Livonia, Namalsk, Sakhal, Deadfall, Banov, Takistan, Alteria), more radar features are coming, and I'll write up the RTTI dumper properly in its own post. Questions? Come ask in the Discord.