【问题标题】:why it was failed SetFilePointer()?为什么 SetFilePointer() 失败?
【发布时间】:2014-06-16 10:27:03
【问题描述】:
BOOL SetDeviceID(HANDLE device,char *id){//
    char data[2];
    data[0]=0x02;
    data[1]=0x27;

    DWORD dwPtr=SetFilePointer(device,0x33,//distance
                                NULL,//
                                FILE_BEGIN);
    if(dwPtr==INVALID_SET_FILE_POINTER) cout<<GetLastError()<<endl;
    BOOL result=WriteFile(device,data,2,NULL,NULL);
    //cout<<GetLastError()<<endl;

    if(result==false)cout<<"Fail WRITE    "<<endl;
    return TRUE;
}


HANDLE GetDeviceHandle(char *path){
    HANDLE handle= CreateFile(LPCSTR(path),
               GENERIC_ALL,//
               0,
               NULL,
               OPEN_EXISTING,
               NULL, 
               NULL);
    if(handle==INVALID_HANDLE_VALUE){
    cout<<"fail to createfile()"<<endl;
    exit(1);
    }
    else return handle;

}

这是我的一些代码。

我要直接读/写设备(usb)

在 ReadFile() 的情况下,它是成功的。

但是,我尝试调用 SetFilePointer

但GetLastError返回87,表示输入无效

有什么问题?在我的代码上

很快,CreateFile,ReadFile 没问题,但是 SetFilePointer 和 WriteFile 失败了

【问题讨论】:

  • device 是什么,你从哪里得到的?您的代码看起来不够相关和干净。
  • 设备来自 main() 请假设 HANDLE 参数有效。我已经用 ReadFile() 检查了这个值
  • 是的,我的设备是usb
  • 顺便说一句,不要声明函数HANDLE GetDeviceHandle(char *path)。这迫使你投到LPCSTR。而是声明参数const char *path

标签: winapi


【解决方案1】:

当您直接访问磁盘设备时,您无法查找扇区中间的位置。该位置必须始终是扇区长度的倍数。而且0x33 不是您的扇区长度的倍数。

您需要做的是读取整个扇区。修改需要修改的字节。最后写回整个扇区。

【讨论】:

  • 哦,谢谢,我会永远记住的。我再次需要你的帮助。有时,CreateFile() GetLastError() 返回 32,这意味着 ERROR_SHARING_VIOLATION 但是任何进程都无法访问我的 USB...(我的意见)我是否还需要编辑参数 CreateFile?要不然?只有我的应用程序接近我的 USB(这是有保证的)当我尝试 WriteFile 时,我的 USB 会按照我的代码进行更新。但它导致应用程序中止。我该如何调试我的程序?;;;;
  • 很难说。我倾向于相信 Windows 并假设其他东西正在访问驱动器。
  • 好的 Windows 可以访问我的设备 但是在应用程序级别,只有一个应用程序可以访问我的设备
  • 我猜是系统正在访问它。您确定需要使用直接访问来满足您的需求吗?我的猜测是有 API 可以做你在这里做的事情。
  • 我想像 Winhex 一样编辑我的设备低级别。调用 WriteFile() 时,它不会返回和中止进程。我将把标签放在设备(某些扇区)中。
猜你喜欢
  • 2012-10-08
  • 2016-10-10
  • 2011-05-16
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多