应用程序与驱动程序通信的源码.doc_第1页
应用程序与驱动程序通信的源码.doc_第2页
应用程序与驱动程序通信的源码.doc_第3页
应用程序与驱动程序通信的源码.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

与驱动程序通信的源码/ Driver.h文件#ifndef _DRIVER_H_#define _DRIVER_H_#include / 为了使用SCM函数class CDriverpublic:/ 构造函数和析构函数/ 构造函数,pszDriverPath为驱动所在目录,pszLinkName为符号连接名字/ 在类的构造函数中,将试图创建或打开服务,CDriver(LPCTSTR pszDriverPath, LPCTSTR pszLinkName);/ 析构函数。在这里,将停止服务,virtual CDriver();/ 属性/ 此驱动是否可用virtual BOOL IsValid() return (m_hSCM != NULL & m_hService != NULL); / 操作/ 开启服务。也就是说驱动的DriverEntry函数将被调用virtual BOOL StartDriver();/ 结束服务。即驱动程序的DriverUnload例程将被调用virtual BOOL StopDriver();/ 打开设备,即取得到此驱动的一个句柄virtual BOOL OpenDevice();/ 向设备发送控制代码virtual DWORD IoControl(DWORD nCode, PVOID pInBuffer, DWORD nInCount, PVOID pOutBuffer, DWORD nOutCount);/ 实现protected:char m_szLinkName56;/ 符号连接名称BOOL m_bStarted;/ 指定服务是否启动BOOL m_bCreateService;/ 指定是否创建了服务HANDLE m_hSCM;/ SCM数据库句柄HANDLE m_hService;/ 服务句柄HANDLE m_hDriver;/ 设备句柄;CDriver:CDriver(LPCTSTR pszDriverPath, LPCTSTR pszLinkName)strncpy(m_szLinkName, pszLinkName, 55);m_bStarted = FALSE;m_bCreateService = FALSE;m_hSCM = m_hService = NULL;m_hDriver = INVALID_HANDLE_VALUE;/ 打开SCM管理器m_hSCM = :OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);if(m_hSCM = NULL)MessageBox(0, 打开服务控制管理器失败n, 可能是因为您不拥有Administrator权限n, 0);return;/ 创建或打开服务m_hService = :CreateService(m_hSCM, m_szLinkName, m_szLinkName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, pszDriverPath, NULL, 0, NULL, NULL, NULL);if(m_hService = NULL)/ 创建服务失败,可能是因为服务已经存在,所以还要试图打开它int nError = :GetLastError();if(nError = ERROR_SERVICE_EXISTS | nError = ERROR_SERVICE_MARKED_FOR_DELETE)m_hService = :OpenService(m_hSCM, m_szLinkName, SERVICE_ALL_ACCESS);elsem_bCreateService = TRUE;CDriver:CDriver()/ 关闭设备句柄if(m_hDriver != INVALID_HANDLE_VALUE):CloseHandle(m_hDriver);/ 如果创建了服务,就将之删除if(m_bCreateService)StopDriver();:DeleteService(m_hService);/ 关闭句柄if(m_hService != NULL):CloseServiceHandle(m_hService);if(m_hSCM != NULL):CloseServiceHandle(m_hSCM);BOOL CDriver:StartDriver()if(m_bStarted)return TRUE;if(m_hService = NULL)return FALSE;/ 启动服务if(!:StartService(m_hService, 0, NULL)int nError = :GetLastError();if(nError = ERROR_SERVICE_ALREADY_RUNNING)m_bStarted = TRUE;else:DeleteService(m_hService);else/ 启动成功后,等待服务进入运行状态int nTry = 0;SERVICE_STATUS ss;:QueryServiceStatus(m_hService, &ss);while(ss.dwCurrentState = SERVICE_START_PENDING & nTry+ 80):Sleep(50);:QueryServiceStatus(m_hService, &ss);if(ss.dwCurrentState = SERVICE_RUNNING)m_bStarted = TRUE;return m_bStarted;BOOL CDriver:StopDriver()if(!m_bStarted)return TRUE;if(m_hService = NULL)return FALSE;/ 停止服务SERVICE_STATUS ss;if(!:ControlService(m_hService, SERVICE_CONTROL_STOP, &ss)if(:GetLastError() = ERROR_SERVICE_NOT_ACTIVE)m_bStarted = FALSE;else/ 等待服务完全停止运行int nTry = 0;while(ss.dwCurrentState = SERVICE_STOP_PENDING & nTry+ 80):Sleep(50);:QueryServiceStatus(m_hService, &ss);if(ss.dwCurrentState = SERVICE_STOPPED)m_bStarted = FALSE;return !m_bStarted;BOOL CDriver:OpenDevice()if(m_hDriver != INVALID_HANDLE_VALUE)return TRUE;/ .是Win32中定义本地计算机的方法,/ m_szLinkName是设备对象的符号连接名称,后面章节会详细讨论char sz256 = ;wsprintf(sz, .%s, m_szLinkName);/ 打开驱动程序所控制设备m_hDriver = :CreateFile(sz,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);return (m_hDriver != INVALID_HANDLE_VALUE);DWORD CDriver:IoControl(DWORD nCode, PVOID pInBuffer, DWORD nInCount, PVOID pOutBuffer, DWORD nOutCount)if(m_hDriver = INVALID_HANDLE_VALUE)return -1;/ 向驱动程序发送控制代码DWORD nBytesRetu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论