В скомпилированном exe-файле, специфичном для платформы x32, мне нужно получить путь к процессу (используя идентификатор процесса), не требуя повышенных прав/прав администратора. Путь процесса, который мы ищем, может запускаться, а может и не запускаться текущим пользователем, и может запускаться, а может и не запускаться с повышенными привилегиями. Насколько я понимаю, единственный способ сделать это — через недокументированные Windows API NtQuerySystemInformation и SystemProcessIdInformation.
У меня это отлично работает со сборками x64, но как только я пытаюсь запустить программу в x32 все вызовы NtQuerySystemInformation возвращают STATUS_INFO_LENGTH_MISMATCH.
Есть ли у кого-нибудь идеи, как это исправить?
Вот минимальный пример этого, просто создайте используя x32, это не сработает... но в x64 будет.
#include
#include
#include
#pragma comment(lib, "ntdll.lib")
struct SYSTEM_PROCESS_ID_INFORMATION
{
HANDLE ProcessId;
UNICODE_STRING ImageName;
};
NTSTATUS GetProcessPath(
const DWORD pid)
{
SYSTEM_PROCESS_ID_INFORMATION info;
info.ProcessId = reinterpret_cast(static_cast(pid));
info.ImageName.Length = 0;
info.ImageName.MaximumLength = 0;
info.ImageName.Buffer = nullptr;
ULONG ReturnLength;
NTSTATUS status = STATUS_INFO_LENGTH_MISMATCH;
while (status == STATUS_INFO_LENGTH_MISMATCH)
{
if (info.ImageName.Buffer)
{
LocalFree(info.ImageName.Buffer);
}
info.ImageName.Buffer = static_cast(LocalAlloc(LMEM_FIXED, info.ImageName.MaximumLength));
if (!info.ImageName.Buffer)
{
status = STATUS_NO_MEMORY;
break;
}
//0x58 = Undocumented SYSTEM_INFORMATION_CLASS::SystemProcessIdInformation
status = NtQuerySystemInformation(static_cast(0x58), &info, sizeof(info), &ReturnLength);
}
// Convert status to DWORD: result = RtlNtStatusToDosError(status);
if (NT_SUCCESS(status))
{
}
if (info.ImageName.Buffer)
{
LocalFree(info.ImageName.Buffer);
}
return status;
}
int main()
{
// Replace 9200 with a process id (found through Task Manager).
GetProcessPath(9200);
return 0;
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... x32-builds
Почему NtQuerySystemInformation не работает со сборками x32? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение