Форум — Ответы ( К темам )
? | Matt: И еще раз NtQuerySystemInformation (28-03-2003 19:34:28) |
Привет, у меня опять проблемы с этой функцией. На void.ru есть пример, как ее обмануть... (http://www.void.ru/?do=printable&id=876 ) Я нашел еще один пример (получение данных о процессах в системе), но он вообще не работает(есть там несколько ошибок). Короче, кто-нибудь знает как работает эта функция с типом требуемой инфы=5 (получение информации о процессах) Конкретно требуется: 1: Cтрукрура данных(инфы о процессах и потоках); 2: Что в каком параметре эта функция получает; 3: Что и куда возвращает; 4: Как обработать в возвращаемые р-ты. З.Ы.: Если кто-то знает где взять полное описание (для всех типов требуемой инфы) поделитесь,плз. | |
Павел (29-03-2003 01:29:05) | |
Если нашел неработающий пример, так выложи его здесь целиком, разберемся, заставим работать !
| |
Matt (30-03-2003 18:09:10) | |
>>выложи его тут Пожалста!!! Я его тут приведу в том виде, в каком я его откопал. Может у меня, конечно, руки не оттуда растут, но мне не удалось его запустить. Точнее удалось, но заставить корректно работать — нет...:) Я думаю, что тема недокументированных функций в WIN32 интересна не мне одному так что если кто чего найдет выкладывайте в Инете или пишите. #include <windows.h> #include <stdio.h> typedef long (*NtQSI)(LONG, PVOID,LONG, LONG); struct ThreadInfo { FILETIME ftCreationTime; DWORD dwUnknown1; DWORD dwStartAddress; DWORD dwOwningPID; DWORD dwThreadID; DWORD dwCurrentPriority; DWORD dwBasePriority; DWORD dwContextSwitches; DWORD dwThreadState; DWORD dwUnknown2; DWORD dwUnknown3; DWORD dwUnknown4; DWORD dwUnknown5; DWORD dwUnknown6; DWORD dwUnknown7; }; struct ProcessInfo { DWORD dwOffset; // an offset to the next Process structure DWORD dwThreadCount; DWORD dwUnkown1[6]; FILETIME ftCreationTime; DWORD dwUnkown2; DWORD dwUnkown3; DWORD dwUnkown4; DWORD dwUnkown5; DWORD dwUnkown6; WCHAR* pszProcessName; DWORD dwBasePriority; DWORD dwProcessID; DWORD dwParentProcessID; DWORD dwHandleCount; DWORD dwUnkown7; DWORD dwUnkown8; DWORD dwVirtualBytesPeak; DWORD dwVirtualBytes; DWORD dwPageFaults; DWORD dwWorkingSetPeak; DWORD dwWorkingSet; DWORD dwUnkown9; DWORD dwPagedPool; // kbytes DWORD dwUnkown10; DWORD dwNonPagedPool; // kbytes DWORD dwPageFileBytesPeak; DWORD dwPageFileBytes; DWORD dwPrivateBytes; DWORD dwUnkown11; DWORD dwUnkown12; DWORD dwUnkown13; DWORD dwUnkown14; struct ThreadInfo ati[1]; }; NtQSI ntqsi; HANDLE h; int i; long j; long tt; char *vt; // UNICODE struct ThreadInfo *tinfo, *tinf2; struct ProcessInfo *pinfo; char buf[20480]; void main() { h=LoadLibrary("NTDLL.DLL"); ntqsi = (NtQSI)GetProcAddress(h,"NtQuerySystemInformation"); j = (*ntqsi)(5,buf,20480,0); pinfo = buf; for(;;){ vt = pinfo->pszProcessName; printf("%4lX|%13s|%8ld|%7lX|%7ld", pinfo->dwProcessID,vt, pinfo->dwThreadCount,pinfo->dwParentProcessID, pinfo->dwOffset); printf("|%4ld\n",pinfo->dwBasePriority); printf("\t| ID|Owner|State|Priority|Base Priority\n"); tinfo = &pinfo->ati[0]; for(i=0;i<pinfo->dwThreadCount;++i){ tinf2 = &tinfo[i]; printf("\t|%4lX|%5lX|%5lX|%8s|%8s\n", tinf2->dwThreadID, tinf2->dwOwningPID, tinf2->dwThreadState, tinf2->dwCurrentPriority, tinf2->dwBasePriority); } if(pinfo->dwOffset==0) break; pinfo = (struct ProcessInfo*)((char *)pinfo + pinfo->dwOffset); } } |