У меня есть программа на C++, которая скомпилирована для x86 (32 бит). Он вызывает драйвер режима ядра. Драйвер скомпилирован для того, чтобы размер слова операционной системы был запущен. Целевые операционные системы могут быть 32 или 64 бит (в моем случае окна).Как определить длину слова операционной системы во время выполнения на C++?
Моя проблема заключается в определении размера указателя, возвращаемого драйвером, поскольку это необходимо вызову ОС.
Следующий вызов программы пользовательского режим работал, если система имела размер слова 32 бита:
HANDLE device = OpenDevice();
HANDLE packageReceivedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
bool result = DeviceIoControl(
device,
IOCTL_CODE,
&packageReceivedEvent, //for signaling
sizeof(HANDLE), //TODO does not work for 64 bit
nullptr,
0,
&recvBytes,
nullptr);
Определения приходят от стандартного WinBase.h и winnt.h.
Я не могу использовать какие-либо решения времени компиляции, такие как sizeof(int)
, поскольку они будут рассматривать программу пользовательского режима, а не компиляцию драйвера, в зависимости от.
Возможно, было бы достаточно установить DeviceIoControl
nInBufferSize
просто наивысшим ожидаемым размером слова, но есть ли более приятное решение?
проверили ли вы, если это на самом деле проблема? Обычно ОС являются умными и не требуют огромного количества кодовых табличек кодов для использования указателя и просто дают вам действительный 32-разрядный указатель, если вы являетесь 32-битной программой и действительным 64-разрядным указателем, если вы 64-битная программа. – nwp
Используйте 64-разрядную версию вашей программы в 64-разрядной системе. Это своего рода дефолт. Используйте 32-разрядную версию вашей программы в 32-разрядной системе. Сейчас они редки. –
Что вы подразумеваете под «32-битным компилятором»? Компилятор - это исполняемый файл, который создает исполняемые файлы.Поскольку исполняемые файлы Windows могут быть 32 и 64 битами, существует 4 теоретических комбинации, и только 64-битный компилятор, производящий 64-битные исполняемые файлы, недвусмысленно _not_ «32-битный компилятор». – MSalters