Я получаю предупреждение (рассматривается как ошибка):
Усечение указателя типа от 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;
}
Используйте ULONG_PTR вместо ULONG:
static_cast<ULONG_PTR>(hHandle)
Если значение, которое содержит дескриптор, на самом деле предназначено для использования в качестве ULONG, тогда приведите ULONG_PTR к ULONG:
static_cast<ULONG>(static_cast<ULONG_PTR>(hHandle))
Тип 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», возможная потеря данных в другом файле моего драйвера. Пожалуйста, смотрите сообщение ниже для кода, вызывающего ошибку.
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 Вы можете просто отключить это предупреждение таким образом.
к сожалению, я не могу отключить предупреждение, так как работаю над драйвером ядра.
@ TheManTheGuy69 Я проверил, что он работает нормально (да, драйвер ядра), а с помощью #pragma warning(push)
и #pragma warning(pop)
вы можете отключить определенные предупреждения только для этой функции, а не глобально.
@ TheManTheGuy69 Я бы порекомендовал вам просто изменить тип process_id_request->process_id
на ULONG_PTR, если это возможно (это нарушит совместимость с ABI).
Большое спасибо, я забыл нажать и поп. Теперь все работает, спасибо!
Здравствуйте, спасибо за быстрый ответ, однако при использовании решения я столкнулся с другой проблемой. ``` return static_cast<ULONG>(static_cast<ULONG_PTR>(PsGetProcessId(current_process))); ``` Я получаю сообщение об ошибке: 'static_cast': невозможно преобразовать из 'HANDLE' в 'ULONG_PTR' У вас есть идеи, как это исправить? Эта проблема сохраняется для обоих предложенных вами решений.