WEB开发网
开发学院软件开发VC 如何建立应用程序和驱动程序间的通信 阅读

如何建立应用程序和驱动程序间的通信

 2006-07-20 11:39:30 来源:WEB开发网   
核心提示: 与此相对应,当驱动程序捕捉到特点事件(如中断)发生时,如何建立应用程序和驱动程序间的通信(3),应当可以与应用程序进行通信,以下是通过I/O请求包(IRP),这是一种简单的方式,速度只能达到几M,驱动程序的读数据函数:VOID P9052Device::Serial_P9052_IOCTL

与此相对应,当驱动程序捕捉到特点事件(如中断)发生时,应当可以与应用程序进行通信。以下是通过I/O请求包(IRP),驱动程序的读数据函数:

VOID P9052Device::Serial_P9052_IOCTL_804_ReadBase3_Handler(KIrp I)
{
  NTSTATUS status = STATUS_SUCCESS;
  t << "Entering P9052Device::Serial_P9052_IOCTL_804_ReadBase3_Handler, " << I << EOL;
  KMemory Mem(I.Mdl());  
  // Use the memory object to create a pointer to the caller''s buffer
  PULONG  pOutBuffer  = (PULONG) Mem.MapToSystemSpace(); //输出缓冲区指针,传出读取的数据
  PULONG pInBuffer    = (PULONG) I.IoctlBuffer();   //输入缓冲区指针
  ULONG  Offset;           //读取的偏移地址
  Offset  = *pInBuffer;
  ULONG  count;           //读取的数据个数
  count  = *(pInBuffer+1);
  m_IoPortRange1_ForBase3.ind(Offset,pOutBuffer,count);
  I.Information() = count;
  I.Status() = status;
  m_DriverManagedQueue.PnpNextIrp(I);
}
以下是通过IRP,驱动程序的写数据函数:
VOID P9052Device::Serial_P9052_IOCTL_805_WriteBase3_Handler(KIrp I)
{
  NTSTATUS status = STATUS_SUCCESS;
  t << "Entering P9052Device::Serial_P9052_IOCTL_805_WriteBase3_Handler, " << I << EOL;
  PULONG pInBuffer = (PULONG) I.IoctlBuffer(); //输入缓冲区指针
  ULONG  count;            //从输入缓冲区要写入的数据个数
  count=*(pInBuffer+1);
  ULONG  offset;            //偏移地址
  offset=*pInBuffer;
  PULONG pBuffer = pInBuffer+2;    //指向要写入的数据
  m_IoPortRange1_ForBase3.outd(offset,pBuffer,count);
  I.Information() = count;
  I.Status() = status;
  m_DriverManagedQueue.PnpNextIrp(I);
}

下图是运行时的界面:

图一 VC运行界面

本文通过DriverWorks实现对PCI9052的数据写入、读出。读写方式是DirectIO方式。这是一种简单的方式,速度只能达到几M,如果是大批量的数据写入可以采用buffer的方式。

上一页  1 2 3 

Tags:如何 建立 应用程序

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接