zoukankan      html  css  js  c++  java
  • CyUSB.sys的说明文档CyUSB.chm-IOCTL接口范例-IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER

    DeviceIoControl()可以利用Io Control (aka IOCTL) code操作USB设备驱动,这些IOCTL码由谁定义由谁解释呢?(CyAPI.lib? CyUSB.dll? CyUSB.sys?)

    答案:cyioctl.h
    例如:
    #define IOCTL_ADAPT_GET_DRIVER_VERSION         CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX, METHOD_BUFFERED, FILE_ANY_ACCESS)

    ..

    #define IOCTL_ADAPT_GET_ALT_INTERFACE_SETTING CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX+2, METHOD_BUFFERED, FILE_ANY_ACCESS)

    至于“FILE_DEVICE_UNKNOWN, IOCTL_ADAPT_INDEX, METHOD_BUFFERED, FILE_ANY_ACCESS”这些东西的定义,应该是在Windows相关头文件or库里面吧。

    这是IOCTL Interface的IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER的使用范例

    Description

    This command sends a control request to the default Control endpoint, endpoint zero.

    DeviceIoControl( ) is passed a pointer to a two-part structure as both the lpInBuffer and lpOutBuffer parameters. This two-part structure contains a SINGLE_TRANSFER structure followed by a data buffer.

    The SINGLE_TRANSFER structure contains all the parameters for the control request.

    The buffer contains the transfer data.

    pXmitBuf
      SINGLE_TRANFER
        bmRequest
        Request
        .
        .
      buff

     

    union  {
    
    struct   {
    
    UCHAR Recipient:5; //接收方: Device,Interface,Endpoint,Other
    UCHAR  Type:2;  //Type: Standard,Class,Vendor
    UCHAR Direction:1; //数据传输方向: Host2Device,Device2Host
    } bmRequest;
     UCHAR bmReq;   //请求类型
    };
    
    bmRequest.Recipient = 0; //  Device
    bmRequest.Type      = 2; //  Vendor
    bmRequest.Direction = 1; // IN command (from  Device to Host)
    
     
    int iXmitBufSize = sizeof(SINGLE_TRANSFER) + bufLen; //  The size of the two-part structure. XmitBuf is the two-part structure.
    
    UCHAR *pXmitBuf = new UCHAR[iXmitBufSize];           //  Allocate the memory 创建iXmitBufSize大小的UCHAR变量
    
    ZeroMemory(pXmitBuf, iXmitBufSize);     // 指定存储空(UCHAR)间清零
    
    PSINGLE_TRANSFER pTransfer = (PSINGLE_TRANSFER)pXmitBuf; //  The SINGLE_TRANSFER comes first 下面首先定义SINGLE_TRANSFER Structure的值
    
    pTransfer->SetupPacket.bmRequest = bmReq;    //Birmap Characteristics of request
    pTransfer->SetupPacket.bRequest = ReqCode;    //Specific request
    pTransfer->SetupPacket.wValue = Value;       
    pTransfer->SetupPacket.wIndex = Index;
    pTransfer->SetupPacket.wLength = bufLen;      //Number of bytes to transfer if there is a Data stage
    pTransfer->SetupPacket.ulTimeOut = TimeOut / 1000;
    pTransfer->Reserved = 0;
    pTransfer->ucEndpointAddress = 0x00;     //  Control pipe
    pTransfer->IsoPacketLength = 0;
    pTransfer->BufferOffset = sizeof (SINGLE_TRANSFER);
    pTransfer->BufferLength = bufLen;
    DWORD dwReturnBytes;
     
    DeviceIoControl (hDevice, IOCTL_ADAPT_SEND_EP0_CONTROL_TRANSFER,
                 pXmitBuf,  iXmitBufSize,
                 pXmitBuf,  iXmitBufSize,
                 &dwReturnBytes,  NULL);
     
    // Copy data into  buf
    UCHAR *ptr = pXmitBuf + sizeof (SINGLE_TRANSFER);
    memcpy(buf, ptr, dwReturnBytes);
  • 相关阅读:
    //删除字符串值的某个值
    disabled和readonly 的用法区别
    Js判断为空或不是对象或是否相等
    1.类型分析:
    多行内容放到一行中(内容的合并)
    sql split
    sql修改列名
    对oracle数字类型的研究
    kettle--组件(3)--行转列
    kettle--组件(2)--计算器
  • 原文地址:https://www.cnblogs.com/sunmaoduo/p/3923720.html
Copyright © 2011-2022 走看看