驅動載入工具的實現

2021-08-19 07:17:12 字數 3487 閱讀 6222

使用openscmanager函式開啟服務控制管理器(scm),獲得控制代碼.使用這個scm控制代碼建立(或者開啟)服務,服務執行載入驅動,服務停止解除安裝驅動

openscmanager      //開啟裝置(服務)管理器

createservice    //建立服務(或者裝置,根據引數不同而不同)

openservice      //開啟裝置或者服務.

startservice       //啟動服務,啟動裝置.

controlservice     //控制裝置或者服務的狀態.

closeservicehandle //關閉服務或者裝置的控制代碼

deleteservice      //解除安裝,刪除服務

//安裝驅動

void cmfcdriveloaddlg::onbnclickedmfcbuttoninstall()

//1. 使用openscmanager函式開啟scm

m_hservicemgr = openscmanager(null, null, sc_manager_all_access);

if (m_hservicemgr == null)

//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);

getdlgitem(idc_static_prompt)->setwindowtext(_t("driver has been installed"));//設定控制項文字內容

}//載入驅動

void cmfcdriveloaddlg::onbnclickedmfcbuttonstart()

//使用openscmanager函式開啟scm

m_hservicemgr = openscmanager(null, null, sc_manager_all_access);

if (m_hservicemgr == null)

//開啟服務獲得控制代碼

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);

getdlgitem(idc_static_prompt)->setwindowtext(_t("the driver has started"));//設定控制項文字內容

}//停止驅動

void cmfcdriveloaddlg::onbnclickedmfcbuttonstop()

//使用openscmanager函式開啟scm

m_hservicemgr = openscmanager(null, null, sc_manager_all_access);

if (m_hservicemgr == null)

//開啟服務獲得控制代碼

m_hserviceddk = openservice(m_hservicemgr, _t("hadesservice"), service_stop);

//停止驅動服務

service_status svcsta = ;

bool bret = controlservice(m_hserviceddk, service_control_stop, &svcsta);

if (bret == false)

closeservicehandle(m_hserviceddk);

closeservicehandle(m_hservicemgr);

getdlgitem(idc_static_prompt)->setwindowtext(_t("the drive has stopped"));//設定控制項文字內容

}//解除安裝驅動

void cmfcdriveloaddlg::onbnclickedmfcbuttonuninstall()

//使用openscmanager函式開啟scm

m_hservicemgr = openscmanager(null, null, sc_manager_all_access);

if (m_hservicemgr == null)

//開啟服務獲得控制代碼

m_hserviceddk = openservice(m_hservicemgr, _t("hadesservice"), service_stop | delete);

//刪除驅動服務

bool bret = deleteservice(m_hserviceddk);

if (bret == false)

getdlgitem(idc_static_prompt)->setwindowtext(_t("driver has been uninstalled"));//設定控制項文字內容

載入驅動測試截圖(驅動輸出了helloworld和遍歷了驅動模組被windbg捕獲):

1 程式設計實現載入驅動

win64驅動模板 0 包含的標頭檔案。可以加入系統或自己定義的標頭檔案 include include include 1 定義符號鏈結,一般來說修改為驅動的名字即可 define device name l device krnlhw64 define link name l dosdevice...

手動載入NT式驅動 非工具 修改登錄檔實現

手動載入nt式驅動 非工具 a 觀察登錄檔 b 手動執行驅動 c 手動停止驅動 執行 regedit.exe hkey local machine system currentcontrolset services imagepath g 驅動教程 018 讀出ssdt表當前函式位址 mini dd...

載入LSI驅動

如是是64位系統,則解壓其中的megaraid sas v00.00.04.37 k2.6.32 21 server.amd64.gz,得到megaraid sas v00.00.04.37 k2.6.32 21 server.amd64檔案,把這個檔案加上字尾.zip 再次解壓就會得到下面所用用到...