How to load our device drivers 如何装载我们的设备驱动
2006-05-18 10:12
501 查看
安装驱动有很多种方法 INF/ 直接写注册表,也可以直接自己编写装载程序来完成
这里有一个装载驱动的类,使用非常方便。
If you want to send/receive data to the device driver loaded, to allow this, you have to get a handle to the driver. For this purpose you can use the function
This function is used to initialize the parameters of the driver such as: driver name, driver path and driver dos name. If you only know the driver path, the funtion tries to get the rest of the parameters.
You can use this function after you call
This function stops the driver and deregister it in Windows Service Manager. If a problem occurred (while stopping or removing the driver), the class data associated with it(driver name, driver path...) will not be free unless you pass the
You can use this function to start the driver "service".
Use this function to stop the driver "service"
If you set the parameter
The above are functions to ask the driver about its status.
You must use this function if you can access to the driver handle directly.
Function to send data to the driver. You must indicate the IOCTL code.
Function to receive data from the driver. You must indicate the IOCTL code. The data will be received in buffer with a maximum length of count.
You decide what to do, read, write or both.
They are all functions exported by the class to applications. However to make a simple application that manage drivers we need use only two functions. For example, I developed a program to show the functionality of the
As you can see that with two lines you can load and unload a driver, making life easy for all :P.
这里有一个装载驱动的类,使用非常方便。
Introduction
When you develop device drivers you always need to make two projects: first, the device driver and second the application to load and test it. This wrapper class,TDriver, can help you in the second one. Furthermore I developed an application example that you can use to load any driver you indicate.
Background
Windows allows loading drivers at runtime using the Service Control Manager. Yes, the Service Control Manager in Windows not only can be used to load and manage services. You can use it with device drivers as you use it to load/unload/start/stop windows services.If you want to send/receive data to the device driver loaded, to allow this, you have to get a handle to the driver. For this purpose you can use the function
createFile, and pass the driver name as the file name. You can see Windows is so abstract in this aspect.
Using the code
Using theTDriverClass is so easy. Here is the class definition and the explanation follows:
class TDriver{public: TDriver(void); //constructor ~TDriver(void); //destructor //functions to initialized the driver variables DWORD InitDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName=NULL); DWORD InitDriver(LPCTSTR path); //functions to load and unload drivers. //If start = TRUE, the driver will be started. DWORD LoadDriver(BOOL start = TRUE); DWORD LoadDriver(LPCTSTR name, LPCTSTR path, LPCTSTR dosName=NULL, BOOL start=TRUE); DWORD LoadDriver(LPCTSTR path, BOOL start=TRUE); //if forceClearData == TRUE, will remove //variables although we cant remove driver "service" DWORD UnloadDriver(BOOL forceClearData = FALSE); //functions to start and stop, driver "service" DWORD StartDriver(void); DWORD StopDriver(void); //if true, the driver havent been removed at finish void SetRemovable(BOOL value); //funtion to return class status BOOL IsInitialized(); BOOL IsStarted(); BOOL IsLoaded(); //function to get driver handle HANDLE GetDriverHandle(void); //funtions to make IO operation with driver DWORD WriteIo(DWORD code, PVOID buffer, DWORD count); DWORD ReadIo(DWORD code, PVOID buffer, DWORD count); DWORD RawIo(DWORD code, PVOID inBuffer, DWORD inCount, PVOID outBuffer, DWORD outCount); private: HANDLE driverHandle; //driver handle LPTSTR driverName; //driver name LPTSTR driverPath; //driver disk path LPTSTR driverDosName; //driver's dos name, to link with it BOOL initialized; //variables to store the status of this class BOOL started; BOOL loaded; BOOL removable; //get a handle to the driver DWORD OpenDevice(void); };The methods you can use in this class are:
InitDriver(...)
This function is used to initialize the parameters of the driver such as: driver name, driver path and driver dos name. If you only know the driver path, the funtion tries to get the rest of the parameters.
LoadDriver(..)
You can use this function after you call
InitDriver, when you use only one parameter. If start is
FALSE, we need to call
StartDriverfunction after, to start it. The other two functions, first initialize the driver and then load it as the first function.
UnloadDriver(BOOL forceClearData = FALSE)
This function stops the driver and deregister it in Windows Service Manager. If a problem occurred (while stopping or removing the driver), the class data associated with it(driver name, driver path...) will not be free unless you pass the
TRUEvalue in
forceClearData.
StartDriver()
You can use this function to start the driver "service".
StopDriver()
Use this function to stop the driver "service"
SetRemovable(BOOL value)
If you set the parameter
removableto
FALSE, in the unload process, the class will not deregister the driver in Windows Service Manager. This parameter is set automatically to
FALSEif the driver was loaded by another application.
IsInitialized(); BOOL IsLoaded(); BOOL IsStarted()
The above are functions to ask the driver about its status.
GetDriverHandle()
You must use this function if you can access to the driver handle directly.
WriteIo(DWORD code, PVOID buffer, DWORD count)
Function to send data to the driver. You must indicate the IOCTL code.
ReadIo(DWORD code, PVOID buffer, DWORD count)
Function to receive data from the driver. You must indicate the IOCTL code. The data will be received in buffer with a maximum length of count.
RawIo(DWORD code, PVOID inBuffer, DWORD inCount, PVOID outBuffer, DWORD outCount)
You decide what to do, read, write or both.
They are all functions exported by the class to applications. However to make a simple application that manage drivers we need use only two functions. For example, I developed a program to show the functionality of the
TDriverclass, that will load/unload any driver you introduce (see screenshot article). The code for this purpose is the next:
if(driver.LoadDriver(m_driverPath, true) == DRV_SUCCESS) { //..... } //..... if(driver.UnloadDriver() == DRV_SUCCESS) { //..... }
As you can see that with two lines you can load and unload a driver, making life easy for all :P.
相关文章推荐
- How to restart USB device(如何重启USB设备)
- How to Enhance Our Sense of Happiness? 如何提升我们的幸福感
- How to load and execute Thread class when spring configuration loaded (如何在读取spring配置时自启动线程类)
- 如何开启真机Log设备_Unable to open log device ‘/dev/log/main’: No such file or directory
- 如何在Android设备中用NDK编译SQLite并且对SQLite进行操作(增删)-How to Compile SQLite for Android using NDK
- 如何从EXCEL文件加载Hierarchy到BW (How to Load Hierarchy From Flat File)
- 读书笔记《Linux Device Drivers》:第一章,设备驱动介绍
- 如何在html前运行php,how to load php before html is completely loaded.
- How to Develop and Test Device Drivers in Windows CE 5.0
- [中英对照]Device Drivers in User Space: A Case for Network Device Driver | 用户态设备驱动: 以网卡驱动为例
- 如何让插入的usb设备不自动装载驱动,进而使用libusb成功向设备传送数据
- 如何从操作系统安装文件提取驱动文件/ How to extract driver files from setup files (win 7)
- How To Load CSV Machine Learning Data in Weka (如何在Weka中加载CSV机器学习数据)
- Multifunction Device Drivers(多功能设备Linux下驱动开发)
- How to write DSP device drivers
- How to programatically unplug & replug an USB device in linux?
- 018如何建立自动化框架 how to bulid the framwork
- How to enable scanner on CN3 device
- (转载)如何成为一位杰出的工程师-How to be a Star Engineer(转载)
- 从 2.4 到 2.6:Linux 内核可装载模块机制的改变对设备驱动的影响