Home >Database >Mysql Tutorial >vc++ 加载,卸载自己的驱动程序

vc++ 加载,卸载自己的驱动程序

WBOY
WBOYOriginal
2016-06-07 15:05:591523browse

用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
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn