SystemProcessesAndThreadsInformation :: переход к следующей структуре

Тема в разделе "WASM.BEGINNERS", создана пользователем UTeX, 21 ноя 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1. void
    2. GetModulesListViaQueryWrapper(CUnicodeStringStorage *UnStorage)
    3. //Getting modules list via ZwQuerySystemInformation wrapper
    4. {
    5.     NT::PSYSTEM_PROCESSES SysProcesses, FreePoint;
    6.  
    7.     SysProcesses = (NT::PSYSTEM_PROCESSES)GetSysInfoBlock(NT::SystemProcessesAndThreadsInformation);
    8.     FreePoint = SysProcesses;
    9.     if(!SysProcesses) return;
    10.     while(SysProcesses->NextEntryDelta != 0)
    11.     {
    12.        
    13.         //getting SysProcesses->ProcessId for future
    14.         SysProcesses = FreePoint + SysProcesses->NextEntryDelta;
    15.     }
    16.     HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, FreePoint);
    17.     SysProcesses = FreePoint = 0;
    18. }
    Код (Text):
    1. PVOID
    2. __stdcall
    3. GetSysInfoBlock(__in ULONG SysClass)
    4. {
    5.     //ZwQuerySystemInformation wrapper
    6.     size_t size = 0x1000;
    7.     PVOID InformationBlock = 0;
    8.  
    9.     InformationBlock = HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE, size);
    10.     if(!InformationBlock) return 0;
    11.     while(XpZwQuerySystemInformation((NT::SYSTEM_INFORMATION_CLASS)SysClass, InformationBlock, (ULONG)size, 0) == STATUS_INFO_LENGTH_MISMATCH)
    12.     {
    13.         HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, InformationBlock);
    14.         size<<=1;
    15.         InformationBlock = HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE, size);
    16.         if(!InformationBlock) return 0;
    17.     }
    18.     return InformationBlock;
    19. }
    У Неббета написано что следующий элемент списка структур указан в NextEntryDelta которое является смещением от базы блока данных данного класса

    SysProcesses += SysProcesses->NextEntryDelta;

    на первом шаге в NextEntryDelta находится 312
    на втором шаге в NextEntryDelta находится явно полный бред - смещение явно превышающее размер самого блока данных

    в чем бок?
     
  2. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Нашел похожие функции у Нэббета в книге но увы не вижу в чем же проблема
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    UTeX
    hint: адресная арифметика: type* p + int = p + int * sizeof(type).
     
  4. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    IceStudent

    извини, но я увы тупой и не понял

    подскажи в чем бок?
     
  5. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    UTeX
    Наверное книжку по сям надо почитать, перед тем как писАть чтоли?
    Код (Text):
    1. SysProcesses = (NT::PSYSTEM_PROCESSES)(((UCHAR)SysProcesses) + SysProcesses->NextEntryDelta);
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1. FreePoint = 0;
    2. FreePoint++;
    Посмотри в дизасме, что получается. А получается не "inc [FreePoint]", а "add [FreePoint], sizeof(NT::SYSTEM_PROCESSES)".

    Используй это:
    Код (Text):
    1. template<typename T1, typename T2>
    2. inline T1* Padd(T1* p, T2 n) { return (T1*) ((char*)p + n); }
    3.  
    4. SysProcesses = Padd(FreePoint, SysProcesses->NextEntryDelta);
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    PUCHAR?
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    IceStudent
    опечатка, кстати думаю, что заместо char* лучше юзать unsigned char*, где то было на эту тему.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    Мопед не мой :)

    Но вообще, по поводу указателя на знакомый или беззнаковый тип - не вижу разницы, тем более, в данном случае. Хотя представить память в виде беззнакового байта логичнее с чисто эстетических соображений..
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    вот черт - это какой то пробел у меня. жесть...

    разве SysProcesses уже не является указателем? И это не одно и то же?
    Какая разница ведь я беру из него адрес? Поясните дураку.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Я же написал в #3. Си работает с указателями не так, как асм, а автоматически преобразовывает смещения. Это сделано для упрощения манипуляций с указателями, чтобы не нужно было считать смещения вручную, как в ассемблере:
    Код (Text):
    1. int* p = 0;
    2. p++; // add [p], 1 * sizeof(int)
    3. int x = p[2]; // mov x,[p+2*sizeof(int)]
    Ну и, наверное, стоит последовать совету из #5.
     
  12. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Все ясно. Спасибо.