MFC 驱动加载工具(安装/运行/停止/卸载)
目錄
題外話
一、了解驅動
二、驅動加載流程
2.1 加載和卸載NT驅動的4個步驟
2.2 對應函數實現流程和代碼
三、一些注意事項
題外話
雖然網上已經有很多驅動加載工具和相關代碼,但自己實現一次有助于理解如何使用代碼實現驅動加載。因此本篇文章只是一個學習總結。再說點題外話,不管之前耗費多久時間完成一個項目,事后最好寫個總結,后期可以自己翻翻,重溫一下~因為我之前完成任何一個項目,都是不懂就搜,但下次遇到相同問題時還是得上網搜(⊙o⊙)…所以想試試這種總結方法會不會讓我下次遇到相同問題就不要搜百度,來搜自己博客就好啦~O(∩_∩)O哈哈~
羅里吧嗦了一堆,那開始進入正題吧!(〃'▽'〃)
一、了解驅動
如果對驅動已經有了初步的認識的同學可以跳過這部分~因為我當時是對“驅動”這個概念有點懵d(′ω`*)所以這里做個簡單介紹,目的是加深自己對驅動的理解~
驅動程序是一個軟件組件,可讓操作系統和設備彼此通信。即驅動程序是設備驅動程序,是一種可以使計算機和設備通信的特殊程序。相當于硬件的接口,操作系統只有通過這個接口,才能控制硬件設備的工作,假如某設備的驅動程序未能正確安裝,便不能正常工作。如下圖所示:
驅動文件一般由擴展名 CAT、 INF、 SYS、 DLL 等文件格式組成的。
二、驅動加載流程
編寫代碼加載驅動的原理相當于在注冊表中寫入相應的字段,因此設備驅動程序的動態加載主要由SCM(服務控制管理程序)系統組件完成。
2.1 加載和卸載NT驅動的4個步驟
Step1:安裝——為NT驅動創建新的服務:LoadNTDriver(自定義的函數名)
Step2:運行——開啟該服務:StartNTDriver(自定義的函數名)
Step3:停止——關閉此服務:StopNTDriver(自定義的函數名)
Step4:卸載——刪除NT驅動所創建的服務:UnLoadNTDriver(自定義的函數名)
2.2 對應函數實現流程和代碼
2.2.1 安裝【LoadNTDriver】
流程圖:
加載驅動流程圖代碼如下:?
//裝載NT驅動程序 BOOL CLoadNtDriver::loadNTDriver(CString strDriverPath) {wchar_t szDriverImagePath[256];CString strDriverImagePath;DWORD dwRtn;//得到完整的驅動路徑GetFullPathName(strDriverPath, 256, szDriverImagePath, NULL);strDriverImagePath = szDriverImagePath;if (strDriverImagePath.IsEmpty()){MessageBoxW(0, L" CLoadDriver::installDriver: 請輸入路徑名", NULL, MB_OK | MB_ICONWARNING);return FALSE;}if (!pathIsFile(strDriverImagePath)){strDriverImagePath += L" loadNTDriver:文件不存在";MessageBoxW(0, strDriverImagePath, NULL, MB_OK | MB_ICONWARNING);return FALSE;}// 提取驅動名wchar_t szServerName[40], szShowName[40];getDriverName(strDriverImagePath, szServerName, szShowName);//打開服務控制管理器m_hServiceMgr = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT|SC_MANAGER_CREATE_SERVICE|SC_MANAGER_ENUMERATE_SERVICE);if (m_hServiceMgr == NULL){//OpenSCManager失敗showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver");return FALSE;}else{//OpenSCManager成功showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");}//創建驅動所對應的服務m_hServiceDDK = CreateService(m_hServiceMgr,szServerName, //驅動程序的在注冊表中的名字 szShowName, // 注冊表驅動程序的 DisplayName 值 SERVICE_ALL_ACCESS, // 加載驅動程序的訪問權限 SERVICE_KERNEL_DRIVER, // 表示加載的服務是驅動程序 SERVICE_DEMAND_START, // 注冊表驅動程序的 Start 值 SERVICE_ERROR_IGNORE, // 注冊表驅動程序的 ErrorControl 值 strDriverImagePath, // 注冊表驅動程序的 ImagePath 值 NULL,NULL,NULL,NULL,NULL);//判斷服務是否失敗if (m_hServiceDDK == NULL){dwRtn = GetLastError();if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS){//由于其他原因創建服務失敗showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");releaseHandle();return FALSE;}else{//服務創建失敗,是由于服務已經創立過showErrorInfo(GetLastError(), __LINE__, L"loadNTDriver()");m_hServiceDDK = OpenService(m_hServiceMgr, szServerName, SERVICE_ALL_ACCESS);}}return TRUE; }2.2.2?運行【StartNTDriver】
流程圖:
運行驅動流程圖PS:其實啟動驅動就是開啟在注冊表中注冊的該項服務~
代碼如下:?
// 啟動驅動 BOOL CLoadNtDriver::startNTDriver( CString strDriverPath ) {//開啟此項服務if (!StartService(m_hServiceDDK, NULL, NULL)){DWORD dwRtn = GetLastError();if (dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING){showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");releaseHandle();return FALSE;}else{if (dwRtn == ERROR_IO_PENDING){//設備被掛住showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");releaseHandle();return FALSE;}}}//服務已經開啟showErrorInfo(GetLastError(), __LINE__, L"startNTDriver()");return TRUE; }2.2.3?停止【StopNTDriver】
停止驅動流程圖代碼如下:?
// 停止驅動 BOOL CLoadNtDriver::stopNTDriver( CString strDrivePath ) {//停止驅動服務SERVICE_STATUS svcsta = { 0 };if(!ControlService(m_hServiceDDK, SERVICE_CONTROL_STOP, &svcsta)){showErrorInfo(GetLastError(), __LINE__, L"stopNTDriver()");releaseHandle();return FALSE;}//服務已經停止showErrorInfo(GetLastError(), __LINE__, L"stopNTDriver()");return TRUE; }2.2.1 卸載【UnLoadNTDriver】
?
卸載驅動流程圖代碼如下:?
// 卸載驅動 BOOL CLoadNtDriver::unloadNTDriver(CString strDriverPath) {if (m_hServiceDDK == NULL){//打開驅動所對應的服務失敗showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return FALSE;}//動態卸載驅動程序。 if (!DeleteService(m_hServiceDDK)){//卸載失敗showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return FALSE;}showErrorInfo(GetLastError(), __LINE__, L"unloadNTDriver()");releaseHandle();return TRUE; }三、一些注意事項
1. 記得釋放句柄!釋放句柄后還要將句柄置為NULL。如果不釋放句柄就會出現只能實現一次安裝卸載一個驅動文件,再次點擊安裝該驅動文件(并沒有將該工具關閉重啟情況下)就會安裝失敗~
2.本驅動加載工具是用來加載自己寫的驅動文件,不要試圖 加載/運行/停止/卸載 系統的驅動文件!!!我在虛擬機上試過幾次加載系統驅動文件,然后……就藍屏了……(╥╯^╰╥)
該工具后期還會加點其他功能,實現完后再添加上來吧~到時順便把截圖也放上來,完善代碼后再將完整代碼發上來~
嘻嘻嘻,感謝你看到這(?′?`?)*?゚*
如果這篇文章對你有幫助的話,可以給個贊喲~O(≧▽≦)O
總結
以上是生活随笔為你收集整理的MFC 驱动加载工具(安装/运行/停止/卸载)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java学习(149):字符输入流
- 下一篇: win7旗舰版6l打印机咋安驱动_在w7