Доброй ночи. Среда: Microsoft Visual С++ 6.0 Код (Text): // enumproc.c //#include <ntddk.h> #include <\WINDDK\2600\inc\ddk\wxp\ntddk.h> #include <stdlib.h> #include "enumproc.h" char ProcessName[256]; // определяем переменную для хранения имени процесса typedef ULONG DWORD; typedef VOID* LPVOID; #define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L) #define SystemProcessesAndThreadsInformation 5 // определяем параметр управления выводом информации void GetProcessName(int PID, char* pProcessName[256]) { ULONG cbBuffer = 0x8000; // определяем начальный размер буфера - 32kb LPVOID pBuffer = NULL; // создаем указатель на буфер NTSTATUS Status; PSYSTEM_PROCESS_INFORMATION pInfo; do { pBuffer = ExAllocatePool (NonPagedPool, cbBuffer); //создаем буфер в памяти размером cbBuffer if (pBuffer == NULL) // Если память выделить не удалось - выходим { return 1; } // пытаемся получить информацию о системе в буфер Status = ZwQuerySystemInformation( SystemProcessesAndThreadsInformation, pBuffer, cbBuffer, NULL); //если размер информации больше размера буфера if (Status == STATUS_INFO_LENGTH_MISMATCH) { ExFreePool(pBuffer); // высвобождаем памятьопределенную для буфера cbBuffer *= 2; // и увеличиваем его размер в два раза } else if (!NT_SUCCESS(Status)) // если операция не удалась по любой другой причине { ExFreePool(pBuffer); // высвобождаем память return 1; //и выходим } } while (Status == STATUS_INFO_LENGTH_MISMATCH); PSYSTEM_PROCESS_INFORMATION pInfo; pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer; for (;;) // вечный цикл { LPWSTR pszProcessName = pInfo->ProcessName.Buffer; // присвоить имя процесса новой переменной if (pszProcessName == NULL) //если имя не доступно pszProcessName = L"NULL"; //устанавливаем имя по умолчанию if (pInfo->ProcessId == PID) // сравниваем его идентификатор с искомым { //если соответствие найдено wcstombs(ProcessName,pszProcessName,256); //конвертируем wide character string pszProcessName //в character string path break; // покидаем цикл } if (pInfo->NextEntryDelta == 0) // если pInfo не содержит других наборов данных break; // покидаем цикл // если мы все еще в цикле, текущие данные не сдержат // процесс который мы ищем, но pInfo содержит дополнительные наборы данных pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)+ pInfo->NextEntryDelta); // получаем новый набор } ExFreePool(pBuffer); // выходя высвобождаем память return 0; // и выходим } Проблема: При компляции возникает следующая хрень - Код (Text): winddk\2600\inc\ddk\wxp\ntddk.h(23) : fatal error C1189: #error : Compiler version not supported by Windows DDK Подскажите, как можно исправить. Спасибо за внимание. P.S. Код из замечательной статьи, с http://www.volynkin.ru/procenum.htm Собственно сам код:
ставь вц2005... иль выше... ещё бывает некоторые советуют закомментировать строку эту с проверкой версий, будет ли работать не знаю, не пробовал
x0man попробовал закоментировать, так VC нашел её еще 55 ошибок, а 2005 ищю. q_q как это можно сделать? у меня есть вариант, только поменять CL из DDK/bin'а int2eh на чистом, но что это даст?
JCronuz есть вариант, только поменять CL из DDK/bin'а Это крайний вариант. У меня уже нет установленной vs6, поэтому только варианты. Можно добавить пути ddk\bin первыми в "Executable files" Компилятор от Intel умел(ет) встраиваться в vs. Проанализировать как/куда и попытаться так же встроить ddk'овый.
JCronuz у меня для cl 12.00.8804 и ddk6000 удалось собрать вот так: @cl /nologo /D "RC_INVOKED" /I \WinDDK\6000\inc\ddk /I \WinDDK\6000\inc\api /D "_X86_" xxx.c