ckforce
驱动牛犊
驱动牛犊
  • 注册日期2008-04-02
  • 最后登录2009-08-13
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1534回复:1

wince5下的DeviceIoControl与CTLCODE_SCSI_PASSTHROUGH的问题

楼主#
更多 发布于:2008-04-18 00:00
具体是这样的,
我们自己开发了一个usb设备,仿真成U盘接口的。
在xp平台下可以直接使用DeviceIoControl,CTLCODE_SCSI_PASS_THROUGH来收发数据,
现在正在把程序移植到CE5平台下,但在CE5平台下却一直不能正常工作,总是发送超时,而且收不到任何数据。

现在手边没有程序,所以只能大概写一下,朋友们帮忙看看,出出主意,应该怎么解决这个问题
TRANSPORT_COMMAND command;
TRANSPORT_DATA data;

//填写command与data

DeviceIoControl( m_hDevice, CTLCODE_SCSI_PASS_THROUGH,
                              &command,
                              sizeof(command),
                              &data,
                              sizeof(data),
                              NULL);


大概类似如此,明天去公司把完整代码贴出来。
请大家看看啦,有这方面的例程更好:)
ckforce
驱动牛犊
驱动牛犊
  • 注册日期2008-04-02
  • 最后登录2009-08-13
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-18 11:02
完整代码
DWORD dwResult = -1;

    TRANSPORT_COMMAND ptcCommand;
    TRANSPORT_DATA ptdData;
    UCHAR             bCDB[MAX_CDB];

    ZeroMemory(&ptcCommand, sizeof(TRANSPORT_COMMAND));     
    ZeroMemory(&ptdData, sizeof(TRANSPORT_DATA));     


    ptcCommand.Length = 10;
    ptcCommand.Flags = DATA_OUT;
    ptcCommand.dwLun = 0;
    ptcCommand.Timeout = 200;
    ptcCommand.CommandBlock = bCDB;

    memset ( bCDB, 0x00, sizeof ( bCDB ) );

    bCDB[0] = CMD_WRITE;
    bCDB[1] = 0;

    bCDB[7] = (UCHAR)(dwLength&0xff); 
    bCDB[8] = (UCHAR)(dwLength>>8);
    /*
    bCDB[7] = (UCHAR)((dwLength>>8)&0x0FF);
    bCDB[8] = (UCHAR)(dwLength&0x0FF); // 24
*/
    ptdData.DataBlock = lpData;
    ptdData.RequestLength = dwLength;
    ptdData.TransferLength = 0;

    DWORD dwBytesReturned;
    BOOL fResult = FALSE;

    DWORD dwIoControlCode = IOCTL_SCSI_PASSTHROUGH;// : IOCTL_DISK_WRITE;
    fResult = DeviceIoControl(
        m_hDevice,
        dwIoControlCode,
        &ptcCommand,
        sizeof(ptcCommand),
        &ptdData,
        sizeof ( ptdData),
        &dwBytesReturned,
        NULL);
    if (fResult)
    {
        ShowError1 ( L"\t\tSend::DeviceIoControl ok", GetLastError() );
    }
    else
    {
        ShowError1 ( L"\t\tSend::DeviceIoControl error", GetLastError() );
        goto EXIT;
    }

    dwResult = 0;

EXIT:;
    return dwResult;
游客

返回顶部