正常加载驱动的步骤如下:
1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步;
2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务.
3、调用StartService开启服务
OpenSCManager——>CreateService——>OpenService——>StartService——>CloseServiceHandle
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // 指向计算机名称,此处为NULL表示指向本机
LPCTSTR lpDatabaseName, // SCM数据库名称,此用为NULL表示使用默认
DWORD dwDesiredAccess // 使用权限一般设置为SC_MANAGER_ALL_ACCESS表示有所有使用权限
);
// 要关闭的SCM句柄
BOOLCloseServiceHandle(SC_HANDLE hSCObject )
//打开服务控制管理器
OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS);
//创建驱动所对应的服务
CreateService( hServiceMgr,//SCM管理器句柄
lpszDriverName,//驱动程序的在注册表中的名字
lpszDriverName,// 注册表驱动程序的 DisplayName 值
SERVICE_ALL_ACCESS, // 加载驱动程序的访问权限
SERVICE_KERNEL_DRIVER,// 表示加载的服务是驱动程序
SERVICE_DEMAND_START, // 注册表驱动程序的 Start 值
SERVICE_ERROR_IGNORE, // 注册表驱动程序的 ErrorControl 值
szDriverImagePath,// 注册表驱动程序的 ImagePath 值
NULL, //要开启服务的 用户组
NULL, //输出验证标签
NULL, //所依赖的服务的名称
NULL, //用户账户名称
NULL); //用户口令
// 驱动程序已经加载,只需要打开
OpenService( hServiceMgr,lpszDriverName, SERVICE_ALL_ACCESS );
//开启此项服务
StartService( hServiceDDK, NULL, NULL );