|
本帖最后由 JerryAJ 于 2016-8-27 16:04 编辑
最近打算用C#做界面,突发奇想就弄了这个驱动管理类,原理和c++那些没什么不同,步骤还是老样子,只是有些地方做了修改
小生也是刚入门,技术有限O(∩_∩)O
目前在WIN7 x64和WIN10 1024 x64下测试通过
具体使用方法,我会上传一个项目文件,里面关于这个类的使用和驱动通信有一个实例
说明:里面的NativeApi和NativeApiEx 2个类是用于声明需要用到的API函数和相关常量
贴上类的主要代码:
- using Microsoft.Win32.SafeHandles;
- using System;
- using System.IO;
- using System.ServiceProcess;
- /*
- .Net driver manager class template
- Version:1.0
- Autor:JerryAJ
- */
- namespace KernelBox
- {
- public class DriverManager
- {
- // 驱动文件的名称
- public static string g_strSysName = "MainDriver.sys";
- // 驱动文件的路径
- public static string g_strSysPath = Directory.GetCurrentDirectory() + "\" + g_strSysName;
- // 驱动符号链接名称
- public static string g_strSysLinkName = "\\\\.\\AJ_Driver"; //格式:\\\\.\\xxoo
- // 驱动服务名称
- public static string g_strSysSvcLinkName = "AJ_Driver";
- // 驱动句柄
- public SafeFileHandle hDrv;
- // SCM句柄
- private IntPtr hSCManager;
- // 驱动服务句柄
- private IntPtr hService;
-
- // 获取驱动服务句柄
- public bool GetSvcHandle()
- {
- hSCManager = NativeApi.OpenSCManager(null, null, (uint)NativeApiEx.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
- if (IntPtr.Zero == hSCManager)
- return false;
- hService = NativeApi.OpenService(hSCManager, g_strSysSvcLinkName, (uint)NativeApiEx.SERVICE_ACCESS.SERVICE_ALL_ACCESS);
- if (IntPtr.Zero == hService)
- {
- NativeApi.CloseServiceHandle(hService);
- return false;
- }
- return true;
- }
- // 安装驱动服务
- public bool Install()
- {
- hSCManager = NativeApi.OpenSCManager(null, null, (uint)NativeApiEx.SCM_ACCESS.SC_MANAGER_ALL_ACCESS);
- if (IntPtr.Zero == hSCManager)
- return false;
- hService = NativeApi.CreateService(hSCManager, g_strSysSvcLinkName, g_strSysSvcLinkName,
- (uint)NativeApiEx.SERVICE_ACCESS.SERVICE_ALL_ACCESS, (uint)NativeApiEx.SERVICE_TYPE.SERVICE_KERNEL_DRIVER,
- (uint)NativeApiEx.SERVICE_START.SERVICE_DEMAND_START, (uint)NativeApiEx.SERVICE_ERROR.SERVICE_ERROR_NORMAL,
- g_strSysPath, null, null, null, null, null);
- if (IntPtr.Zero == hService)
- {
- NativeApi.GetLastError();
- NativeApi.CloseServiceHandle(hService);
- return false;
- }
- return true;
- }
- // 启动驱动服务
- public bool Start()
- {
- if (!NativeApi.StartService(hService, 0x0, null))
- return false;
- return true;
- }
- // 停止驱动服务
- public bool Stop()
- {
- try
- {
- ServiceController service = new ServiceController(g_strSysSvcLinkName);
- if (service.Status == ServiceControllerStatus.Stopped)
- return true;
- else
- {
- TimeSpan timeout = TimeSpan.FromMilliseconds(1000 * 10);
- service.Stop();
- service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
- }
- }
- catch (Exception)
- {
- return false;
- throw;
- }
- return true;
- }
- // 卸载驱动
- public bool Remove()
- {
- if (!NativeApi.DeleteService(hService))
- return false;
- else
- {
- NativeApi.CloseServiceHandle(hService);
- NativeApi.CloseServiceHandle(hSCManager);
- }
- return true;
- }
- // 打开当前驱动
- public SafeFileHandle OpenDriver(string strLinkName)
- {
- return NativeApi.CreateFile(strLinkName, FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
- }
- // 用于驱动通信的IO控制器
- public bool IoControl(SafeFileHandle hDriver, uint nIoCode, object InBuffer, uint nInBufferSize, object OutBuffer, uint nOutBufferSize, ref uint pBytesReturned, ref System.Threading.NativeOverlapped Overlapped)
- {
- const uint FILE_ANY_ACCESS = 0;
- const uint METHOD_BUFFERED = 0;
- bool bRet;
- nIoCode = ((int)NativeApiEx.DEVICE_TYPE.FILE_DEVICE_UNKNOWN * 65536) | (FILE_ANY_ACCESS * 16384) | (nIoCode * 4) | METHOD_BUFFERED;
- bRet = NativeApi.DeviceIoControl(hDriver, nIoCode, InBuffer, nInBufferSize, OutBuffer, nOutBufferSize, ref pBytesReturned, ref Overlapped);
- return bRet;
- }
- // 初始化
- public bool InitializeDriver()
- {
- bool bRet = false;
- hDrv = OpenDriver(g_strSysLinkName);
- NativeApi.GetLastError();
- if (!hDrv.IsInvalid)
- bRet = GetSvcHandle();
- else
- {
- bRet = Install();
- if (!bRet)
- return bRet;
- else
- {
- bRet = Start();
- hDrv = OpenDriver(g_strSysLinkName);
- }
- }
- return bRet;
- }
- // 卸载驱动
- public bool RemoveDrvier()
- {
- hDrv.Close();
- hDrv.Dispose();
- hDrv = null;
- bool bRet = false;
- bRet = Stop();
- if (!bRet)
- return bRet;
- bRet = Remove();
- return bRet;
- }
- }
- }
复制代码
完毕! |
评分
-
查看全部评分
|