视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
vc++加载,卸载自己的驱动程序
2020-11-09 08:22:41 责编:小采
文档


用vc加载 自己 的 驱动 程序 主要分为以下几个步骤: 1、加载 驱动 服务 主要要用到以下几个函数 SC_HANDLE WINAPI OpenSCManagerA( __in_optLPCSTRlpMachineName, __in_optLPCSTRlpDatabaseName, __inDWORDdwDesiredAccess ); //创建 驱动 服务 SC_HANDLE WI

用vc++加载自己的驱动程序主要分为以下几个步骤:

1、加载驱动服务

主要要用到以下几个函数

  1. SC_HANDLE
  2. WINAPI
  3. OpenSCManagerA(
  4. __in_opt LPCSTR lpMachineName,
  5. __in_opt LPCSTR lpDatabaseName,
  6. __in DWORD dwDesiredAccess
  7. );
  8. //创建驱动服务
  9. SC_HANDLE
  10. WINAPI
  11. CreateServiceA(
  12. __in SC_HANDLE hSCManager,
  13. __in LPCSTR lpServiceName,
  14. __in_opt LPCSTR lpDisplayName,
  15. __in DWORD dwDesiredAccess,
  16. __in DWORD dwServiceType,
  17. __in DWORD dwStartType,
  18. __in DWORD dwErrorControl,
  19. __in_opt LPCSTR lpBinaryPathName,
  20. __in_opt LPCSTR lpLoadOrderGroup,
  21. __out_opt LPDWORD lpdwTagId,
  22. __in_opt LPCSTR lpDependencies,
  23. __in_opt LPCSTR lpServiceStartName,
  24. __in_opt LPCSTR lpPassword
  25. );
  26. //打开驱动服务
  27. SC_HANDLE
  28. WINAPI
  29. OpenServiceA(
  30. __in SC_HANDLE hSCManager,
  31. __in LPCSTR lpServiceName,
  32. __in DWORD dwDesiredAccess
  33. );
  34. //启动驱动服务
  35. BOOL
  36. WINAPI
  37. StartServiceA(
  38. __in SC_HANDLE hService,
  39. __in DWORD dwNumServiceArgs,
  40. __in_ecount_opt(dwNumServiceArgs)
  41. LPCSTR *lpServiceArgVectors
  42. );

首先调用OpenSCManager函数 建立一个连接到服务控制管理器,然后再调用CreateService创建服务最后调用OpenService和StartService分别打开服务和启动服务。

当服务启动后就可以用CreateFile函数访问驱动程序了代码如下:

1.启动驱动服务程序

  1. //启动驱动服务
  2. void LoadDriver()
  3. {
  4. SC_HANDLE hSCManager = NULL;
  5. SC_HANDLE hService = NULL;
  6. SC_HANDLE hService1 = NULL;
  7. hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
  8. hService = CreateService(hSCManager,
  9. MYWINRIN0, //这是驱动服务名称 这里为"MyWinRing0" 可以自定义任意名称
  10. MYWINRIN0, //这是驱动服务显示名称,可以自定义任意名称,这里我选择和上面一样
  11. SERVICE_ALL_ACCESS,
  12. SERVICE_KERNEL_DRIVER,
  13. SERVICE_DEMAND_START,
  14. SERVICE_ERROR_NORMAL,
  15. gDriverPath,//驱动存放的路径,这里和应用程序同目录
  16. NULL,
  17. NULL,
  18. NULL,
  19. NULL,
  20. NULL
  21. );
  22. CloseServiceHandle(hService);//上面创建成功后就关闭掉这个句柄
  23. hService1 = OpenService(hSCManager, MYWINRIN0, SERVICE_ALL_ACCESS);//打开上面创建的服务,名字为"MyWinRing0"
  24. int result=StartService(hService1, 0, NULL);//启动服务
  25. CloseServiceHandle(hSCManager);
  26. CloseServiceHandle(hService1);
  27. }

2.打开驱动服务

  1. //驱动服务启动后,打开驱动
  2. BOOL OpenDriver()
  3. {
  4. char message[256];
  5. gHandle = CreateFile(
  6. _T("\\\\.\\") OLS_DRIVER_ID,//这个地方的名字必须是驱动程序里面IoCreateDevice函数创建设备是 使用的名字
  7. GENERIC_READ | GENERIC_WRITE,
  8. 0,
  9. NULL,
  10. OPEN_EXISTING,
  11. FILE_ATTRIBUTE_NORMAL,
  12. NULL
  13. );
  14. int code=GetLastError();
  15. if(gHandle == INVALID_HANDLE_VALUE)
  16. {
  17. return FALSE;
  18. }
  19. return TRUE;
  20. }

3.停止驱动

  1. //停止驱动
  2. BOOL StopDriver(SC_HANDLE hSCManager,LPCTSTR DriverId)
  3. {
  4. SC_HANDLE hService = NULL;
  5. BOOL rCode = FALSE;
  6. SERVICE_STATUS serviceStatus;
  7. DWORD error = NO_ERROR;
  8. hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  9. if(hService != NULL)
  10. {
  11. rCode = ControlService(hService, SERVICE_CONTROL_STOP, &serviceStatus);
  12. error = GetLastError();
  13. CloseServiceHandle(hService);
  14. }
  15. return rCode;
  16. }

4.卸载驱动

  1. //卸载驱动
  2. BOOL RemoveDriver(SC_HANDLE hSCManager, LPCTSTR DriverId)
  3. {
  4. SC_HANDLE hService = NULL;
  5. BOOL rCode = FALSE;
  6. hService = OpenService(hSCManager, DriverId, SERVICE_ALL_ACCESS);
  7. if(hService == NULL)
  8. {
  9. rCode = TRUE;
  10. }
  11. else
  12. {
  13. rCode = DeleteService(hService);
  14. CloseServiceHandle(hService);
  15. }
  16. return rCode;
  17. }

完整示例程序下载:http://download.csdn.net/detail/xiaibiancheng/5449887

下载本文
显示全文
专题