编写内核驱动加载工具
生活随笔
收集整理的這篇文章主要介紹了
编写内核驱动加载工具
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
編寫內核驅動加載工具
一丶加載內核驅動的常用API介紹.
加載內核驅動,使用我們的ring3下的API即可完成.
API分別是:
OpenSCManager? 打開設備(服務)管理器
CreateService 創建服務(或者設備,根據參數不同而不同)
OpenService ? ?打開設備或者服務.
StartService? ? ? ? ? ?啟動服務,啟動設備.
ControlService? ? ? ?控制設備或者服務的狀態.
CloseServiceHandle?關閉服務或者設備的句柄
DeleteService? ? ? ?卸載服務
參數介紹:
1.打開設備管理器
SC_HANDLE OpenSCManager(LPCTSTR lpMachineName, // 機器名稱.可以制定計算機,如不指定,給NULL則是打開自己.LPCTSTR lpDatabaseName, // 打開設備管理器數據庫的名稱,如果為NULL則使用默認的.DWORD dwDesiredAccess // 打開的權限. ); ?返回值:
成功:?返回設備管理器的句柄
失敗:?返回NULL
?
2.創建設備或者服務.
SC_HANDLE CreateService( SC_HANDLE hSCManager, //設備管理器句柄,通過OpenScManger返回LPCTSTR lpServiceName, // 服務或者設備啟動的名稱LPCTSTR lpDisplayName, // 服務或者的顯示名稱DWORD dwDesiredAccess, // 訪問服務或者設備的權限DWORD dwServiceType, // 創建的服務或者設備的類型,如果是內核驅動,則通過這里給DWORD dwStartType, // 服務或者設備何時啟動DWORD dwErrorControl, // 服務或者設備如果啟動出錯,則指定一下應用程序應該怎么做,(重啟,或者重新長還是.)LPCTSTR lpBinaryPathName, // 服務或者設備的文件路徑,必須給.LPCTSTR lpLoadOrderGroup, // 服務或者設備排租.LPDWORD lpdwTagId, // 可以通過注冊表來啟動服務.LPCTSTR lpDependencies, // array of dependency namesLPCTSTR lpServiceStartName, // 服務的啟動名稱. LPCTSTR lpPassword // 密碼; );返回值:
成功:?返回創建服務或者設備的句柄.
失敗:?返回NULL
3.打開服務或者設備.
SC_HANDLE OpenService(SC_HANDLE hSCManager, // 設備管理器的句柄,通過OpenScManger返回.LPCTSTR lpServiceName, // 服務或者設備的名稱.DWORD dwDesiredAccess // 打開服務或者設備的權限. );返回值:
成功:?返回服務或者設備的句柄.
失敗:?返回NULL
4.啟動服務或者設備.
BOOL StartService(SC_HANDLE hService, // 服務或者設備句柄DWORD dwNumServiceArgs, // 二維數組的個數.LPCTSTR* lpServiceArgVectors // 二維數組.其中每組存儲一個服務名稱.如果是內核驅動則都給NULL即可. );返回值:
成功:?返回非零值
失敗:?返回零值.
5.控制服務或者設備.
BOOL ControlService(SC_HANDLE hService, // 服務或者設備句柄,通過OpenService或者CreateService返回.DWORD dwControl, //控制代碼. 如果給SERVICE_CONTROL_PAUSE那么服務就會暫停LPSERVICE_STATUS lpServiceStatus // 服務的狀態.是一個結構體,操作系統幫你填好. );結構體:
typedef struct _SERVICE_STATUS { DWORD dwServiceType; //服務的類型DWORD dwCurrentState; //服務的當前狀態,暫停狀態還是停止狀態....DWORD dwControlsAccepted; //服務的控制碼.DWORD dwWin32ExitCode; //服務錯誤或者停止返回的錯誤馱DWORD dwServiceSpecificExitCode; //服務啟動的是否返回的錯誤代碼.DWORD dwCheckPoint; //服務開啟的是否的用于統計的次數.到達100則啟動完成.一般進度條使用DWORD dwWaitHint; } SERVICE_STATUS, *LPSERVICE_STATUS//給定一個期望值.時間.然后按照時間一點一點的啟動.6.關閉服務句柄.
BOOL CloseServiceHandle(SC_HANDLE hSCObject // 服務或者設備的句柄 );?7.卸載服務
BOOL DeleteService( SC_HANDLE hService // handle to service);?
二丶詳細代碼
上面是簡單的API介紹.下面則貼出完整的代碼.
請注意我這里使用的是MFC編寫的.?但是其每個函數不會互相依賴.如果你是拷貝代碼.則之間誒拷貝過去就可以使用.
1.安裝內核驅動代碼
m_CreateService = CreateService(m_ScHand, 服務或者設備名稱, //例如: MySystem.sys服務或者設備的名稱,SC_MANAGER_ALL_ACCESS,SERVICE_KERNEL_DRIVER,//安裝的屬性,我這里給的是內核的.所以安裝的是內核.SERVICE_DEMAND_START,SERVICE_ERROR_SEVERE,m_EdtPathName,NULL,NULL,NULL,NULL,NULL);if (m_CreateService == NULL){::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT("Sorry Install Drive Fail"), TEXT("Error"), NULL);return;}::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT("InStall Drive Sucess"), TEXT("Sucess"), NULL);2.卸載代碼
m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_ScHand == NULL){::MessageBox(NULL, TEXT("Sorry OpenScManger Fail\r\n"), TEXT("Error"), MB_ICONEXCLAMATION);return;}//open Servicem_CreateService = OpenService(m_ScHand, m_ServiceName, SERVICE_STOP | DELETE);if (m_CreateService == NULL){::MessageBox(NULL, TEXT("Sorry Install Drive Fail"), TEXT("Error"), NULL);return;}BOOL bRet = FALSE;bRet = DeleteService(m_CreateService);if (!bRet){::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT("Sorry UnInstall Drive Fail"), TEXT("Error"), NULL);return;}DeleteService(m_CreateService);::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT("UnInstall Drive Sucess"), TEXT("Sucess"), NULL);3.啟動內核驅動的代碼
m_ScHand = NULL;m_CreateService = NULL;m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if (m_ScHand == NULL){::MessageBox(NULL, TEXT("Sorry OpenScManger Fail\r\n"), TEXT("Error"), MB_ICONEXCLAMATION);return;}//open Servicem_CreateService = OpenService(m_ScHand, m_ServiceName, SERVICE_START);if (m_CreateService == NULL){::MessageBox(NULL, TEXT("Sorry Start Drive Fail"), TEXT("Error"), NULL);return;}UpdateData(TRUE);BOOL bRet = StartService(m_CreateService,0,NULL); //重要的地方.if (bRet == NULL){::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT("Sorry Start Service Fail\r\n"), TEXT("Error"), IDOK);return;}::CloseServiceHandle(m_CreateService);::CloseServiceHandle(m_ScHand);::MessageBox(NULL, TEXT(" Start Service Sucess\r\n"), TEXT("Sucess"), IDOK);4..暫停內核驅動
m_ScHand = NULL;m_CreateService = NULL;UpdateData(TRUE);m_ScHand = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); SERVICE_STATUS svcsta = { 0 }; if (m_ScHand != NULL){ SC_HANDLE hService = OpenService(m_ScHand, m_ServiceName, SERVICE_STOP); if (hService != NULL){ if (ControlService(m_CreateService, SERVICE_CONTROL_STOP, &svcsta)) { CloseServiceHandle(m_CreateService); CloseServiceHandle(m_ScHand); ::MessageBox(NULL, TEXT(" Stop Service Sucess\r\n"), TEXT("Sucess"), IDOK);return ; } CloseServiceHandle(m_CreateService); CloseServiceHandle(m_ScHand); ::MessageBox(NULL, TEXT(" Stop Service Fail\r\n"), TEXT("Error"), IDOK);return ; } CloseServiceHandle(m_ScHand); return ; } else {::MessageBox(NULL, TEXT(" Stop Service Fail\r\n"), TEXT("Fail"), IDOK);return ; }return;?
總結
以上是生活随笔為你收集整理的编写内核驱动加载工具的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 17. 框架标签及其应用实例
- 下一篇: 安装并配置ROS环境