В общем, пытаюсь сделать подгрузку функций по хешу в сишке. Додумался в итоге до функций с переменными параметрами. Для аргументов решил воспользоваться макросом
И не могу додуматься как её пофиксить. Или может есть варианты с определением и пушем типов в функцию получше? Не очень бы хотелось рыться с асмом, на самом деле.. но в принципе и с ним побороться готов.
Код прилагаю. Ах, да, строка с ошибкой помечена комментарием "err"...
_Generic, но в итоге получается ошибка:Код прилагаю. Ах, да, строка с ошибкой помечена комментарием "err"...
C:
#include <Windows.h>
#include <libloaderapi.h>
#include <stdarg.h>
#include "crypto.h"
#include "libloader.h"
#pragma region generictypename
// Список типов (специфичные определения также присутствуют), пополняется по мере необходимости.
enum _typename {
TYPENAME_BOOL,
TYPENAME_CHAR,
TYPENAME_BYTE,
TYPENAME_WCHAR,
TYPENAME_WORD,
TYPENAME_DWORD,
TYPENAME_LPWSTR,
TYPENAME_LPDWORD,
TYPENAME_LPBYTE,
TYPENAME_PDWORD,
TYPENAME_LPSTR,
TYPENAME_LPCSTR,
TYPENAME_UINT,
KEY_HKEY,
KEY_REGSAM,
KEY_PHKEY
};
#define __typename(x) _Generic((x), \
BOOL: TYPENAME_BOOL, \
CHAR: TYPENAME_CHAR, \
BYTE: TYPENAME_BYTE, \
WCHAR: TYPENAME_WCHAR, \
WORD: TYPENAME_WORD, \
DWORD: TYPENAME_DWORD, \
LPWSTR: TYPENAME_LPWSTR, \
LPDWORD: TYPENAME_LPDWORD, \
LPBYTE: TYPENAME_LPBYTE, \
PDWORD: TYPENAME_PDWORD, \
LPSTR: TYPENAME_LPSTR, \
LPCSTR: TYPENAME_LPCSTR, \
UINT: TYPENAME_UINT, \
HKEY: KEY_HKEY, \
REGSAM: KEY_REGSAM, \
PHKEY: KEY_PHKEY \
)
#pragma endregion
/* Прототип, но жалко удалять
inline LPVOID noArg(HMODULE hModule, DWORD hash) {
typedef LPVOID(WINAPI* newfnc)();
newfnc fnc = (newfnc)GetProcAddress(hModule, hash);
return fnc();
}
*/
inline LPVOID fncCall(HMODULE hModule, DWORD hash, unsigned int argNum, ...) {
va_list args;
unsigned int control = 0;
va_start(args, argNum);
while(argNum--) {
control += va_arg(args, __typename(argNum)); // err
if(control >= argNum) {
// ...
typedef LPVOID(WINAPI* fncCall)();
// ...
} else {
DWORD dwErr = GetLastError();
return dwErr;
}
}
}