Мне нужно заменить все вызовы WinAPI
с моей собственной реализацией (использующей низкоуровневое чтение файлов через Bluetooth). Код, в котором будут заменены функции, - это Video File Player, и он уже работает с обычными файлами hdd. Также необходимо, чтобы видеопроигрыватель по-прежнему мог воспроизводить файлы с жесткого диска, если файл на входе VideoPlayer является обычным файлом hdd.
Что лучше всего подходит для такой задачи?
Я не думаю, что это лучшая практика, но она должна работать, если вы поместите ее во включаемый файл, который включен везде, где вызывается функция, которую вы хотите изменить:
#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, где вы можете решить, хотите ли вы использовать свою собственную реализацию или исходную.
Отказ от ответственности: я считаю, что делать это некрасиво, и я бы не стал этого делать. Я бы предпочел поискать и заменить все вхождения или что-то в этом роде.
Да, я предлагаю вам это сделать.
В основном просто делайте то, что предложил ChrisN.
На самом деле, вы можете получить выгоду, написав такой класс, особенно если ваши функции должны поддерживать какое-либо дополнительное состояние / данные во время чтения или записи файла.
Если вы пытаетесь перехватить вызовы этих API из другого приложения, подумайте о Объезды.
Если вы можете редактировать код, вам нужно просто переписать его, чтобы использовать собственный API, который делает то, что вы хотите. В противном случае используйте технику Максимилиана, но имейте в виду, что это ужасное обслуживание.
Если вы не можете редактировать код, вы можете исправить таблицы импорта, чтобы перенаправить вызовы на свой собственный код. Описание этого метода можно найти в Эта статья - найдите раздел под названием «Шпионаж путем изменения таблицы адресов импорта».
Это опасно, но если вы будете осторожны, то сможете заставить это сработать. Также проверьте Microsoft Detours, который делает то же самое, но не требует, чтобы вы возились с фактическим исправлением.
да, все дело в изменении кода, а не во взломе таблиц импорта :) спасибо.
Я предлагаю вам выполнить следующие действия:
Обратите внимание, что CreateFile - это макрос, который расширяется до CreateFileW или CreateFileA, в зависимости от того, определен ли UNICODE. Рассмотрите возможность использования LPCTSTR и Функции TCHAR, чтобы ваше приложение могло быть построено как ANSI или Unicode.
Пожалуйста, не используйте #define, как предлагается в других ответах здесь, так как это просто приведет к проблемам с обслуживанием, и, как правильно указывает Максимилиан, это не лучшая практика.
Вы можете просто написать свои новые функции в настраиваемом пространстве имен. например
namespace Bluetooth
{
void CreateFile(/*params*/);
void etc...
}
Тогда в вашем коде вам нужно будет изменить только следующее:
if (::CreateFile(...))
{
}
к
if (Bluetooth::CreateFile(...))
{
}
Легко! :)
Если вы действительно хотите взломать API, посмотрите syringe.dll (L-GPL).
Спасибо! Как вы думаете, лучше будет написать какой-нибудь класс, где будет определен метод MyCreateFile (), а затем Ctrl-H Все вызовы CreateFile в коде?