12877|56

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Windows CE下读写U盘的第一个扇区(进者有分) [复制链接]

在Windows XP系统下,我通过如下代码(VB编写)
可实现向U盘(映射到我的XP系统下之后,磁盘目录为“K”)
的第一个扇区写入数据(这里写入的为0)
这样就破坏了U盘的引导程序(或者破话了U盘的文件系统)
使得U盘已经无法正常使用
代码如下,我已经验证过:
——————————————————————————
  1.     Public Shared Function WriteUDisk(ByVal id As Byte) As String
  2.         Dim ReturnStr As String = "ok"
  3.         '<1>打开U盘并返回U盘的句柄
  4.         Dim drivename As String = String.Concat("\\.\K", ":")

  5.         Dim device As Integer = CreateFile(drivename, generic_read Or generic_write, 0, 0, open_existing, 0, 0)

  6.         If device = invalid_handle_value Then
  7.             CloseHandle(device)
  8.             ReturnStr = "打开U盘" + id.ToString + "错"
  9.             Return ReturnStr
  10.         End If

  11.         '<2>定位写指针
  12.         Dim MyPointer As Int32

  13.         Try
  14.             MyPointer = SetFilePointer(device, 0, 0, 0)
  15.         Catch ex As Exception
  16.             CloseHandle(device)
  17.             ReturnStr = "定位U盘" + id.ToString + "指针错。" + ex.Message.ToString
  18.             Return ReturnStr
  19.         End Try


  20.         '<2>写一个扇区的数据到U盘

  21.         Dim MyByteNumber As Integer
  22.         Dim bBuffer(511) As Byte
  23.         Dim i As Integer
  24.         Dim MyResult As Integer

  25.         bBuffer(0) = CByte(Asc("S"))
  26.         bBuffer(1) = CByte(Asc("J"))
  27.         bBuffer(2) = CByte(Asc("M"))
  28.         For i = 3 To 511
  29.             bBuffer(i) = &H0
  30.         Next

  31.         Try
  32.             MyResult = WriteFile(device, bBuffer(0), 512, MyByteNumber, 0)
  33.         Catch ex As Exception
  34.             CloseHandle(device)
  35.             ReturnStr = "写U盘" + id.ToString + "错。" + ex.Message.ToString
  36.             Return ReturnStr
  37.         End Try

  38.         'MyResult = FlushFileBuffers(device)

  39.         If MyResult = 0 Then
  40.             CloseHandle(device)
  41.             ReturnStr = "U盘" + id.ToString + "错。"
  42.             Return ReturnStr
  43.         Else
  44.             CloseHandle(device)
  45.             ReturnStr = "写U盘" + id.ToString + "成功。"
  46.             Return ReturnStr
  47.         End If

  48.     End Function
  49. End Class
复制代码

——————————————————————————
同样的方法我想在Windows CE下实现,用Visual C++编写
或者用VB编写都已经试过了。都是在“操作文件指针”的时候就失败了。
我不清楚是什么原因。我想请教各位大侠:
1> 是不是CE 和 XP在驱动层的差别的缘故,我要实现如上目的,
是否还需要在CE的驱动层,编写驱动函数来达到我
“向U盘第1个扇区写入数据”的操作
(注:我在定制系统的时候,加入了USB Storage Class Driver组件
,可以正常使用U盘)
2> 哪位大侠做过类似的操作,(非以.txt等文件形式读写),请给
小弟指点。分数不多,可以另加。多谢大家。
以下是我编写的CE下的代码:(分为VB,VC两种)
一 VC
——————————————————————————
  1. void CURWDlg::OnBnClickedButton1()
  2. {
  3.         // TODO: 在此添加控件通知处理程序代码
  4.         LPDWORD lpFileSizeHigh;

  5.         hFile = CreateFile(_T("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0,
  6.                                            NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);
  7.         if (hFile == INVALID_HANDLE_VALUE)
  8.         {
  9.                 MessageBox(_T("在SD/MMC卡上创建文件失败!"));
  10.                 return;
  11.         }
  12.         else
  13.         {
  14.                 MessageBox(_T("在SD/MMC卡上创建文件成功!"));
  15.         }

  16.         DWORD pFile=SetFilePointer(hFile,0,NULL,FILE_BEGIN);

  17.         if(pFile == INVALID_SET_FILE_POINTER)
  18.         {
  19.                 MessageBox(_T("指针定位失败!"));
  20.         }
  21.         else
  22.         {
  23.                 MessageBox(_T("指针定位成功!"));
  24.         }

  25.         BYTE DataT[511];

  26.         for(int i=0;i<512;i++)
  27.         {
  28.                 DataT[i]=0x00;
  29.         }
  30.        
  31.         DWORD ActNum;
  32.         BOOL TF = WriteFile(hFile,&DataT[0],512,&ActNum,NULL);

  33.         if(TF == TRUE)
  34.         {
  35.                 MessageBox(_T("写文件成功!"));
  36.         }
  37.         else
  38.         {
  39.                 MessageBox(_T("写文件失败!"));
  40.         }

  41.         CloseHandle(hFile);
  42. }
复制代码

——————————————————————————
二 VB
——————————————————————————
  1. Public Shared Function WriteUDisk(ByVal id As Byte) As String
  2.         Dim ReturnStr As String = "ok"
  3.         '<1>打开U盘并返回U盘的句柄
  4.         Dim drivename As String = String.Concat("DSK", id.ToString() + ":")

  5.         'Dim device As Integer = CreateFile(drivename, generic_read Or generic_write, file_share_read Or file_share_write, 0, open_existing, 0, 0)
  6.         Dim device As Integer = CreateFile(drivename, generic_write, file_share_write, 0, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, 0)

  7.         If device = invalid_handle_value Then
  8.             CloseHandle(device)
  9.             ReturnStr = "打开U盘" + id.ToString + "错"
  10.             Return ReturnStr
  11.         End If

  12.         '<2>定位写指针
  13.         Dim MyPointer As Integer

  14.         Try
  15.             MyPointer = SetFilePointer(device, 0, 0, 0)
  16.         Catch ex As Exception
  17.             CloseHandle(device)
  18.             ReturnStr = "定位U盘" + id.ToString + "指针错。" + ex.Message.ToString
  19.             Return ReturnStr
  20.         End Try

  21.         If MyPointer = 0 Then
  22.             CloseHandle(device)
  23.             ReturnStr = "定位U盘" + id.ToString + "错。"
  24.             Return ReturnStr
  25.         End If

  26.         '<2>写一个扇区的数据到U盘
  27.         Dim bBuffer(511) As Byte
  28.         Dim MyByteNumber As Integer
  29.         Dim i As Integer
  30.         Dim MyResult As Integer

  31.         bBuffer(0) = CByte(Asc("S"))
  32.         bBuffer(1) = CByte(Asc("J"))
  33.         bBuffer(2) = CByte(Asc("M"))
  34.         For i = 3 To 511
  35.             bBuffer(i) = &HFF
  36.         Next

  37.         Try
  38.             MyResult = WriteFile(device, bBuffer(0), 512, MyByteNumber, 0)
  39.         Catch ex As Exception
  40.             CloseHandle(device)
  41.             ReturnStr = "写U盘" + id.ToString + "指令错。" + ex.Message.ToString
  42.             Return ReturnStr
  43.         End Try

  44.         If MyResult = 0 Then
  45.             CloseHandle(device)
  46.             ReturnStr = "写U盘" + id.ToString + "错。"
  47.             Return ReturnStr
  48.         Else
  49.             CloseHandle(device)
  50.             ReturnStr = "写U盘" + id.ToString + "成功。"
  51.             Return ReturnStr
  52.         End If

  53.     End Function
复制代码

最新回复

哦?这个函数在驱动里是写好的?我没有找到呢。 如何调用,请大侠接着指点指点。  详情 回复 发表于 2009-12-23 09:26
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
多谢分享
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
谢谢,正在研究有关东西呢
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
关注一下,活到老学到老
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

5
 
标记下
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
先友情帮顶下。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 1 楼 flandy1982 的回复:
应该是CE里没有实现seek操作...SetFilePointer只是一个空函数..

这个函数,我在以文件的形式操作的时候是管用的
比如我建立一个a.txt
然后写入数据
可以成功,之后调用SetFilePointer
移动指针,写入数据
都是可以实现的
——————————————————————————
JOYZML(菜鸟朱铭雷)
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
读那里干嘛?那里估计存着MBR,写了还得了啊,肯定不能用了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
你的win7 哪个版本的啊?
实在不行,到网上找个第三方软件,做web服务器
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 42 楼 maylee9 的回复:
你的win7 哪个版本的啊?
实在不行,到网上找个第三方软件,做web服务器

老兄会错帖子了吧。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
mark一下
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
暂时不懂,顶下
 
 
 

回复

1

帖子

0

TA的资源

禁止访问

13
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习了,帮顶~~
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
学习,关注中.....
顶帖
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 

不同操作系统的驱动程序有差异。

用 DeviceIoControl 函数发送 Mass storage device bulk SCSI 协议命令就可以了。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

17
 
不错
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 3 楼 joyzml 的回复:
引用 1 楼 flandy1982 的回复:
应该是CE里没有实现seek操作...SetFilePointer只是一个空函数..

这个函数,我在以文件的形式操作的时候是管用的
比如我建立一个a.txt
然后写入数据
可以成功,之后调用SetFilePointer
移动指针,写入数据
都是可以实现的
——————————————————————————
JOYZML(菜鸟朱铭雷)


建立a.txt以及对其进行操作, 都是调用的fat的驱动进行操作的.

我又看了下SD卡驱动的代码, 确实对SD卡的直接读写以及定位都是未实现的..
// The function Not supported.
DWORD SCR_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod){return 0;}
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
引用 4 楼 gooogleman 的回复:
读那里干嘛?那里估计存着MBR,写了还得了啊,肯定不能用了。

一军队科研的朋友要这么做。我也不清楚具体目的。
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 5 楼 flandy1982 的回复:
引用 3 楼 joyzml 的回复:
引用 1 楼 flandy1982 的回复:
应该是CE里没有实现seek操作...SetFilePointer只是一个空函数..

这个函数,我在以文件的形式操作的时候是管用的
比如我建立一个a.txt
然后写入数据
可以成功,之后调用SetFilePointer
移动指针,写入数据
都是可以实现的
——————————————————————————
JOYZML(菜鸟朱铭雷)


建立a.txt以及对其进行操作, 都是调用的fat的驱动进行操作的.

我又看了下SD卡驱动的代码, 确实对SD卡的直接读写以及定位都是未实现的..
// The function Not supported.
DWORD SCR_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod){return 0;}


恩。我也去看了下这段代码。
——————————————————————————
// The function Not supported.
DWORD SCR_Read(DWORD Handle, LPVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Write(DWORD Handle, LPCVOID pBuffer, DWORD dwNumBytes){return 0;}
DWORD SCR_Seek(DWORD Handle, long lDistance, DWORD dwMoveMethod){return 0;}
——————————————————————————
Not supported
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表