驱动程序是通过设备句柄来控制设备的,应用程序要控制设备,也需要获得设备句柄,然后使用驱动程序体提供的DeviceIoControl接口来控制设备。那么应用程序是如何获得设备句柄的呢?
通常流接口驱动程序会使用两个结构体,驱动上下文结构体和设备上下文结构体。设备句柄会保存在设备上下文结构体中,驱动上下文结构体会保存设备上下文结构体的地址。这样通过驱动上下文结构体就能够得到设备句柄。下面我定义一个驱动上下文指针dwDriverContext来说明这个指针是如何被传递的。
1、 在执行USBDeviceAttach的函数中,函数ActivateDevice用来激活流接口,它将dwDriverContext的值写入注册表中。
2、 当dwDriverContext被写入注册表后,设备管理器会调用Cam_Init 函数。Cam_Init 函数执行后会从注册表取得dwDriverContext的值。
3、 应用程序使用CreatFile这个API时,驱动程序中的Cam_Open函数会被调用,Cam_Open执行时会获得Cam_Init 函数的到的dwDriverContext。CreatFile会得到Cam_Open返回的dwDriverContext。在应用程序中,dwDriverContext会以句柄的形式出现,这时应用程序就可以通过CreatFile返回的句柄来控制设备了。
4、 应用程序使用DeviceIoControl时会把CreatFile返回的句柄(其实就是dwDriverContext)传回给驱动程序的CAM_IOControl函数。
以上就是设备句柄在驱动程序与应用程序之间的传递过程。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jjyyhema/archive/2009/12/31/5114194.aspx