Связь с Windows API PatchAPI - PullRequest
       28

Связь с Windows API PatchAPI

3 голосов
/ 19 апреля 2011

Я бы хотел использовать PatchAPI для Windows API , чтобы применить некоторые исправления. Применение исправлений реализовано в mspatcha.dll, который должен находиться в папке system32.

После прочтения в разных местах, таких как их ссылки и поиск в Google, мне еще предстоит найти правильный способ ссылки на эту DLL. Я хотел бы связать статически, работа с LoadLibrary кажется беспорядочной и что-то вроде поражения цели их заголовка patchapi.h. Так как я не нашел .lib-файл, на который я должен ссылаться, я создал свой собственный, используя следующие команды:

1) свалка / экспорт C: \ windows \ system32 \ mspatcha.dll

2) Создайте файл mspatcha.def, напишите строку «EXPORTS», а затем по одной строке для каждого имени функции, которое появляется в выводе dumpbin

3) lib /def:mspatcha.def /out:mspatcha.lib

Хотя я уверен, что это не правильный способ статически связываться с патчапи, я не нашел правильного способа сделать это. В любом случае, после выполнения этих шагов и написания простого тестового примера, сделанного из одного вызова ApplyPatchToFileExA (), я все еще получаю ошибку компоновщика для символа _ApplyPatchToFileA @ 16. Взглянув на экспортированные символы моего недавно созданного mspatcha.lib, выяснилось, что функции используют соглашение о неверном имени

D: \ tmp \ mspatcha> dumpbin / exports mspatcha.lib | find "ApplyPatchToFileExA"

             _ApplyPatchToFileExA

Если я не ошибаюсь, это указывает на то, что lib экспортировала функции с использованием cdecl, тогда как dll использует stdcall (или, по крайней мере, объявляет функцию как _stdcall). См .: C украшением имени в Microsoft Windows .

Мои вопросы: как правильно использовать mspatcha.dll в моем приложении и что не так с моим процессом создания библиотеки из dll, чтобы я мог выполнять статическое связывание?

Подробный вывод моего терминала можно найти здесь: http://pastebin.com/q4FV4Se6

1 Ответ

0 голосов
/ 19 апреля 2011

С точки зрения терминологии, вы пытаетесь связать не статически, а неявно, что означает совсем другое.

Если вы действительно не можете получить файл .lib, то один из простых способов его создания - создать фиктивную DLL с пустыми заглушками для каждой функции. Вызовите DLL-файл mspatcha.dll. Убедитесь, что вы используете файл .def и stdcall.

Когда вы соберете DLL, выбросьте ее, но сохраните файл .lib!

Я делал это в прошлом, чтобы генерировать файлы .lib для библиотек DLL, построенных с помощью цепочек инструментов, которые не генерируют файлы .lib.

Техника, которую вы использовали, работает только для функций cdecl.

...