求解:我用IOCTL_DISK_GET_STORAGEID碰到的一个奇怪的问题

Anna2007   2007-1-24 06:31 楼主
用该语句调用sd card的序列号,同一张卡在不同的机器上试,得出2种结果,2个序列号,请有过类似经验的大侠帮忙解决。

回复评论 (4)

ioctl在不同的image上定义的功能可能不一样的
估计你读的其中一个是错的,不是序列号
点赞  2007-1-25 11:41
建议:

1/ 两个IMGE 是否使用同一个SD卡驱动程序,如果是, 这个函数你可能用错了.如果否,建议使用同一个;
2/仔细看函数的使用说名,以下为他的解释:
hDevice
[in] Handle to the block device storage volume, which can be obtained by opening the FAT volume by its file system entry. The following code example shows how to open a PC Card storage volume.
hVolume = CreateFile(TEXT("\Storage Card\Vol:"), GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

3/  看看说明下面的哪个注意事项 :
Return Values
If you provide support in a block device driver for IOCTL_DISK_GET_STORAGEID, then the driver should return TRUE on a successful operation, and return FALSE if this is a non-supported code. If FALSE returns, callers should call GetLastError for information. An error of ERROR_INSUFFICIENT_BUFFER indicates that lpOutBuf is too small to store the information.

Remarks
Block device drivers, such as the sample ATADISK driver, implement this code. For more information, see Sample ATADISK Driver.

The caller must allocate enough memory for the structure and the identifiers. If the buffer is not large enough to hold the data, the call will fail and dwSize will receive the size of the required buffer. Whether a block device driver supports this code depends on the implementation and whether the hardware contains storage identifier information.

You do not need to store the manufacturer identifier string and disk serial number. For ATA disk devices, the manufacturer identifier string and disk serial number read directly from the storage card.


希望能解决你的问题

点赞  2007-1-26 09:39
谢谢两位大侠的回答,楼上所转载的文献,小弟已经再发贴前来回读了数十遍,发觉该注意的都注意着。我应该将情况再说具体点:

目前测试下来只有三种结果(同一张sd卡在5种不同的小机器上测试,然后换张卡重复操作,所用的代码不变,并且已验证函数返回TRUE,代表调用成功)

三种结果分别是:
1  返回的size 28 bytes, 标志位 0, 制造商序列号偏移量 16, sd卡序列号偏移量 18
2  返回的size 26 bytes, 标志位 1, 制造商序列号偏移量 0, sd卡序列号偏移量 16
3  返回的size 等于我初设的size, 其他全为0

我事先设定的可供写入的内存为256,确保能装下所有数据,并且得到结果在有效位之后都为0。函数返回为真。1和2 所得的序列号完全不同,1的结果与我用其他软件测试的结果相同(只可惜这个软件只能在某个特定机器上使用)。

百思不得其解,后来看到msdn中有这样一句
Note   This API is part of the complete Windows CE OS package as provided by Microsoft. The functionality of a particular platform is determined by the original equipment manufacturer (OEM) and some devices may not support this API.
是不是说api是微软定的,但是具体执行方式则是由OEM自己填充,这才可以解释为什么有的机器运行该函数返回TRUE但是实际上什么也没做。

不知道我理解是否有误,还请大家继续帮忙。

还有楼上指的IMGE是不是就是小机器,专业词汇不慎明了,sorry
点赞  2007-2-1 05:50
是的,楼主的理解没有错!
函数名是MS定的,但实现却不是MS。
点赞  2007-2-1 08:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复