>  기사  >  데이터 베이스  >  vc++ 加载,卸载自己的驱动程序

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

WBOY
WBOY원래의
2016-06-07 15:05:591479검색

用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
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.