代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Al-Qudsi

低级别C++应用程序在Windows Vista或7崩溃,除非在XP兼容模式下运行

  •  3
  • Mahmoud Al-Qudsi  · 技术社区  · 15 年前

    我有一个低级的(比如 真正地 低级的,基本上是所有IOCTL调用和几个枚举API调用)在客户端机器上的WindowsVista/7上偶尔崩溃。不幸的是,我还没有获得任何崩溃转储,但一位有用的用户确实提到,在XP兼容模式下运行该程序解决了这个问题。

    应用程序总是以完全的管理员权限启动(它是从另一个需要管理员授权的程序启动的),因此它不是UAC问题。我不使用任何不推荐使用的API,也不依赖任何注册表黑客等。我只是发出枚举磁盘的调用,然后使用IOCTL命令获取有关所有连接设备的更多低级信息。

    XP兼容模式下会发生什么?Windows向我的应用程序中注入了什么,或者用什么沙盒防止它在Vista/7上崩溃?在被告知堆在XP兼容模式下运行良好之前,我最初怀疑堆已损坏(尽管我在尝试复制或跟踪问题时已竭尽全力)。

    有人能建议我在XP Compat模式下可以避免的任何可能的问题来解决这个问题吗?谢谢

    还有一件事可能非常重要:我正在从用户空间调用DDK/内核函数,以获得某些未通过WIN32 API公开的特性。

    我使用的是ZwReadFile、ZwCreateFile、ZwWriteFile、RtlInitUnicodeString、ZwQueryVolumeInformationFile、ZwDeviceIoControlFile、ZwSetInformationFile、ZwClose。

    我调用的IOCTL包括IOCTL\u DISK\u GET\u PARTITION\u INFO\u EX、IOCTL\u STORAGE\u GET\u DEVICE\u NUMBER、IOCTL\u DISK\u GET\u LENGTH\u INFO和IOCTL\u DISK\u GET\u DRIVE\u layou EX。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Mahmoud Al-Qudsi    15 年前

    这很奇怪,但我调用了ZWQueryVolumeInformation文件,并将FsInformationClass设置为FileFsVolumeInformation。

    我传入了一个缓冲区,缓冲区中的文件\u FS\u卷\u信息首先正常分配,然后过度分配到 (sizeof(FILE_FS_VOLUME_INFORMATION) + sizeof(TCHAR)*FILE_FS_VOLUME_INFORMATION->VolumeLabelLength)

    FILE_FS_VOLUME_INFORMATION->VolumeLabel[FILE_FS_VOLUME_INFORMATION->VolumeLabelLength/2] = _T('\0'); 只有在某些机器上 这将导致内存损坏。

    当使用 vector<unsigned char> 作为文件\u FS\u卷\u信息缓冲区。

    内核似乎在缓冲区上放置了某种写保护,不管大小如何,都会导致损坏。将第一个VolumeLabelLength字节复制到第二个缓冲区, _T('\0') 之后 应该 以字符数组结尾!),但仅仅是不修改我传递的缓冲区中的任何数据就成功了。。。。这是疯狂的,因为它只发生在某些机器上(一致且100%可重复)。

        2
  •  0
  •   Amirshk    15 年前

    从XP到vista的低级驱动程序有很多变化。我怀疑您正在使用受其影响的IOCTL。

    推荐文章