Усечение приведения типа из HANDLE в ULONG C++

Я получаю предупреждение (рассматривается как ошибка):

Усечение указателя типа от HANDLE до ULONG

При попытке скомпилировать я понимаю, что тип имеет другую длину, так как компилирую ARM64, а не ARM, поэтому мне нужно изменить тип или static_cast его, однако я получаю ошибки типа "ожидаемый" (" при изменении строки на что-то вроде этого:

return static_cast<ULONG>PsGetProcessId(current_process); //this gives me invalid conversion type as 
                                                          //there are no brackets around the static cast 
                                                          //because I am returning its value

Я добавляю скобки, однако всегда есть проблема, и она никогда не работает, всегда «Ожидается» («:

return (static_cast<ULONG>)PsGetProcessId(current_process); //this bracket error 

ОРИГИНАЛЬНЫЙ КОД НИЖЕ

ULONG memory::get_process_id_by_name(PEPROCESS start_process, const char* process_name)
{
    PLIST_ENTRY active_process_links;
    PEPROCESS current_process = start_process;

    do
    {
        PKPROCESS kproc = (PKPROCESS)current_process;
        PDISPATCHER_HEADER header = (PDISPATCHER_HEADER)kproc;
        LPSTR current_process_name = (LPSTR)((PUCHAR)current_process + IMAGE_FILE_NAME);

        if (header->SignalState == 0 && strcmp(current_process_name, process_name) == 0)
        {   
            return (ULONG)PsGetProcessId(current_process); //warning occurs here
        }

        active_process_links = (PLIST_ENTRY)((PUCHAR)current_process + ACTIVE_PROCESS_LINKS_FLINK);
        current_process = (PEPROCESS)(active_process_links->Flink);
        current_process = (PEPROCESS)((PUCHAR)current_process - ACTIVE_PROCESS_LINKS_FLINK);

    } while (start_process != current_process);

    return 0;
}
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
888
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте ULONG_PTR вместо ULONG:

static_cast<ULONG_PTR>(hHandle)

Если значение, которое содержит дескриптор, на самом деле предназначено для использования в качестве ULONG, тогда приведите ULONG_PTR к ULONG:

static_cast<ULONG>(static_cast<ULONG_PTR>(hHandle))

Здравствуйте, спасибо за быстрый ответ, однако при использовании решения я столкнулся с другой проблемой. ``` return static_cast<ULONG>(static_cast<ULONG_PTR>(PsGetProcessId(cur‌​rent_process))); ``` Я получаю сообщение об ошибке: 'static_cast': невозможно преобразовать из 'HANDLE' в 'ULONG_PTR' У вас есть идеи, как это исправить? Эта проблема сохраняется для обоих предложенных вами решений.

TheManTheGuy69 18.12.2020 04:25
Ответ принят как подходящий

Тип HANDLE используется для указания на непрозрачную структуру.

Обычно он хранит значение индекса, но в заголовочном файле winnt.h он определяется как тип длины указателя.

typedef void *HANDLE;

Таким образом, правильный подход состоит в том, чтобы рассматривать идентификатор процесса как тип длины указателя.

Я знаю, что вам не нравится HANDLE, поэтому вы можете использовать ULONG_PTR, он имеет ту же длину, что и тип указателя.

Вот фиксированный код:

ULONG_PTR memory::get_process_id_by_name(PEPROCESS start_process, const char* process_name)
{
    PLIST_ENTRY active_process_links;
    PEPROCESS current_process = start_process;

    do
    {
        PKPROCESS kproc = (PKPROCESS)current_process;
        PDISPATCHER_HEADER header = (PDISPATCHER_HEADER)kproc;
        LPSTR current_process_name = (LPSTR)((PUCHAR)current_process + IMAGE_FILE_NAME);

        if (header->SignalState == 0 && strcmp(current_process_name, process_name) == 0)
        {
            return (ULONG_PTR)PsGetProcessId(current_process);
        }

        active_process_links = (PLIST_ENTRY)((PUCHAR)current_process + ACTIVE_PROCESS_LINKS_FLINK);
        current_process = (PEPROCESS)(active_process_links->Flink);
        current_process = (PEPROCESS)((PUCHAR)current_process - ACTIVE_PROCESS_LINKS_FLINK);

    } while (start_process != current_process);

    return 0;
}

Если вам нужно использовать ULONG по другим причинам, вы можете обратиться к решению @SoronelHaetir.


Пример для комментария:

До:

void test()
{
    ULONG value = (ULONG_PTR)0xFFFFFFFFFFFF;
    UNREFERENCED_PARAMETER(value);
}

EXTERN_C NTSTATUS DriverEntry(DRIVER_OBJECT *pDriverObject, UNICODE_STRING *pRegistryPath)
{
    UNREFERENCED_PARAMETER(pDriverObject);
    UNREFERENCED_PARAMETER(pRegistryPath);
    test();
    return STATUS_UNSUCCESSFUL;
}

Предупреждения:

error C2220: the following warning is treated as an error
warning C4305: 'initializing': truncation from 'ULONG_PTR' to 'ULONG'
warning C4309: 'initializing': truncation of constant value
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

После:

#pragma warning(push)
#pragma warning(disable: 4305)
#pragma warning(disable: 4309)
void test()
{
    ULONG value = (ULONG_PTR)0xFFFFFFFFFFFF;
    UNREFERENCED_PARAMETER(value);
}
#pragma warning(pop)

EXTERN_C NTSTATUS DriverEntry(DRIVER_OBJECT *pDriverObject, UNICODE_STRING *pRegistryPath)
{
    UNREFERENCED_PARAMETER(pDriverObject);
    UNREFERENCED_PARAMETER(pRegistryPath);
    test();
    return STATUS_UNSUCCESSFUL;
}

Нет предупреждений:

========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========

Эй, спасибо за ответ! Следуя вашему решению, я получаю сообщение об ошибке: «=»: преобразование из «ULONG_PTR» в «ULONG», возможная потеря данных в другом файле моего драйвера. Пожалуйста, смотрите сообщение ниже для кода, вызывающего ошибку.

TheManTheGuy69 18.12.2020 04:31

if (ioctl == NF_GET_PROCESS_ID) { PNF_PROCESS_ID_REQUEST process_id_request = (PNF_PROCESS_ID_REQUEST)irp->AssociatedIrp.SystemBuffer; process_id_request->process_id = memory::get_process_id_by_name(IoGetCurrentProcess(), process_id_request->process_name); если (process_id_request->process_id) { status = STATUS_SUCCESS; } bytes_io = sizeof(NF_PROCESS_ID_REQUEST); DbgPrintEx(0, 0, " NF_GET_PROCESS_ID\n"); }

TheManTheGuy69 18.12.2020 04:33

@TheManTheGuy69 Вы можете просто отключить это предупреждение таким образом.

Sprite 18.12.2020 07:02

к сожалению, я не могу отключить предупреждение, так как работаю над драйвером ядра.

TheManTheGuy69 18.12.2020 08:25

@ TheManTheGuy69 Я проверил, что он работает нормально (да, драйвер ядра), а с помощью #pragma warning(push) и #pragma warning(pop) вы можете отключить определенные предупреждения только для этой функции, а не глобально.

Sprite 18.12.2020 08:59

@ TheManTheGuy69 Я бы порекомендовал вам просто изменить тип process_id_request->process_id на ULONG_PTR, если это возможно (это нарушит совместимость с ABI).

Sprite 18.12.2020 09:09

Большое спасибо, я забыл нажать и поп. Теперь все работает, спасибо!

TheManTheGuy69 18.12.2020 09:34

Другие вопросы по теме