Mercurial > minori
comparison dep/animone/src/util/win32.cc @ 340:74e2365326c6
dep/animone: add experimental accessibility strategy
I also moved most of the functions out of util/win32.cc, because that
file is meant for things that are shared between the different functions,
and currently that is only wide string conversion helpers.
| author | Paper <paper@paper.us.eu.org> |
|---|---|
| date | Wed, 19 Jun 2024 23:13:55 -0400 |
| parents | a7d4e5107531 |
| children |
comparison
equal
deleted
inserted
replaced
| 339:eac06513db86 | 340:74e2365326c6 |
|---|---|
| 45 std::wstring ret(size, L'\0'); | 45 std::wstring ret(size, L'\0'); |
| 46 mbtowc(&ret.front(), ret.length()); | 46 mbtowc(&ret.front(), ret.length()); |
| 47 return ret; | 47 return ret; |
| 48 } | 48 } |
| 49 | 49 |
| 50 std::string GetProcessPath(DWORD process_id) { | |
| 51 // If we try to open a SYSTEM process, this function fails and the last error | |
| 52 // code is ERROR_ACCESS_DENIED. | |
| 53 // | |
| 54 // Note that if we requested PROCESS_QUERY_INFORMATION access right instead | |
| 55 // of PROCESS_QUERY_LIMITED_INFORMATION, this function would fail when used | |
| 56 // to open an elevated process. | |
| 57 Handle process_handle(::OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_id)); | |
| 58 | |
| 59 if (!process_handle) | |
| 60 return std::wstring(); | |
| 61 | |
| 62 std::wstring buffer(MAX_PATH, L'\0'); | |
| 63 DWORD buf_size = buffer.length(); | |
| 64 | |
| 65 // Note that this function requires Windows Vista or above. You may use | |
| 66 // GetProcessImageFileName or GetModuleFileNameEx on earlier versions. | |
| 67 if (!::QueryFullProcessImageNameW(process_handle.get(), 0, &buffer.front(), &buf_size)) | |
| 68 return std::wstring(); | |
| 69 | |
| 70 buffer.resize(buf_size); | |
| 71 return ToUtf8String(buffer); | |
| 72 } | |
| 73 | |
| 74 std::string GetFileNameFromPath(const std::string& path) { | |
| 75 const auto pos = path.find_last_of(L"/\\"); | |
| 76 return pos != std::wstring::npos ? path.substr(pos + 1) : path; | |
| 77 } | |
| 78 | |
| 79 static std::wstring GetSystemDirectory() { | |
| 80 PWSTR path_wch; | |
| 81 SHGetFolderPathW(NULL, CSIDL_WINDOWS, NULL, SHGFP_TYPE_CURRENT, &path_wch); | |
| 82 std::wstring path_wstr(path_wch); | |
| 83 CoTaskMemFree(path_wch); | |
| 84 return path_wstr; | |
| 85 } | |
| 86 | |
| 87 bool IsSystemDirectory(const std::string& path) { | |
| 88 return IsSystemDirectory(ToWstring(path)); | |
| 89 } | |
| 90 | |
| 91 bool IsSystemDirectory(std::wstring path) { | |
| 92 ::CharUpperBuffW(&path.front(), path.length()); | |
| 93 | |
| 94 std::wstring windir = GetSystemDirectory(); | |
| 95 ::CharUpperBuffW(&windir.front(), windir.length()); | |
| 96 | |
| 97 // XXX wtf is 4? | |
| 98 return path.find(windir) == 4; | |
| 99 } | |
| 100 | |
| 101 bool VerifyProcessPath(const std::string& path) { | |
| 102 return !path.empty() && !IsSystemDirectory(path); | |
| 103 } | |
| 104 | |
| 105 bool VerifyProcessFileName(const std::string& name) { | |
| 106 static const std::set<std::string> invalid_names = { | |
| 107 // System files | |
| 108 "explorer.exe", // Windows Explorer | |
| 109 "taskeng.exe", // Task Scheduler Engine | |
| 110 "taskhost.exe", // Host Process for Windows Tasks | |
| 111 "taskhostex.exe", // Host Process for Windows Tasks | |
| 112 "taskmgr.exe", // Task Manager | |
| 113 "services.exe", // Service Control Manager | |
| 114 }; | |
| 115 | |
| 116 if (name.empty()) | |
| 117 return false; | |
| 118 | |
| 119 for (const auto& invalid_name : invalid_names) | |
| 120 if (util::EqualStrings(name, invalid_name)) | |
| 121 return false; | |
| 122 | |
| 123 return true; | |
| 124 } | |
| 125 | |
| 126 } // namespace animone::internal::win32 | 50 } // namespace animone::internal::win32 |
