编译 ARM64 C++ 时禁用警告? Visual Studio 2019
Disable Warnings when compiling ARM64 C++? Visual Studio 2019
我在一个项目(在 ARM64 中构建)的内核 space 中工作,无法为我的项目禁用特定警告。该警告被视为错误,不允许我编译我的项目,所以你可以想象这很烦人。
警告是错误代码 C4244:“=”从 'ULONG_PTR' 到 'ULONG' 的转换,可能会丢失数据。
我试过使用 #pragma disable warning 4244 但这不起作用,
我已经关闭了我项目中的“将警告视为错误”设置,
我已在警告级别项目设置中“关闭所有警告”。
天底下好像都试过了,还是编译不出来,请问有什么办法吗?我将 post 代码在下面抛出错误,以便有人可以修复,但是关闭警告也一样好:)
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); //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;
}
基于 in ,警告应该出现在调用get_process_id_by_name
函数的位置,而不是在get_process_id_by_name
函数内部。因为现在函数内部没有ULONG_PTR
到ULONG
的转换。
这是 the documentation #pragma warning
。
这里是固定代码:
#pragma warning(push)
#pragma warning(disable: 4305)
#pragma warning(disable: 4309)
void YourFunction()
{
/* ... */
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);
if (process_id_request->process_id) {
status = STATUS_SUCCESS;
}
bytes_io = sizeof(NF_PROCESS_ID_REQUEST);
DbgPrintEx(0, 0, " NF_GET_PROCESS_ID\n");
}
/* ... */
}
#pragma warning(pop)
我在一个项目(在 ARM64 中构建)的内核 space 中工作,无法为我的项目禁用特定警告。该警告被视为错误,不允许我编译我的项目,所以你可以想象这很烦人。
警告是错误代码 C4244:“=”从 'ULONG_PTR' 到 'ULONG' 的转换,可能会丢失数据。 我试过使用 #pragma disable warning 4244 但这不起作用, 我已经关闭了我项目中的“将警告视为错误”设置, 我已在警告级别项目设置中“关闭所有警告”。
天底下好像都试过了,还是编译不出来,请问有什么办法吗?我将 post 代码在下面抛出错误,以便有人可以修复,但是关闭警告也一样好:)
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); //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;
}
基于get_process_id_by_name
函数的位置,而不是在get_process_id_by_name
函数内部。因为现在函数内部没有ULONG_PTR
到ULONG
的转换。
这是 the documentation #pragma warning
。
这里是固定代码:
#pragma warning(push)
#pragma warning(disable: 4305)
#pragma warning(disable: 4309)
void YourFunction()
{
/* ... */
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);
if (process_id_request->process_id) {
status = STATUS_SUCCESS;
}
bytes_io = sizeof(NF_PROCESS_ID_REQUEST);
DbgPrintEx(0, 0, " NF_GET_PROCESS_ID\n");
}
/* ... */
}
#pragma warning(pop)