WinXP下虚拟摄像头驱动程序开发

 WinXP下虚拟摄像头驱动程序开发

摄像头驱动程序的主要目的是通过硬件捕捉视频信号。微软公司提供了一套视频驱动的接口,可以满足这个接口的视频驱动程序。第三方厂商开发的软件,如QQ和MSN等软件,都可以通过这个接口读取视频摄像头采集的数据。本文将介绍一个虚拟摄像头的实现,读者可以根据自己的需要,结合硬件设计出符合这个接口的USB或者PCI摄像头驱动程序。

1               驱动框架

WinXP下采用WDM模式进行摄像头驱动程序开发主要包含两个部分,一部分时类驱动程序,一部分是小驱动程序。类驱动程序由微软提供,而小驱动程序是由程序自己编写,并实现相关扩展功能。

摄像头采集的数据都是纯粹的数据文件,然后源源不断地传递给PC机。因此得名Stream(流设备)。编写摄像头驱动程序就是编写流设备的小驱动,但首先需要了解类设备驱动与小驱动之间是如何配合的。在WDM驱动程序当中,小驱动需要首先将自己注册给类驱动,类驱动拥有真正的设备对象,然而小驱动程序不创建对象,它仅利用类驱动程序实现系统调用。

流设备的类驱动主要是控制请求。这需要通过调用小驱动的适配器来访问具体的硬件。在流设备的类驱动和小驱动都初始化以后,小驱动需要被动地等待类驱动来调用。类驱动用(stream request block)SRB向小驱动程序发送标准的请求,小驱动通过解析SRB后向Class Driver的请求。例如在SRB中,类驱动与小驱动采用数据结构HW_STREAM_REQUEST_BLOCK来传送命令和数据。

2               初始化

与其他驱动程序不同,类驱动与小驱动采用HW_INITIALIZATION_DATA数据结构进行初始化操作,其初始化步骤如下。

当设备接入插口时,即插即用管理器能够监测到新的设备,进而调用Mini Driver的DriverEntry例程。

申请HW_INITIALIZATION_DATA数据内存,并填充相关域,调用StreamClassRegisterMinidriver函数注册该小驱动。如下代码;


RtlZeroMemory(&HwInitData, sizeof(HwInitData));

    HwInitData.HwInitializationDataSize = sizeof(HwInitData);

    //

    // Set the Adapter entry points for the driver

    //

    HwInitData.HwInterrupt               = NULL; // HwInterrupt;         

    HwInitData.HwReceivePacket          = AdapterReceivePacket;

    HwInitData.HwCancelPacket           = AdapterCancelPacket;

    HwInitData.HwRequestTimeoutHandler   = AdapterTimeoutPacket;

    HwInitData.DeviceExtensionSize        = sizeof(HW_DEVICE_EXTENSION);

    HwInitData.PerRequestExtensionSize     = sizeof(SRB_EXTENSION);

    HwInitData.FilterInstanceExtensionSize   = 0;

    HwInitData.PerStreamExtensionSize      = sizeof(STREAMEX);

    HwInitData.BusMasterDMA            = FALSE;

    HwInitData.Dma24BitAddresses         = FALSE;

    HwInitData.BufferAlignment          = 3;

    HwInitData.DmaBufferSize           = 0;

    // Don't rely on the stream class using raised IRQL to synchronize

    // execution.  This single paramter most affects the overall structure

    // of the driver.

    HwInitData.TurnOffSynchronization   = TRUE;

    ReturnValue = StreamClassRegisterAdapter(DriverObject, RegistryPath, &HwInitData);

AdapterReceivePacket函数用于接收类驱动向小驱动发送的SRB,其中SRB_INITIALIZE_DEVICE用于初始化小驱动,SRB_INITIALIZE_DEVICE结构体中ConfigInfo记录着摄像头的意见相关信息。初始化之后类驱动再向小驱动发送SRB_GET_STREAM_INFO类型的SRB,用于向小驱动程序咨询HW_STREAM_HEADER数据信息和HW_STREAM_INFORMATION等信息。这些信息包含了摄像头驱动提供的视频图像大小、图像格式等信息。最后类驱动程序小驱动再发送HW_STREAM_INFORMATION的SRB,这次请求之后,小驱动的初始化操作基本完成,并返回给类驱动程序。上述这些过程的代码如下;


switch (pSrb->Command)

{

case SRB_INITIALIZE_DEVICE:

// open the device

HwInitialize(pSrb);

break;

case SRB_UNINITIALIZE_DEVICE:

// close the device.

HwUnInitialize(pSrb);

break;

case SRB_OPEN_STREAM:

        // open a stream

AdapterOpenStream(pSrb);

break;

case SRB_CLOSE_STREAM:

// close a stream

AdapterCloseStream(pSrb);

break;

case SRB_GET_STREAM_INFO:

        AdapterStreamInfo(pSrb);

        break;

    case SRB_GET_DATA_INTERSECTION:

        AdapterFormatFromRange(pSrb);

break;

case SRB_OPEN_DEVICE_INSTANCE:

case SRB_CLOSE_DEVICE_INSTANCE:

 

        TRAP;

        pSrb->Status = STATUS_NOT_IMPLEMENTED;

        break;

    case SRB_GET_DEVICE_PROPERTY:

        AdapterGetProperty (pSrb);

        break;

    case SRB_SET_DEVICE_PROPERTY:

        AdapterSetProperty (pSrb);

        break;

case SRB_PAGING_OUT_DRIVER:

    DbgLogInfo(("'Testcap: Receiving SRB_PAGING_OUT_DRIVER -- SRB=%x/n", pSrb));

        break;

case SRB_CHANGE_POWER_STATE:

    DbgLogInfo(("'Testcap: Receiving SRB_CHANGE_POWER_STATE ------ SRB=%x/n", pSrb));

        AdapterPowerState(pSrb);

        break;

case SRB_INITIALIZATION_COMPLETE:

    DbgLogInfo(("'Testcap: Receiving SRB_INITIALIZATION_COMPLETE-- SRB=%x/n", pSrb));

        break;

case SRB_UNKNOWN_DEVICE_COMMAND:

default:

pSrb->Status = STATUS_NOT_IMPLEMENTED;

}

CompleteDeviceSRB (pSrb);

3               编写小驱动程序

类驱动程序的目标是与操作系统进行交互,其中包括处理同步、提供标准接口。而小驱动由类驱动调用,主要负责具体的硬件相关操作。因此编写小驱动的程序应该会向类驱动注册一些回调函数,方便类驱动调用。其中有几个函数是必须注册的,如下;

Ø         StrMiniCancelPacket:对HW_STREAM_REQUEST_BLOCK数据包进行取消的回调函数。

Ø         StrMiniReceieveDevicePacket:获取HW_STREAM_REQUEST_BLOCK数据包回调函数。

Ø         StrMiniRequestTimeout:当HW_STREAM_REQUEST_BLOCK数据包超时的回调函数。

Ø         StrMiniEvent:使小驱动程序支持某种事件。

Ø         StrMiniInterrupt:当驱动获取中断时还用该支持中断处理函数。

编写小驱动程序时,还需要注意实现流控制操作,流控制命令和数据主要保存在SRB当中,其中以下几种流控制命令必须实现。

Ø         SRB_INITIALIZE_DEVICE:调用HW_INITIALIZATION_DATA数据结构中初始化小驱动程序。

Ø         SRB_GET_STREAM_INFO:调用HW_INITIALIZATION_DATA数据结构中获取流相关信息。

Ø         SRB_OPEN_STREAM:打开一个流实例,并填充HW_STREAM_OBJECT结构体流描述信息。

Ø         SRB_READ_DATA和SRB_WRITE_DATA:这两个命令用于接收和发送数据。

Ø         HW_STREAM_REQUEST_BLOCK:类驱动为了获得或者设置小驱动的某项属性或者流的某项属性,会向小驱动提供HwReceivePacket函数发送HW_STREAM_OBJECT请求。

Ø         SRB_CLOSE_STREAM:用于关闭小驱动程序。

4               总结

  在微软提供的类驱动程序之上编写虚拟驱动程序,其实最主要的工作就是编写子驱动程序,实现初始化、流控制、数据接收等相关回调函数。

时间: 2024-12-09 11:26:31

WinXP下虚拟摄像头驱动程序开发的相关文章

Linux下PCI设备驱动程序开发

PCI是一种广泛采用的总线标准,它提供了许多优于其它总线标准(如EISA)的新特性,目前已经成为 计算机系统中应用最为广泛,并且最为通用的总线标准.Linux的内核能较好地支持PCI总线,本文以 Intel 386体系结构为主,探讨了在Linux下开发PCI设备驱动程序的基本框架. 一.PCI总线系统体系结构 PCI是外围设备互连(Peripheral Component Interconnect)的简称,作为一种通用的总线接口标准 ,它在目前的计算机系统中得到了非常广泛的应用.PCI提供了一组

WinXP下USB驱动开发(一)

  目  录 第1节    概述.... 4 第2节       USB相关技术.... 4 2.1.      USB拓扑结构... 4 2.2.      USB数据流模式... 5 2.3.      USB四种传输模式... 7 2.3.1.      批量传输... 7 2.3.2.      控制传输... 7 2.3.3.      中断传输... 8 2.3.4.      同步传输... 9 2.4.      USB协议层规范... 10 2.5.      USB HUB规

驱动开发-虚拟摄像头开发——如何在C#编程中调用虚拟摄像头驱动

问题描述 虚拟摄像头开发--如何在C#编程中调用虚拟摄像头驱动 我现在在做一个C#的桌面软件,需要使用虚拟摄像头,查了些关于虚拟摄像头开发的资料,稍微了解了一点,但是还是不是很清楚具体该怎么着手做. 请问下如何对虚拟摄像头采用什么编程语言,什么开发工具比较合适,谢谢~

WinXP下USB驱动开发(十)

3.4.       其他说明 Ø       编译环境:Win XP Checked Build Environment/Win XP Free Build Environment Ø       开发环境:Microsoft Visual C++ 6.0 Ø       调试工具:Debugging Tools for Windows (x86)(WinDbg) Ø       开发周期:2009-11-7到2009-10-24 Ø       设计人员/编码人员/调试人员:罗振辉 第4节 

vs2008在winxp下开发的程序,在win7下的vs2013打不开

问题描述 如题.我使用vs2008在winxp下开发的C#程序,在其他winxp系统中运行很好.想在win7下使用vs2013重新编译,但是打不开.使用高版本Framework编译低版本Framework程序,应该是没问题的吧? 解决方案 解决方案二:我是否应该下载一个适合64位的VS2008,在win7上重新安装并编译呢?解决方案三:阿拉正准备这样升级呢,求前辈解惑从05到08很顺畅,接下来会这样吗?应该是OS的缘故?但Win7的兼容性貌似还不错啊.XP+VS08下的项目,部署到Win7里面跑

浅谈WinCE平台USB摄像头驱动开发流程

由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集成到嵌入式系统中.例如,通过USB 摄像头WinCE系统可以很方便地得到实时图像,这对某些要求实时图象监控的嵌入式系统是一个很不错的选择.但是由于嵌入式硬件平台的多样性,以及WinCE对USB设备驱动开发只提供了底层支持,再加上许多摄像头厂商尚未提供WinCE下的USB摄像头驱动,这对初级开发人员在开发WinCE USB摄像头程序时是一个难点.     前段时间,公司委派我负责一个嵌入式项目,项目要求是在WinCE平台上集成U

V4L2(二)虚拟摄像头驱动vivi深入分析【转】

转自:http://www.cnblogs.com/tureno/articles/6694463.html 转载于: http://blog.csdn.net/lizuobin2/article/details/53006927   本文基于:linux3.5   前面一篇文章中,简单分析了 V4L2 大框架,本文借助内核中的虚拟摄像头驱动 vivi 来分析一个完整的摄像头驱动程序.vivi 相对于后面要分析的 usb 摄像头驱动程序,它没有真正的硬件相关层的操作,也就是说抛开了复杂的 usb

如何安装使用虚拟摄像头?

什么是虚拟摄像头?其实虚拟摄像头 (9158)(Softcam) 是一个名副其实的软件摄像机,它能模拟成为"真实的"摄像机,成功地骗过大部分的视频聊天软件,比如CU-Seeme. MicrosoftNetmeeting.等等.如此一来,就算计算机上没有摄像设置,但照样能使用这些软件来虚拟视频. 那到底qq虚拟摄像头怎么用呢?其实很简单,你先下载一个虚拟摄像头的软件,然后准备一张图片或者提前录好的一段视频也行,然后加载到聊天室就可以了.虚拟摄像头软件把你提前准备好的录象加载进去部分网站聊

WinXP下共享打印机连接失败如何紧急处理

  WinXP下共享打印机连接失败,首先要想到的问题就是重新连接打印服务器,连接成功后才需要考虑下一步操作. 打印机共享具体步骤如下: 1.配置打印机主机 首先我们要在主机上配置打印机.我们暂且称直接连接打印机的电脑为"主机",而局域网内其他需要和主机共享打印的电脑称为"客户机". 第一步:将打印机连接至主机,打开打印机电源,通过主机的"控制面板"进入到"打印机和传真"文件夹,在空白处单击鼠标右键,选择"添加打印机&