【发布时间】:2010-11-06 23:18:49
【问题描述】:
由于某种原因,当我的应用程序在某些硬盘配置(RAID、随机分区、通过单独的 IDE 控制器,而不是在操作系统分区上)上运行时,VirtualAlloc 返回 null 和 GetLastError 代码ERROR_INVALID_PARAMETER.
除了传入的标志(MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE) 之外,唯一的参数是计算为从磁盘几何获得的扇区大小的倍数的大小(不幸的是,由于 NDA 等原因,我无法发布代码)。
只是想知道是否有人有这方面的经验?或者如果有人知道为什么 Windows 可能会以不同方式处理属于 raid 或分区的磁盘上的页面大小的任何原因?非常感谢任何帮助!
【问题讨论】:
-
当你试图提交一个已经保留的块时,你是否检查了当你保留块时地址是否被四舍五入到分配粒度的倍数?在计算请求的大小时,是否有任何保护措施可以防止请求异常大量的内存?
-
偏移量向下舍入到扇区大小的粒度,并检查以防止出现任何错误,尽管它看起来不像是在防止请求大量内存,尽管我把在一些额外的日志记录中以在失败时输出长度
-
问题似乎出在 DeviceIoControl 上,对于不是主硬盘驱动器的任何磁盘,它都不会返回有效的驱动器几何形状,有什么想法吗?
-
也许你应该问一个单独的问题。您关于 VirtualAlloc 的问题现在与您的实际问题无关,实际上是关于 DeviceIoControl。任何可以提供帮助的人都不会从问题标题或描述中知道他们可以提供帮助。
标签: c++ windows virtualalloc