У меня есть следующий код, выполняющийся в службе Windows
в Windows XP 32-разрядная версия:
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
a_impl->pid);
if (0 == h)
{
throw Process_exception(__LINE__,
__FILE__,
"Failed obtain module list for '" +
a_impl->exe_name + "'",
GetLastError());
}
DWORD required_size = 1024 * sizeof(HMODULE);
DWORD module_entries = 0;
BOOL result;
DWORD last_error;
HMODULE* module_handles = 0;
do
{
module_entries = required_size / sizeof(HMODULE);
delete[] module_handles;
module_handles = new HMODULE[module_entries];
memset(module_handles, 0, sizeof(HMODULE) * module_entries);
result = EnumProcessModules(h,
module_handles,
sizeof(HMODULE) * module_entries,
&required_size);
last_error = GetLastError();
} while (TRUE == result &&
required_size > (sizeof(HMODULE) * module_entries));
if (FALSE == result)
{
CloseHandle(h);
delete[] module_handles;
throw Process_exception(__LINE__,
__FILE__,
"Failed to enumerate module list for '" +
a_impl->exe_name + "'",
last_error);
}
Служба Windows развернута на многих машинах и на некоторых машинах.
(к которому у меня нет доступа)
вызов EnumProcessModules()
завершается неудачно с ERROR_PARTIAL_COPY
.
Насколько мне известно, это не удается при запросе процесса
запущен вошедшим в систему пользователем: я не смог воспроизвести это
и попробовал следующее:
- При использовании Process Explorer отказано в чтении памяти локальной системной учетной записи
и запись доступа к памяти для процесса, запущенного вошедшим в систему пользователем.
- Запуск процесса в другом сеансе (службы Windows и процессы
запускается первым вошедшим в систему пользователем, выполняющимся в том же сеансе,
0
)
Может кто-нибудь объяснить это поведение?
Обратите внимание, единственный процесс, который я видел это поведение, это системный процесс
(обычно идентификатор процесса 4).