最近在写一个小工具需要加载驱动。完成后,分享给朋友使用。大家反馈的信息是,无法加载驱动。后来我自己多次测试,没发现什么问题。
前提条件:驱动文件.sys 必须与可执行文件.exe必须在同一目录下面!
我在想是不是运行环境导致的,后来我复制出来到物理机里面测试,同样的问题出现了——驱动无法加载。
在最后,我发现问题了。在网上还是看到的大部分加载与卸载程序都是吧!驱动和驱动文件路径,定义成一个宏。定义成一个宏当然方便,但是程序的移植性不好,当你换一个地方路径就会导致驱动无法加载。
所以在这里我自己实现了一个通过驱动名称获取驱动文件的路径再加载驱动。经过测试还是挺稳定的……
程序加载驱动的实现方法参考了网上代码和书上的知识,这里说说应程序加载驱动程序的原理。在windows系统中,会把驱动程序当做一个服务来启动和关闭……这个至于为什么我就不多说了,寒江独钓说的很清楚。加载驱动就是一个开启一个服务,而卸载驱动就是停止一个服务。
一、加载驱动程序的方法 ——1.建立服务控制连接——>>2创建服务——>>3.打开服务管理器——>>4.开始服务
加载驱动的步骤:
1.使用API 函数 OpenSCManager()函数建立了一个连接到服务控制管理器,它会返回一个SC_HANDLE句柄,假设我们定义的一个句柄为SC_HANDLE schSCManager,这样就可以管理windows系统以后的服务,前提是要知道服务的名称。
2.通过SC_HANDLE schSCManager,使用API函数OpenService(), 它也是返回一个SC_HANDLE schService句柄,使用范例:
SC_HANDLE schService = OpenService(schSCManager, //通过OpenSCManager获得的句柄
DriverName, //服务名称(驱动名),其实就是将我们驱动程序设置成一个可见的服务
SERVICE_ALL_ACCESS); //访问方式
3..通过使用API函数CreateService(),创建一个服务,参数很多不多说看注释吧!使用范例:
schService = CreateService(
schSCManager, //服务控制器 SCM句柄
DriverName, //驱动名
DriverName, //驱动名
SERVICE_ALL_ACCESS, //存取权限
SERVICE_KERNEL_DRIVER, //服务类型
SERV