Код (Text): void GetModulesListViaQueryWrapper(CUnicodeStringStorage *UnStorage) //Getting modules list via ZwQuerySystemInformation wrapper { NT::PSYSTEM_PROCESSES SysProcesses, FreePoint; SysProcesses = (NT::PSYSTEM_PROCESSES)GetSysInfoBlock(NT::SystemProcessesAndThreadsInformation); FreePoint = SysProcesses; if(!SysProcesses) return; while(SysProcesses->NextEntryDelta != 0) { //getting SysProcesses->ProcessId for future SysProcesses = FreePoint + SysProcesses->NextEntryDelta; } HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, FreePoint); SysProcesses = FreePoint = 0; } Код (Text): PVOID __stdcall GetSysInfoBlock(__in ULONG SysClass) { //ZwQuerySystemInformation wrapper size_t size = 0x1000; PVOID InformationBlock = 0; InformationBlock = HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE, size); if(!InformationBlock) return 0; while(XpZwQuerySystemInformation((NT::SYSTEM_INFORMATION_CLASS)SysClass, InformationBlock, (ULONG)size, 0) == STATUS_INFO_LENGTH_MISMATCH) { HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, InformationBlock); size<<=1; InformationBlock = HeapAlloc(GetProcessHeap() , HEAP_ZERO_MEMORY|HEAP_NO_SERIALIZE, size); if(!InformationBlock) return 0; } return InformationBlock; } У Неббета написано что следующий элемент списка структур указан в NextEntryDelta которое является смещением от базы блока данных данного класса SysProcesses += SysProcesses->NextEntryDelta; на первом шаге в NextEntryDelta находится 312 на втором шаге в NextEntryDelta находится явно полный бред - смещение явно превышающее размер самого блока данных в чем бок?
UTeX Наверное книжку по сям надо почитать, перед тем как писАть чтоли? Код (Text): SysProcesses = (NT::PSYSTEM_PROCESSES)(((UCHAR)SysProcesses) + SysProcesses->NextEntryDelta);
Код (Text): FreePoint = 0; FreePoint++; Посмотри в дизасме, что получается. А получается не "inc [FreePoint]", а "add [FreePoint], sizeof(NT::SYSTEM_PROCESSES)". Используй это: Код (Text): template<typename T1, typename T2> inline T1* Padd(T1* p, T2 n) { return (T1*) ((char*)p + n); } SysProcesses = Padd(FreePoint, SysProcesses->NextEntryDelta);
IceStudent опечатка, кстати думаю, что заместо char* лучше юзать unsigned char*, где то было на эту тему.
censored Мопед не мой Но вообще, по поводу указателя на знакомый или беззнаковый тип - не вижу разницы, тем более, в данном случае. Хотя представить память в виде беззнакового байта логичнее с чисто эстетических соображений..
вот черт - это какой то пробел у меня. жесть... разве SysProcesses уже не является указателем? И это не одно и то же? Какая разница ведь я беру из него адрес? Поясните дураку.
Я же написал в #3. Си работает с указателями не так, как асм, а автоматически преобразовывает смещения. Это сделано для упрощения манипуляций с указателями, чтобы не нужно было считать смещения вручную, как в ассемблере: Код (Text): int* p = 0; p++; // add [p], 1 * sizeof(int) int x = p[2]; // mov x,[p+2*sizeof(int)] Ну и, наверное, стоит последовать совету из #5.