驅動程序是通過設備句柄來控制設備的,應用程序要控制設備,也需要獲得設備句柄,然後使用驅動程序體提供的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/lovelynn/archive/2008/12/04/3446024.aspx