Всем привет. Пытаюсь получить список запущеных процессов с помощью функции ZwQuerySystemInformation. И никак не могу понять, почему ниче не работает Делаю так: Code (Text): HINSTANCE addrNt = GetModuleHandle(TEXT("ntdll.dll")); if(addrNt == NULL) cout << "Failed get ntdll.dll handle" << endl; FARPROC zwfunc = GetProcAddress(addrNt, "ZwQuerySystemInformation"); if(zwfunc == NULL) cout << "Failed get ntdll.dll addres" << endl; PVOID pBuff; ULONG cBuff = 0x8000; zwfunc(SystemProcessesAndThreadsInformation, pBuff, cBuff, NULL); Пишет ошибку [Error] 'SystemProcessesAndThreadsInformation' was not declared in this scope если добавляю кавычки zwfunc("SystemProcessesAndThreadsInformation", pBuff, cBuff, NULL); то пишет [Error] too many arguments to function Что делать?
1. подключите заголовочный файл с обявленной SystemProcessesAndThreadsInformation (или объявите через define) 2. объявите нормально прототип ZwQuerySystem Information.
h0t Переделал: Code (Text): #define SystemProcessesAndThreadsInformation 5 .... unsigned long ZwQuerySystemInformation (ULONG tag, VOID *buffer, ULONG bufferSize, ULONG *returnedSize); .... далее тот же код выдает [Error] too many arguments to function это ппц.... Malfoy хотелось бы именно так.
Fail а память под pBuff выделять разве не надо? Code (Text): pBuff = HeapAlloc(hHeap, 0, cBuff); memset(pBuff, 0, cBuff);
Code (Text): typedef NTSTATUS(*pZwQuerySystemInformation)(ULONG tag, VOID *buffer, ULONG bufferSize, ULONG *returnedSize); HMODULE h = LoadLibraryA("ntdll.dll"); pZwQuerySystemInformation Zwquery = (pZwQuerySystemInformation) GetProcAddress(h,"ZwQuerySystemInformation"); Zwquery(0,0,0,0); Только не понял почему тема создана в HEAP P.S. если хотите через lib'у добавьте либу в опциях ликовщика или через #pragma
h0t Спасибо. Только вот опять проблема..) На строчку Code (Text): typedef NTSTATUS (*pZwQuerySystemInformation) (ULONG tag, VOID *buffer, ULONG bufferSize, ULONG *returnedSize); выдает [Error] ISO C++ forbids declaration of 'NTSTATUS' with no type [-fpermissive] [Error] typedef 'NTSTATUS' is initialized (use decltype instead) [Error] 'pZwQuerySystemInformation' was not declared in this scope что это может быть? Компилятор DevC++
typedef ULONG (WINAPI *pZwQuerySystemInformation) ( ULONG SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength );
У тебя NTSTATUS определен ? Вообще то конвенция stdcalll на х86 тоесть так надо Code (Text): typedef NTSTATUS (NTAPI*pZwQuerySystemInformation) (ULONG tag, VOID *buffer, ULONG bufferSize, ULONG *returnedSize);
steelfactor Спасибо, на одну ошибку меньше XshStasX пробовал, все равно.. Code (Text): [Error] ISO C++ forbids declaration of 'NTSTATUS' with no type [-fpermissive] [Error] typedef 'NTSTATUS' is initialized (use decltype instead)
NTSTATUS замени на ULONG. Если NTSTATUS он тебе так важен, то задефайни его где-нить в своих хидерах. NTSTATUS == ULONG, обычно так
Еще вопросик) А в каком заголовочном файле лежат эти типы? [Error] 'UNICODE_STRING' does not name a type [Error] 'KPRIORITY' does not name a type [Error] 'VM_COUNTERS' does not name a type [Error] 'SYSTEM_THREADS' does not name a type
Fail В твоем случае дешевле будет ручками объявить, чем эти ntddk.h подключать, иначе куча ошибок будет. Найди в сети и задефайни их сам.
Установил WDK. Проблемы прибавились Я, наверное, чего то не понимаю, но как компилятор может выдавать ошибки на свою же библиотеку? Code (Text): #include "stdafx.h" #include <ntddk.h> int _tmain(int argc, _TCHAR* argv[]) { return 0; } Из всего кода я добавил только строчку #include <ntddk.h>, и тут у меня посыполось нечто: Code (Text): 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8898): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8898): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C2144: синтаксическая ошибка: перед "int" требуется ";" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C2086: int DECLSPEC_DEPRECATED_DDK_WINXP: переопределение 1> c:\winddk\7600.16385.1\inc\ddk\wdm.h(8838): см. объявление "DECLSPEC_DEPRECATED_DDK_WINXP" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C2143: синтаксическая ошибка: отсутствие ";" перед "__stdcall" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C2433: LARGE_INTEGER: "inline" не разрешается для объявлений данных 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8909): error C2086: int LARGE_INTEGER: переопределение 1> c:\winddk\7600.16385.1\inc\ddk\wdm.h(8840): см. объявление "LARGE_INTEGER" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8911): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "LargeInteger" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8911): warning C4229: устаревший элемент: пропуск модификаторов для данных 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8911): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8913): error C2059: синтаксическая ошибка: ) 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8914): error C2143: синтаксическая ошибка: отсутствие ";" перед "{" 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(8914): error C2447: {: отсутствует заголовок функции (возможно, используется формальный список старого типа) 1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ktmtypes.h(136): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "TmVirtualClock" 1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ktmtypes.h(136): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\program files (x86)\microsoft sdks\windows\v7.0a\include\ktmtypes.h(136): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию 1>c:\winddk\7600.16385.1\inc\ddk\wdm.h(10199): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "VirtualClock" и это только малая часть
Попробуй так Code (Text): #include "stdafx.h" namespace DDK { #include <ntddk.h> } int _tmain(int argc, _TCHAR* argv[]) { return 0; } Когда будешь писать какой то тип/функцию из ntddk в начале нужно будет писать DDK:: А по поводу ошибок отключи все остальные инклуды для начала. или #include <ntddk.h> попробуй первым сделать. Или в там есть не известные типы ...
Fail Вы что курили ? Посмотирте хотя б примеры в WDK. Как писать драйвера. Так же обратите внимание на то, какие параметры для компилятора и линкера там выставляются.