Почему NtQuerySystemInformation не работает со сборками x32?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему NtQuerySystemInformation не работает со сборками x32?

Сообщение Anonymous »

В скомпилированном 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Гдал для windows 7(x32)
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Использование JavaOsc для получения показаний счетчиков с Behringer X32
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Использование JavaOsc для получения показаний счетчиков с Behringer X32
    Anonymous » » в форуме JAVA
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Не могу собрать проект Vulcan x32.
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Система Windows Обработка итерация и фильтрация с помощью ProcessID - ntquerysysteminformation winapi windows
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»