lhj117
驱动牛犊
驱动牛犊
  • 注册日期2004-07-26
  • 最后登录2008-10-24
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2045回复:2

使用IOCTL_SCSI_PASSTHROU 调用DeviceIoControl(),错误不知错在那里

楼主#
更多 发布于:2005-07-07 19:01
  BCB6 环境下
目的是  发送SCSI命令对设备进行读写
TCHAR *pname ="\\\\.\\USB#Vid_04cf&Pid_0809#100#{a5dcbf10-6530-11d2-901f-00c04fb951ed}";

HANDLE OpenCS881X( TCHAR *pname )//打开整个读卡器设备,非分区
{
       ////BOOL status = 0;
       DWORD dwAccessMode = 0, dwShareMode = 0;
       HANDLE fileHandle = NULL;

       dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; // default
       dwAccessMode = GENERIC_WRITE | GENERIC_READ; // default

       fileHandle = CreateFile( pname,
                        dwAccessMode,
                        dwShareMode,
                        NULL,
                      OPEN_EXISTING,
                        0,
                        NULL );

       if ( fileHandle == INVALID_HANDLE_VALUE )
       {
                           return NULL;
       }

       return fileHandle;
}
//这个函数打开设备成功


BOOL SPTI_WriteBlock( HANDLE hFile,int nBytes, DWORD offset )
{
       ULONG length = 0;
       DWORD dwBytesReturned = 0;
       BOOL bResult = FALSE;

       ZeroMemory( &SPTWB, sizeof( SCSI_PASS_THROUGH_WITH_BUFFERS ) );

       SPTWB.spt.Length = sizeof( SCSI_PASS_THROUGH );
       SPTWB.spt.PathId = 0;
       SPTWB.spt.TargetId = 1;
       SPTWB.spt.Lun = 0;
       SPTWB.spt.CdbLength = CDB10_LENGTH;
       SPTWB.spt.SenseInfoLength = 0;
       SPTWB.spt.DataIn = SCSI_IOCTL_DATA_IN;
       SPTWB.spt.DataTransferLength = 0;
       SPTWB.spt.TimeOutValue = 2;
       SPTWB.spt.DataBufferOffset = offsetof( SCSI_PASS_THROUGH_WITH_BUFFERS,
              DataBuf );
       SPTWB.spt.SenseInfoOffset = 0;
       SPTWB.spt.Cdb[ 0 ] = WRITE_CMD;
       SPTWB.spt.Cdb[ 1 ] = 0x0;
       SPTWB.spt.Cdb[ 2 ] = HIBYTE(HIWORD(offset));
       SPTWB.spt.Cdb[ 3 ] = LOBYTE(HIWORD(offset));
       SPTWB.spt.Cdb[ 4 ] = HIBYTE(LOWORD(offset));
       SPTWB.spt.Cdb[ 5 ] = LOBYTE(LOWORD(offset));
       SPTWB.spt.Cdb[ 6 ] = 0x0;
       SPTWB.spt.Cdb[ 7 ] = 0x0;
       SPTWB.spt.Cdb[ 8 ] = 0x10;
       SPTWB.spt.Cdb[ 9 ] = 0x0;

       length = offsetof( SCSI_PASS_THROUGH_WITH_BUFFERS, DataBuf );


       bResult =   DeviceIoControl( hFile, IOCTL_SCSI_PASS_THROUGH, &SPTWB, length,
              &SPTWB, length, &dwBytesReturned, FALSE );
       LAST_ERROR_CODE = GetLastError();
       if ( bResult == FALSE )
       {
                            return FALSE;
       }
       else
       {
                            return TRUE;
       }

      }
调用下边这个函数失败
DeviceIoControl()调用后返回失败,错误号为LAST_ERROR_CODE =50(不支持此请求---VC中的错误类型)


不知道那里问题,也不好调试
用BUSHOUND察看是找不到发出去的WRITE_CMD(应该就是原来那个数值巴?)

求教,该怎么办啊?

最新喜欢:

LeopardLeopar...
我要去热海(伊塞克池)洗澡,夷波海(巴尔喀什湖)吟诗,北海(贝加尔湖)牧羊,库页岛捕鱼
lhj117
驱动牛犊
驱动牛犊
  • 注册日期2004-07-26
  • 最后登录2008-10-24
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-07 19:15
驱动是XP自带的
我要去热海(伊塞克池)洗澡,夷波海(巴尔喀什湖)吟诗,北海(贝加尔湖)牧羊,库页岛捕鱼
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-07-08 18:48
下面是引用lhj117于2005-07-07 19:15发表的:
驱动是XP自带的

块设备不是随便一个参数都可以写的,都是固定大小一般至少是512
你直接WRITE FILE 和这个是一样的。实在没有必要这么做
---内核开发合作或提供基础技术服务QQ:22863668 ---
游客

返回顶部