1. 程式人生 > >NT式驅動的安裝解除安裝

NT式驅動的安裝解除安裝

 AOpenSCManager

      BCreateService

      C、OpenService

      DStartService

      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;   

}