WINCE 流驱动的xx_IOControl

学习提速专享!AI工具全家桶免费用 限时购周边加赠Coding Plan Lite,解锁20+主AI工具,写代码、查资料快人一步! 阅读详情
 

前言

       刚刚完成一个WINCE 下的I2C的流驱动,由于在读I2C 时要进行参数的传入和传出,所以其中的xx_IOControl必须要完成,像一些简单的传递单向数据的驱动,要xx_Read或xx_Write就可以实现.

       之前没有写过xx_IOControl,所以参考了网上的代码又结合自己的软硬件环境,我现有的BSP 里已经实现了I2C 读写的基本函数,所以只需要我驱动了作好初始化,并处理好读写I2C 之前的工作,正确的传入参数,正确的调用现有的i2c读写函数就可以了.

      说明下,我访问的I2C 从器件是eeprom :CAT24C04.功能只实现简单的读byte和写byte.

 

准备工作:了解IOControl 的使用,这里引用下其他人的总结

=========引用开始=================================

 原文地址: http://hi.baidu.com/magical/blog/item/3e6746103ea036f9c2ce79c0.html

DeviceIoControl的使用说明
2008-07-15 10:57

        应用程序和驱动程序的通信过程是:应用程序使用CreateFile函数打开设备,然后用DeviceIoControl与驱动程序进行通信,包括读和写两种操作。还可以用ReadFile读数据用WriteFile写数据。操作完毕时用CloseHandle关闭设备。我们比较常用的就是用DeviceIoControl对设备进行读写操作。先看看DeviceIoControl是怎么定义的:

BOOL DeviceIoControl(
  HANDLE hDevice, 
  DWORD dwIoControlCode, 
  LPVOID lpInBuffer, 
  DWORD nInBufferSize, 
  LPVOID lpOutBuffer, 
  DWORD nOutBufferSize, 
  LPDWORD lpBytesReturned, 
  LPOVERLAPPED lpOverlapped
);
Parameters(参数)
hDevice (CreateFile返回的设备句柄)
[in] Handle to the device that is to perform the operation. To obtain a device handle, call the CreateFile function.
dwIoControlCode (应用程序调用驱动程序的控制命令,就是IOCTL_XXX IOCTLs )
[in] IOCTL for the operation. This value identifies the specific operation to perform and the type of device on which to perform the operation. There are no specific values defined for the dwIoControlCode parameter. However, you can define custom IOCTL_XXX IOCTLs with the CTL_CODE macro. You can then advertise these IOCTLs and an application can use these IOCTLs with DeviceIoControl to perform the driver-specific functions.
lpInBuffer (应用程序传递给驱动程序的数据缓冲区地址)
[in] Long pointer to a buffer that contains the data required to perform the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not require input data.
nInBufferSize (应用程序传递给驱动程序的数据缓冲区大小,字节数)
[in] Size, in bytes, of the buffer pointed to by lpInBuffer.
lpOutBuffer (驱动程序返回给应用程序的数据缓冲区地址)
[out] Long pointer to a buffer that receives the output data for the operation. Set to NULL if the dwIoControlCode parameter specifies an operation that does not produce output data.
nOutBufferSize (驱动程序返回给应用程序的数据缓冲区大小,字节数)
[out] Size, in bytes, of the buffer pointed to by lpOutBuffer.
lpBytesReturned (驱动程序实际返回给应用程序的数据字节数地址)
[out] Long pointer to a variable that receives the size, in bytes, of the data stored in lpOutBuffer. The DeviceIoControl function may unnecessarily use this parameter. For example, if an operation does not produce data for lpOutBuffer and lpOutBuffer is NULL, the value of lpBytesReturned is meaningless.
lpOverlapped (重叠操作结构)
[in] Ignored; set to NULL.
Return Values(返回值)

Nonzero indicates success. Zero indicates failure. To obtain extended error information, call the GetLastError function. (非0成功,0失败)

具体使用我们看看列子:

1,向设备传递数据,我们定义一个函数来实现

bool CDeviceOperDlg::SendKeyData(HANDLE handle, BYTE *bData, int iSize)
{
ULONG nOutput;
BYTE bTemp[512];

//将数据放置到发送数组
memset(bTemp,0,sizeof(bTemp));
memcpy(bTemp,&bData[0],iSize);
//向设备发送
if (!DeviceIoControl(handle,        
       ATST2004_IOCTL_WRITE,     //根据具体的设备有相关的定义
       bTemp,                                        //向设备传递的数据地址
       iSize,                                            //数据大小,字节数
       NULL,                                          //没有返回的数据,置为NULL
       0,                                                  //没有返回的数据,置为0

       &nOutput,
       NULL)
    )
{
   return false;
}

return true;
}

2,从设备读取数据


bool CDeviceOperDlg::ReviceKeyData(HANDLE handle, BYTE *bData, int iSize)
{

ULONG nOutput;
BYTE bTemp[512];
//数组清零
memset(bTemp,0,sizeof(bTemp));
//向设备发送
if (!DeviceIoControl(handle,
       ATST2004_IOCTL_READ,           //根据具体的设备有相关的定义
       NULL,                                              //没有向设备传递的数据,置为NULL
       0,                                                      //没有向设备传递的数据,置为NULL
       bTemp,                                            //读取设备的数据返回地址
       iSize,                                                //读取数据的字节数
       &nOutput,
       NULL)
    )
{
   return false;
}
//放置到公用数组
memcpy(&bData[0],&bTemp[0],iSize);
return true;
}

==================引用结束===============================

现在开始我的代码

驱动代码实现:

 oemi2c_write与 oemi2c_read ,其中XllpI2CWrite和XllpI2CRead是BSP实现得代码.

  1. int  oemi2c_write(XLLP_UINT8_T slaveAddr, XLLP_UINT8_T * bytesBuf, int bytesCount)
  2. {
  3.     int status;
  4.     Lock();
  5.     status = XllpI2CWrite((P_XLLP_I2C_T)(m_I2CBase),(P_XLLP_OST_T)(m_OSTBase),slaveAddr,bytesBuf,bytesCount,1);
  6.     if (status != XLLP_STATUS_SUCCESS) {
  7.         RETAILMSG(1, (TEXT("I2C: XllpI2CWrite failed %d/r/n"), status));
  8.     }
  9.      UnLock();
  10.     return status;
  11. }
  12. int oemi2c_read(XLLP_UINT8_T slaveAddr, XLLP_UINT8_T subAddr,XLLP_UINT8_T * bytesBuf, int bytesCount)
  13. {
  14.     int  status;
  15.     Lock();
  16.     status = XllpI2CWrite((P_XLLP_I2C_T)(m_I2CBase), (P_XLLP_OST_T)(m_OSTBase),slaveAddr,&subAddr,1,1);
  17.     if (status != XLLP_STATUS_SUCCESS) {
  18.         RETAILMSG(1, (TEXT("I2C:1  XllpI2CWrite failed %d/r/n"), status));
  19.     }
  20.     status = XllpI2CRead((P_XLLP_I2C_T)(m_I2CBase), (P_XLLP_OST_T)(m_OSTBase),slaveAddr,bytesBuf,bytesCount,1);
  21.     if (status != XLLP_STATUS_SUCCESS) {
  22.         RETAILMSG(1, (TEXT("I2C:2  XllpI2CRead failed %d/r/n"), status));
  23.     }
  24.      UnLock();
  25.     return status;
  26. }

IIC_IOControl函数

    1. typedef struct _I2C_IO_DESC  
    2.  DWORD SlaveAddr; // Target Slave Address 
    3.  DWORD WordAddr; // Starting Slave Word Address 
    4.  //LPBYTE  pData; // pBuffer 
    5.  XLLP_UINT8_T *pData; 
    6.  XLLP_UINT32_T Count; // nBytes to read/write 
    7. } I2C_IO_DESC, *PI2C_IO_DESC; 
    8. #define IOCTL_I2C_READ 1 
    9. #define IOCTL_I2C_WRITE 4 
    10. BOOL IIC_IOControl(DWORD hOpenContext,DWORD dwCode,PBYTE pBufIn,DWORD dwLenIn,PBYTE pBufOut,DWORD dwLenOut,PDWORD pdwActualOut) 
    11.  DWORD dwErr = ERROR_SUCCESS; 
    12.      BOOL  bRc = TRUE; 
    13.  XLLP_UINT8_T *pval;//received data 
    14.  XLLP_UINT8_T Address,SlaveAddr,ActiveAdress; 
    15.  I2C_IO_DESC *pI2C_Desc; 
    16.  XLLP_STATUS_T status; 
    17.  XLLP_UINT8_T WRbuf[2]; 
    18.      RETAILMSG(ZONE_IIC,(TEXT(">IIC -IOControl(0x%x,0x%x, 0x%x, %d, 0x%x)/n"), 
    19.         dwCode, pBufIn, dwLenIn, pBufOut, dwLenOut )); 
    20.     if ( !m_I2CBase || !g_OpenCount )  
    21.   { 
    22.            RETAILMSG (1, (TEXT("IIC-IOControl: ERROR_INVALID_HANDLE/r/n"))); 
    23.           SetLastError (ERROR_INVALID_HANDLE); 
    24.           return(FALSE); 
    25.       } 
    26.      if (pdwActualOut) 
    27.          *pdwActualOut = 0; 
    28.      //--------------------------------------------  
    29.      switch (dwCode)  
    30.   { 
    31.     case IOCTL_I2C_READ: 
    32.               if ( (dwLenIn < sizeof(I2C_IO_DESC)) || !pBufIn || !((PI2C_IO_DESC)pBufIn)->pData )  
    33.     { 
    34.                    dwErr = ERROR_INVALID_PARAMETER; 
    35.                    bRc = FALSE; 
    36.      RETAILMSG (1, (TEXT("1:IOCTL_I2C_READ: ERROR_INVALID_PARAMETER/r/n"))); 
    37.                   break
    38.                } 
    39.    pI2C_Desc=(PI2C_IO_DESC)MapPtrToProcess(pBufIn,(HANDLE) GetCurrentProcess()); //得到传入参数 
    40.    if (pBufIn != NULL && pI2C_Desc == NULL)  
    41.     { 
    42.      // Security violation 
    43.      RETAILMSG(1, (TEXT("I2CRead>Failed to map pointer to caller/r/n"))); 
    44.                   dwErr = ERROR_INVALID_PARAMETER; 
    45.      RETAILMSG (1, (TEXT("2:IOCTL_I2C_READ: ERROR_INVALID_PARAMETER/r/n"))); 
    46.                    bRc = FALSE; 
    47.                    break
    48.     }  
    49.    pval=(XLLP_UINT8_T *)MapPtrToProcess(pI2C_Desc->pData,(HANDLE) GetCurrentProcess()); 
    50.    if (pI2C_Desc->pData != NULL && pval == NULL)  
    51.     { 
    52.      // Security violation 
    53.      RETAILMSG(1, (TEXT("I2CRead>Failed to map pointer to caller/r/n"))); 
    54.                    dwErr = ERROR_INVALID_PARAMETER; 
    55.      RETAILMSG (1, (TEXT("3:IOCTL_I2C_READ: ERROR_INVALID_PARAMETER/r/n"))); 
    56.                   bRc = FALSE; 
    57.                   break
    58.     } 
    59.               Address =(XLLP_UINT8_T)(pI2C_Desc->WordAddr); 
    60.    ActiveAdress = (Address & 0xFF); 
    61.    SlaveAddr = (XLLP_UINT8_T)(pI2C_Desc->SlaveAddr);// | (((dwAddress/255)&0x07)<<1)); 
    62.     WRbuf[0]=*pval; 
    63.    status=oemi2c_read(SlaveAddr,ActiveAdress,WRbuf,1);//read one byte 
    64.    *pBufOut=WRbuf[0];//输出的数据 
    65.    *pdwActualOut=1;//READ ONE BYTE 
    66.    if(status!=XLLP_STATUS_SUCCESS) 
    67.     { 
    68.      bRc = FALSE; 
    69.      RETAILMSG (1, (TEXT("4 IOCTL_I2C_READ error: /r/n"))); 
    70.      break
    71.     } 
    72.               UnMapPtr(pval); 
    73.               UnMapPtr(pI2C_Desc);    
    74.    break
    75.     
    76.   case IOCTL_I2C_WRITE: 
    77.    if ( (dwLenIn < sizeof(I2C_IO_DESC)) || !pBufIn || !((PI2C_IO_DESC)pBufIn)->pData)  
    78.     { 
    79.                    dwErr = ERROR_INVALID_PARAMETER; 
    80.      RETAILMSG (1, (TEXT("1 IOCTL_I2C_WRITE ERROR_INVALID_PARAMETER/r/n"))); 
    81.                    bRc = FALSE; 
    82.                    break
    83.                } 
    84.    pI2C_Desc=(PI2C_IO_DESC)MapPtrToProcess(pBufIn,(HANDLE) GetCurrentProcess()); 
    85.    if (pBufIn != NULL && pI2C_Desc == NULL)  
    86.     { 
    87.      // Security violation 
    88.      RETAILMSG(1, (TEXT("I2CRead>Failed to map pointer to caller/r/n"))); 
    89.                   dwErr = ERROR_INVALID_PARAMETER; 
    90.                    bRc = FALSE; 
    91.      RETAILMSG (1, (TEXT("2 IOCTL_I2C_WRITE ERROR_INVALID_PARAMETER/r/n"))); 
    92.                    break
    93.     }  
    94.    pval=(XLLP_UINT8_T *)MapPtrToProcess(pI2C_Desc->pData,(HANDLE) GetCurrentProcess()); 
    95.    if (pI2C_Desc->pData != NULL && pval == NULL)  
    96.     { 
    97.      // Security violation 
    98.      RETAILMSG(1, (TEXT("I2CRead>Failed to map pointer to caller/r/n"))); 
    99.                    dwErr = ERROR_INVALID_PARAMETER; 
    100.                   bRc = FALSE; 
    101.      RETAILMSG (1, (TEXT("3 IOCTL_I2C_WRITE ERROR_INVALID_PARAMETER/r/n"))); 
    102.                   break
    103.     } 
    104.    Address = (XLLP_UINT8_T)(pI2C_Desc->WordAddr); 
    105.    ActiveAdress = (Address & 0xFF); 
    106.    SlaveAddr = (XLLP_UINT8_T)(pI2C_Desc->SlaveAddr );//| (((dwAddress/255)&0x07)<<1)); 
    107.    //begain I2C 
    108.    WRbuf[0] = ActiveAdress; 
    109.    WRbuf[1] = *pval; 
    110.     status=oemi2c_write(SlaveAddr,WRbuf,2);//write one byte 
    111.     *pdwActualOut =1; 
    112.    if(status!= XLLP_STATUS_SUCCESS) 
    113.     { bRc = FALSE; 
    114.      RETAILMSG (1, (TEXT("4 IOCTL_I2C_WRITE ERror/r/n"))); 
    115.      break
    116.     } 
    117.    UnMapPtr(pval); 
    118.               UnMapPtr(pI2C_Desc);    
    119.    break
    120.   default
    121.    bRc  = FALSE; 
    122.               dwErr = ERROR_INVALID_FUNCTION; 
    123.               RETAILMSG (1, (TEXT("I2C_IOControl Unknown Ioctl: 0x%X/r/n"), dwCode)); 
    124.    break
    125.       } 
    126.  //------------------------------------- 
    127.  if ( !bRc ) 
    128.  { 
    129.          RETAILMSG (1, (TEXT("I2C_IOControl ERROR: %u/r/n"), dwErr)); 
    130.          SetLastError(dwErr); 
    131.      } 
    132.      RETAILMSG(ZONE_IIC,(TEXT("<I2C_IOControl:%d/n"), bRc)); 
    133.  return bRc;; 
    134. }

========================================================

EVC 应用程序代码:

typedef struct _I2C_IO_DESC
{
 DWORD SlaveAddr; // Target Slave Address
 DWORD WordAddr; // Starting Slave Word Address
 //LPBYTE  pData; // pBuffer
 unsigned char *pData;
 unsigned long Count; // nBytes to read/write
} I2C_IO_DESC, *PI2C_IO_DESC;

 

#define IOCTL_I2C_READ 1
#define IOCTL_I2C_WRITE 4
#define CAT24C04Addr (0x0a0>>1)

     DWORD RetBytes;
    I2C_IO_DESC   DataFamily;

  1. // Cpage_i2c message handlers
  2. BOOL Cpage_i2c::OnInitDialog() 
  3. {
  4.  CPropertyPage::OnInitDialog();
  5.  // TODO: Add extra initialization here
  6.  m_hIIC=CreateFile(TEXT("IIC1:"),GENERIC_READ|GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
  7.  if(m_hIIC==INVALID_HANDLE_VALUE)
  8.  {
  9.   AfxMessageBox(_T("I2C CreateFile failed!!"));
  10.   return 0;
  11.  }
  12.  return TRUE;  // return TRUE unless you set the focus to a control
  13.                // EXCEPTION: OCX Property Pages should return FALSE
  14. }
  15. //----write byte button--------------
  16. void Cpage_i2c::OnBUTTONi2cWB() 
  17. {
  18.  // TODO: Add your control notification handler code here
  19. // AfxMessageBox(_T("I2C OnBUTTON i2c WB!!"));
  20.  DWORD Ret;
  21.  UpdateData(true);
  22.  pBuffOut[0]=(unsigned char)m_i2cWrData;
  23.  DataFamily.SlaveAddr=CAT24C04Addr;
  24.  DataFamily.WordAddr=(unsigned char)m_i2cWrAddr;
  25.  DataFamily.pData=pBuffOut;
  26.  DataFamily.Count=1;  
  27.     Ret=DeviceIoControl(m_hIIC,IOCTL_I2C_WRITE,&DataFamily,sizeof(DataFamily),NULL,0,&RetBytes,NULL);  //
  28.  if(!Ret)
     {
      AfxMessageBox(_T("I2C communication error!!"));
      return;
     }
  29. }
  30. //----read byte button--------------
  31. void Cpage_i2c::OnBUTTONi2cRB() 
  32. {
  33.  // TODO: Add your control notification handler code here
  34.  // AfxMessageBox(_T("I2C OnBUTTON i2c RB!!"));
  35.  BYTE  poutBuff[2]={0,0};
  36.  DWORD Ret;
  37.  UpdateData(true);
  38.  DataFamily.SlaveAddr=CAT24C04Addr;
  39.  DataFamily.WordAddr=(unsigned char)m_i2cRdAddr;
  40.  DataFamily.pData=pBuffin;
  41.  DataFamily.Count=1;  
  42.     Ret=DeviceIoControl(m_hIIC,IOCTL_I2C_READ,&DataFamily,sizeof(DataFamily),poutBuff,1,&RetBytes,NULL);  //
  43.  if(!Ret)
     {
      AfxMessageBox(_T("I2C communication error!!"));
      return;
     }
  44.  m_i2cRdData=poutBuff[0]; //收到得数据
  45.  UpdateData(FALSE); 
  46. }

运行界面:

    

Windows驱动开发WDM (5)- DeviceIoControl(直接方式交互"输出buffer") 除了ReadFile和WriteFile外,还有一个函数可以让用户模式程序访问内核模式驱动:DeviceIoControl。这是经常用的一个API, 原型如下: BOOL WINAPI DeviceIoControl( _In_ HANDLE hDevice,//已经打开的设备 _In_ DWORD dwIoControlCode,控制码 _In_op 阅读详情

相关推荐

UDS诊断服务InputOutputControlByIdentifier在ODX-D诊断描述文件中的描述和应用

它定义了一系列的诊断服务,包括读取和清除故障码、读取实时数据等。本文将详细介绍IOControl服务在ODX-D(Open Diagnostic data eXchange-Development)描述文件中的描述,并提供相应的源代码示例。Services节点定义了车辆的诊断服务,其中ID为SID001的服务就是IOControl服务。通过ODX-D描述文件,可以清晰地定义和描述车辆的诊断信号和诊断服务。另外,IOControl服务还有一个输出参数Result,它是一个布尔类型,用于表示该服务操作的结果。

PixelPusher的博客 308

iocontrol:测量并限制数据传输速率

控制 -导入“ github.com/aybabtme/iocontroliocontrol软件包提供了io.Writer和io.Reader实现,可以实现对数据传输速率的测量和调节。 用法 const ( KiB = 1 << 10 MiB = 1 << 20 GiB = 1 << 30 ) 数据量级,以千字节为单位(2的幂或1024的倍数)。 参见 。 func ThrottledReader func ThrottledReader ( r io. Reader , bytesPerSec int , maxBurst time. Duration ) io. Reader ThrottledReader确保对r读取永远不会超过每秒指定的字节速率。 maxBurst持续时间会更改验证的频率。 值越小,突发性越小,但节的开销也就越大。 func Throttle

Windows 10驱动开发入门(三):DeviceIoControl实现上层通讯

在这个例子中我们创建了一个设备对象,使用`DeviceIoControl` 来发送`IRP`,实现了上层程序和驱动之间的通讯。

haleycat的博客 1528

自己开发内核漏洞挖掘工具IoControlFuzzer代码.7z

自己开发内核漏洞挖掘工具IoControlFuzzer代码.

使用iocontrol进行IO控制指南

使用iocontrol进行IO控制指南 项目介绍 iocontrol 是一个由 aybabtme 开发的开源工具,旨在提供深度的磁盘I/O控制能力。该项目特别适合那些需要精细管理存储访问场景的应用开发者和系统管理员。通过它,用户能够实现对读写速率的限制、优先级调整等高级IO策略,从而优化存储资源的使用效率,确保关键任务的畅运行。 项目快速启动 要快速启动并使用 iocontrol,首先确保你...

gitblog_01157的博客 825

关于WinCE驱动编写时的IO地址映射

一直在琢磨,WinCE中的虚拟地址和实际的物理地址是如何对应的。比如WinCE.Net4.2提高的源码:C:/WINCE420/PLATFORM/XSC1BD/DRIVERS/DISPLAY/SA_LCD/sa2video.cpp中,有如下代码:BOOL MapVirtualAddress(){     v_pLcdRegs = (volatile SA2lcdregs *)VirtualAllo

实业兴国 实干报国 4087

Windows驱动开发(二)WDM/WDF的IOControl

上一章大概介绍了WDM/WDF的驱动模型, 链接:https://blog.csdn.net/o0xwh_93150o/article/details/104213348 这一章我们主要来看一下驱动程序中的IO请求是如何处理的。 其实驱动程序的主要功能也就是负责处理IO请求,其中大部分IO请求是在派遣函数中处理的。用户模式下的所有对驱动程序的IO请求,全部由操作系统转化为一个叫做IRP(IO...

o0xwh_93150o的博客 1907

项目推荐:iocontrol —— 数据传输速率的测量与限制工具

项目推荐:iocontrol —— 数据传输速率的测量与限制工具 项目基础介绍 iocontrol 是一个由 Go 语言编写的开源项目,它提供了对数据传输速率进行测量及限制的能力。此项目对于需要精细控制数据速度的场景尤为重要,如网络应用中的限速逻辑实现或是模拟低带宽环境下的测试等。 核心功能 速率限制:iocontrol 提供了 ThrottledReader 和 ThrottledWrite...

gitblog_00455的博客 520

WinCE设备驱动简介及GPIO驱动的实现

转载:WinCE设备驱动简介及GPIO驱动的实现设备驱动实际上就是导出标准的接口函数的驱动,这是文档上面的定义。在WinCE中,所有的设备都导出设备接口,这样WinCE中的Device Manager可以加载和管理这些设备驱动设备驱动的架构如图:  首先我声明一下,这个图是我抄的,呵呵。在WinCE启动的时候,OAL(OAL.exe)首先加载kernel.dll,然

dengxin123的专栏 718

IIC驱动

WINCE 驱动xx_IOControl 收藏 <br />前言<br />       刚刚完成一个WINCE 下的I2C的驱动,由于在读I2C 时要进行参数的传入和传出,所以其中的xx_IOControl必须要完成,像一些简单的传递单向数据的驱动,要xx_Read或xx_Write就可以实现.<br />       之前没有写过xx_IOControl,所以参考了网上的代码又结合自己的软硬件环境,我现有的BSP 里

abin_gha的专栏 1960

WinCE设备驱动简介及GPIO驱动的实

转载——WinCE设备驱动简介及GPIO驱动的实现 http://blog.csdn.net/nanjianhui/archive/2008/07/18/2674753.aspx作者:ARM-WinCE设备驱动实际上就是导出标准的接口函数的驱动,这是文档上面的定义。在WinCE中,所有的设备都导出设备接口,这样WinCE中的Device Manager可以加载和管理这些设备驱动设备驱动的架构如图:首先我声明一下,这个图是我抄的,呵呵。在WinCE启动的时候,OAL(OAL.exe)首先加载k

embed2010的专栏 941

应用程序与驱动程序交互函数DeviceIoControl详解

这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL(DeviceIoControl函数会产生此IRP),MinorFunction 为自己定义的控制码的IRP,系统就调用相应的处理IRP_MJ_DEVICE_CONTROL的派遣函数,你在派遣函数中判断Mi...

zz_strive_2012的专栏 3198

驱动学习---IRP_MJ_READ与IRP_MJ_WRITE

【代码】驱动学习---IRP_MJ_READ与IRP_MJ_WRITE。

weixin_41693985的博客 550

UDP的IOControl(低级操作模式)

private IPEndPoint LocaIPEP; //udp 本地节点 private IPEndPoint RemoteIPEP; //对方节点 private Socket MyClient; //当前对象 public UdpHandle(IPEndPoint local, IPEndPoint remote)

myth的博客 3101

iocontrol 项目常见问题解决方案

iocontrol 项目常见问题解决方案 项目基础介绍 iocontrol 是一个开源项目,旨在提供对数据传输速率的测量和限制功能。该项目主要使用 Go 语言编写,适用于需要控制数据读写速率的应用场景。通过 iocontrol,开发者可以轻松地实现对数据传输速率的监控和限制,从而更好地管理资源和优化性能。 新手使用注意事项及解决方案 1. 安装和依赖问题 问题描述:新手在尝试安装 iocontro...

gitblog_00087的博客 617

探索数据动的艺术 —— iocontrol项目深度剖析与应用实践

探索数据动的艺术 —— iocontrol项目深度剖析与应用实践 在高速发展的技术世界中,对数据传输的控制成为了至关重要的环节。如何优雅地管理数据速,既保障服务的稳定性,又满足高性能需求,是开发者们不断追寻的目标。今天,我们将一起深入了解一个强大的Go语言开源库——iocontrol。 项目介绍 iocontrol,顾名思义,是一个为Go程序设计的数据传输速率控制包。通过简单的接口集成,它赋予...

gitblog_00049的博客 392

windows driver - DeviceIoControl 用法

原文地址:https://www.cnblogs.com/lsh123/p/7354573.html 之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客,这次再通过这个完整的代码来简要疏通总结一下。   这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用DeviceIoControl函数,IO管理器会产生一个MajorFunction 为IRP_MJ_DEVICE_CONTROL(DeviceIoControl函数会产生此IRP),MinorFunc.

dragon_cdut的博客 2808

WinCE下GPIO(LED可参考)的驱动开发(附源码,供下载参考)

WinCE下GPIO(LED可参考)的驱动开发(附源码,供下载参考)   笔者接到导师任务,在WinCE系统下加载一个I/O口的驱动来控制一个继电器开关,说白了就是来控制GPIO口的输入输出状态和端口电平的高低。现在手上的板子是友善公司的Tiny6410增强版。 首先,来上一张图来理一下做的思路。   在带有操作系统的基础上对芯片进行操作,是需要在驱动层中BSP中对GPIO

u013550000的博客 658

AT91SAM9263 WINCE 6.0 R2驱动开发-GPIO驱动的实现以及应用程序的调用

<br />1.实现GPIO驱动,源代码如下<br />view plaincopy to clipboardprint?<br />#include <windows.h>   <br />#include <types.h>   <br />#include <ceddk.h>   <br />#include <memory.h>   <br />#include <nkintr.h>   <br />#include <pegdpar.h>   <br />#include <ddkreg.h>

happenhappy的专栏 1693
上一篇: 看看我用EVC写得TEST utility,呵呵
下一篇: PXA300+WINCE 5 添加UART功能
AlicePeter
博客等级 码龄18年 6粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值