Windows核心學習筆記(四)– 編寫程式手動載入驅動程式

來源:互聯網
上載者:User

#include <windows.h><br />#include <winsvc.h><br />#include <conio.h><br />#include <stdio.h><br />#define DRIVER_NAME "HelloDriver"<br />#define DRIVER_PATH "..//MyDriver//HelloDriver.sys"<br />//裝載NT驅動程式<br />BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)<br />{<br />char szDriverImagePath[256];<br />//得到完整的驅動路徑<br />GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);<br />BOOL bRet = FALSE;<br />SC_HANDLE hServiceMgr=NULL;//SCM管理器的控制代碼<br />SC_HANDLE hServiceDDK=NULL;//NT驅動程式的服務控制代碼<br />//開啟服務控制管理員<br />hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );<br />if( hServiceMgr == NULL )<br />{<br />//OpenSCManager失敗<br />printf( "OpenSCManager() Faild %d ! /n", GetLastError() );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />////OpenSCManager成功<br />printf( "OpenSCManager() ok ! /n" );<br />}<br />//建立驅動所對應的服務<br />hServiceDDK = CreateService( hServiceMgr,<br />lpszDriverName, //驅動程式的在註冊表中的名字<br />lpszDriverName, // 註冊表驅動程式的 DisplayName 值<br />SERVICE_ALL_ACCESS, // 載入驅動程式的存取權限<br />SERVICE_KERNEL_DRIVER,// 表示載入的服務是驅動程式<br />SERVICE_DEMAND_START, // 註冊表驅動程式的 Start 值<br />SERVICE_ERROR_IGNORE, // 註冊表驅動程式的 ErrorControl 值<br />szDriverImagePath, // 註冊表驅動程式的 ImagePath 值<br />NULL,<br />NULL,<br />NULL,<br />NULL,<br />NULL);<br />DWORD dwRtn;<br />//判斷服務是否失敗<br />if( hServiceDDK == NULL )<br />{<br />dwRtn = GetLastError();<br />if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )<br />{<br />//由於其他原因建立服務失敗<br />printf( "CrateService() Faild %d ! /n", dwRtn );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />//服務建立失敗,是由於服務已經創立過<br />printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! /n" );<br />}<br />// 驅動程式已經載入,只需要開啟<br />hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );<br />if( hServiceDDK == NULL )<br />{<br />//如果開啟服務也失敗,則意味錯誤<br />dwRtn = GetLastError();<br />printf( "OpenService() Faild %d ! /n", dwRtn );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />printf( "OpenService() ok ! /n" );<br />}<br />}<br />else<br />{<br />printf( "CrateService() ok ! /n" );<br />}<br />//開啟此項服務<br />bRet= StartService( hServiceDDK, NULL, NULL );<br />if( !bRet )<br />{<br />DWORD dwRtn = GetLastError();<br />if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING )<br />{<br />printf( "StartService() Faild %d ! /n", dwRtn );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />if( dwRtn == ERROR_IO_PENDING )<br />{<br />//裝置被掛住<br />printf( "StartService() Faild ERROR_IO_PENDING ! /n");<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />//服務已經開啟<br />printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! /n");<br />bRet = TRUE;<br />goto BeforeLeave;<br />}<br />}<br />}<br />bRet = TRUE;<br />//離開前關閉控制代碼<br />BeforeLeave:<br />if(hServiceDDK)<br />{<br />CloseServiceHandle(hServiceDDK);<br />}<br />if(hServiceMgr)<br />{<br />CloseServiceHandle(hServiceMgr);<br />}<br />return bRet;<br />}<br />//卸載驅動程式<br />BOOL UnloadNTDriver( char * szSvrName )<br />{<br />BOOL bRet = FALSE;<br />SC_HANDLE hServiceMgr=NULL;//SCM管理器的控制代碼<br />SC_HANDLE hServiceDDK=NULL;//NT驅動程式的服務控制代碼<br />SERVICE_STATUS SvrSta;<br />//開啟SCM管理器<br />hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );<br />if( hServiceMgr == NULL )<br />{<br />//帶開SCM管理器失敗<br />printf( "OpenSCManager() Faild %d ! /n", GetLastError() );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />//帶開SCM管理器失敗成功<br />printf( "OpenSCManager() ok ! /n" );<br />}<br />//開啟驅動所對應的服務<br />hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );<br />if( hServiceDDK == NULL )<br />{<br />//開啟驅動所對應的服務失敗<br />printf( "OpenService() Faild %d ! /n", GetLastError() );<br />bRet = FALSE;<br />goto BeforeLeave;<br />}<br />else<br />{<br />printf( "OpenService() ok ! /n" );<br />}<br />//停止驅動程式,如果停止失敗,只有重新啟動才能,再動態載入。<br />if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) )<br />{<br />printf( "ControlService() Faild %d !/n", GetLastError() );<br />}<br />else<br />{<br />//開啟驅動所對應的失敗<br />printf( "ControlService() ok !/n" );<br />}<br />//動態卸載驅動程式。<br />if( !DeleteService( hServiceDDK ) )<br />{<br />//卸載失敗<br />printf( "DeleteSrevice() Faild %d !/n", GetLastError() );<br />}<br />else<br />{<br />//卸載成功<br />printf( "DelServer:eleteSrevice() ok !/n" );<br />}<br />bRet = TRUE;<br />BeforeLeave:<br />//離開前關閉開啟的控制代碼<br />if(hServiceDDK)<br />{<br />CloseServiceHandle(hServiceDDK);<br />}<br />if(hServiceMgr)<br />{<br />CloseServiceHandle(hServiceMgr);<br />}<br />return bRet;<br />}<br />void TestDriver()<br />{<br />//測試驅動程式<br />HANDLE hDevice = CreateFile("////.//HelloDDK",<br />GENERIC_WRITE | GENERIC_READ,<br />0,<br />NULL,<br />OPEN_EXISTING,<br />0,<br />NULL);<br />if( hDevice != INVALID_HANDLE_VALUE )<br />{<br />printf( "Create Device ok ! /n" );<br />}<br />else<br />{<br />printf( "Create Device faild %d ! /n", GetLastError() );<br />}<br />CloseHandle( hDevice );<br />}<br />int main(int argc, char* argv[])<br />{<br />//載入驅動<br />BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);<br />if (!bRet)<br />{<br />printf("LoadNTDriver error/n");<br />return 0;<br />}<br />//載入成功<br />printf( "press any to create device!/n" );<br />getch();<br />TestDriver();<br />//這時候你可以通過註冊表,或其他查看符號串連的軟體驗證。<br />printf( "press any to unload the driver!/n" );<br />getch();<br />//卸載驅動<br />UnloadNTDriver(DRIVER_NAME);<br />if (!bRet)<br />{<br />printf("UnloadNTDriver error/n");<br />return 0;<br />}<br />return 0;<br />}<br />

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.