Предисловие. Работая над небольшим проектиком мне потребовалось иметь данные о скиллах. Перепробовав варианты с ini и ресурсами, и осозновая что мой проект работает в адресном пространстве клиента, был написан этот модуль.
Код:
unit UserData;
interface
uses
Windows, SysUtils, Classes;
type
TMSData = record
name : pWideChar;
b1 : integer;
b2 : integer;
description : pWideChar;
b3 : integer;
b4 : integer;
id : integer;
level : integer;
oper_type : integer;
mp_consume : integer;
hp_consume : integer;
cast_range : integer;
cast_style : integer;
hit_time : double;
is_magic : integer;
ani_char : integer;
desc : integer;
icon_name : integer;
extra_eff : integer;
desc_add1 : pWideChar;
b5 : integer;
b6 : integer;
desc_add2 : pWideChar;
b7 : integer;
b8 : integer;
is_ench : integer;
ench_skill_id : integer;
UNK_0 : integer;
UNK_1 : integer;
end;
pMSData = ^TMSData;
procedure EngineGetMSData;cdecl; external 'engine.dll' name '?GetMSData@FL2GameData@@QAEPAUFL2MagicSkillData@@HH@Z';
procedure EngineDL2FName; cdecl; external 'engine.dll' name '??DL2FName@@QBEPBGXZ';
function DL2FName(Skill:pMSData):PWideChar; cdecl;
function GetMSData(SkillID,SkillLvl:integer):pMSData; cdecl;
var
Engine:cardinal;
implementation
function DL2FName(Skill:pMSData):PWideChar; cdecl;
asm
mov EAX, Skill
lea ECX,dword ptr DS:[EAX+$48]
call EngineDL2FName
mov Result, EAX
end;
function GetMSData(SkillID,SkillLvl:integer):pMSData; cdecl;
asm
mov EAX,[SkillLvl]
mov ECX,[SkillID]
push EAX
push ECX
mov ECX,[Engine]
add ECX,$6F31B8
call EngineGetMSData
mov Result, EAX
end;
initialization
Engine:=GetModuleHandle('engine.dll');
end.
функция
GetMSData возвращает указатель на структуру описания скила в клиенте.
DL2FName возвращает имя текстуры иконки.
Engine - адрес ImageBase "Engine.dll"
Код:
mov ECX,[Engine]
add ECX,$6F31B8
Тут я упростил, смысл - добратся до адреса по которому начинаются данные о скилах в клиенте, в таблице экспорта оно обьявлено как :
=>6F31B8 .data Export ?GL2GameData@@3VFL2GameData@@A
ЗЫ. мой проект заточен для С4, для дальнейших хроник экспортируемые ф-ции могут лежать в других dll, но в любом случае в папке system клиента
Добавлено через 31 минуту
xor, тут говорят что ты умеешь из клиента программно иконки вытаскивать. Можно пример увидеть?