阅读:2994回复:10
有做WINCE 3.0下直接读写扇区编程的么?
我是在SH4处理器下要求直接读定指扇区,请做过的多多帮忙啊。
|
|
|
沙发#
发布于:2003-05-16 17:55
没有人来UP一下,UP有分哦.
|
|
|
板凳#
发布于:2003-05-19 17:57
我在GOOGLE上找到了一篇文章,是关于这个主题的,它DEMO了一个类来读底层的CF
http://groups.google.com/groups?hl=zh-CN&lr=&ie=UTF-8&oe=UTF-8&selm=cff9bf9a.0304081528.1697aa43%40posting.google.com&rnum=4 大概步骤如下: m_hFlash=CreateFile(TEXT(\"DSK1\"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); IOCTL_DISK_GETINFO bResult = DeviceIoControl(m_hFlash, // device we are querying IOCTL_DISK_GETINFO, // operation to perform NULL, 0, // no input buffer, so pass zero pdg, sizeof(*pdg), // output buffer &junk, // discard count of bytes returned (LPOVERLAPPED) NULL); // synchronous I/O if (m_bFlashGood) { LARGE_INTEGER DistanceToMove; LARGE_INTEGER NewFilePointer; DistanceToMove.LowPart = startingAddress; DistanceToMove.HighPart = 0; BOOL flg = SetFilePointerEx(m_hFlash,DistanceToMove,&NewFilePointer,FILE_BEGIN); bResult = ReadFile(m_hFlash,buffer,blockSize,&count,NULL); IOCTL_DISK_GET_DRIVE_GEOMETRY可以改用IOCTL_DISK_GETINFO代替。 |
|
|
地板#
发布于:2003-05-27 09:43
呵呵,多谢joyfly兄的回复,我先试试去了。
|
|
|
地下室#
发布于:2003-05-28 04:31
直接读写什么东西的扇区?
下面那位老兄给出的是对驱动程序的访问,所有的东西都是驱动来做的呀。 |
|
5楼#
发布于:2003-05-28 09:34
就是要通过USB口在WINCE系统下读取CF卡第一扇区上的数据,上面的老兄可有什么好的方法,我通过JOYFLY兄的方法做过,但没有读到任何数据,另外还通过DeviceIoControl(HANDLE, DSK_IOCTL_READ)的方法也读不到任何数据.
|
|
|
6楼#
发布于:2003-05-28 18:11
呵呵。那位老兄给出的程序需要假定下层的驱动已经完整地实现了那些控制代码才可以工作。
你如果手头没有现成的驱动,那么可以自己实现一个。然后从应用程序用那位老兄的方法去做。自己写一个驱动的好处是一劳永逸。 如果你现在没工夫,可以参考cf的手册和例子程序。把它们直接搬到你的程序中就成。注意修改一下端口访问的函数,ce下面用macro实现了和nt下面类似的端口访问例程;另外就是内存映射的处理,参考一下ce下面的驱动程序就成。 |
|
7楼#
发布于:2003-05-28 19:15
hi,FeaHoo
DeviceIoControl(HANDLE, DSK_IOCTL_READ)应该可以成功的吧。 DSK_IOCTL_READ没有在SDK中,你是按D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\INC\\diskio.h里的来自己定义的吗? CF的标准驱动程序在D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\DRIVERS\\BLOCK\\ATADISK,我看了system.c,发现DSK_IoControl()下实现了DSK_IOCTL_READ,DSK_IOCTL_WRITE 还有pInBuf参数是一个PSG_REQ结构,也是在diskio.h里定义的。我想你需要自己把diskio.h include进去。 所以如果你调用DeviceIoControl(HANDLE, DSK_IOCTL_READ)应该是可以的。 如果你的平台是自己BUILD的,你可以在system.c里自己加些RETAILMSG(1,(_T(\"DSK_IoControl::DSK_IOCTL_READ...\"))); 之类的调试信息,看看DSK_IOCTL_READ的处理是否真正被执行了. 编译的时候,要从PB里打开Build->Open Build Release Directory,然后cd D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\DRIVERS\\BLOCK\\ATADISK,再build -cfs,这样D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\LIB\\ARMV4\\RETAIL\\atadisk_lib.lib 才会更新,再重新编译你的平台里,你所做的更改才能被使用。 试试吧! |
|
|
8楼#
发布于:2003-05-28 21:18
我写了段实验代码,确实能读出数据了,不过我无法验证数据是否正确,你试一下吧。
#include \"D:\\WINCE420\\PUBLIC\\COMMON\\OAK\\INC\\diskio.h\" #define SECTORBUFSIZE 0X100 #define SECTORSTARTADDR 1 void ReadCFSector() { SG_REQ sg; DWORD dwRead =0; BOOL bResult = FALSE; DWORD dwErr = 0; BYTE ucBuf[SECTORBUFSIZE] ; ghDisk = CreateFile(_T(\"\\\\Storage Card\\\\VOL:\"),GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING ,NULL,NULL); if (!ghDisk) { dwErr = GetLastError(); AfxMessageBox((_T(\"Can\'t open CF Card! Error Code(%d)\"),dwErr),NULL,NULL); return; } sg.sr_start = (DWORD)SECTORSTARTADDR; sg.sr_num_sec = 1; sg.sr_num_sg = 1; sg.sr_status = 0; sg.sr_callback = NULL; sg.sr_sglist[0].sb_buf = ucBuf;/* (PBYTE)MapPtrToProcess((LPVOID)ucBuf, GetCurrentProcess());*/ sg.sr_sglist[0].sb_len = SECTORBUFSIZE; bResult = DeviceIoControl(ghDisk,DISK_IOCTL_READ,&sg,sizeof(SG_REQ), NULL,NULL,&dwRead,NULL); if (!bResult) { dwErr = GetLastError(); AfxMessageBox((_T(\"Can\'t read CF Card sector!Error Code(%d)\"),dwErr),NULL,NULL); } CloseHandle(ghDisk); } |
|
|
9楼#
发布于:2003-05-29 09:59
JoyFly兄,我照你的方法写了一个TEST CODE,但还是执行不成功,由于我们现在这个系统是由另外一厂家BUILD的,所以不大可能去看它到底执行了没有。
我自己的程序调用DeviceIoControl()是没有错误的,但是我用GetLastError()发现它的错误代码是5,也就是访问CF卡被拒绝了,不知这是为什么,另外我在读之前,先DSK_IOCTL_GETINFO却能执行成功,获得了扇区大小为512字节,你说这是什么原因? |
|
|
10楼#
发布于:2003-06-03 11:51
有谁知道GUID_DEVINTERFACE_DISK的值到底是多少,定义在哪个文件中,我搜遍了我的系统都找不到这个值啊。
|
|
|