首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

Windows CE下读写U盘的第一个扇区(进者有分),该怎么处理

2012-03-23 
Windows CE下读写U盘的第一个扇区(进者有分)在Windows XP系统下,我通过如下代码(VB编写)可实现向U盘(映射

Windows CE下读写U盘的第一个扇区(进者有分)
在Windows XP系统下,我通过如下代码(VB编写)
可实现向U盘(映射到我的XP系统下之后,磁盘目录为“K”)
的第一个扇区写入数据(这里写入的为0)
这样就破坏了U盘的引导程序(或者破话了U盘的文件系统)
使得U盘已经无法正常使用
代码如下,我已经验证过:
——————————————————————————

VB code
    Public Shared Function WriteUDisk(ByVal id As Byte) As String        Dim ReturnStr As String = "ok"        '<1>打开U盘并返回U盘的句柄        Dim drivename As String = String.Concat("\\.\K", ":")        Dim device As Integer = CreateFile(drivename, generic_read Or generic_write, 0, 0, open_existing, 0, 0)        If device = invalid_handle_value Then            CloseHandle(device)            ReturnStr = "打开U盘" + id.ToString + "错"            Return ReturnStr        End If        '<2>定位写指针        Dim MyPointer As Int32        Try            MyPointer = SetFilePointer(device, 0, 0, 0)        Catch ex As Exception            CloseHandle(device)            ReturnStr = "定位U盘" + id.ToString + "指针错。" + ex.Message.ToString            Return ReturnStr        End Try        '<2>写一个扇区的数据到U盘        Dim MyByteNumber As Integer        Dim bBuffer(511) As Byte        Dim i As Integer        Dim MyResult As Integer        bBuffer(0) = CByte(Asc("S"))        bBuffer(1) = CByte(Asc("J"))        bBuffer(2) = CByte(Asc("M"))        For i = 3 To 511            bBuffer(i) = &H0        Next        Try            MyResult = WriteFile(device, bBuffer(0), 512, MyByteNumber, 0)        Catch ex As Exception            CloseHandle(device)            ReturnStr = "写U盘" + id.ToString + "错。" + ex.Message.ToString            Return ReturnStr        End Try        'MyResult = FlushFileBuffers(device)        If MyResult = 0 Then            CloseHandle(device)            ReturnStr = "U盘" + id.ToString + "错。"            Return ReturnStr        Else            CloseHandle(device)            ReturnStr = "写U盘" + id.ToString + "成功。"            Return ReturnStr        End If    End FunctionEnd Class

——————————————————————————
同样的方法我想在Windows CE下实现,用Visual C++编写
或者用VB编写都已经试过了。都是在“操作文件指针”的时候就失败了。
我不清楚是什么原因。我想请教各位大侠:
1> 是不是CE 和 XP在驱动层的差别的缘故,我要实现如上目的,
是否还需要在CE的驱动层,编写驱动函数来达到我
“向U盘第1个扇区写入数据”的操作
(注:我在定制系统的时候,加入了USB Storage Class Driver组件
,可以正常使用U盘)
2> 哪位大侠做过类似的操作,(非以.txt等文件形式读写),请给
小弟指点。分数不多,可以另加。多谢大家。
以下是我编写的CE下的代码:(分为VB,VC两种)
一 VC
——————————————————————————
C/C++ code
void CURWDlg::OnBnClickedButton1(){    // TODO: 在此添加控件通知处理程序代码    LPDWORD lpFileSizeHigh;    hFile = CreateFile(_T("DSK1:"), GENERIC_READ | GENERIC_WRITE, 0,                        NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL);    if (hFile == INVALID_HANDLE_VALUE)    {        MessageBox(_T("在SD/MMC卡上创建文件失败!"));        return;    }    else    {        MessageBox(_T("在SD/MMC卡上创建文件成功!"));    }    DWORD pFile=SetFilePointer(hFile,0,NULL,FILE_BEGIN);    if(pFile == INVALID_SET_FILE_POINTER)    {        MessageBox(_T("指针定位失败!"));    }    else    {        MessageBox(_T("指针定位成功!"));    }    BYTE DataT[511];    for(int i=0;i<512;i++)    {        DataT[i]=0x00;    }        DWORD ActNum;    BOOL TF = WriteFile(hFile,&DataT[0],512,&ActNum,NULL);    if(TF == TRUE)    {        MessageBox(_T("写文件成功!"));    }    else    {        MessageBox(_T("写文件失败!"));    }    CloseHandle(hFile);}

——————————————————————————
二 VB
——————————————————————————
VB code
 Public Shared Function WriteUDisk(ByVal id As Byte) As String        Dim ReturnStr As String = "ok"        '<1>打开U盘并返回U盘的句柄        Dim drivename As String = String.Concat("DSK", id.ToString() + ":")        'Dim device As Integer = CreateFile(drivename, generic_read Or generic_write, file_share_read Or file_share_write, 0, open_existing, 0, 0)        Dim device As Integer = CreateFile(drivename, generic_write, file_share_write, 0, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, 0)        If device = invalid_handle_value Then            CloseHandle(device)            ReturnStr = "打开U盘" + id.ToString + "错"            Return ReturnStr        End If        '<2>定位写指针        Dim MyPointer As Integer        Try            MyPointer = SetFilePointer(device, 0, 0, 0)        Catch ex As Exception            CloseHandle(device)            ReturnStr = "定位U盘" + id.ToString + "指针错。" + ex.Message.ToString            Return ReturnStr        End Try        If MyPointer = 0 Then            CloseHandle(device)            ReturnStr = "定位U盘" + id.ToString + "错。"            Return ReturnStr        End If        '<2>写一个扇区的数据到U盘        Dim bBuffer(511) As Byte        Dim MyByteNumber As Integer        Dim i As Integer        Dim MyResult As Integer        bBuffer(0) = CByte(Asc("S"))        bBuffer(1) = CByte(Asc("J"))        bBuffer(2) = CByte(Asc("M"))        For i = 3 To 511            bBuffer(i) = &HFF        Next        Try            MyResult = WriteFile(device, bBuffer(0), 512, MyByteNumber, 0)        Catch ex As Exception            CloseHandle(device)            ReturnStr = "写U盘" + id.ToString + "指令错。" + ex.Message.ToString            Return ReturnStr        End Try        If MyResult = 0 Then            CloseHandle(device)            ReturnStr = "写U盘" + id.ToString + "错。"            Return ReturnStr        Else            CloseHandle(device)            ReturnStr = "写U盘" + id.ToString + "成功。"            Return ReturnStr        End If    End Function 



[解决办法]
应该是CE里没有实现seek操作...SetFilePointer只是一个空函数..
[解决办法]
先友情帮顶下。
[解决办法]
读那里干嘛?那里估计存着MBR,写了还得了啊,肯定不能用了。
[解决办法]
探讨
引用:
应该是CE里没有实现seek操作...SetFilePointer只是一个空函数..

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

[解决办法]
这是??验证成功了?
[解决办法]
先接后看
[解决办法]
关注关注
[解决办法]
学些下,MARK/
[解决办法]
关注一下啊
[解决办法]
不懂 ..
[解决办法]
出错后GetLastError看看返回什么。
文件刚打开时,文件指针就是在开始的位置,不需要移动。

顺便提两点,与此问题无关:打开磁盘应该指定读写共享;数组长度应该是512,而你定义的是511,少了1字节。
[解决办法]
用VB写 WINCE的程序 会不会很多类都不支持啊??
[解决办法]
VB写 WINCE的程序 会不会很多类都不支持啊??
[解决办法]
持续关注中~~
[解决办法]
关注关注!!
[解决办法]
学习了
[解决办法]
第0块是与文件系统相关的MBR,LZ要写这个地方的话,应该是用了自己的文件系统吧,重新编排一下MBR,如果只是用fat32等的话,你是不能替换掉的,不然,设备无法工作。。。
[解决办法]
0扇区,你写BOOT文件?不然不能写,建议看下文件系统相关!
[解决办法]
学习
[解决办法]
向你们学习!!!
[解决办法]
这样也行啊。还真没这么干过。
[解决办法]

[解决办法]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[解决办法]
顶一下。
[解决办法]
积分好低
[解决办法]
学习了
[解决办法]
学习中 关注一下
[解决办法]

[解决办法]
不懂!帮顶!
[解决办法]
LZ要写的区域是系统保护的

通过CE给的API是无法访问的



如果一定要写,调用驱动里读写block的deviceioctol可以访问
[解决办法]
你的win7 哪个版本的啊? 
实在不行,到网上找个第三方软件,做web服务器
[解决办法]
关注
[解决办法]
mark一下
[解决办法]
暂时不懂,顶下
[解决办法]
接分
[解决办法]
学习了,帮顶~~
[解决办法]
学习,关注中.....
顶帖
[解决办法]

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

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

[解决办法]
不错

热点排行