Форум — Ответы     (  К темам )
 ?  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);
}
}