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);
  • 相关阅读:
    WebRTC视频分辨率设置
    WebRTC本地插入多个转发节点,模拟多节点转发,造成延迟
    Android SeekBar 自定义thumb,thumb旋转动画效果
    WebRTC从摄像头获取图片传入canvas
    WebRTC本地分享屏幕,录制屏幕
    Android 悬浮窗
    WebRTC与音频音量
    WebRTC概念介绍
    Android CameraX ImageAnalysis 获取视频帧
    Android 摄像头预览悬浮窗
  • 原文地址:https://www.cnblogs.com/sunmaoduo/p/3923720.html
Copyright © 2011-2022 走看看