Такой код Код (Text): #include <windows.h> #include <tlhelp32.h> int main () { while (true) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe32 = {0}; pe32.dwSize = sizeof(PROCESSENTRY32); Process32First(hSnapshot, &pe32); while (::Process32Next(hSnapshot, &pe32)); CloseHandle(hSnapshot); } return TRUE; } Вызовы Process32Next приводят к запредельному количеству page faults. В чем может быть дело? Или это такая особенность и так должно быть?
dmicarus Подозреваю, что это нормально. Хэндл, возвращаемый CreateToolhelp32Snapshot — это хэндл файловой секции, основанной на pagefile'е. Process32Next при каждом вызове подгружает секцию из pagefile, чем провоцирует некоторое число ошибок страниц (как минимум столько, сколько занимает SystemProcessesAndThreadsInformation, возвращённая ZwQuerySystemInformation), но каждый раз он также вызывает ZwUnmapViewOfSection, сбрасывая страницы с SystemProcessesAndThreadsInformation назад в pagefile. Не уверен, но вроде как-то так.
Вообще-то вот здесь : http://www.pisoft.ru/verstak/insider/cwproc.htm написано, что Я по этой функции не спец, но может дело еще и в этом?
Ну и как вариант - ваша "примочка", выдающая инфу просто врет в данной позиции. И кстати понял почему Касперыч тормозит у меня систему - у него 19 млн. отказов Ваши 5 млн. - это много для такого простого цикла - ищите причину вне программы. =============================== Только сейчас разглядел, что в ссылке не Си, а Кларион. Но возможно все равно там важное замечание.
Если на нэйтиве, то нужно динамически размер структур определить: Код (Text): ; + ; Определения размера структур SYSTEM_PROCESS_INFORMATION и SYSTEM_THREAD_INFORMATION. ; QuerySizeOfSystemProcessesAndThreadsInformationEntry proc uses esi edi ebx InformationBuffer:PVOID, SizeOfSystemProcessesEntry:PULONG, SizeOfSystemThreadsEntry:PULONG mov esi,InformationBuffer xor edx,edx mov edi,esi add edi,dword ptr [esi] assume esi:PSYSTEM_PROCESSES ; Org. SYSTEM_PROCESS_INFORMATION/SYSTEM_THREAD_INFORMATION assume edi:PSYSTEM_PROCESSES mov eax,[edi].NextEntryDelta sub eax,[esi].NextEntryDelta movzx ecx,[esi].ProcessName.MaximumLength add eax,ecx movzx ecx,[edi].ProcessName.MaximumLength sub eax,ecx mov ecx,[edi].ThreadCount sub ecx,[esi].ThreadCount div ecx mov ebx,eax mul [esi].ThreadCount mov edx,[esi].NextEntryDelta sub edx,eax movzx ecx,[esi].ProcessName.MaximumLength sub edx,ecx mov edi,SizeOfSystemProcessesEntry mov esi,SizeOfSystemThreadsEntry xor eax,eax mov dword ptr [edi],edx mov dword ptr [esi],ebx ret QuerySizeOfSystemProcessesAndThreadsInformationEntry endp Получаем текущий размер слепка, передав в сервис нули, возвратится STATUS_INFO_LENGTH_MISMATCH и размер слепка. Расширяем его немного, на страницу - будет достаточно и получаем слепок. Далее при энуме входов в слепке размер их берётся который возвратит QuerySizeOfSystemProcessesAndThreadsInformationEntry().
d2k9 Вот формула Код (Text): SYSTEM_PROCESSES.NextEntryOffset = SYSTEM_PROCESSES2.ThreadCount*SizeOf(SYSTEM_THREADS) + SizeOf(SYSTEM_PROCESSES) + SYSTEM_PROCESSES.ProcessName.MaximumLength A = SYSTEM_PROCESSES.NextEntryOffset B = SYSTEM_PROCESSES.ThreadCount C = SYSTEM_PROCESSES.ProcessName.MaximumLength X = SizeOf(SYSTEM_PROCESSES) Y = SizeOf(SYSTEM_THREADS) A1 = B1*Y + X + C1 A2 = B2*Y + X + C2 X = A1 - B1*Y - C1 A2 = B2*Y + (A1 - B1*Y - C1) + C2 = B2*Y + A1 - B1*Y - C1 + C2 = B2*Y - B1*Y + A1 - C1 + C2 = Y*(B2 - B1) + A1 - C1 + C2 Y*(B2 - B1) = A2 - A1 + C1 - C2 Y = (A2 - A1 + C1 - C2)/(B2 - B1)
d2k9 Тут по асму и низкоуровневому коденгу форум, это так, к сведению. Если чтото не нравится уходите.)