- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2023-6-21
 
- 在线时间
 - 2 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 38 
 
 
 
 
 | 
 
 
c++加载驱动文件,自己经常用的。 
- #include <windows.h> 
 
 - #include <winsvc.h> 
 
 - #include <conio.h> 
 
 - #include <stdio.h>
 
  
- #define DRIVER_NAME "HelloDDK"
 
 - #define DRIVER_PATH "..\\MyDriver\\MyDriver_Check\\HelloDDK.sys"
 
  
- //装载NT驱动程序
 
 - BOOL LoadNTDriver(char* lpszDriverName,char* lpszDriverPath)
 
 - {
 
 -     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);
 
 -     }
 
 -     return bRet;
 
 - }
 
  
- //卸载驱动程序 
 
 - BOOL UnloadNTDriver( char * szSvrName ) 
 
 - {
 
 -     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);
 
 -     }
 
 -     return bRet;   
 
 - }
 
  
- void TestDriver()
 
 - {
 
 -     //测试驱动程序 
 
 -     HANDLE hDevice = CreateFile("\\\\.\\HelloDDK", 
 
 -         GENERIC_WRITE | GENERIC_READ, 
 
 -         0, 
 
 -         NULL, 
 
 -         OPEN_EXISTING, 
 
 -         0, 
 
 -         NULL); 
 
 -     if( hDevice != INVALID_HANDLE_VALUE ) 
 
 -     {
 
 -         printf( "Create Device ok ! \n" ); 
 
 -     }
 
 -     else 
 
 -     {
 
 -         printf( "Create Device faild %d ! \n", GetLastError() ); 
 
 -     }
 
 -     CloseHandle( hDevice );
 
 - }
 
  
- int main(int argc, char* argv[]) 
 
 - {
 
 -     //加载驱动
 
 -     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;
 
 -     }
 
 -     return 0; 
 
 - } 
 
  复制代码 
 |   
 
 
 
 |