vc編程實現sys文件的安裝

#include <windows.h> 
#include <winsvc.h> 
#include <conio.h> 
#include <stdio.h>

#define DRIVER_NAME "123467"
#define DRIVER_PATH "..\\HelloDDK.sys"

//裝載NT驅動程序
BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
{

/************************ 加載NT驅動的代碼*******************************
   ① 調用OpenSCManager,打開SCM管理器.若是返回NULL,則返回失敗,不然繼續
   ② 調用CreateService,建立服務,建立成功則轉步驟 ⑥
      ③ 用GetLastError的獲得錯誤返回值
   ④ 返回值爲ERROR_IO_PENDING,說明服務已經建立過,用OpenService打開此服務.
   ⑤ 返回值爲其餘值, 建立武服務失敗,返回失敗.
   ⑥ 調用StartService開啓服務
   ⑦ 成功返回
************************************************************************/

char szDriverImagePath[256];
//獲得完整的驅動路徑
GetFullPathName(lpszDriverPath, 256, szDriverImagePath, NULL);

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失敗
   printf( "OpenSCManager() Faild %d ! \n", GetLastError() );
   bRet = FALSE;
   goto BeforeLeave;
}
else
{
   // OpenSCManager成功
   printf( "OpenSCManager() ok ! \n" ); 
}


//建立驅動所對應的服務
hServiceDDK = CreateService( hServiceMgr,
   lpszDriverName,         // 驅動程序的在註冊表中的名字 
   lpszDriverName,         // 註冊表驅動程序的 DisplayName 值 
   SERVICE_ALL_ACCESS,     // 加載驅動程序的訪問權限 
   SERVICE_KERNEL_DRIVER, // 表示加載的服務是驅動程序 
   SERVICE_DEMAND_START,   // 註冊表驅動程序的 Start 值 
   SERVICE_ERROR_IGNORE,   // 註冊表驅動程序的 ErrorControl 值 
   szDriverImagePath,      // 註冊表驅動程序的 ImagePath 值 
   NULL, 
   NULL, 
   NULL, 
   NULL, 
   NULL);

DWORD dwRtn;
// 判斷服務是否失敗
if( hServiceDDK == NULL ) 
{ 
   dwRtn = GetLastError();
   if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_EXISTS ) 
   { 
    //因爲其餘緣由建立服務失敗
    printf( "CrateService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   {
    //服務建立失敗,是因爲服務已經創立過
    printf( "CrateService() Faild Service is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS! \n" ); 
   }

   // 驅動程序已經加載,只須要打開 
   hServiceDDK = OpenService( hServiceMgr, lpszDriverName, SERVICE_ALL_ACCESS ); 
   if( hServiceDDK == NULL ) 
   {
    // 若是打開服務也失敗,則意味錯誤
    dwRtn = GetLastError(); 
    printf( "OpenService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   {
    printf( "OpenService() ok ! \n" );
   }
} 
else 
{
   printf( "CrateService() ok ! \n" );
}

// 開啓此項服務
bRet= StartService( hServiceDDK, NULL, NULL ); 
if( !bRet ) 
{ 
   DWORD dwRtn = GetLastError(); 
   if( dwRtn != ERROR_IO_PENDING && dwRtn != ERROR_SERVICE_ALREADY_RUNNING ) 
   { 
    printf( "StartService() Faild %d ! \n", dwRtn ); 
    bRet = FALSE;
    goto BeforeLeave;
   } 
   else 
   { 
    if( dwRtn == ERROR_IO_PENDING ) 
    { 
     // 設備被掛住
     printf( "StartService() Faild ERROR_IO_PENDING ! \n");
     bRet = FALSE;
     goto BeforeLeave;
    } 
    else 
    { 
     // 服務已經開啓
     printf( "StartService() Faild ERROR_SERVICE_ALREADY_RUNNING ! \n");
     bRet = TRUE;
     goto BeforeLeave;
    } 
   } 
}
bRet = TRUE;
// 離開前關閉句柄
BeforeLeave:
if(hServiceDDK)
{
   CloseServiceHandle(hServiceDDK); // 服務句柄
}
if(hServiceMgr)
{
   CloseServiceHandle(hServiceMgr); // SCM句柄
}
return bRet;
}

// 卸載驅動程序 
BOOL UnloadNTDriver( char * szSvrName ) 
{
/************************* 卸載NT驅動的代碼******************************
   ① 調用OpenSCManager,打開SCM管理器,若是返回NULL,則返回失敗,不然繼續.
   ② 調用OpenService.若是返回NULL,則返回失敗,不然繼續
   ③ 調用DeleteService卸載此項服務.
   ④ 成功返回.
************************************************************************/

BOOL bRet = FALSE;
SC_HANDLE hServiceMgr=NULL;// SCM管理器的句柄
SC_HANDLE hServiceDDK=NULL;// NT驅動程序的服務句柄
SERVICE_STATUS SvrSta;
// 打開SCM管理器
hServiceMgr = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS ); 
if( hServiceMgr == NULL ) 
{
   // 打開SCM管理器失敗
   printf( "OpenSCManager() Faild %d ! \n", GetLastError() ); 
   bRet = FALSE;
   goto BeforeLeave;
} 
else 
{
   // 打開SCM管理器失敗成功
   printf( "OpenSCManager() ok ! \n" ); 
}

// 打開驅動所對應的服務
hServiceDDK = OpenService( hServiceMgr, szSvrName, SERVICE_ALL_ACCESS );

if( hServiceDDK == NULL ) 
{
   // 打開驅動所對應的服務失敗
   printf( "OpenService() Faild %d ! \n", GetLastError() ); 
   bRet = FALSE;
   goto BeforeLeave;
} 
else 
{ 
   printf( "OpenService() ok ! \n" ); 
}

// 中止驅動程序,若是中止失敗,只有從新啓動才能,再動態加載。 
if( !ControlService( hServiceDDK, SERVICE_CONTROL_STOP , &SvrSta ) ) 
{ 
   printf( "ControlService() Faild %d !\n", GetLastError() ); 
} 
else 
{
   // 打開驅動所對應的失敗
   printf( "ControlService() ok !\n" ); 
} 
// 動態卸載驅動程序。 
if( !DeleteService( hServiceDDK ) ) 
{
   // 卸載失敗
   printf( "DeleteSrevice() Faild %d !\n", GetLastError() ); 
} 
else 
{ 
   // 卸載成功
   printf( "DelServer:eleteSrevice() ok !\n" ); 
} 
bRet = TRUE;
BeforeLeave:
// 離開前關閉打開的句柄
if(hServiceDDK)
{
   CloseServiceHandle(hServiceDDK); // 服務句柄
}
if(hServiceMgr)
{
   CloseServiceHandle(hServiceMgr); // SCM 句柄
}
return bRet; 
}

void TestDriver()
{
// 測試驅動程序 
HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", 
   GENERIC_WRITE | GENERIC_READ, 
   0, 
   NULL, 
   OPEN_EXISTING, 
   0, 
   NULL); 
if( hDevice != INVALID_HANDLE_VALUE ) 
{
   MessageBox(NULL,"SUCESSFULLY....ComeOn...","Yes",0);
   printf( "Create Device ok ! \n" ); 
}
else 
{
   printf( "Create Device faild %d ! \n", GetLastError() ); 
   MessageBox(NULL,"Faild...Fuckking...","No",0);
}
CloseHandle( hDevice );
}

int main(int argc, char* argv[]) 
{  

UnloadNTDriver(DRIVER_NAME);
// 加載驅動
BOOL bRet = LoadNTDriver(DRIVER_NAME,DRIVER_PATH);
if (!bRet)
{
   printf("LoadNTDriver error\n");
   return 0;
}
// 加載成功

printf( "press any to create device!\n" ); 
getch();

TestDriver();

// 這時候你能夠經過註冊表,或其餘查看符號鏈接的軟件驗證。 
printf( "press any to unload the driver!\n" ); 
getch();

// 卸載驅動
UnloadNTDriver(DRIVER_NAME);
// if (!bRet)
// {
//   printf("UnloadNTDriver error\n");
//   return 0;
// }
system("pause");
return 0; 
}
相關文章
相關標籤/搜索