У меня низкоуровневый (например, действительно низкоуровневый, в основном все вызовы IOCTL и несколько вызовов API перечисления) случайный сбой в Windows Vista / 7 на клиентских компьютерах. К сожалению, я не смог получить никаких аварийных дампов, но один полезный пользователь упомянул, что запуск программы в режиме совместимости с XP решил проблему.
Приложение всегда запускается с полными правами администратора (оно запускается из другой программы, требующей авторизации администратора), поэтому это не проблема UAC. Я не использую устаревшие API-интерфейсы и не полагаюсь на взломы реестра и т. Д. Я просто выполняю вызовы для перечисления дисков, а затем использую команды IOCTL для получения более низкоуровневой информации обо всех подключенных устройствах.
Что происходит в режиме совместимости с XP? Что Windows вводит в мое приложение или как-то иначе помещает его в «песочницу», что предотвращает его сбой в Vista / 7? Первоначально я подозревал повреждение кучи (хотя я вырвал свои волосы, пытаясь воспроизвести или отследить проблему), прежде чем мне сказали, что она работает нормально в режиме совместимости с XP.
Может ли кто-нибудь предложить какие-либо возможные проблемы, которых следует избегать в режиме Compat XP, на которые я должен обратить внимание, чтобы попытаться решить эту проблему? Спасибо!
EDIT:
Еще одна вещь, которую, вероятно, очень важно упомянуть: я вызываю функции DDK / Kernel из пространства пользователя, чтобы получить доступ к определенным функциям, не предоставляемым через WIN32 API.
Я использую ZwReadFile, ZwCreateFile, ZwWriteFile, RtlInitUnicodeString, ZwQueryVolumeInformationFile, ZwDeviceIoControlFile, ZwSetInformationFile, ZwClose.
IOCTL, которые я вызываю, включают IOCTL_DISK_GET_PARTITION_INFO_EX, IOCTL_STORAGE_GET_DEVICE_NUMBER, IOCTL_DISK_GET_LENGTH_INFO и IOCTL_DISK_GET_DRIVE_LAYOUT_.