NT式駆動の取り付け

11580 ワード

NT式駆動の取り付け
      A、OpenSCManager
      B、CreateService
      C、OpenService
      D、StartService
      E、CloseServiceHandle
F、loadNTDriver関数に統合
 
#include  
通常のロードドライバの手順は次のとおりです.
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 ); 

 
loadNTDriver関数への統合
//  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 ! 
", GetLastError() );     bRet = FALSE;     goto BExit;   }   else   {     //OpenSCManager     TRACE( "OpenSCManager() ok !
" );   }   //   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 !
", dwRtn );       bRet = FALSE;       goto BExit;     }     else     {       //       TRACE( "CrateService() , ERROR is ERROR_IO_PENDING or ERROR_SERVICE_EXISTS!
" );     }     //     hServiceDDK = OpenService( hServiceMgr, lpDriverName, SERVICE_ALL_ACCESS );     if( hServiceDDK == NULL )     {       //       dwRtn = GetLastError();       TRACE( "OpenService() %d !
", dwRtn );       bRet = FALSE;       goto BExit;     }     else     {      TRACE( "OpenService() !
" );     }   }   else   {     TRACE( "CrateService() !
" );   }   //   bRet= StartService( hServiceDDK, NULL, NULL );   if( !bRet ) //   {     TRACE( "StartService() %d !
", dwRtn );   }   bRet = TRUE; //
BExit:   if(hServiceDDK)   {     CloseServiceHandle(hServiceDDK);   }   if(hServiceMgr)   {     CloseServiceHandle(hServiceMgr);   }   return bRet; }