安装驱动小工具
1、说明
对于一般的驱动,不需要使用inf文件,直接安装
2、代码
主要封装了几个函数
// 服务是否存在
BOOL EtIsServiceExists(CString strServiceName);
// 安装服务
BOOL EtInstallService(CString strServiceName, CString strFileName, DWORD dwStartType);
// 启动服务
BOOL EtStartService(CString strServiceName);
// 停止服务
BOOL EtStopService(CString strServiceName);
// 卸载服务
BOOL EtUnInstallService(CString strServiceName);
代码:
BOOL CInstallDriversDlg::EtIsServiceExists(CString strServiceName)
{
SC_HANDLE hSC = ::OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS
);
if(NULL == hSC)
{
return FALSE;
}
SC_HANDLE hSvc = ::OpenService(
hSC,
strServiceName.GetBuffer(),
SERVICE_QUERY_STATUS
);
if(NULL == hSvc)
{
::CloseServiceHandle(hSC);
return FALSE;
}
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return TRUE;
}
BOOL CInstallDriversDlg::EtInstallService(CString strServiceName, CString strFileName, DWORD dwStartType)
{
CString strMsg;
if(EtIsServiceExists(strServiceName))
{
m_strInfo += TEXT("服务已经存在!\r\n");
UpdateData(FALSE);
return TRUE;
}
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
LPTSTR strSvcName = strServiceName.GetBuffer();
SC_HANDLE hService = ::CreateService(
hSCM,
strSvcName,
strSvcName,
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
dwStartType,
SERVICE_ERROR_NORMAL,
strFileName.GetBuffer(),
NULL,
NULL,
NULL,
NULL,
NULL);
if(NULL == hService)
{
::CloseServiceHandle(hSCM);
m_strInfo += TEXT("安装服务失败!\r\n");
UpdateData(FALSE);
return FALSE;
}
else
{
m_strInfo += TEXT("安装服务成功!\r\n");
}
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
UpdateData(FALSE);
return TRUE;
}
BOOL CInstallDriversDlg::EtStartService(CString strServiceName)
{
CString strMsg;
if(!EtIsServiceExists(strServiceName))
{
m_strInfo += TEXT("指定服务不存在!\r\n");
UpdateData(FALSE);
return TRUE;
}
SC_HANDLE hSC = ::OpenSCManager(
NULL,
NULL,
GENERIC_EXECUTE);
if (NULL == hSC)
{
return FALSE;
}
SC_HANDLE hSvc = ::OpenService(
hSC,
strServiceName.GetBuffer(),
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP
);
if (NULL == hSvc)
{
::CloseServiceHandle(hSC);
return FALSE;
}
if (!::StartService(hSvc, NULL, NULL))
{
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return FALSE;
}
else
{
m_strInfo += TEXT("开启服务成功!\r\n");
}
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
UpdateData(FALSE);
return TRUE;
}
BOOL CInstallDriversDlg::EtStopService(CString strServiceName)
{
CString strMsg;
if(!EtIsServiceExists(strServiceName))
{
m_strInfo += TEXT("指定服务不存在!\r\n");
UpdateData(FALSE);
return TRUE;
}
SC_HANDLE hSC = ::OpenSCManager(
NULL,
NULL,
GENERIC_EXECUTE);
if (NULL == hSC)
{
return FALSE;
}
SC_HANDLE hSvc = ::OpenService(
hSC,
strServiceName.GetBuffer(),
SERVICE_START | SERVICE_QUERY_STATUS | SERVICE_STOP
);
if (NULL == hSvc)
{
::CloseServiceHandle(hSC);
return FALSE;
}
SERVICE_STATUS status;
do
{
if (::QueryServiceStatus(hSvc, &status))
{
::Sleep(status.dwWaitHint);
}
else
{
::CloseServiceHandle( hSvc);
::CloseServiceHandle( hSC);
return FALSE;
}
} while (0 < status.dwWaitHint);
if (status.dwCurrentState == SERVICE_RUNNING)
{
if (!::ControlService(hSvc, SERVICE_CONTROL_STOP, &status))
{
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
return FALSE;
}
else
{
m_strInfo += TEXT("停止服务成功!\r\n");
}
}
else
{
m_strInfo += TEXT("服务为启动!\r\n");
}
::CloseServiceHandle(hSvc);
::CloseServiceHandle(hSC);
UpdateData(FALSE);
return TRUE;
}
BOOL CInstallDriversDlg::EtUnInstallService(CString strServiceName)
{
CString strMsg;
if(!EtIsServiceExists(strServiceName))
{
m_strInfo += TEXT("指定服务不存在!\r\n");
UpdateData(FALSE);
return TRUE;
}
SC_HANDLE hSCM = ::OpenSCManager(
NULL,
NULL,
SC_MANAGER_ALL_ACCESS
);
if (NULL == hSCM)
{
return FALSE;
}
SC_HANDLE hService = ::OpenService(
hSCM,
strServiceName.GetBuffer(),
SERVICE_STOP | DELETE
);
if (NULL == hService)
{
::CloseServiceHandle(hSCM);
m_strInfo += TEXT("打开服务失败!\r\n");
UpdateData(FALSE);
return FALSE;
}
SERVICE_STATUS sServiceStatus;
::ControlService(hService, SERVICE_CONTROL_STOP, &sServiceStatus);
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
m_strInfo += TEXT("卸载服务成功!\r\n");
UpdateData(FALSE);
return bDelete;
}
3、界面
演示程序下载:
在我上传的资源内