https://bbs.pediy.com/thread-77339.htm

参考资料

直接源码 , 基于 C C++ 。代码检测枚举 查找 驱动 列表

//.h

#pragma once
#include "stdafx.h" //MFC , 可以删。
#define MAXNUM 255
#define UNICODE // to support chinese
#include <windows.h>
#include <psapi.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib,"psapi.lib")
using namespace std;
typedef struct _DRIVER_INFO {
WCHAR DriverName[MAX_PATH];
WCHAR BaseName[MAX_PATH];
WCHAR FileName[MAX_PATH];
DWORD BaseAddr;
} DRIVER_INFO,*PDRIVER_INFO ;

typedef struct _ALL_DRIVER_INFO {
DWORD cbNum;
DRIVER_INFO DrvInfo[1]; // define variable length structure
} ALL_DRIVER_INFO,*PALL_DRIVER_INFO;

class CMyDriver{

private:
PALL_DRIVER_INFO m_pDriversInfo;
void ClearDriverInfo();
void GetDriverInfo();
BOOLEAN m_bDriver_Info_Status;

public:
CMyDriver();
void FlushDriversInfo();

//枚举驱动列表。
void ShowDriversInfo();

//查询指定驱动,存在返回1,不存在返回0,异常返回-1;
int DriverExists(WCHAR* wszDriverName);
~CMyDriver();
CMyDriver& operator=(const CMyDriver&);
};

//CPP

#include "stdafx.h"
#include "MyDriver.h"

CMyDriver::CMyDriver()
{
GetDriverInfo();
}

void CMyDriver::ShowDriversInfo()
{
for(int i = 0 ; i < m_pDriversInfo->cbNum ; i ++)
{
wprintf(L"%d\t%8X\t%s\t%s\n",
i,
m_pDriversInfo->DrvInfo[i].BaseAddr,
m_pDriversInfo->DrvInfo[i].BaseName,
m_pDriversInfo->DrvInfo[i].FileName
);

}
return ;
}

void CMyDriver::ClearDriverInfo()
{
GlobalFree(m_pDriversInfo);
m_pDriversInfo = NULL;
}

void CMyDriver::GetDriverInfo()
{
DWORD cbNum = 0;
PDWORD pBaseAddr = NULL;

pBaseAddr = (PDWORD)GlobalAlloc(GMEM_FIXED,sizeof(DWORD)*MAXNUM);

if( EnumDeviceDrivers ( (LPVOID*)pBaseAddr,sizeof(DWORD)*MAXNUM,&cbNum ) != TRUE )
{
wprintf( L"EnumDeviceDriver failed! ErrorCode = %8x\n", GetLastError() );
m_bDriver_Info_Status = FALSE;
GlobalFree(pBaseAddr);
pBaseAddr = NULL;
return ;

}else
{
m_bDriver_Info_Status = TRUE;
}

cbNum /= 4;

m_pDriversInfo = (PALL_DRIVER_INFO)GlobalAlloc( GMEM_FIXED,sizeof(DRIVER_INFO)*cbNum + 4 );
m_pDriversInfo -> cbNum = cbNum;

PDWORD pBaseAddrBegin = pBaseAddr;

for(int i = 0 ; i < cbNum ; i ++)
{
m_pDriversInfo->DrvInfo[i].BaseAddr = *pBaseAddr;
GetDeviceDriverBaseName( (LPVOID)*pBaseAddr,(LPWSTR)&m_pDriversInfo->DrvInfo[i].BaseName,MAX_PATH );
GetDeviceDriverFileName( (LPVOID)*pBaseAddr,(LPWSTR)&m_pDriversInfo->DrvInfo[i].FileName,MAX_PATH );
pBaseAddr ++;

}
GlobalFree(pBaseAddrBegin);
pBaseAddrBegin = NULL;

return ;
}

void CMyDriver::FlushDriversInfo()
{
ClearDriverInfo();
GetDriverInfo();
}

CMyDriver::~CMyDriver()
{
ClearDriverInfo();
}

int CMyDriver::DriverExists( WCHAR* wszDriverName )
{
if(m_bDriver_Info_Status == FALSE)
{
return -1;
}
for(int i = 0 ; i < m_pDriversInfo -> cbNum ; i ++)
{
if(wcscmp(m_pDriversInfo->DrvInfo[i].BaseName,wszDriverName) == 0)
{
return 1;
}
}
return 0;
}

转载于:https://www.cnblogs.com/clover-xuqi/p/8005852.html

文档化ring3 api列举驱动列表 --- 做了一些重构。(解决内存泄漏问题)相关推荐

  1. 使用 Swagger 文档化和定义 RESTful API

    大部分 Web 应用程序都支持 RESTful API,但不同于 SOAP API--REST API 依赖于 HTTP 方法,缺少与 Web 服务描述语言(Web Services Descript ...

  2. java api文档_细说API – 文档和前后端协作

    在上一篇文章--<细说API – 重新认识RESTful>中介绍了如何理解和设计RESTful风格的API,现在我们来聊聊如何有效的呈现API文档,以及前后端协作的方式. 我经历过一些没有 ...

  3. 文档化Python代码完全指南(翻译)

    阅读代码比编写代码更多,有良好丰富文档的项目会吸引更多人使用和参与开发贡献.本教程旨在详细阐述如何将 Python 代码实现"文档化",介绍了注释用法.类型提示.文档字符串.在项目 ...

  4. (软考笔记) —— 系统架构设计师 - UML建模与架构文档化

    文章目录 UML建模与架构文档化 UML 现状与发展 UML起源 UML 体系结构演变 UML 的应用与未来 UML基础 概述 用例和用例图 交互图 类图和对象图 状态和活动图 状态图 活动图 构件图 ...

  5. uml具有多种视图_UML建模与架构文档化

    UML(统一建模语言) 是用元模型描述的,元模型是4层元模型体系结构模式中的一层.此模式的其他层次分别是元-元模型层.模型层和用户对象层. 在原模型层,UML元模型 又被分解为三个子逻辑包:基础包(核 ...

  6. 代码中如何让无序标记的内容并排_英语技术文档中如何正确使用无序列表和有序列表?...

    Foreword 之前跟大家分享过英语技术文档中如何正确使用时态和英语技术文档中如何正确使用人称,这一篇再跟大家分享一下如何正确使用无序列表和有序列表. 其实,在技术文档中,除了无序列表和有序列表,另 ...

  7. 微信支付 自动退款 php,银联在线、微信、支付宝自动退款接口文档总结和API地址...

    关于微信和支付宝自动退款接口的接入总结 一:支付宝的自动退款接口接入 支付宝官方api:https://doc.open.alipay.com/doc2/apiDetail.htm?spm=a219a ...

  8. UG 二次开发中文帮助文档,UFun在线帮助文档, NX API 中文帮助文档

    UG 二次开发中文帮助文档,UFun在线帮助文档, NX API 中文帮助文档 在线的中文帮助文档,不用下载,网页直接查询函数: UFun函数中文帮助文档地址:http://www.ugapi.com ...

  9. 计算机打字自动换行怎么,Word文档一行才输入几个字就自动换行了如何解决

    Word文档一行才输入几个字就自动换行了如何解决 腾讯视频/爱奇艺/优酷/外卖 充值4折起 我们在使用Word文档进行编辑文字的时候,经常会遇到这样那样的问题,今天就跟大家介绍一下Word文档一行才输 ...

最新文章

  1. selenium之作用和工作原理
  2. linux开启远程访问端口
  3. android自适应拉伸图片,Android 启动页-解决图片被拉伸和压缩问题,适配虚拟导航栏...
  4. Navicat设置unique报错
  5. CoolQ/DingTalk 实现CI/CD消息推送到群
  6. 阿里巴巴Java开发手册建议设置HashMap的初始容量,但设置多少合适呢?
  7. WeX5 Model 里data ,baasData 数据过滤条件清除 数据初始化
  8. python3默认编码标准是_python3 编码
  9. PostgreSQL 摘得 DB-Engines 2020 年度数据库
  10. java linux 调用so文件,linux下java jni调用.so文件的方法
  11. 使用fiddler对android手机抓包
  12. 澳门大学计算机qs排名,澳门大学世界QS排名
  13. java fadein_jQuery中fadein与fadeout方法用法示例
  14. pureftpd mysql.conf_Pure-ftpd.conf 配置详解
  15. 三进制与八进制相互转换
  16. 华为mate30pro和荣耀v30pro的区别 哪个好
  17. php mysql 柱状图,使用EChat通过php连接mysql数据库从而实现将数据转换为柱状图
  18. Web前端之背景、雪碧图
  19. VMware安装Ubuntu Kylin系统
  20. Word表格中的孤行控制?

热门文章

  1. ffmpeg系列-解决ffmpeg获取aac音频文件duration不准
  2. stm32中断优先级_浅谈STM32串口USART1的使用
  3. android 发送csv邮件,无法在android中使用电子邮件发送.csv文件
  4. php 无法识别oci8,php 连接oracle 无法 启用oci8 解决办法 (摘自oracle官网)
  5. java vk减号_Vue入门经常使用指令
  6. 【NOIP2013】【Luogu1966】火柴排队(逆序对)
  7. 【UOJ78】二分图最大匹配
  8. mysql tode_FAQ: MyDB Studio for MySQL
  9. 计算机组成原理—浮点数
  10. Linux c++ udp按包发送接收文件