程序加载NT式驱动
设备驱动程序的动态加载主要由服务控制管理程序(Service Control Manager, SCM)来完成。
加载和卸载NT驱动分为四个步骤:
1、为NT驱动创建新的任务
2、开启此项服务。
3、关闭此项服务。
4、删除NT驱动所创建的服务。
1、打开SCM管理器函数,用于SCM的初始化。
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, //计算机名称,NULL代表本机
LPCTSTR lpDatabaseName, //SCM数据库名称,NULL代表缺省数据库
DWRD dwDesiredAccess //使用权限,一般设置为SC_MANAGER_ALL_ACCESS
);
返回值:成功返回SCM管理器句柄,失败返回NULL
2、关闭服务句柄,关闭SCM管理器句柄,用于SCM清除工作
BOOL CloseServiceHandle(
SC_HANDLE hSCObject //要关闭的SCM句柄
)
3、创建服务,创建SCM管理器的句柄,后面操作都是基于此句柄
SC_HANDLE CreateService(
SC_HANDLE hSCManager, // handle to SCM database,OpenSCManager打开的句柄
LPCTSTR lpServiceName, // 服务名称,就是在设备管理器中看到的设备名称
LPCTSTR lpDisplayName, // 服务显示出的名称
DWORD dwDesiredAccess, // 打开权限,一般设置为SERVICE_ALL_ACCESS
DWORD dwServiceType, // 服务类型
// SERVICE_FILE_SYSTEM_DRIVER File system driver service.
// SERVICE_KERNEL_DRIVER Driver service.一般用此项
DWORD dwStartType, // 打开服务时间
// SERVICE_AUTO_START 驱动自动加载
// SERVICE_BOOT_START 被system loader加载,系统启动之前
// SERVICE_DEMAND_START 需要是启动,一般选择此项
DWORD dwErrorControl, // 关于错误处理的代码
// SERVICE_ERROR_IGNORE 错误全部忽略
// SERVICE_ERROR_NORMAL 错误按缺省办法处理
// SERVICE_ERROR_CRITICAL 增加对错误处理的校验,并提示出对话框,并记录错误信息到log文件
LPCTSTR lpBinaryPathName, // name of binary file,编译后的驱动程序
LPCTSTR lpLoadOrderGroup, // 用何用户组开启服务
LPDWORD lpdwTagId, // 输出验证标签
LPCTSTR lpDependencies, // 所依赖的服务名称
LPCTSTR lpServiceStartName, // 用户账户名称
LPCTSTR lpPassword // 用户口令
);
4、打开服务
SC_HANDLE OpenService(
SC_HANDLE hSCManager, // handle to SCM database
LPCTSTR lpServiceName, // service name
DWORD dwDesiredAccess // 访问权限,一般设置为SERVICE_ALL_ACCESS
);
5、控制服务
BOOL ControlService(
SC_HANDLE hService, // handle to service
DWORD dwControl, // control code
// SERVICE_CONTROL_CONTINUE 针对暂停的服务发出的命令
// SERVICE_CONTROL_PAUSE 针对正在运行的服务发出暂停命令
// SERVICE_CONTROL_STOP 针对正在运行的服务发出停止命令
LPSERVICE_STATUS lpServiceStatus // status information,服务返回的状态码
);
设备驱动程序的动态加载主要由服务控制管理程序(Service Control Manager, SCM)来完成。
加载和卸载NT驱动分为四个步骤:
1、为NT驱动创建新的任务
2、开启此项服务。
3、关闭此项服务。
4、删除NT驱动所创建的服务。
1、打开SCM管理器函数,用于SCM的初始化。
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, //计算机名称,NULL代表本机
LPCTSTR lpDatabaseName, //SCM数据库名称,NULL代表缺省数据库
DWRD dwDesiredAccess //使用权限,一般设置为SC_MANAGER_ALL_ACCESS
);
返回值:成功返回SCM管理器句柄,失败返回NULL
2、关闭服务句柄,关闭SCM管理器句柄,用于SCM清除工作
BOOL CloseServiceHandle(
SC_HANDLE hSCObject //要关闭的SCM句柄
)
3、创建服务,创建SCM管理器的句柄,后面操作都是基于此句柄
SC_HANDLE CreateService(
SC_HANDLE hSCManager, // handle to SCM database,OpenSCManager打开的句柄
LPCTSTR lpServiceName, // 服务名称,就是在设备管理器中看到的设备名称
LPCTSTR lpDisplayName, // 服务显示出的名称
DWORD dwDesiredAccess, // 打开权限,一般设置为SERVICE_ALL_ACCESS
DWORD dwServiceType, // 服务类型
// SERVICE_FILE_SYSTEM_DRIVER File system driver service.
// SERVICE_KERNEL_DRIVER Driver service.一般用此项
DWORD dwStartType, // 打开服务时间
// SERVICE_AUTO_START 驱动自动加载
// SERVICE_BOOT_START 被system loader加载,系统启动之前
// SERVICE_DEMAND_START 需要是启动,一般选择此项
DWORD dwErrorControl, // 关于错误处理的代码
// SERVICE_ERROR_IGNORE 错误全部忽略
// SERVICE_ERROR_NORMAL 错误按缺省办法处理
// SERVICE_ERROR_CRITICAL 增加对错误处理的校验,并提示出对话框,并记录错误信息到log文件
LPCTSTR lpBinaryPathName, // name of binary file,编译后的驱动程序
LPCTSTR lpLoadOrderGroup, // 用何用户组开启服务
LPDWORD lpdwTagId, // 输出验证标签
LPCTSTR lpDependencies, // 所依赖的服务名称
LPCTSTR lpServiceStartName, // 用户账户名称
LPCTSTR lpPassword // 用户口令
);
4、打开服务
SC_HANDLE OpenService(
SC_HANDLE hSCManager, // handle to SCM database
LPCTSTR lpServiceName, // service name
DWORD dwDesiredAccess // 访问权限,一般设置为SERVICE_ALL_ACCESS
);
5、控制服务
BOOL ControlService(
SC_HANDLE hService, // handle to service
DWORD dwControl, // control code
// SERVICE_CONTROL_CONTINUE 针对暂停的服务发出的命令
// SERVICE_CONTROL_PAUSE 针对正在运行的服务发出暂停命令
// SERVICE_CONTROL_STOP 针对正在运行的服务发出停止命令
LPSERVICE_STATUS lpServiceStatus // status information,服务返回的状态码
);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/518171/viewspace-711544/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/518171/viewspace-711544/