Extract .tpi/.tpd Client Files
Quick guide using QuickBMS. Includes TQ_TPI_Pack.bms and a batch runner to process all archives automatically.
Tutorial
- Download QuickBMS and extract it.
- Create Input and Output folders inside the QuickBMS directory.
- Save TQ_TPI_Pack.bms (script below) next to quickbms.exe.
- Save RUN_TPI.bat (batch below).
- Copy all client .tpi/.tpd files into QuickBMS/Input.
- Run RUN_TPI.bat.
- 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