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