@Mercury13
Программист на «си с крестами» и не только

Есть ли подвох в этом коде (получение версие-специфичной функции Win32)?

Задача — получить функцию Windows API (Vista+), но как-то (может, не столь эффективно) работать на XP+.
namespace {

    typedef BOOL WINAPI (*EvCancelIoEx) (    // ev = event
            _In_     HANDLE       hFile,
            _In_opt_ LPOVERLAPPED lpOverlapped
            );

    EvCancelIoEx cancelIoEx = NULL;

}   // anon namespace

void st::AsyncFile::detectWinVersion()   // static, вызывается из main, случай для cancelIoEx=NULL прописан
{
    HMODULE hKernel = LoadLibrary(L"kernel32.dll");
    if (hKernel) {
        cancelIoEx = reinterpret_cast<EvCancelIoEx>(GetProcAddress(hKernel, "CancelIoEx"));
    } else {
        cancelIoEx = NULL;
    }
    // We won’t free library, everyone uses kernel32!
}

Есть ли какие-то нарекания к безопасности? Возможно ли внедрение DLL и как его обойти?
  • Вопрос задан
  • 286 просмотров
Решения вопроса 1
@vilgeforce
Раздолбай и программист
Никогда не используйте *_cast, если вы точно, полностью и окончательно не понимаете что вы делаете и зачем. В данном случае приведения типов в стиле (void*)GetProcAddress() хватит за глаза.
Далее, я бы советовал GetModuleHandle() вместо LoadLibrary(): наверняка ваша софтина импортирует функции из kernel32, следовательно она уже загружена. И проблемой подмены занимается ОС, а не вы. Ну и не надо делать FreeLibrary.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы