Собственно после длительного перерыва вернулся к кодингу в ядре, посему заранее извиняюсь за возможную "тупость". Значит есть задача: дабы не напрягать пользователя высокой загрузкой ЦП - не давать ему увидеть что какой-то процесс хавает 99% процессорного времени. (Ага. Ситуевина: винт и кулера свистят как резанные, а юзер ни сном - ни духом. Хотя... Заказ есть заказ). Ок. Реверсинг диспетчера задач под XP sp3 показал что "да, действительно он юзает NtQuerySystemInformation с параметром SystemProcessInformation{=5}". Хм. Ок. Перехватываем. Вот здесь начинается собственно вопрос. В MSDN описание SYSTEM_PROCESS_INFORMATION: Код (Text): typedef struct _SYSTEM_PROCESS_INFORMATION { ULONG NextEntryOffset; BYTE Reserved1[52]; PVOID Reserved2[3]; HANDLE UniqueProcessId; PVOID Reserved3; ULONG HandleCount; BYTE Reserved4[4]; PVOID Reserved5[11]; SIZE_T PeakPagefileUsage; SIZE_T PrivatePageCount; LARGE_INTEGER Reserved6[6]; }SYSTEM_PROCESS_INFORMATION; Где там собцтвенно Кернел и Юзер тайм ? Структурка сама по себе вроди правильная (ну я посмотрел... ProcessUID стоит на нужном месте). Собцтвенно наглый и глобальный вопрос из разряда "швырните кодом": как решить задачу ? (ибо времени мало) Или мелкий и скромный: собцтвенно как именно taskmgr подсчитывает(если кто знает) процент загруженности для опред. задачи и как на самом деле выглядит SYSTEM_PROCESS_INFORMATION
а загуглить нормальную структуру не судьба? http://undocumented.ntinternals.net...on/Structures/SYSTEM_PROCESS_INFORMATION.html
Код (Text): /*++ CalcCpuTime Routine Description: calculate and return %cpu time and time periods Arguments: None Notes: Revision History: Nov-13-95 DavePl Created --*/ void CalcCpuTime(BOOL fUpdateHistory) { SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION ProcessorInfo[MAX_PROCESSOR]; LARGE_INTEGER CPUIdleTime[MAX_PROCESSOR]; LARGE_INTEGER CPUTotalTime[MAX_PROCESSOR]; LARGE_INTEGER CPUKernelTime[MAX_PROCESSOR]; LARGE_INTEGER SumIdleTime = { 0 ,0 }; LARGE_INTEGER SumTotalTime = { 0, 0 }; LARGE_INTEGER SumKernelTime = { 0, 0 }; NTSTATUS Status; Status = NtQuerySystemInformation( SystemProcessorPerformanceInformation, ProcessorInfo, sizeof(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * MAX_PROCESSOR, NULL ); if (!NT_SUCCESS(Status)) { return; } // // Walk through the info for each CPU, and compile // // - Amount of time each CPU has spent idle (since last check) // - Amount of time each CPU has spent entirely (since last check) // // In addition to keeping per-CPU stats, compile a sum for // // - Amount of time system has spent idle (since last check) // - Amount of time that has elapsed, in total (since last check) // for (int ListIndex = 0; ListIndex < g_cProcessors; ListIndex++) { LARGE_INTEGER DeltaCPUIdleTime; LARGE_INTEGER DeltaCPUTotalTime; LARGE_INTEGER DeltaCPUKernelTime; CPUIdleTime[ListIndex].QuadPart = ProcessorInfo[ListIndex].IdleTime.QuadPart; CPUKernelTime[ListIndex].QuadPart= ProcessorInfo[ListIndex].KernelTime.QuadPart- ProcessorInfo[ListIndex].IdleTime.QuadPart; CPUTotalTime[ListIndex].QuadPart = ProcessorInfo[ListIndex].KernelTime.QuadPart + ProcessorInfo[ListIndex].UserTime.QuadPart;// + //ProcessorInfo[ListIndex].IdleTime.QuadPart; DeltaCPUIdleTime.QuadPart = CPUIdleTime[ListIndex].QuadPart - PreviousCPUIdleTime[ListIndex].QuadPart; DeltaCPUKernelTime.QuadPart = CPUKernelTime[ListIndex].QuadPart - PreviousCPUKernelTime[ListIndex].QuadPart; DeltaCPUTotalTime.QuadPart = CPUTotalTime[ListIndex].QuadPart - PreviousCPUTotalTime[ListIndex].QuadPart; SumIdleTime.QuadPart += DeltaCPUIdleTime.QuadPart; SumTotalTime.QuadPart += DeltaCPUTotalTime.QuadPart; SumKernelTime.QuadPart += DeltaCPUKernelTime.QuadPart; // Calc CPU Usage % for this processor, scroll the history buffer, and store // the newly calced value at the head of the history buffer BYTE ThisCPU = DeltaCPUTotalTime.QuadPart ? (BYTE) (100 - ((DeltaCPUIdleTime.QuadPart * 100) / DeltaCPUTotalTime.QuadPart)) : 0; BYTE * pbHistory = g_pCPUHistory[ListIndex]; MoveMemory((LPVOID) (pbHistory + 1), (LPVOID) (pbHistory), sizeof(BYTE) * (HIST_SIZE - 1) ); pbHistory[0] = ThisCPU; BYTE ThisKernel = DeltaCPUTotalTime.QuadPart ? (BYTE) (((DeltaCPUKernelTime.QuadPart * 100) / DeltaCPUTotalTime.QuadPart)) : 0; pbHistory = g_pKernelHistory[ListIndex]; MoveMemory((LPVOID) (pbHistory + 1), (LPVOID) (pbHistory), sizeof(BYTE) * (HIST_SIZE - 1) ); pbHistory[0] = ThisKernel; PreviousCPUTotalTime[ListIndex].QuadPart = CPUTotalTime[ListIndex].QuadPart; PreviousCPUIdleTime[ListIndex].QuadPart = CPUIdleTime[ListIndex].QuadPart; PreviousCPUKernelTime[ListIndex].QuadPart = CPUKernelTime[ListIndex].QuadPart; } g_CPUUsage = SumTotalTime.QuadPart ? (BYTE) (100 - ((SumIdleTime.QuadPart * 100) / SumTotalTime.QuadPart)) : 0; if (fUpdateHistory) { g_KernelUsage = SumTotalTime.QuadPart ? (BYTE) ((SumKernelTime.QuadPart * 100) / SumTotalTime.QuadPart) : 0; // // Get the commit size // SYSTEM_PERFORMANCE_INFORMATION PerfInfo; Status = NtQuerySystemInformation( SystemPerformanceInformation, &PerfInfo, sizeof(PerfInfo), NULL); if (!NT_SUCCESS(Status)) { return; } g_MEMUsage = PerfInfo.CommittedPages * (g_PageSize / 1024); MoveMemory((LPVOID) (g_pMEMHistory + 1), (LPVOID) (g_pMEMHistory), sizeof(BYTE) * (HIST_SIZE - 1) ); g_pMEMHistory[0] = (BYTE) ((g_MEMUsage * 100) / g_MEMMax); } } Он же опенсурсный.. win2k\private\shell\applets\taskmgr
Многа спасиба ! Hellspawn Загуглить не сложилось. Нашлось с десяток разных вариантов. Все проверять оч. некогда было