【问题标题】:how to directly read/write usb (disk) like winhex?如何像winhex一样直接读/写usb(磁盘)?
【发布时间】:2014-06-13 22:07:10
【问题描述】:

我的目标是读/写usb。

首先必须像“程序”一样打开并读取usb低级

我在 winAPI 中使用了 Visual c++

下面是我的测试代码

char path[64];
sprintf(path,"\\\\.\\%c:",volume);//

/////MOST case, user's input is F or G ......
HANDLE usb;

usb=CreateFile(TEXT(path),
               GENERIC_ALL,//
               0,
               NULL,
               OPEN_EXISTING,
               FILE_ATTRIBUTE_NORMAL, //serail I/O
               NULL);

if(usb==INVALID_HANDLE_VALUE) cout<<"fail to createfile()"<<endl;

cout<<usb<<endl;    

char buf[128];

DWORD dwBytesRead=0;

ReadFile(usb,buf,sizeof(buf),&dwBytesRead,NULL);
cout<<buf<<endl;
cout<<GetLastError()<<endl;

CloseHandle(usb);

我想知道 CreateFile 是正确的和 ReadFile

ReadFile() 的 GetLastError() 是 87,这意味着 Invalid Input...

怎么了??

我多次引用MSDN...但是任何页面都不能解决这个问题....

我应该知道什么?修好吗?

【问题讨论】:

  • 如果您已经知道出了问题,您应该只调用GetLastError(检查来自ReadFile 的返回值)。成功的操作不一定会改变上一个错误。
  • 看到你的评论后,试着去做。但只有 ReadFile 的 GetLastError 返回 87..... 怎么了??
  • 你确定只在ReadFile返回FALSE时调用GetLastError()吗?
  • 是的,当我调用 CreateFile 时,只有 ReadFile 返回 87,GetLastError 返回 0
  • TEXT 宏用于字符串 literals。由于它可以编译,我怀疑您没有选择 unicode(否则 TEXT(path) 将扩展为 Lpath 并且不存在);你真的应该。事实上,我相信像\\.\ 这样的特殊前缀只能在宽界面中使用。

标签: c++ winapi


【解决方案1】:

缓冲区大小必须等于 N *(驱动器的扇区大小),其中 N 是 DWORD 值。可以使用 DeviceIoControl(Handle, IOCTL_DISK_GET_DRIVE_GEOMETRY, ..., DISK_GEOMETRY, ...) 接收扇区大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-18
    • 2014-11-23
    • 2010-09-07
    • 2014-04-17
    • 2011-02-20
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多