Такая вот строка кода Код (Text): (int(__stdcall*)())ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation"); Прекрасно ведет себя в борладнском компиляторе.А в GCC "ISO C++ forbids cast to non-reference type used as lvalue" А вот если изменить так Код (Text): ZwQuerySystemInformation=(int(__stdcall*)())GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation"); То уже ошибка совсем другого рода Я конечно понимаю что форточки не линукс,но что же все таки надо этому GCC ???
Он просто заставляет тебя сделать временные переменные из-за этих casts. Разложи кождое действие а отдельную строку (выражение) и всё скомпилится.
_nic мож так Код (Text): long _addr=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation"); ZwQuerySystemInformation=(int(__stdcall*) _addr; под рукой его нет чтоб проверить, мож и не так
А если так Код (Text): long *_addr=(long *)GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation"); ZwQuerySystemInformation=(int(__stdcall*) _addr; То матерится на вторую строку "primary-expression before "int" ","expected `)' before "int" "
Ляп это да.Но если так "ZwQuerySystemInformation=(int(__stdcall*)) _addr;" то получается "cannot convert `int*' to `dispp::NTSTATUS (*)(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*)' in assignment "
Я начинаю подозревать что дело все таки не в этом ЗЫ:неужели столько мало людей на этом форуме сталкивалось с GCC???
_nic Попробуй вот так (проверить не могу): Код (Text): (FARPROC&)ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
Код (Text): (void*) ZwQuerySystemInformation = GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
Код (Text): typedef int (query_t)(); int Test() { HMODULE mod = GetModuleHandle("ntdll.dll"); query_t *ZwQuerySystemInformation = (query_t *)GetProcAddress(mod, "ZwQuerySystemInformation"); return ZwQuerySystemInformation(); }
_nic Как у тебя объявлено ZwQuerySystemInformation? Судя по всему примерно так: Код (Text): dispp::NTSTATUS ZwQuerySystemInformation(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*); подозреваю, что __stdcall забыл, то есть надо: Код (Text): dispp::NTSTATUS __stdcall ZwQuerySystemInformation(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*); Вот и пиши так: Код (Text): ZwQuerySystemInformation=(dispp::NTSTATUS (__stdcall*)(dispp()::SYSTEMINFOCLASS, void*, ULONG, long unsigned int*))GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation"); Борладн - сакс, однозначно. Хавает шо попало, а делает шо хочет. Иногда его такая пурга несет...