MS Detours - DetourAttach не работает - PullRequest
0 голосов
/ 25 мая 2019

Чувствую себя глупо, но почему этот код дает мне синтаксическую ошибку в Visual Студия при попытке его скомпилировать?

    DetourAttach(&(PVOID&)true_create_file, create_file);

Компилятор жалуется (подчеркивая & после PVOID)

Ошибка (активная) E0018 ожидал ')'

Код буквально скопирован со страницы Detours example . Я предполагаю, что это потому, что мой содержащий файл имеет расширение .c и таким образом компилируется как C с помощью VS, в то время как пример имеет расширение .cpp и компилируется как C ++.

Я не совсем уверен, что происходит в этой линии со всеми кастами. Почему компилятору C это не нравится и как я могу получить его для компиляции этой строки?

Вот полный список кода:

#include <Windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

static HANDLE(WINAPI *true_create_file) (LPCSTR file, DWORD access,
    DWORD share, LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags,
    HANDLE tmpl) = CreateFileA;

HANDLE WINAPI create_file(LPCSTR file, DWORD access, DWORD share,
    LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags, HANDLE tmpl) {
}

int hook_create_file() {
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    /* syntax error */
    DetourAttach(&(PVOID&)true_create_file, create_file);
    DetourTransactionCommit();
}

PVOID определяется как

typedef void * PVOID;

1 Ответ

1 голос
/ 27 мая 2019

Часть &(PVOID&): приведение параметра к ссылке на указатель на void, а затем получение адреса этого.Как отмечается в комментарии, вы компилируете его как C, но ссылочная операция не существует в C. Поэтому компилятор распознает «&» как принимающий адрес, но только «)» за ним, а затем получает ошибку expected a ')'.

Поскольку PVOID& здесь не имеет смысла, просто для повышения читабельности.Вы можете использовать PVOID вместо PVOID& здесь:

DetourAttach(&(PVOID)true_create_file, create_file);

Вы также можете получить подробности функции DetourAttach от здесь .

...