У меня низкий уровень (например, действительно низкоуровневый, это в основном все вызовы IOCTL и несколько вызовов API перечисления), который периодически падает на Windows Vista/7 на компьютерах клиентов. К сожалению, я не смог получить какие-либо аварийные дампы, но один полезный пользователь упомянул, что запуск программы в режиме совместимости с XP решил проблему.Сбой при работе на низком уровне C++ в Windows Vista/7 Если не работает в режиме совместимости с XP
Приложение всегда запускается с полными правами администратора (он запускается из другой программы, требующей авторизации администратора), поэтому это не проблема UAC. Я не использую устаревшие API, и я не полагаюсь на какие-либо хаки реестра и т. Д. Я просто выдаю вызовы для перечисления дисков, а затем с помощью команд IOCTL, чтобы получить более низкоуровневую информацию обо всех подключенных устройствах.
Что происходит в режиме совместимости XP? Что Windows вводит в мое приложение или иным образом изолирует его, что предотвращает его сбой в Vista/7? Я изначально подозревал, что куча повреждена (хотя я вытащил свои волосы, пытаясь воспроизвести или отследить проблему), прежде чем сказать, что он отлично работает в режиме совместимости с XP.
Может ли кто-нибудь предложить любые возможные проблемы, которых можно было бы избежать в режиме совместимости XP, на которые я должен попытаться решить эту проблему? Благодаря!
EDIT:
Еще одна вещь, которая, вероятно, очень важно отметить: я звоню функцию DDK/ядро из пользовательского пространства для того, чтобы получить в определенных функциях, не подвергающихся через API WIN32.
Я использую ZwReadFile, ZwCreateFile, ZwWriteFile, RtlInitUnicodeString, ZwQueryVolumeInformationFile, ZwDeviceIoControlFile, ZwSetInformationFile, ZwClose.
В IOCTLs я звоню включают IOCTL_DISK_GET_PARTITION_INFO_EX, IOCTL_STORAGE_GET_DEVICE_NUMBER, IOCTL_DISK_GET_LENGTH_INFO и IOCTL_DISK_GET_DRIVE_LAYOUT_EX.
Можете ли вы предоставить образец кода для этого? Какие конкретные вызовы IOCTL вы используете? Это больше похоже на проблему с драйвером ... – t0mm13b
Я обновил сообщение. Я полностью забыл упомянуть о самой важной вещи, и это то, что я вызываю функции kernel/ddk из пользовательского пространства! Я также перечислил IOCTL, которые я использую. –
Возможно, что IOCTL были изменены для Windows 7, когда вы считаете, что их загрузочный код отличается и поддержка Bitlocker (я мог бы быть в моей голове на этом) ... также, драйверы изменились для Win 7, который мог бы объяснить, что функции DDK не работают на 100% под Win 7 ... – t0mm13b