驱动加载工具的实现
驅動加載工具的實現
主要思路:
使用OpenSCManager函數打開服務控制管理器(SCM),獲得句柄.使用這個SCM句柄創建(或者打開)服務,服務運行加載驅動,服務停止卸載驅動
主要函數:
OpenSCManager ? ? ?//打開設備(服務)管理器
CreateService ?//創建服務(或者設備,根據參數不同而不同)
OpenService ? ?//打開設備或者服務.
StartService ? ? ? //啟動服務,啟動設備.
ControlService ? ? //控制設備或者服務的狀態.
CloseServiceHandle //關閉服務或者設備的句柄
DeleteService ? ? ?//卸載,刪除服務
主要代碼:
//安裝驅動 void CMFCDriveLoadDlg::OnBnClickedMfcbuttonInstall() {// TODO: 在此添加控件通知處理程序代碼//不是驅動文件,直接返回,不處理if (m_isDriverFile == FALSE){return;}//1. 使用OpenSCManager函數打開SCMm_hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_hServiceMgr == NULL){MessageBox(_T("OpenSCManager Error"), _T("Error"));CloseServiceHandle(m_hServiceMgr);return;}//2.使用CreateService函數利用SCM句柄創建一個服務m_hServiceDDK = CreateService(m_hServiceMgr,//SMC句柄_T("HadesService"),//驅動服務名稱(驅動程序的在注冊表中的名字)_T("HadesService"),//驅動服務顯示名稱(注冊表驅動程序的DisplayName值)SERVICE_ALL_ACCESS,//權限(所有訪問權限)SERVICE_KERNEL_DRIVER,//服務類型(驅動程序)SERVICE_DEMAND_START,//啟動方式(需要時啟動,注冊表驅動程序的Start值)SERVICE_ERROR_IGNORE,//錯誤控制(忽略,注冊表驅動程序的ErrorControl值)m_szPath_w,//服務的二進制文件路徑(驅動程序文件路徑, 注冊表驅動程序的ImagePath值)NULL,//加載組命令NULL,//TagId(指向一個加載順序的標簽值)NULL,//依存關系NULL,//服務啟動名NULL);//密碼if (m_hServiceDDK == NULL){//如果創建錯誤,關閉句柄CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);MessageBox(_T("Install Drive Fail"), _T("Error"));return;}CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(_T("Driver has been installed"));//設置控件文本內容 }//加載驅動 void CMFCDriveLoadDlg::OnBnClickedMfcbuttonStart() {// TODO: 在此添加控件通知處理程序代碼//不是驅動文件,直接返回,不處理if (m_isDriverFile == FALSE){return;}//使用OpenSCManager函數打開SCMm_hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_hServiceMgr == NULL){MessageBox(_T("OpenSCManager Error"), _T("Error"));CloseServiceHandle(m_hServiceMgr);return;}//打開服務獲得句柄m_hServiceDDK = OpenService(m_hServiceMgr, _T("HadesService"), SERVICE_START);//啟動剛剛創建的服務BOOL bRet = StartService(m_hServiceDDK, NULL, NULL);if (bRet == FALSE){CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);MessageBox(_T("Start Service Fail"), _T("Error"));return;}CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(_T("The driver has started"));//設置控件文本內容 }//停止驅動 void CMFCDriveLoadDlg::OnBnClickedMfcbuttonStop() {// TODO: 在此添加控件通知處理程序代碼//不是驅動文件,直接返回,不處理if (m_isDriverFile == FALSE){return;}//使用OpenSCManager函數打開SCMm_hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_hServiceMgr == NULL){MessageBox(_T("OpenSCManager Error"), _T("Error"));CloseServiceHandle(m_hServiceMgr);return;}//打開服務獲得句柄m_hServiceDDK = OpenService(m_hServiceMgr, _T("HadesService"), SERVICE_STOP);//停止驅動服務SERVICE_STATUS svcsta = { 0 };BOOL bRet = ControlService(m_hServiceDDK, SERVICE_CONTROL_STOP, &svcsta);if (bRet == FALSE){CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);MessageBox(_T("Stop Service Fail"), _T("Error"));return;}CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(_T("The drive has stopped"));//設置控件文本內容 }//卸載驅動 void CMFCDriveLoadDlg::OnBnClickedMfcbuttonUninstall() {// TODO: 在此添加控件通知處理程序代碼//不是驅動文件,直接返回,不處理if (m_isDriverFile == FALSE){return;}//使用OpenSCManager函數打開SCMm_hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_hServiceMgr == NULL){MessageBox(_T("OpenSCManager Error"), _T("Error"));CloseServiceHandle(m_hServiceMgr);return;}//打開服務獲得句柄m_hServiceDDK = OpenService(m_hServiceMgr, _T("HadesService"), SERVICE_STOP | DELETE);//刪除驅動服務BOOL bRet = DeleteService(m_hServiceDDK);if (bRet == FALSE){MessageBox(_T("UnInstall Service Fail"), _T("Error"));CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr);return;}GetDlgItem(IDC_STATIC_PROMPT)->SetWindowText(_T("Driver has been uninstalled"));//設置控件文本內容CloseServiceHandle(m_hServiceDDK);CloseServiceHandle(m_hServiceMgr); }程序截圖:
加載驅動測試截圖(驅動輸出了helloworld和遍歷了驅動模塊被Windbg捕獲):總結
- 上一篇: docker 主进程 日志_运维笔记--
- 下一篇: ifix如何设画面大小_如何让你的视频又