我有一个低级别的(像 真的 低水平,它的基本上所有读写电话和几次电话来枚举Api)提偶尔在Windows Vista/7月的客户'机器。不幸的是,我们未能获得任何崩溃堆放场但是一个有用的用户没有提到,运行程序在XP兼容性方式解决该问题。

该应用程序总是发起的全面管理的权利(这是从另一个程序,该程序需要管理员的授权),所以它不是一个UAC问题。我不要使用任何弃Api而且我不依赖任何注册的黑客,等等。我只是发出呼吁列举的磁盘,然后使用读写的命令得到一些更多的低水平的信息有关的所有连接的设备。

什么发生在XP兼容性模式?什么窗户注入到我的应用程序或其他sandbox它与防止其崩溃在Vista/7吗?我起初怀疑堆腐败(不过我已经把我的头发,试图复制或追踪问题)之前被告知,它的运行现在XP兼容性模式。

任何人都可以提出任何可能的问题,将避免在XP兼容性模式,我应该看到试图解决这个问题?谢谢!

编辑:

有一件事可能是非常重要的是要提一提:我打电话信息适/核心职能从用户在以获得在某些特征不能通过WIN32API。

我使用的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_EX.

有帮助吗?

解决方案

这是非常奇怪,但是我是叫ZwQueryVolumeInformationFile与FsInformationClass设FileFsVolumeInformation.

我已经通过在一个缓冲区的FILE_FS_VOLUME_INFORMATION第一个正常分配的,那么超额分配到 (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');只有些机器 这将结果在存储器中的腐败。

无论大小度分配(甚至试图分配一个完整的256个字符的额外!), 这将可靠的结果在堆腐败 甚至 当使用 vector<unsigned char> 作为FILE_FS_VOLUME_INFORMATION缓冲区。

看来,核心的地方,某种形式的写保护的缓冲区以某种方式,是导致腐败,无论大小。复制的第一VolumeLableLength字节的第二个缓冲器, 然后 后挂起 _T('\0') 解决了这个问题。不知道该如何为Windows正在缓冲区 分配,并通过在作为一个参数的只读的 如果是储存 该FILE_FS_VOLUME_INFORMATION结构(它 应该 端的角色阵!), 但不修改任何数据在缓冲器,我通过有技巧....这是疯狂的,因为它只发生的(一贯和100%的可重复)对某些机器。

在任何率:问题解决了*唷*!

其他提示

已经有很多的变化,低级别的司机从XP。我怀疑你是采用一读写,是受到它的影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top