win c++ 枚举设备驱动状态

  1. #include <cfgmgr32.h>  
    #include <SetupAPI.h>
    #pragma comment(lib,"Setupapi.lib")
  2. bool IsDeviceDisabled(DWORD dwDevID, HDEVINFO hDevInfo, DWORD &dwStatus)
    {
        SP_DEVINFO_DATA DevInfoData = {sizeof(SP_DEVINFO_DATA)};
        DWORD dwDevStatus,dwProblem;
        if(!SetupDiEnumDeviceInfo(hDevInfo,dwDevID,&DevInfoData))
        {
            return FALSE;
        }
    
        //查询设备状态
        if(CM_Get_DevNode_Status(&dwDevStatus,&dwProblem,DevInfoData.DevInst,0)!=CR_SUCCESS)
        {
            return FALSE;
        }
        
        dwStatus = dwProblem;
    //    return ( (dwProblem == CM_PROB_FAILED_INSTALL));
    
        return true;
    }
    
    int IsInstallDriver()
    {
        HDEVINFO hDevInfo; 
        SP_DEVINFO_DATA DeviceInfoData; 
        DWORD i; 
        bool bRet = false;
        bool bOk = false;
    
          //step1. Create a HDEVINFO with all present devices. 
        hDevInfo = SetupDiGetClassDevs(NULL, 
            0, // Enumerator 
            0, 
            DIGCF_PRESENT | DIGCF_ALLCLASSES ); 
    
        if (hDevInfo == INVALID_HANDLE_VALUE) 
        { 
            // Insert error handling here. 
            return bRet; 
        } 
    
         
        DWORD dwStatuts = -1;
        //step2. Enumerate through all devices in Set. 
        DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA); 
        for (i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++) 
        { 
            DWORD DataT; 
            LPTSTR buffer = NULL; 
            DWORD buffersize = 0; 
       
            // Call function with null to begin with, 
            // then use the returned buffer size 
            // to Alloc the buffer. Keep calling until 
            // success or an unknown failure. 
            // 
            while (!SetupDiGetDeviceRegistryProperty( 
                hDevInfo, 
                &DeviceInfoData, 
                SPDRP_HARDWAREID, 
                &DataT, 
                (PBYTE)buffer, 
                buffersize, 
                &buffersize)) 
            { 
                if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) 
                { 
                    // Change the buffer size. 
                    if (buffer) LocalFree(buffer); 
                    buffer = (LPTSTR)LocalAlloc(LPTR,buffersize); 
                } 
                else 
                { 
                    // Insert error handling here. 
                    break; 
                } 
            } 
    
            printf("%S\n", buffer);
            //step3. find devices status
            if (buffer && (!wcscmp(buffer,L"USB\\Vid_0955&Pid_7103") || !wcscmp(buffer,L"USB\\Vid_0955&Pid_7102")) )
            {
                
                if (IsDeviceDisabled(i, hDevInfo, dwStatuts) && dwStatuts == 0)
                {
        
                }
                //printf( "SPDRP_DEVICEDESC:[%S] %d\n ",buffer, dwStatuts); 
    
                if (buffer)
                    LocalFree(buffer); 
                break;
            }
    
            if (buffer)
                LocalFree(buffer); 
        } 
    
        // step4. Cleanup 
        SetupDiDestroyDeviceInfoList(hDevInfo);
        
        return dwStatuts;
    }


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是书的光盘。共分为两个部分,这是第一部分。 本书由浅入深、循序渐进地介绍了Windows驱动程序的开发方法与调试技巧。本书共分23章,内容涵盖了 Windows操作系统的基本原理、NT驱动程序与WDM驱动程序的构造、驱动程序中的同步异步处理方法、驱 动程序中即插即用功能、驱动程序的各种调试技巧等。同时,还针对流行的PCI驱动程序、USB驱动程序 、虚拟串口驱动程序、摄像头驱动程序、SDIO驱动程序进行了详细的介绍,本书最大的特色在于每一节 的例子都是经过精挑细选的,具有很强的针对性。力求让读者通过亲自动手实验,掌握各类Windows驱动 程序的开发技巧,学习尽可能多的Windows底层知识。   本书适用于中、高级系统程序员,同时也可用做高校计算机专业操作系统实验课的补充教材。 原创经典,威盛一线工程师倾力打造。深入驱动核心,剖析操作系统底层运行机制,通过实例引导,快 速学习编译、安装、调试的方法。   从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例详细讲解 PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如 用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析Windows驱动 开发的本质。 本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技 巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导意义 ,是一本值得推荐的专著。              ——中国工程院院士   院士推荐   目前,电子系统设计广泛采用通用操作系统,达到降低系统的设计难度和缩短研发周期。实现操作 系统与硬件快速信息交换是电子系统设计的关键。   通用操作系统硬件驱动程序的开发,编写者不仅需要精通硬件设备、计算机总线,而且需要Windows 操作系统知识以及调试技巧。学习和掌握Windows硬件驱动程序的开发是电子系统设计人员必备的能力。   本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,并且介绍了编 程技巧和应用实例,兼顾了在校研究生和工程技术人员的实际需求,对教学、生产和科研有现实的指导 意义,是一本值得推荐的专著。 第1篇 入门篇 第1章 从两个最简单的驱动谈起 本章向读者呈现两个最简单的Windows驱动程序,一个是NT式的驱动程序,另一个是WDM式的驱动程序。 这两个驱动程序没有操作具体的硬件设备,只是在系统里创建了虚拟设备。在随后的章节中,它们会作 为基本驱动程序框架,被本书其他章节的驱动程序开发所复用。笔者将带领读者编写代码、编译、安装 和调试程序。   1.1 DDK的安装   1.2 第一个驱动程序HelloDDK的代码分析    1.2.1 HelloDDK的头文件    1.2.2 HelloDDK的入口函数    1.2.3 创建设备例程    1.2.4 卸载驱动例程    1.2.5 默认派遣例程   1.3 HelloDDK的编译和安装    1.3.1 用DDK环境编译HelloDDK    1.3.2 用VC集成开发环境编译HelloDDK    1.3.3 HelloDDK的安装   1.4 第二个驱动程序HelloWDM的代码分析    1.4.1 HelloWDM的头文件    1.4.2 HelloWDM的入口函数    1.4.3 HelloWDM的AddDevice例程    1.4.4 HelloWDM处理PNP的回调函数    1.4.5 HelloWDM对PNP的默认处理    1.4.6 HelloWDM对IRP_MN_REMOVE_DEVICE的处理    1.4.7 HelloWDM对其他IRP的回调函数    1.4.8 HelloWDM的卸载例程   1.5 HelloWDM的编译和安装    1.5.1 用DDK编译环境编译HelloWDM    1.5.2 HelloWDM的编译过程    1.5.3 安装HelloWDM   1.6 小结  第2章 Windows操作驱动的基本概念  驱动程序被操作系统加载在内核模式下,它与Windows操作系统内核的其他组件进行密切交互。本章主 要介绍Windows操作系统内核的基本概念,同时还介绍应用程序和驱动程序之间的通信方法。   2.1 Windows操作系统概述    2.1.1 Windows家族    2.1.2 Windows特性    2.1.3 用户模式和内核模式    
本书是一本指导读者如何最大程度地使用c++ builder 6.0进行代码开发的就业指南。书中详细介绍了关键的编程概念和利用vcl环境来开发应用程序的基础知识,还提供了上百个如何在vcl环境下使用c++ builder功能的技巧、具有实践性的建议以及数百个可以立即运行的重要解决方案的详细代码,内容主要涉及以下几个方面:标准c++基础知识、vcl库、windows窗体、图形编程、多线程技术、数据库应用、分布式应用、web等等。通过本书的学习,读者可以高效的利用c++ builder开发应用程序,能够理解关键操作的内部实现机制,有助于迅速利用c++ builder来实现大量的编程任务,成为一个成功的设计师。 本书适用于大中专院校学生、程序设计人员和c++ builder爱好作为为一本就业实践指南。 目录 ↑第一部分 学习——跨越求职路上的鸿沟 第1章 夯实c++基本功 1.1 初步认识c++基本功 1.2 类型和表达式 1.3 控制结构 1.4 指针和数组 1.5 函数 1.6 结构和枚举 第2章 如何实现面向对象编程 2.1 类和对象 2.2 友元类和友元函数 2.3 类的继承 2.4 多态和虚函数 第3章 异常处理3.1 3.2 win32平台的结构优异常处理 3.3 c++异常处理 第二部分 实践——享受c++builder,享受工作的乐趣 第4章 参观c++builder的开发环境 4.1 了解集成开发环境 4.2 项目管理工具 .4.3 编译和调试的方法 4.4 如何开发一个完整的工程 第5章 使用类库 5.1 vcl库中的类结构 5.2 组件的控件之间的关系 5.3 理解属性、方法和事件 5.4 通用的属性、方法和事件 5.5 与应用程序息息相关的类 第6章 设计用户界面 6.1 利用按钮与用户交互 6.2 静态文本显示类控件的操作 6.3 用户输入类控件的应用 6.4 状态类控件的应用 6.5 选项类控件的应用 6.6 分页控件 6.7 大纲视图类控件 6.8 如何在窗口上显示图形 6.9 tframe的使用 6.10 管理菜单 6.11 工具栏和酷栏 6.12 使用动作列表 第7章 图形编程 7.1 图形的简单显示 7.2 设备描述表与tcanvas类 7.3 gdi对象 7.4 基本绘图操作 第8章 文件和目录操作 8.1 标准文件类型 8.2 常用文件操作函数 8.3 文件操作对话框 8.4 如何获取驱动器类型 8.5 操作jni文件 8.6 获取文件的日期信息 8.7 检测软盘或光碟是否有过变化 8.8 检测驱动器容量 8.9 复制整个目录 8.10 将文件删除到回收站中 8.11 检测驱动器是否就绪 8.12 操作临时文件 第9章 打印的实现 9.1 用对话框设置打印 9.2 简便的打印 9.3 tprinter类 9.4 获取默认打印机信息 9.5 获取打印队列的信息 9.6 如何打印位图 第10章 注册表 10.1 注册表键 10.2 注册表数据类型 10.3 使用tregistry 第11章 多线程的处理 11.1 如何创建并运行一个线程 11.2 在vcl中使用线程 11.3 如何控制线程的优化级 11.4 如何挂起和唤醒线程 11.5 如何协调线程之间的工作 第三部分 价值提升_走上专家之路,做个真正的设计师 第12章 数据库技术 12.1 用ado连接数据库 12.2 如何连接到数据源 12.3 如何从数据源取出数据 12.4 如何对数据集中的数据进行操作 12.5 如何创建主线表 12.6 如何使用字段组件 12.7 数据集的状态 12.8 用adocommand直接对数据源进行操作 第13章 分布多层应用 13.1 为什么要使用分布式多层结构 13.2 理解midas 13.3 创建分布式应用程序 13.4 创建应用程序服务器 13.5 创建客户端应用程序 13.6 在分布式应用程序中管理事务 13.7 支持远程数据模块的状态信息 13.8 用提供者组件和客户端交互 第14章 利用webbroker开发web应用 14.1 什么是webbroker 14.2 html基础 14.3 使用webbroker组件作开发 14.4 使用cookie 第15章 scket编程 15.1 winsock概述 15.2 服务端socket 15.3 客户端socket 15.4 数据传输 15.5 winsocd类组件介绍 15.6 如何创建自己的网络聊天室
### 回答1: Win10加载驱动是指将驱动程序加载到操作系统中,以保证硬件设备能够正常运行。Win10自带了大量的驱动程序,但有时需要手动安装或更新。 首先,我们需要确定需要安装的驱动程序的型号和厂商。可以在设备管理器中找到相关信息,并从厂商网站或驱动下载网站下载相应驱动程序。 安装驱动程序的方法有多种,如: 1. 自动安装:在设备管理器中右键选择需要安装驱动设备,选择“更新驱动程序”,系统会自动下载并安装驱动程序。 2. 手动安装:在设备管理器中右键选择需要安装驱动设备,选择“属性”,在驱动程序选项卡中点击“更新驱动程序”,选择“浏览计算机以查找驱动程序”,然后选择刚刚下载的驱动程序文件进行安装。 3. 使用驱动安装工具:部分驱动程序提供了专门的安装工具,用户可以直接运行安装程序进行安装。 总体来说,Win10加载驱动程序相对比较简单,但需要注意的是,一定要下载和安装正确的驱动程序,否则会导致设备无法正常工作甚至系统崩溃。因此,在下载和安装驱动程序的过程中,要谨慎、仔细操作。 ### 回答2: 在Windows 10操作系统中,加载驱动有多种方法。 一种方法是使用Windows设备管理器加载驱动程序。首先,按下“Win + X”键,然后选择“设备管理器”。在该窗口中,找到需要加载驱动程序的设备,右键单击该设备,选择“更新驱动程序”。 另一种方法是使用Windows Power Shell命令行加载驱动程序。首先,按下“Win + X”键,然后选择Windows PowerShell(管理员)。在该窗口中,输入“pnputil -i -a c:\driver.inf”(其中“c:\driver.inf”是驱动程序的完整路径)以安装驱动程序。 此外,如果驱动程序附带了安装程序,则可以运行该程序来安装驱动程序。打开程序后,按照提示操作即可。 无论采用哪种方法,都需要确保驱动程序与设备兼容,并且是从可靠的来源下载的。如果安装错误的驱动程序,系统可能会出现问题,甚至无法启动。因此,仔细确认驱动程序的来源和兼容性至关重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值