使用DeviceIoControl读写PhysicalDrive0时IOCTL_STORAGE_SET_PROPERTY调用失败(错误码1)
解决IOCTL_STORAGE_SET_PROPERTY调用失败(错误码1)的问题
错误码1对应ERROR_INVALID_FUNCTION,导致调用失败的常见原因如下:
目标属性为只读
不是所有通过IOCTL_STORAGE_QUERY_PROPERTY读取的属性都支持修改。比如磁盘序列号、固件版本这类硬件固有属性是只读的,系统不允许通过IOCTL_STORAGE_SET_PROPERTY写入,直接调用就会返回无效函数错误。先确认你要修改的属性是否属于可配置项,比如部分设备的电源管理参数、逻辑设置可能支持修改,但硬件相关基础属性大多不行。STORAGE_PROPERTY_SET构造错误
使用IOCTL_STORAGE_SET_PROPERTY时,输入缓冲区必须严格遵循「STORAGE_PROPERTY_SET结构体 + 属性数据」的格式,不能直接把读取到的缓冲区原样写入:- 要确保
PropertyId、SetType字段与目标属性匹配,比如设置电源属性时,PropertyId需设为StorageDevicePowerProperty,SetType设为StorageSetProperty; AdditionalParametersSize必须准确填写后续属性数据的字节大小,不能填错。
- 要确保
磁盘打开权限不足
打开PhysicalDrive0时必须申请GENERIC_WRITE权限,且程序必须以管理员身份运行。如果只申请了GENERIC_READ权限,后续写入操作必然失败;非管理员身份连物理磁盘的打开权限都无法获取,也会间接导致调用报错。缓冲区参数错误
调用DeviceIoControl时:- 输入缓冲区大小必须是
sizeof(STORAGE_PROPERTY_SET)加上属性数据的总大小,不能偏小; - 部分系统要求缓冲区按特定字节(如8/16字节)对齐,若内存分配未满足对齐要求,也会触发无效函数错误。
- 输入缓冲区大小必须是
设备不支持该IOCTL
部分老旧存储设备或虚拟磁盘可能不支持IOCTL_STORAGE_SET_PROPERTY控制码,此时调用直接返回ERROR_INVALID_FUNCTION。可以先通过IOCTL_STORAGE_QUERY_PROPERTY查询设备支持的功能集,确认是否允许设置属性。
内容的提问来源于stack exchange,提问作者user15137953
相关产品推荐
相关产品推荐

