Как заменить вызовы функций WinAPI в проекте MS VC ++ моей собственной реализацией (имя и набор параметров совпадают)? - PullRequest
1 голос
/ 13 сентября 2008

Мне нужно заменить все вызовы WinAPI

  • CreateFile,
  • ReadFile,
  • SetFilePointer
  • CloseHandle

с моей собственной реализацией (которая использует низкоуровневое чтение файлов через Bluetooth). Код, в котором функции будут заменены, - Video File Player, и он уже работает с обычными hdd-файлами. Также необходимо, чтобы Video Player все еще мог воспроизводить файлы с жесткого диска, если файл на входе VideoPlayer представляет собой обычный жесткий диск.

Какова наилучшая практика для такой задачи?

Ответы [ 6 ]

5 голосов
/ 13 сентября 2008

Я предлагаю вам выполнить следующие действия:

  1. Напишите набор функций-оболочек, например, MyCreateFile, MyReadFile и т. Д., Которые изначально просто вызывают соответствующий API и передают те же аргументы без изменений.
  2. Используйте ваш текстовый редактор для поиска всех вызовов исходных API и замените их вызовами ваших новых функций-оболочек.
  3. Проверьте, что приложение по-прежнему функционирует правильно.
  4. Измените функции оболочки в соответствии с вашими собственными целями.

Обратите внимание, что CreateFile - это макрос, который расширяется до CreateFileW или CreateFileA, в зависимости от того, определен ли UNICODE. Подумайте об использовании LPCTSTR и функций TCHAR , чтобы ваше приложение могло быть скомпоновано как ANSI или Unicode.

Пожалуйста, не используйте #define, как предлагается в других ответах здесь, так как это только приведет к проблемам с обслуживанием, и, как правильно указывает Максимилиан, это не лучшая практика.

2 голосов
/ 15 сентября 2008

Вы можете просто написать свои новые функции в пользовательском пространстве имен. например,

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

Тогда в вашем коде единственное, что вам нужно изменить, это:

if (::CreateFile(...))
{
}

до

if (Bluetooth::CreateFile(...))
{
}

Легко! :)

1 голос
/ 18 сентября 2008

Если вы действительно хотите взломать API, посмотрите на syringe.dll (L-GPL).

1 голос
/ 13 сентября 2008

Если вы можете редактировать код, вы должны просто переписать его, чтобы использовать пользовательский API, который делает то, что вы хотите. В противном случае используйте технику Максимилиана, но имейте в виду, что это ужас обслуживания.

Если вы не можете редактировать код, вы можете исправить таблицы импорта, чтобы перенаправить вызовы на ваш собственный код. Описание этой техники можно найти в этой статье - найдите раздел под названием «Шпионаж путем изменения таблицы адресов импорта».

Это опасно, но если вы будете осторожны, вы можете заставить его работать. Также обратите внимание на Microsoft Detours , которая делает то же самое, но не требует от вас возиться с фактическим исправлением.

1 голос
/ 13 сентября 2008

Если вы пытаетесь перехватить вызовы этих API из другого приложения, рассмотрите Detours .

0 голосов
/ 13 сентября 2008

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

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

Реализация MyCreateFile выглядит примерно так:

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

Вы в основном делаете каждый вызов CreateFile вызовом MyCreateFile, где вы можете решить, хотите ли вы использовать собственную реализацию или оригинальную.

Отказ от ответственности: я думаю, что делать это уродливо, и я бы этого не делал. Я бы предпочел поискать и заменить все вхождения или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...