驱动开发:实现驱动加载卸载工具
生活随笔
收集整理的這篇文章主要介紹了
驱动开发:实现驱动加载卸载工具
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
驅(qū)動(dòng)程序加載工具有許多,最常用的當(dāng)屬KmdManager工具,如果驅(qū)動(dòng)程序需要對(duì)外發(fā)布那我們必須自己編寫實(shí)現(xiàn)一個(gè)驅(qū)動(dòng)加載工具,當(dāng)需要使用驅(qū)動(dòng)時(shí)可以拉起自己的驅(qū)動(dòng),如下將實(shí)現(xiàn)一個(gè)簡單的驅(qū)動(dòng)加載工具,該工具可以實(shí)現(xiàn)基本的,安裝,加載,關(guān)閉,卸載等操作日常使用完全沒問題。
installDvr 驅(qū)動(dòng)安裝
#include <iostream> #include <Windows.h>using namespace std;// 安裝驅(qū)動(dòng) BOOL installDvr(CONST WCHAR drvPath[50], CONST WCHAR serviceName[20]) {// 打開服務(wù)控制管理器數(shù)據(jù)庫SC_HANDLE schSCManager = OpenSCManager(NULL, // 目標(biāo)計(jì)算機(jī)的名稱,NULL:連接本地計(jì)算機(jī)上的服務(wù)控制管理器NULL, // 服務(wù)控制管理器數(shù)據(jù)庫的名稱,NULL:打開 SERVICES_ACTIVE_DATABASE 數(shù)據(jù)庫SC_MANAGER_ALL_ACCESS // 所有權(quán)限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 創(chuàng)建服務(wù)對(duì)象,添加至服務(wù)控制管理器數(shù)據(jù)庫SC_HANDLE schService = CreateService(schSCManager, // 服務(wù)控件管理器數(shù)據(jù)庫的句柄serviceName, // 要安裝的服務(wù)的名稱serviceName, // 用戶界面程序用來標(biāo)識(shí)服務(wù)的顯示名稱SERVICE_ALL_ACCESS, // 對(duì)服務(wù)的訪問權(quán)限:所有全權(quán)限SERVICE_KERNEL_DRIVER, // 服務(wù)類型:驅(qū)動(dòng)服務(wù)SERVICE_DEMAND_START, // 服務(wù)啟動(dòng)選項(xiàng):進(jìn)程調(diào)用 StartService 時(shí)啟動(dòng)SERVICE_ERROR_IGNORE, // 如果無法啟動(dòng):忽略錯(cuò)誤繼續(xù)運(yùn)行drvPath, // 驅(qū)動(dòng)文件絕對(duì)路徑,如果包含空格需要多加雙引號(hào)NULL, // 服務(wù)所屬的負(fù)載訂購組:服務(wù)不屬于某個(gè)組NULL, // 接收訂購組唯一標(biāo)記值:不接收NULL, // 服務(wù)加載順序數(shù)組:服務(wù)沒有依賴項(xiàng)NULL, // 運(yùn)行服務(wù)的賬戶名:使用 LocalSystem 賬戶NULL // LocalSystem 賬戶密碼);if (schService == NULL){CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return TRUE; }int main(int argc, char *argv[]) {if (installDvr(L"C:\\WinDDK.sys", L"service") == TRUE){cout << "驅(qū)動(dòng)已安裝" << endl;}getchar();return 0; }startDvr 啟動(dòng)驅(qū)動(dòng)
#include <iostream> #include <Windows.h>using namespace std;// 啟動(dòng)服務(wù) BOOL startDvr(CONST WCHAR serviceName[20]) {// 打開服務(wù)控制管理器數(shù)據(jù)庫SC_HANDLE schSCManager = OpenSCManager(NULL, // 目標(biāo)計(jì)算機(jī)的名稱,NULL:連接本地計(jì)算機(jī)上的服務(wù)控制管理器NULL, // 服務(wù)控制管理器數(shù)據(jù)庫的名稱,NULL:打開 SERVICES_ACTIVE_DATABASE 數(shù)據(jù)庫SC_MANAGER_ALL_ACCESS // 所有權(quán)限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打開服務(wù)SC_HANDLE hs = OpenService(schSCManager, // 服務(wù)控件管理器數(shù)據(jù)庫的句柄serviceName, // 要打開的服務(wù)名SERVICE_ALL_ACCESS // 服務(wù)訪問權(quán)限:所有權(quán)限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (StartService(hs, 0, 0) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE; }int main(int argc, char *argv[]) {if (startDvr(L"service") == TRUE){cout << "驅(qū)動(dòng)服務(wù)" << endl;}getchar();return 0; }stopDvr 停止驅(qū)動(dòng)
#include <iostream> #include <Windows.h>using namespace std;// 停止服務(wù) BOOL stopDvr(CONST WCHAR serviceName[20]) {// 打開服務(wù)控制管理器數(shù)據(jù)庫SC_HANDLE schSCManager = OpenSCManager(NULL, // 目標(biāo)計(jì)算機(jī)的名稱,NULL:連接本地計(jì)算機(jī)上的服務(wù)控制管理器NULL, // 服務(wù)控制管理器數(shù)據(jù)庫的名稱,NULL:打開 SERVICES_ACTIVE_DATABASE 數(shù)據(jù)庫SC_MANAGER_ALL_ACCESS // 所有權(quán)限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打開服務(wù)SC_HANDLE hs = OpenService(schSCManager, // 服務(wù)控件管理器數(shù)據(jù)庫的句柄serviceName, // 要打開的服務(wù)名SERVICE_ALL_ACCESS // 服務(wù)訪問權(quán)限:所有權(quán)限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 如果服務(wù)正在運(yùn)行SERVICE_STATUS status;if (QueryServiceStatus(hs, &status) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}if (status.dwCurrentState != SERVICE_STOPPED &&status.dwCurrentState != SERVICE_STOP_PENDING){// 發(fā)送關(guān)閉服務(wù)請(qǐng)求if (ControlService(hs, // 服務(wù)句柄SERVICE_CONTROL_STOP, // 控制碼:通知服務(wù)應(yīng)該停止&status // 接收最新的服務(wù)狀態(tài)信息) == 0) {CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 判斷超時(shí)INT timeOut = 0;while (status.dwCurrentState != SERVICE_STOPPED){timeOut++;QueryServiceStatus(hs, &status);Sleep(50);}if (timeOut > 80){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE; }int main(int argc, char *argv[]) {if (stopDvr(L"service") == TRUE){cout << "停止驅(qū)動(dòng)服務(wù)" << endl;}getchar();return 0; }unloadDvr 卸載驅(qū)動(dòng)
#include <iostream> #include <Windows.h>using namespace std;// 卸載驅(qū)動(dòng) BOOL unloadDvr(CONST WCHAR serviceName[20]) {// 打開服務(wù)控制管理器數(shù)據(jù)庫SC_HANDLE schSCManager = OpenSCManager(NULL, // 目標(biāo)計(jì)算機(jī)的名稱,NULL:連接本地計(jì)算機(jī)上的服務(wù)控制管理器NULL, // 服務(wù)控制管理器數(shù)據(jù)庫的名稱,NULL:打開 SERVICES_ACTIVE_DATABASE 數(shù)據(jù)庫SC_MANAGER_ALL_ACCESS // 所有權(quán)限);if (schSCManager == NULL){CloseServiceHandle(schSCManager);return FALSE;}// 打開服務(wù)SC_HANDLE hs = OpenService(schSCManager, // 服務(wù)控件管理器數(shù)據(jù)庫的句柄serviceName, // 要打開的服務(wù)名SERVICE_ALL_ACCESS // 服務(wù)訪問權(quán)限:所有權(quán)限);if (hs == NULL){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}// 刪除服務(wù)if (DeleteService(hs) == 0){CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return FALSE;}CloseServiceHandle(hs);CloseServiceHandle(schSCManager);return TRUE; }int main(int argc, char *argv[]) {if (unloadDvr(L"service") == TRUE){cout << "卸載驅(qū)動(dòng)服務(wù)" << endl;}getchar();return 0; }總結(jié)
以上是生活随笔為你收集整理的驱动开发:实现驱动加载卸载工具的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hook xposed 自定义类_【开始
- 下一篇: 玩转oracle 11g(5):表空间的