HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwPID);
if (hProcess == NULL) return;
//
// Get process main module name.
//
wchar_t mainModName[MAX_PATH + 1];
size_t nameSize = GetModuleFileNameEx((HMODULE)hProcess, NULL, mainModName, MAX_PATH + 1);
GetModuleFileNameEx
частенько возвращает 0. GetLastError
говорит об ошибке 299 (ERROR_PARTIAL_COPY
- only part of a ReadProcessMemory
or WriteProcessMemory
request was completed). Не могу понять в чём причина такого поведения, ведь программа запускается с правами администратора и даже предварительно получает привилегии отладчика (что влияет только на OpenProcess
- даже для системных процессов удаётся получить HANDLE
).
GetModuleFileName
так же даёт ошибку (126 (ERROR_MOD_NOT_FOUND
) - the specified module could not be found).
Подскажите, пожалуйста, как уменьшить количество подобных ошибок?
Кстати, на Windows 10 это работает отлично, но это проблема появляется на Windows 7.
Раз уж речь зашла о WinAPI, спрошу ещё вот что: Как я могу получить полное имя текущего пользователя?
GetUserNameEx
неплохо справляется, но если задать первый параметр как NameSamCompatible
, имя, если оно содержит пробел, будет неполным; а если указать NameDisplay
, не будет поддерживаться русский язык (ну, по крайне мере, на Windows 7). По поводу русского могу сказать, что GetUserNameExW
с параметром
NameDisplay
вернёт массив кракозябр. Как только я не пробовал выводить...
Например:
setlocale(LC_ALL, "ru");
TCHAR username[MAX_PATH + 1];
ULONG nNameSize = MAX_PATH + 1;
GetUserNameExW(NameDisplay, username, &nNameSize);
wprintf(L"%s\n", username);
Мне пришла на помощь QueryFullProcessImageName
. Работает исправно как на 7ке, так и на 10ке.
Как решить вопрос с именем пользователя я пока не знаю.
UPD:
Ну что понять можно было сразу, так это то, что GetUserNameEx
просто не годится (при заявленных требованиях: полнота имени, поддержка русского). В документации на MSDN указано следующее:
NameFormat [in] - The format of the name. This parameter is a value from the EXTENDED_NAME_FORMAT enumeration type. It cannot be NameUnknown. If the user account is not in a domain, only NameSamCompatible is supported.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как произвести ретрансляцию трафика через сокеты в Boost AsioПытаюсь реализовать что то вроде сервера, к которому подключаются клиенты с одной...
Здравствуйте! Появилась задача - сделать нейросеть, которая будет распознавать числа от 1 до 15 на С++ QtНикогда раньше не имел с этим дело