Конфликт между инклюдами ntifs.h и winnt.h (C++ VS2019)
Пишу драйвер, в проекте понадобилось включить winnt.h, который после подключения начинает конфликтовать с ntifs.h. Компилятор выдает кучу ошибок переопределений функций, необъявленных идентификаторов и прочих синтактический ошибок в подключаемых библиотеках. Набросал в новом проекте минимальный код драйвера, что бы воспроизвести ошибку и решить проблему. Пробовал разные танцы с бубном в виде pragma once, менял местами инклюды, но что то не выходит. Понимаю, что проблема банальная, но сам не могу решить. Помогите.
VS2019
DrvTest.cpp
//#pragma once // эта директива здесь не имеет смысла, но все равно попробовал :) - не помогает
#include <ntifs.h> // нужен для PsLookupProcessByProcessId
#include <windef.h> // использую для DWORD, BYTE и прочих привычных мне типов
#include <winnt.h> // нужен для структур IMAGE_DOS_HEADER, IMAGE_NT_HEADERS, IMAGE_SECTION_HEADER
void Thread(_In_ PVOID Context)
{
UNREFERENCED_PARAMETER(Context);
DWORD test = 0;
DbgPrint("[DriverTest]: Size of IMAGE_DOS_HEADER: 0x%I64X", sizeof(IMAGE_DOS_HEADER));
DbgPrint("[DriverTest]: Size of IMAGE_NT_HEADERS: 0x%I64X", sizeof(IMAGE_NT_HEADERS));
DbgPrint("[DriverTest]: Size of IMAGE_SECTION_HEADER: 0x%I64X", sizeof(IMAGE_SECTION_HEADER));
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
{
UNREFERENCED_PARAMETER(pDriverObject);
UNREFERENCED_PARAMETER(pRegistryPath);
HANDLE thread_handle = NULL;
NTSTATUS status = PsCreateSystemThread(&thread_handle, GENERIC_ALL, NULL, NULL, NULL, Thread, NULL);
if (!NT_SUCCESS(status))
{
DbgPrint("[DriverTest]: Failed to create thread. Status code: %X.", status);
return STATUS_UNSUCCESSFUL;
}
ZwClose(thread_handle);
return STATUS_SUCCESS;
}
Часть вывода при компиляции
Сборка начата…
1>------ Сборка начата: проект: DrvTest, Конфигурация: Release x64 ------
1>Building 'DrvTest' with toolset 'WindowsKernelModeDriver10.0' and the 'Universal' target platform.
1>Stamping x64\Release\DrvTest.inf
1>Stamping [Version] section with DriverVer=11/05/2021,15.38.23.247
1>driver.cpp
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(160,1): error C2220: следующее предупреждение рассматривается как ошибка
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(160,1): warning C4005: PROBE_ALIGNMENT: изменение макроопределения
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\ntdef.h(188): message : см. предыдущее определение "PROBE_ALIGNMENT"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winnt.h(177,1): warning C4005: PROBE_ALIGNMENT32: изменение макроопределения
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared\ntdef.h(205): message : см. предыдущее определение "PROBE_ALIGNMENT32"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\minwinbase.h(219,30): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "CRITICAL_SECTION"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\minwinbase.h(220,31): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "PCRITICAL_SECTION"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\minwinbase.h(223,36): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "CRITICAL_SECTION_DEBUG"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\minwinbase.h(224,37): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "PCRITICAL_SECTION_DEBUG"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\errhandlingapi.h(136,10): error C2061: синтаксическая ошибка: идентификатор "PVECTORED_EXCEPTION_HANDLER"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\errhandlingapi.h(152,10): error C2061: синтаксическая ошибка: идентификатор "PVECTORED_EXCEPTION_HANDLER"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\fibersapi.h(37,14): error C2065: PFLS_CALLBACK_FUNCTION: необъявленный идентификатор
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\fibersapi.h(37,37): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "lpCallback"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\heapapi.h(138,10): error C2061: синтаксическая ошибка: идентификатор "HEAP_INFORMATION_CLASS"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\heapapi.h(219,10): error C2061: синтаксическая ошибка: идентификатор "HEAP_INFORMATION_CLASS"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(34,21): error C2146: синтаксическая ошибка: отсутствие ";" перед идентификатором "SRWLOCK"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(42,20): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(50,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(58,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(66,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(74,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(82,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\synchapi.h(90,22): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "SRWLock"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winbase.h(7698,32): error C2146: синтаксическая ошибка: отсутствие ")" перед идентификатором "pcbe"
1>C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um\winbase.h(7699,5): fatal error C1003: число ошибок превышает 100; остановка компиляции
1>Сборка проекта "DrvTest.vcxproj" завершена с ошибкой.
========== Сборка: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========