Доброе время суток, многоуважаемые программисты. Возникла у меня такая проблема. По pid надо определить имя процесса. Для этого использую следующий код Код (Text): hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION | PROCESS_VW_READ, FALSE, ProcessId ) if ( hProcess ) { if ( ( ::GetProcessImageFileName ( hProcess, cProcessFileName, sizeof ( cProcessFileName ) ) ) != NULL ) { return cProcessFileName; } } Но для процесса csrss.exe OpenProcess возвращает ошибку, GetLastError возвращает 5 - Отказ в доступе?
Господи... да код добавляющий привилегии валяется на каждом углу. Тем более, мне кажется что автор не спрашивал как именно они подрубаются.
ProfessorNimnull Код (Text): // @cl /EHsc /MD pid2name.cpp advapi32.lib psapi.lib && del *.obj #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <psapi.h> #include <tchar.h> #include <iostream> #include <string> #include <vector> #include <memory> typedef std::basic_string< TCHAR > tstring; template < class char_type > struct obj_holder; template <> struct obj_holder< char > { static std::ostream & out; }; template <> struct obj_holder< wchar_t > { static std::wostream & out; }; std::ostream & obj_holder< char >::out = std::cout; std::wostream & obj_holder< wchar_t >::out = std::wcout; #define tcout obj_holder<TCHAR>::out const std::auto_ptr<tstring> pid2name(unsigned pid) { HANDLE process; std::auto_ptr<tstring> res(new tstring(_T(""))); enum { ACCESS = PROCESS_QUERY_INFORMATION | PROCESS_VM_READ }; process = ::OpenProcess(ACCESS, FALSE, pid); if (process) { std::vector<TCHAR> buf(MAX_PATH, 0); if (::GetProcessImageFileName(process, &buf[0], buf.size())!=NULL) { res->assign(&buf[0], buf.size()); } CloseHandle(process); } return res; } int _tmain(int argc, TCHAR ** argv) { if (argc<=1) { tcout << _T("usage: pid2name [pid]") << std::endl; return 0; } unsigned pid = _ttoi(argv[1]); tcout << *pid2name(pid) << std::endl; return 0; } /* [EOF] */ Работает как надо!