首页 > 编程语言 >C# 根据设备实例路径,获取父节点(父系)的设备实例路径

C# 根据设备实例路径,获取父节点(父系)的设备实例路径

时间:2023-06-29 10:14:06浏览次数:37  
标签:CM Get C# 路径 int 实例 uint 节点 设备

我们知道有时候系统的某些设备异常,可以通过(禁用启用)重启该设备。但是某些设备操作当前设备是没起作用的,例如扬声器设备,禁用后扬声器仍然可以播放声音,但是如果禁用了该设备的父节点则不再可以播放声音。

可以从设备管理器中查看

 这里就是父节点

如果通过C#怎么获取该设备的父系实例路径呢?可以使用以下方式

/// <summary>定位到设备节点</summary>
        /// <param name="pdnDevInst"></param>
        /// <param name="pDeviceID"></param>
        /// <param name="ulFlags"></param>
        /// <returns></returns>
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern int CM_Locate_DevNodeA(ref int pdnDevInst, string pDeviceID, int ulFlags);

        /// <summary>获取节点父系</summary>
        /// <param name="pdnDevInst"></param>
        /// <param name="dnDevInst"></param>
        /// <param name="ulFlags"></param>
        /// <returns></returns>
        [DllImport("setupapi.dll")]
        public static extern int CM_Get_Parent(out uint pdnDevInst, uint dnDevInst, int ulFlags);

        /// <summary>获取节点id 长度</summary>
        /// <param name="pulLen"></param>
        /// <param name="dnDevInst"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        [DllImport("setupapi.dll", SetLastError = true)]
        public static extern int CM_Get_Device_ID_Size(out int pulLen, uint dnDevInst, int flags = 0);

        /// <summary>获取节点名称</summary>
        /// <param name="dnDevInst"></param>
        /// <param name="buffer"></param>
        /// <param name="bufferLen"></param>
        /// <param name="flags"></param>
        /// <returns></returns>
        [DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
        public static extern int CM_Get_Device_ID(
          uint dnDevInst,
          char[] buffer,
          int bufferLen,
          int flags);

        /// <summary>获取设备父系</summary>
        /// <param name="deviceId">设备id</param>
        /// <param name="parentDeviceId">父系id</param>
        /// <returns></returns>
        public static bool TryGetDriverIdParent(string deviceId, out string parentDeviceId)
        {
            parentDeviceId = "";
            try
            {
                int num1 = 0;
                int num2 = 0;
                int pdnDevInst1 = 0;
                int pulLen = 0;
                uint pdnDevInst2;
                if (DeviceDrivers.CM_Locate_DevNodeA(ref pdnDevInst1, deviceId, num1) != num2 || DeviceDrivers.CM_Get_Parent(out pdnDevInst2, (uint)pdnDevInst1, num1) != num2 || DeviceDrivers.CM_Get_Device_ID_Size(out pulLen, pdnDevInst2, num1) != num2)
                    return false;
                char[] buffer = new char[pulLen];
                if (DeviceDrivers.CM_Get_Device_ID(pdnDevInst2, buffer, pulLen, 0) != num2)
                    return false;
                parentDeviceId = new string(buffer);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

 

标签:CM,Get,C#,路径,int,实例,uint,节点,设备
From: https://www.cnblogs.com/log9527blog/p/17513288.html

相关文章

  • 查看Oracle自增列
    Oracle添加自增列CreateSequenceSEQ_XXX最后一个是自增列的名称,一般是  SEQ_表名。为表添加一个自增的列并将上面创建的序列值给这个列ALTERTABLEemployeeADDemp_idNUMBER(10)DEFAULTSEQ_XXX.nextvalNOTNULL;这里nextval是关键词,表示下一个值 可以在Pl......
  • 使用guava的cache实现缓存
    一、maven<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.......
  • leetcode -- Kth Smallest Element in a BST -- 简单重点
    https://leetcode.com/problems/kth-smallest-element-in-a-bst/这里注意BST的leftsubtree所有**node都要小于root,rightsubtree所有node都要大于**root。没有等于,并且是所有node思路1非递归用stack用inorder的模板就行classSolution(object):definorder(self,root,......
  • 使用secureCRT进行文件传输
    第一种方式:上传文件只需在shell终端仿真器中输入命令"rz",即可从弹出的对话框中选择本地磁盘上的文件,利用Zmodem上传到服务器当前路径下。下载文件只需在shell终端仿真器中输入命令"sz文件名",即可利用Zmodem将文件下载到本地某目录下。通过"FileTransfer"可以修改......
  • elecrton 自定义关闭事件
     main.jsconst{app,BrowserWindow,Menu,ipcMain}=require('electron')constmainWindow=newBrowserWindow({webPreferences:{contextIsolation:false//必须有,不然报错}})//执行关闭自定义关闭ipcMain.on('handelClose'......
  • 明德扬FPGA核心板Xilnx开发Lattice光纤7K325T410T光纤PCIE口DDR3
                   ......
  • CF1637H Minimize Inversions Number
    我直接??????????????????考虑一个数怎么做,就是逆序对减去一个\(i\)前面的逆序对再加上顺序对。考虑很多数怎么做,就是这个玩意的和再加上子序列种的顺序对减去逆序对,顺序对可以用逆序对表示,现在只考虑顺序对。注意到,如果\(i<j,p_i>p_j\)且\(i\)在子序列中\(j\)不在子序列中,那么把\(j\)弄......
  • typescript的必要性及使用
    1前言作为一个前端语言,Javascript从最初只是用来写页面,到如今的移动终端、后端服务、神经网络等等,它变得几乎无处不在。如此广阔的应用领域,对语言的安全性、健壮性以及可维护性都有了更高的要求。尽管ECMAScript标准在近几年有了长足的进步,但是在类型检查方面依然毫无建树。在这......
  • 驱动开发:应用DeviceIoContro模板精讲
    在笔者上一篇文章《驱动开发:应用DeviceIoContro开发模板》简单为大家介绍了如何使用DeviceIoContro模板快速创建一个驱动开发通信案例,但是该案例过于简单也无法独立加载运行,本章将继续延申这个知识点,通过封装一套标准通用模板来实现驱动通信中的常用传递方式,这其中包括了如何传递......
  • vue列表页返回数组错误Invalid prop: type check failed for prop "data". Expected A
    一个vue列表页接收后端数组时是这样写的:this.list=response.data返回如下错误:Invalidprop:typecheckfailedforprop"data".ExpectedArray,gotObject意思是希望返回一个数组但实际得到一个对象Object,网上大多是初始化userList=[]或userList=null解决的,但......