利用SCM加载驱动

来源:互联网 发布:vr球面投影算法 编辑:程序博客网 时间:2024/05/22 08:11

mark一下:

写了一个简单得类

后期会陆续添加其他两种常用方法.

头文件:

class DriverLoader  {    public:BOOL UnloadNTDriverBySCM();BOOL LoadNTDriverBySCM();DriverLoader(CString paht,CString name);virtual ~DriverLoader();CString driverpath;CString servicename;};


实现文件:


// DriverLoader.cpp: implementation of the DriverLoader class.////////////////////////////////////////////////////////////////////////#include "DriverLoader.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////DriverLoader::DriverLoader(CString path,CString name){this->driverpath = path;this->servicename = name;}DriverLoader::~DriverLoader(){}BOOL DriverLoader::LoadNTDriverBySCM(){BOOL bRet = false;SC_HANDLE hManager = NULL;    //SCM管理句柄SC_HANDLE hService = NULL;    //NT驱动服务句柄//打开服务控制管理器SCMhManager = OpenSCManager ( NULL, NULL, SC_MANAGER_ALL_ACCESS );if( hManager == NULL ){//打开服务管理器失败MessageBox( NULL, "ERROR", "OpenSCM", MB_OK );bRet = false;CloseServiceHandle( hManager );return bRet;}else{MessageBox( NULL, "SUCCESS", "OpenSCM", MB_OK );}hService = CreateService( hManager,servicename,servicename,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_DEMAND_START,SERVICE_ERROR_IGNORE,driverpath,NULL,NULL,NULL,NULL,NULL );DWORD dwRtn;if( hService == NULL ){dwRtn = GetLastError();if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ){//由于其他原因创建服务失败MessageBox( NULL, "ERROR", "CreateService", MB_OK );bRet = false;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}else{//服务已经创建过  只需打开服务MessageBox( NULL, "ERROR", "Service Created", MB_OK );}//打开服务hService = OpenService( hManager, servicename, SERVICE_ALL_ACCESS );if( hService == NULL ){//打开服务失败MessageBox( NULL, "ERROR", "OpenService", MB_OK );bRet = false;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}else{MessageBox( NULL, "SUCCESS", "OpenService", MB_OK );}}else{MessageBox( NULL, "SUCCESS", "CreateService", MB_OK );}//开启服务bRet = StartService( hService, NULL, NULL);if( !bRet ){dwRtn = GetLastError();if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING){MessageBox( NULL, "SUCCESS", "StartService", MB_OK );bRet = false;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}else{if( dwRtn == ERROR_IO_PENDING ){//设备被挂住MessageBox( NULL, "ERROR", "StartService", MB_OK );bRet = false;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}else{//服务已经启动MessageBox( NULL, "SUCCESS", "StartService", MB_OK );bRet = true;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}}}    MessageBox( NULL, "SUCCESS", "StartService", MB_OK );    CloseServiceHandle( hManager );CloseServiceHandle( hService );    return bRet;}BOOL DriverLoader::UnloadNTDriverBySCM(){BOOL bRet = false;SC_HANDLE hManager = NULL;SC_HANDLE hService = NULL;SERVICE_STATUS SvrSta;//打开SCM管理器hManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );if( hManager == NULL ){//打开服务管理器失败MessageBox( NULL, "ERROR", "OpenSCM", MB_OK );bRet = false;CloseServiceHandle( hManager );return bRet;}else{MessageBox( NULL, "SUCCESS", "OpenSCM", MB_OK );}//打开服务hService = OpenService( hManager, servicename, SERVICE_ALL_ACCESS );if( hService == NULL ){//打开服务失败MessageBox( NULL, "ERROR", "OpenService", MB_OK );bRet = false;CloseServiceHandle( hManager );CloseServiceHandle( hService );return bRet;}else{MessageBox( NULL, "SUCCESS", "OpenService", MB_OK );}//停止驱动if( !ControlService( hService,SERVICE_CONTROL_STOP, &SvrSta) ){MessageBox( NULL, "ERROR", "ControlService", MB_OK );}else{MessageBox( NULL, "SUCCESS", "ControlService", MB_OK );}//卸载服务if( !DeleteService( hService ) ){MessageBox( NULL, "ERROR", "DeleteService", MB_OK );}else{MessageBox( NULL, "SUCCESS", "DeleteService", MB_OK );}bRet = true;    CloseServiceHandle( hManager );CloseServiceHandle( hService );     return bRet;}