4.1 Достаточный минимум
Путем некоторых исследований, мной было установлено, что для простой
подгрузки своих native-функций нет надобности возить за собой весь grimoire:
достаточно минимального комплекта:
bin\<ваша библиотека>.dll
bin\japi.dll
bin\ongameload.dll
bin\exehack.exe
startwar3.bat
lua5.1.dll
findpath.lua
ongameload.lua
war3.lua
4.2 Код базовой библиотеки для Delphi
Благодаря AiwaDoter, теперь доступен код базовой библиотеки для
добавления native функций для Delphi. Вот он:
unit jAPIDLL;
interface
procedure jStartAPI;
implementation
uses Windows;
type
jString = longint;
jInt = longint;
jReal = longint;
AddNative = procedure(routine: Pointer; name: PChar; prototype: PChar); cdecl;
StrMap = function(const str: PChar): jString; cdecl;
StrGet = function(strid: jString): PChar; cdecl;
var
LibInstance : HMODULE;
jAddNative: AddNative;
jStrMap: StrMap;
jStrGet: StrGet;
function test: jString; stdcall;
begin
Result:= jStrMap('ZOMG TEH FUNC! - DELPHI');
end;
procedure jStartAPI;
begin
if(LibInstance = 0)then begin
LibInstance := LoadLibrary('japi.dll');
if(LibInstance = 0)then begin
MessageBox(0, 'Could not locate jAPI', 'Error',
MB_ICONEXCLAMATION or MB_OK);
exit;
end;
jAddNative:= AddNative(GetProcAddress(LibInstance, 'jAddNative'));
if(Not Assigned(jAddNative))then
MessageBox(0, 'Could not find jAddNative', 'Error', MB_ICONEXCLAMATION or MB_OK);
jStrMap:= StrMap(GetProcAddress(LibInstance, 'jStrMap'));
if(Not Assigned(jStrMap))then
MessageBox(0, 'Could not find jStrMap', 'Error', MB_ICONEXCLAMATION or MB_OK);
jStrGet:= StrGet(GetProcAddress(LibInstance, 'jStrGet'));
if(Not Assigned(jStrGet))then
MessageBox(0, 'Could not find jStrGet', 'Error', MB_ICONEXCLAMATION or MB_OK);
end;
jAddNative(@test, 'test', '()S');
end;
initialization
LibInstance := 0;
jAddNative:=Nil;
jStrMap:=Nil;
jStrGet:=Nil;
finalization
if(LibInstance<>0)then begin
FreeLibrary(LibInstance);
LibInstance:= 0;
end;
end.
end.
4.3 Избавление от придирок антивирусов
Используя небольшую хитрость, можно добиться отказа от использования
exehack.exe, что положительно повлияет на весь комплект: именно этот файл
антивирусы чаще всего считают вредным. Также использование этой хитрости
позволяет запускать варкрафт с добавленными native функциями в linux
(естественно, из-под wine).
Итак, порядок действий:
- Скачать PEditor
- Скопировать папку bin/ нашей сборки в PEditor/bin
- Скопировать lua5.1.dll в PEditor/
- Сделать резервную копию war3.exe
- PEditor -> открыть war3.exe -> directory -> imports, щелчок правой
кнопкой add import: dll name = bin/ongameload.dll, func name = DllMain
- Нажать +, нажать OK, выйти из PEditor
Дело сделано! Теперь можно заменить оригинальный war3.exe в папке игры (не
забудьте сделать резервную копию!) и наслаждаться. Этот метод позволяет
исключить из списка возимых за собой файлов exehack.exe, startwar3.bat,
findpath.lua и war3.lua.
Важно! При выполнении пункта 5, PEditor может выдать ошибку плана
"Сan't find the "DllMain" function in the dll". Тогда вам нужно открыть
ongameload.dll в любом просмотрщике ресурсов , найти таблицу экспорта
и в ней посмотреть, имя какой функции содержит что-то, намекающее на загрузку
^_^ (в моем случае это было _Z16LoadLibraryAWrapPKc@4) — её и
использовать в этом шаге.
Примечания
Внимание! Некоторые антивирусы могут ругаться на grimoire, а
конкретно на файлы bin\exehack.exe, bin\ongameload.dll и
bin\japi.dll, определяя в них троянов.Никакой опасности для вашего
компьютера эти файлы не несут! Дело в том, что в них используется
потенциально подозрительный код (для динамического изменения памяти процесса
игры), на который и реагируют антивирусы. Просто добавьте их в исключения
вашего антивируса.