Process32Next & Page Faults

Тема в разделе "WASM.WIN32", создана пользователем dmicarus, 1 апр 2010.

  1. dmicarus

    dmicarus New Member

    Публикаций:
    0
    Регистрация:
    25 май 2009
    Сообщения:
    17
    Такой код
    Код (Text):
    1. #include <windows.h>
    2. #include <tlhelp32.h>
    3.  
    4. int main ()
    5. {
    6.     while (true)
    7.     {
    8.         HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    9.         PROCESSENTRY32 pe32 = {0};
    10.         pe32.dwSize = sizeof(PROCESSENTRY32);
    11.  
    12.         Process32First(hSnapshot, &pe32);
    13.         while (::Process32Next(hSnapshot, &pe32));
    14.  
    15.         CloseHandle(hSnapshot);
    16.     }
    17.     return TRUE;
    18. }
    Вызовы Process32Next приводят к запредельному количеству page faults. В чем может быть дело? Или это такая особенность и так должно быть?

    [​IMG]
     
  2. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Напиши на чистом Си и сравни. А то эти классы раздражают...
     
  3. make

    make New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2009
    Сообщения:
    59
    d2k9
    lol
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    dmicarus
    Подозреваю, что это нормально. Хэндл, возвращаемый CreateToolhelp32Snapshot — это хэндл файловой секции, основанной на pagefile'е. Process32Next при каждом вызове подгружает секцию из pagefile, чем провоцирует некоторое число ошибок страниц (как минимум столько, сколько занимает SystemProcessesAndThreadsInformation, возвращённая ZwQuerySystemInformation), но каждый раз он также вызывает ZwUnmapViewOfSection, сбрасывая страницы с SystemProcessesAndThreadsInformation назад в pagefile.
    Не уверен, но вроде как-то так. :)
     
  5. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Юзайте натив, а не Toolhelp.
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Вообще-то вот здесь :
    http://www.pisoft.ru/verstak/insider/cwproc.htm
    написано, что
    Я по этой функции не спец, но может дело еще и в этом?
     
  7. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ну и как вариант - ваша "примочка", выдающая инфу просто врет в данной позиции.
    И кстати понял почему Касперыч тормозит у меня систему - у него 19 млн. отказов
    Ваши 5 млн. - это много для такого простого цикла - ищите причину вне программы.
    ===============================
    Только сейчас разглядел, что в ссылке не Си, а Кларион. Но возможно все равно там важное замечание.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Если на нэйтиве, то нужно динамически размер структур определить:
    Код (Text):
    1. ; +
    2. ; Определения размера структур SYSTEM_PROCESS_INFORMATION и SYSTEM_THREAD_INFORMATION.
    3. ;
    4. QuerySizeOfSystemProcessesAndThreadsInformationEntry proc uses esi edi ebx InformationBuffer:PVOID, SizeOfSystemProcessesEntry:PULONG, SizeOfSystemThreadsEntry:PULONG
    5.     mov esi,InformationBuffer
    6.     xor edx,edx
    7.     mov edi,esi
    8.     add edi,dword ptr [esi]
    9.     assume esi:PSYSTEM_PROCESSES    ; Org. SYSTEM_PROCESS_INFORMATION/SYSTEM_THREAD_INFORMATION
    10.     assume edi:PSYSTEM_PROCESSES
    11.     mov eax,[edi].NextEntryDelta
    12.     sub eax,[esi].NextEntryDelta
    13.     movzx ecx,[esi].ProcessName.MaximumLength
    14.     add eax,ecx
    15.     movzx ecx,[edi].ProcessName.MaximumLength
    16.     sub eax,ecx
    17.     mov ecx,[edi].ThreadCount
    18.     sub ecx,[esi].ThreadCount
    19.     div ecx
    20.     mov ebx,eax
    21.     mul [esi].ThreadCount
    22.     mov edx,[esi].NextEntryDelta
    23.     sub edx,eax
    24.     movzx ecx,[esi].ProcessName.MaximumLength
    25.     sub edx,ecx
    26.     mov edi,SizeOfSystemProcessesEntry
    27.     mov esi,SizeOfSystemThreadsEntry
    28.     xor eax,eax
    29.     mov dword ptr [edi],edx
    30.     mov dword ptr [esi],ebx
    31.     ret
    32. QuerySizeOfSystemProcessesAndThreadsInformationEntry endp
    Получаем текущий размер слепка, передав в сервис нули, возвратится STATUS_INFO_LENGTH_MISMATCH и размер слепка. Расширяем его немного, на страницу - будет достаточно и получаем слепок. Далее при энуме входов в слепке размер их берётся который возвратит QuerySizeOfSystemProcessesAndThreadsInformationEntry().
     
  9. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Clerk
    Аааа опять асм! Они наверное в твоём асм листинге нихрена не поймут, если пишут на цпп ;)
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    d2k9
    Вот формула :dntknw:
    Код (Text):
    1. SYSTEM_PROCESSES.NextEntryOffset = SYSTEM_PROCESSES2.ThreadCount*SizeOf(SYSTEM_THREADS) + SizeOf(SYSTEM_PROCESSES) + SYSTEM_PROCESSES.ProcessName.MaximumLength
    2. A = SYSTEM_PROCESSES.NextEntryOffset
    3. B = SYSTEM_PROCESSES.ThreadCount
    4. C = SYSTEM_PROCESSES.ProcessName.MaximumLength
    5. X = SizeOf(SYSTEM_PROCESSES)
    6. Y = SizeOf(SYSTEM_THREADS)
    7. A1 = B1*Y + X + C1
    8. A2 = B2*Y + X + C2
    9. X = A1 - B1*Y - C1
    10. 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
    11. Y*(B2 - B1) = A2 - A1 + C1 - C2
    12. Y = (A2 - A1 + C1 - C2)/(B2 - B1)
     
  11. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Clerk
    А слабо ещё схему алгоритма в Visio составить?! :lol:
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    d2k9
    Тут по асму и низкоуровневому коденгу форум, это так, к сведению. Если чтото не нравится уходите.)
     
  13. d2k9

    d2k9 Алексей

    Публикаций:
    0
    Регистрация:
    14 сен 2008
    Сообщения:
    325
    Clerk
    Да мне по барабану - я сам на асме пишу когда надо.