GetModuleFileNameEx - ERROR_PARTIAL_COPY

504
08 августа 2017, 16:28
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);
Answer 1

Мне пришла на помощь 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.

READ ALSO
В чём может быть проблема?

В чём может быть проблема?

Вот код на C++На этой строчке выдаются такие ошибки:

353
ретрансляция трафика

ретрансляция трафика

Как произвести ретрансляцию трафика через сокеты в Boost AsioПытаюсь реализовать что то вроде сервера, к которому подключаются клиенты с одной...

414
Нейросеть для распознавания чисел Qt C++ [требует правки]

Нейросеть для распознавания чисел Qt C++ [требует правки]

Здравствуйте! Появилась задача - сделать нейросеть, которая будет распознавать числа от 1 до 15 на С++ QtНикогда раньше не имел с этим дело

381
Анимация border

Анимация border

Здравствуйте!

239