在.NET框架中本身就提供了一套API接口,包含在System.Service
Process中你可能会有疑惑,驱动与系统服务是不一样的 对的它们
的确不一样、这样说吧、驱动是跟随系统最先启动的程序,当然这
个前提必须建立在你的驱动安装在%WINDIR%\[32/64]\Drivers中,
然后是系统组件包括系统服务两个部分、.NET可以开发系统服务但
不可以开发驱动这是因为,在驱动随系统映射时、CLR组件还没有
被系统映射、当然驱动与服务两个本身相当类似,我们需要调用它
提供的服务于命令基本方式都差不到那里去、至于.NET框架上
ServiceController类提供的ExecuteCommand当然它不止是调用
服务命令且可以使用驱动命令、它包含一个命令参数且必须在128
~256之间,而且不存在返回值、着实有些令人摸不到头脑、当然通
常是通过DeviceIoControl调用命令、在本文中通过EnumDeviceDri
vers、GetDeviceDriverBaseName获取到被映射的驱动程序、通过
这两个函数可以更快更节省资源的获取到我们想要的信息 如果需要
获取到复杂信息 那么可以通过ServiceController.GetDevices()获取
到、当然这或许会是一个好办法、
外部函数注解:
// 枚举驱动设备映像
Declare Sub EnumDeviceDrivers Lib "psapi.dll" (ByVal lpImageBase As IntPtr(),// 欲获取驱动映像地址缓冲区
ByVal cbSize As Integer,// 欲获取驱动映像地址缓冲区长度
ByRef lpcbNeeded As Integer) // 欲获取驱动映像地址缓冲区尺寸
// 取驱动设备基类名
Declare Sub GetDeviceDriverBaseName Lib "psapi.dll" Alias "GetDeviceDriverBaseNameA" (
ByVal ImageBase As IntPtr,// 欲获取信息的驱动映像地址
ByVal lpBaseName As String,// 欲获取驱动信息的字符缓冲区
ByVal nSize As Integer) // 欲获取驱动信息的字符缓冲区尺寸
// 取驱动设备文件名
Declare Sub GetDeviceDriverFileName Lib "psapi.dll" Alias "GetDeviceDriverFileNameA" (
ByVal ImageBase As IntPtr,// 欲获取信息的驱动映像地址
ByVal lpBaseName As String,// 欲获取驱动信息的字符缓冲区
ByVal nSize As Integer)// 欲获取驱动信息的字符缓冲区尺寸
示例代码:
Imports System.Runtime.InteropServices Module MainModule Declare Sub EnumDeviceDrivers Lib "psapi.dll" (ByVal lpImageBase As IntPtr(),ByVal cbSize As Integer,ByRef lpcbNeeded As Integer) Declare Sub GetDeviceDriverBaseName Lib "psapi.dll" Alias "GetDeviceDriverBaseNameA" (ByVal ImageBase As IntPtr,ByVal lpBaseName As String,ByVal nSize As Integer) Declare Sub GetDeviceDriverFileName Lib "psapi.dll" Alias "GetDeviceDriverFileNameA" (ByVal ImageBase As IntPtr,ByVal nSize As Integer) Sub Main() Dim cbSize = vbNull,cbNeeded As Integer Dim pbaseAddr As IntPtr() = nothing Do cbSize = cbSize * 2 ReDim pbaseAddr(cbSize) EnumDeviceDrivers(pbaseAddr,cbSize,cbNeeded) Loop While cbNeeded > cbSize cbSize = (cbNeeded / IntPtr.Size) - 1 For i = 0 To cbSize Step 1 Dim strBaseName As String = Space(8096) GetDeviceDriverBaseName(pbaseAddr(i),strBaseName,8096) Console.WriteLine(strBaseName.TrimEnd() & pbaseAddr(i).ToString("X")) Next Console.ReadKey(False) End Sub End Module
原文地址:https://www.jb51.cc/vb/257185.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。