安装驱动小工具

安装驱动小工具

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、界面



演示程序下载:

在我上传的资源内


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值