📦 Extract .tpi/.tpd (QuickBMS)

Extract .tpi/.tpd Client Files

Quick guide using QuickBMS. Includes TQ_TPI_Pack.bms and a batch runner to process all archives automatically.

Tutorial

  1. Download QuickBMS and extract it.
  2. Create Input and Output folders inside the QuickBMS directory.
  3. Save TQ_TPI_Pack.bms (script below) next to quickbms.exe.
  4. Save RUN_TPI.bat (batch below).
  5. Copy all client .tpi/.tpd files into QuickBMS/Input.
  6. Run RUN_TPI.bat.
  7. Extracted files will appear under Output.

Script: TQ_TPI_Pack.bms

# NetDragon .tpi/.tpd extractor (QuickBMS)
# Reads .tpi (index) and extracts data from .tpd
# Place .tpi and .tpd together. If only .tpd exists, script tries direct read.

open FDDE tpi 0
open FDDE tpd 1

idstring "NetDragonDatPkg"
goto 0x24
get FILES long
get INFO_SIZE long
savepos INFO_OFF
math INFO_SIZE += INFO_OFF

for i = 0 < FILES
    get NAME_OFF long
    get DATA_OFF long
    get SIZE long
    get ZSIZE long
    get FLAGS long
    get TIME long
    savepos CURR
    goto NAME_OFF
    get NAME string
    goto CURR
    if ZSIZE > 0
        clog NAME DATA_OFF ZSIZE SIZE
    else
        log NAME DATA_OFF SIZE
    endif
next i

If your client layout differs, adjust offsets/fields accordingly.

Batch Runner: RUN_TPI.bat

@echo off
setlocal

REM === Paths ===
set "QUICKBMS=quickbms.exe"
set "BMS_SCRIPT=TQ_TPI_Pack.bms"
set "INPUT_DIR=Input"
set "OUTPUT_DIR=Output"

if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

echo [INFO] Scanning "%INPUT_DIR%" for .tpi/.tpd ...

REM 1) Process pairs by .tpi (index-driven)
for /r "%INPUT_DIR%" %%I in (*.tpi) do (
  set "IDX=%%~fI"
  set "NAME=%%~nI"
  if exist "%%~dpnI.tpd" (
    echo [RUN] %%~nxI + %%~nI.tpd
    "%QUICKBMS%" -o -Y "%BMS_SCRIPT%" "%%~fI" "%OUTPUT_DIR%\!NAME!" || echo [FAIL] %%~nxI
  ) else (
    echo [RUN] %%~nxI (no .tpd found; script may fallback)
    "%QUICKBMS%" -o -Y "%BMS_SCRIPT%" "%%~fI" "%OUTPUT_DIR%\!NAME!" || echo [FAIL] %%~nxI
  )
)

REM 2) Process lone .tpd (no matching .tpi)
for /r "%INPUT_DIR%" %%D in (*.tpd) do (
  if not exist "%%~dpnD.tpi" (
    echo [RUN] %%~nxD (tpd only)
    "%QUICKBMS%" -o -Y "%BMS_SCRIPT%" "%%~fD" "%OUTPUT_DIR%\%%~nD" || echo [FAIL] %%~nxD
  )
)

echo.
echo [DONE] Output: "%OUTPUT_DIR%"
pause