# windows device manager diff(设备管理器内容变化后的比较)
[TOC]
## 前言
打开设备管理器, 插入了一个USB设备, 想在设备管理器中看看, 多了哪些设备.
人工识别, 眼睛都看花了, 感到好无助.
去找了一个网上大神写好的工程(codeproject上的DevMgr-SRC.zip, 一个简版的设备管理器), 准备添加一个导出按钮, 将当前检测结果导出成文本.
在设备插入前后, 分别导出文本列表. 然后用BC4比较, 就知道USB插入后, 设备的变化了.
花了1天, 将这个功能升级完了.
这个实现(设备管理器导出内容的比较)有2个用处:
* 本机插入设备前后的设备管理器中的设备比较
* 同型号或相同配置计算机之间的设备比较
## 实验
## 网上大神的工程原始url
[https://www.codeproject.com/script/Articles/Download.aspx?file=/KB/cpp/DevMgr/DevMgr-SRC.zip&rp=https://www.codeproject.com/](https://www.codeproject.com/script/Articles/Download.aspx?file=/KB/cpp/DevMgr/DevMgr-SRC.zip&rp=https://www.codeproject.com/)
## 原始效果
![image-20220707145517587](readme.assets/image-20220707145517587.png)
这就是个设备管理器啊.
和win10自带的设备管理器比较了一下, 基本一致.
## 实验环境
win10专业工作站版 21H2(19044.1806)
Microsoft Visual Studio Enterprise 2019 版本 16.11.16
## 实验
原始工程是vc6写的.
手头只有vs2022. 试了一下, vs2022不支持.dsw工程.
装了vs2019企业版, 可以打开.dsw工程, 转换完, 直接能编译运行.
## 去掉警告
编译选项改成/Zi
![image-20220707151328288](readme.assets/image-20220707151328288.png)
禁掉警告C4477, C4996
![image-20220707151435848](readme.assets/image-20220707151435848.png)
启用函数级链接
![image-20220707151516223](readme.assets/image-20220707151516223.png)
不用最小生成
![image-20220707151604907](readme.assets/image-20220707151604907.png)
不要CRT函数警告
![image-20220707151700686](readme.assets/image-20220707151700686.png)
一般低版本vs工程(e.g. VC6)转成高版本vs工程(e.g. VS2017, VS2019), 就这些编译选项要修改.
修改完编译选项, 编译出来0错误, 0警告.
```
已启动重新生成…
1>------ 已启动全部重新生成: 项目: DevMgr, 配置: Debug Win32 ------
1>DevMgr.c
1>GetTypeInfo.c
1>Setup.c
1>SysSetup.c
1>Util.c
1>WDMSetup.c
1>正在生成代码...
1>DevMgr.vcxproj -> D:\my_dev\my_local_git_prj\soft\windows_device_manager_diff\src\DevMgr_SRC_SP1\Debug\DevMgr.exe
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
```
## 修正原始工程bug
## bug1
程序跑起来后, 在 char EnumWDMDriver(const UINT nIdTree, const UINT nIdBmp) 尾巴处, 要返回的地方报异常如下:
![image-20220707153235911](readme.assets/image-20220707153235911.png)
看报错, 知道是和变量wImageIdx有关.
在EnumWDMDriver()查找 wImageIdx 参考点, 看了一下, 变量类型定义错了.
原始定义是short int , 但是API要求的都是int.
修正后如下:
```
while (1)
{
if (SetupDiEnumDeviceInfo(hDevInfo,
wIndex,
&spDevInfoData))
{
char szBuf[MAX_PATH] = {0};
// short wImageIdx = 0;
int wImageIdx = 0; // to fix : when this function return, reprot exception : Run-Time Check Failure #2 - Stack around the variable 'wImageIdx' was corrupted.
short wItem = 0;
```
重新编译运行, 异常消失.
## bug2
SP_DRVINFO_DETAIL_DATA 变量的长度使用了硬编码, 导致栈溢出.
从这个 bug能看出, 在工程中使用可能会被第三方改掉的常数, 是陋习.
e.g. 一个第三方SDK的结构size, 人家以后有权修改啊. 非要操作第三方的结构size, 要使用sizeof(结构类型名称), 不要直接使用当前类型的数字size.
修正如下
```
while (1)
{
spDrvInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
if (SetupDiEnumDriverInfo(hDevInfo,
&spDevInfoData,
SPDIT_COMPATDRIVER,
wIdx++,
&spDrvInfoData))
{
// char szBuf[2048] = {0};
// int temp = sizeof(spDrvInfoDetail); // 796
// memcpy(&spDrvInfoDetail, szBuf, sizeof(SP_DRVINFO_DETAIL_DATA));
memset(&spDrvInfoDetail, 0, sizeof(SP_DRVINFO_DETAIL_DATA));
```
## 测试原始工程
正常用了用, 改过之后, 原始工程没报异常了, 正常使用.
## 开始修改原始工程
准备加个按钮, 将手工点击左边设备数显示的右边的设备内容导出为文本, 用于BC4比较设备插入前后的不同.
![image-20220707161741083](readme.assets/image-20220707161741083.png)
![image-20220707161832134](readme.assets/image-20220707161832134.png)
按钮消息处理
```
case IDC_EXPORT_TXT:
{
cb_export_txt(hDlg, uMsg, wParam, lParam);
};
break;
//
case IDC_COPYPATHBTN:
{
HGLOBAL hMem = 0L;
```
```
INT_PTR CALLBACK cb_export_txt(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
// cb_export_txt(hDlg, uMsg, wParam, lParam);
return 0;
}
```
现在的任务, 就是实现cb_export_txt()
## 写好的cb_export_txt()和相关实现
就用git比较修改前后的代码, 直接贴在这了.
```
INT_PTR CALLBACK cb_export_txt(HWND hDlg, UINT uMsg,
WPARAM wParam, LPARAM lParam)
{
int iCnt = 0;
iCnt = getAllDeviceCnt(); // 192
enumTreeCtrl(IDC_TREE1);
MessageBox(hDlg, "export finished!", "info", MB_ICONINFORMATION);
return 0;
}
HTREEITEM fn_get_tree_root_node(HWND hTreeView, const UINT nIdTree)
{
HTREEITEM hNode = NULL;
TVITEM tvItem = { 0 };
char szText[256] = { 0 };
int nNodeCnt = 0;
nNodeCnt = (int)SendMessage(hTreeView, TVM_GETCOUNT, 0, 0); // 220
hNode = (HTREEITEM)SendMessage(hTreeView,
TVM_GETNEXTITEM,
TVGN_ROOT, // TVGN_ROOT or TVGN_CHILD, not be TVGN_NEXT
(LPARAM)NULL
);
if (NULL != hNode)
{
tvItem.mask = TVIF_TEXT | TVIF_HANDLE;
tvItem.pszText = szText;
tvItem.cchTextMax = sizeof(szText) - 1;
RtlZeroMemory(szText, sizeof(szText));
tvItem.hItem = hNode; // !
SendMessage(hTreeView, TVM_GETITEM, 0, (LPARAM)&tvItem); // param1 must be hTreeView
if (*szText)
{
// watch szText
// LS-PRECISION356
};
}
return hNode;
}
#define OUTPUT_FILE_NAME "device_manager_export.txt"
void fn_get_tree_Level_3_node(HWND hTreeView, HTREEITEM hNodeL1, const char* psz_NodeL1_name, HTREEITEM hNodeL2, const char* psz_NodeL2_name)
{
FILE* pFile = NULL;
char szBuf[4096] = { '\0' };
pFile = fopen(OUTPUT_FILE_NAME, "a");
if (NULL != pFile)
{
memset(szBuf, 0, sizeof(szBuf));
sprintf(szBuf, "%s : %s\r\n", psz_NodeL1_name, psz_NodeL2_name);
fwrite(szBuf, sizeof(char), strlen(szBuf), pFile);
fclose(pFile);
}
}
void fn_get_tree_Level_2_node(HWND hTreeView, HTREEITEM hNodeL1, const char* psz_NodeL1_name)
{
HTREEITEM hNode = NULL;
TVITEM tvItem = { 0 };
char szText[256] = { 0 };
int nNodeCnt = 0;
BOOL bFirtLoop = TRUE;
// psz_NodeL1_name like below
// 安全设备
// 处理器
do {
hNode = (HTREEITEM)SendMessage(hTreeView,
TVM_GETNEXTITEM,
bFirtLoop ? TVGN_CHILD : TVGN_NEXT,
没有合适的资源?快使用搜索试试~ 我知道了~
windows device manager diff(设备管理器内容变化后的比较)__对应的附件工程
共39个文件
png:11个
h:7个
c:6个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 140 浏览量
2023-06-20
15:44:00
上传
评论
收藏 733KB ZIP 举报
温馨提示
windows device manager diff(设备管理器内容变化后的比较)__对应的附件工程.____在codeproject大神的工程上升级, 可以导出设备管理器的内容列表, 用于比对设备插入前后, 设备管理器内容的差别.zip
资源推荐
资源详情
资源评论
收起资源包目录
windows device manager diff(设备管理器内容变化后的比较)__对应的附件工程.____在codeproject大神的工程上升级, 可以导出设备管理器的内容列表, 用于比对设备插入前后, 设备管理器内容的差别.zip (39个子文件)
A
windows_device_manager_diff
doc
DevMgr-SRC.zip 26KB
src
DevMgr_SRC_SP1
MYCOMP.BMP 246B
SysSetup.h 365B
WDMSetup.h 1013B
resource.h 2KB
DevMgr.vcxproj.filters 2KB
device_manager_export_b.txt 8KB
MYCOMP.ICO 1KB
DevMgr.vcxproj 7KB
DevMgr.dsw 535B
GetTypeInfo.h 935B
DevMgr.dsp 5KB
Util.c 15KB
Util.h 2KB
device_manager_export_a.txt 8KB
Setup.h 2KB
UpgradeLog.htm 34KB
Setup.c 27KB
DevMgr.vcxproj.user 168B
SysSetup.c 3KB
DevMgr.c 26KB
WDMSetup.c 14KB
DevMgr.rc 5KB
DevMgr.sln 1KB
GetTypeInfo.c 21KB
DevMgr.h 781B
readme.md 13KB
bin
DevMgr.exe 396KB
readme.assets
image-20220707151328288.png 9KB
image-20220707151700686.png 9KB
image-20220707161832134.png 33KB
image-20220707151435848.png 6KB
image-20220707151516223.png 6KB
image-20220707145517587.png 93KB
image-20220708142604499.png 195KB
image-20220707151604907.png 7KB
image-20220707161741083.png 3KB
image-20220707153235911.png 27KB
image-20220708142955906.png 122KB
共 39 条
- 1
资源评论
GZM888888
- 粉丝: 176
- 资源: 2945
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功