NT式驅動的安裝解除安裝
A、OpenSCManager
B、CreateService
C、OpenService
D、StartService
E、CloseServiceHandle
F、整合到loadNTDriver函式
#include <winsvc.h>
正常載入驅動的步驟如下:
1、呼叫OpenSCManager,開啟SCM管理器。如果返回NULL,則返回失敗,否則繼續下一步;
2、呼叫CreateService建立服務,如果用GetLastError獲取的返回值為ERROR_IO_PENDING,說明服務已經建立過,此時用OpenService開啟此服務.
3、呼叫StartService開啟服務
SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, // 指向計算機名稱,此處為NULL表示指向本機
LPCTSTR lpDatabaseName, // SCM資料庫名稱,此用為NULL表示使用預設
DWORD dwDesiredAccess // 使用許可權 一般設定為SC_MANAGER_ALL_ACCESS表示有所有使用許可權
);
BOOL CloseServiceHandle(
SC_HANDLE hSCObject // 要關閉的SCM控制代碼
//開啟服務控制管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
//建立驅動所對應的服務
hServiceDDK = CreateService( hServiceMgr,//SCM管理器控制代碼
lpszDriverName, //驅動程式的在登錄檔中的名字
lpszDriverName, // 登錄檔驅動程式的 DisplayName 值
SERVICE_ALL_ACCESS, // 載入驅動程式的訪問許可權
SERVICE_KERNEL_DRIVER,// 表示載入的服務是驅動程式
SERVICE_DEMAND_START, // 登錄檔驅動程式的 Start 值
SERVICE_ERROR_IGNORE, // 登錄檔驅動程式的 ErrorControl 值
szDriverImagePath, // 登錄檔驅動程式的 ImagePath 值
NULL, //要開啟服務的 使用者組
NULL, //輸出驗證標籤
NULL, //所依賴的服務的名稱
NULL, //使用者賬戶名稱
NULL); //使用者口令
// 驅動程式已經載入,只需要開啟
hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS );
//開啟此項服務
bRet= StartService( hServiceDDK, NULL, NULL );
//裝載NT驅動程式
BOOL LoadNTDriver(char* lpDriverName,char* lpDriverPathName)
{
BOOL bRet = FALSE;
SC_HANDLE hServiceMgr=NULL;//SCM管理器的控制代碼
SC_HANDLE hServiceDDK=NULL;//NT驅動程式的服務控制代碼
//開啟服務控制管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hServiceMgr == NULL )
{
//OpenSCManager失敗
TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );
bRet = FALSE;
goto BExit;
}
else
{
////OpenSCManager成功
TRACE( "OpenSCManager() ok ! \n" );
}
//建立驅動所對應的服務
hServiceDDK = CreateService( hServiceMgr,
lpDriverName, //驅動程式的在登錄檔中的名字
lpDriverName, // 登錄檔驅動程式的 DisplayName 值
SERVICE_ALL_ACCESS, // 載入驅動程式的訪問許可權
SERVICE_KERNEL_DRIVER,// 表示載入的服務是驅動程式
SERVICE_DEMAND_START, // 登錄檔驅動程式的 Start 值
SERVICE_ERROR_IGNORE, // 登錄檔驅動程式的 ErrorControl 值
lpDriverPathName, // 登錄檔驅動程式的 ImagePath 值
NULL,
NULL,
NULL,
NULL,
NULL);
DWORD dwRtn;
//判斷服務是否失敗
if( hServiceDDK == NULL )
{
dwRtn = GetLastError();
if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS )
{
//由於其他原因建立服務失敗
TRACE( "CrateService() 失敗 %d ! \n", dwRtn );
bRet = FALSE;
goto BExit;
}
else
{
//服務建立失敗,是由於服務已經創立過
TRACE( "CrateService() 服務建立失敗,是由於服務已經創立過 ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" );
}
// 驅動程式已經載入,只需要開啟
hServiceDDK = OpenService( hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS );
if( hServiceDDK == NULL )
{
//如果開啟服務也失敗,則意味錯誤
dwRtn = GetLastError();
TRACE( "OpenService() 失敗 %d ! \n", dwRtn );
bRet = FALSE;
goto BExit;
}
else
{
TRACE( "OpenService() 成功 ! \n" );
}
}
else
{
TRACE( "CrateService() 成功 ! \n" );
}
//開啟此項服務
bRet= StartService( hServiceDDK, NULL, NULL );
if( !bRet ) //開啟服務不成功
{
TRACE( "StartService() 失敗 服務可能已經開啟%d ! \n", dwRtn );
}
bRet = TRUE;
//離開前關閉控制代碼
BExit:
if(hServiceDDK)
{
CloseServiceHandle(hServiceDDK);
}
if(hServiceMgr)
{
CloseServiceHandle(hServiceMgr);
}
return bRet;
}
、、、、、、、、、、、、、、、、、、、、、、、、、、、、
A、解除安裝驅動流程
B、核心函式DeleteService
C、核心函式ControlService
D、構建UnLoadSys函式
E、測試並檢視除錯資訊
一、解除安裝驅動流程
1、用OpenSCManager函式開啟 服務控制管理器,取得SCM控制代碼,如果返回NULL,則結束,否則繼續2.//hSCM
2、用OpenService開啟相應的服務,如果返回NULL,則結束,否則繼續3.hSerVice
3、用ControlService停止驅動服務,如果返回NULL,只有重新啟動才能,再動態載入。
4、用DeleteService動態解除安裝驅動程式,如果返回NULL,則打印出錯除錯資訊,否則列印成功資訊。
//解除安裝驅動程式
BOOL UnLoadSys( char * szSvrName )
{
//一定義所用到的變數
BOOL bRet = FALSE;
SC_HANDLE hSCM=NULL;//SCM管理器的控制代碼,用來存放OpenSCManager的返回值
SC_HANDLE hService=NULL;//NT驅動程式的服務控制代碼,用來存放OpenService的返回值
SERVICE_STATUS SvrSta;
//二開啟SCM管理器
hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if( hSCM == NULL )
{
//帶開SCM管理器失敗
TRACE( "OpenSCManager() Faild %d ! \n", GetLastError() );
bRet = FALSE;
goto BeforeLeave;
}
else
{
//開啟SCM管理器成功
TRACE( "OpenSCManager() ok ! \n" );
}
//三開啟驅動所對應的服務
hService = OpenService( hSCM, szSvrName, SERVICE_ALL_ACCESS );
if( hService == NULL )
{
//開啟驅動所對應的服務失敗 退出
TRACE( "OpenService() Faild %d ! \n", GetLastError() );
bRet = FALSE;
goto BeforeLeave;
}
else
{
TRACE( "OpenService() ok ! \n" ); //開啟驅動所對應的服務 成功
}
//四停止驅動程式,如果停止失敗,只有重新啟動才能,再動態載入。
if( !ControlService( hService, SERVICE_CONTROL_STOP , &SvrSta ) )
{
TRACE( "用ControlService() 停止驅動程式失敗 錯誤號:%d !\n", GetLastError() );
}
else
{
//停止驅動程式成功
TRACE( "用ControlService() 停止驅動程式成功 !\n" );
}
//五動態解除安裝驅動服務。
if( !DeleteService( hService ) ) //TRUE//FALSE
{
//解除安裝失敗
TRACE( "解除安裝失敗:DeleteSrevice()錯誤號:%d !\n", GetLastError() );
}
else
{
//解除安裝成功
TRACE ( "解除安裝成功 !\n" );
}
bRet = TRUE;
//六 離開前關閉開啟的控制代碼
BeforeLeave:
if(hService>0)
{
CloseServiceHandle(hService);
}
if(hSCM>0)
{
CloseServiceHandle(hSCM);
}
return bRet;
}