DriverHelper.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Management;
  5. using System.Runtime.InteropServices;
  6. using Vinno.vCloud.FIS.CrossPlatform.Common;
  7. using Vinno.vCloud.FIS.CrossPlatform.Common.Enum;
  8. using Vinno.vCloud.FIS.CrossPlatform.Common.Hardware.Interface;
  9. namespace Vinno.vCloud.FIS.CrossPlatform.Windows.Hardware
  10. {
  11. public class DriverHelper : IDriverHelper
  12. {
  13. private string _captureCard = "LT8501-DVI Card";
  14. private readonly string _manageString = "Win32_PnPEntity";
  15. [DllImport("setupapi.dll", SetLastError = true)]
  16. public static extern int CM_Locate_DevNodeA(ref int pdnDevInst, string pDeviceID, int ulFlags);
  17. [DllImport("setupapi.dll")]
  18. public static extern int CM_Get_Parent(out UInt32 pdnDevInst, UInt32 dnDevInst, int ulFlags);
  19. [DllImport("setupapi.dll", SetLastError = true)]
  20. public static extern int CM_Get_Device_ID_Size(out int pulLen, UInt32 dnDevInst, int flags = 0);
  21. [DllImport("setupapi.dll", CharSet = CharSet.Unicode)]
  22. public static extern int CM_Get_Device_ID(UInt32 dnDevInst, char[] buffer, int bufferLen, int flags);
  23. public void test()
  24. {
  25. }
  26. public void InitializeCaptureCard(List<string> captureCardList)
  27. {
  28. if (captureCardList != null)
  29. {
  30. foreach (var captureCard in captureCardList)
  31. {
  32. if (IsDeviceExist(captureCard))
  33. {
  34. _captureCard = captureCard;
  35. CrossPlatformHelper.Instance.LogWriter?.WriteLineInfo($"Driver Helper Initialize, the Capture Card is {_captureCard}");
  36. return;
  37. }
  38. }
  39. }
  40. CrossPlatformHelper.Instance.LogWriter?.WriteLineInfo($"Driver Helper Can't not found the Capture Card in the Capture CardList, the default Capture Card is {_captureCard}");
  41. }
  42. private bool IsDeviceExist(string deviceName)
  43. {
  44. try
  45. {
  46. using (var mc = new ManagementClass(_manageString))
  47. {
  48. using (ManagementObjectCollection moc = mc.GetInstances())
  49. {
  50. foreach (ManagementObject mo in moc)
  51. {
  52. var nameProperty = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "Name");
  53. if (nameProperty.Value?.ToString() == deviceName)
  54. {
  55. return true;
  56. }
  57. }
  58. }
  59. }
  60. return false;
  61. }
  62. catch (Exception ex)
  63. {
  64. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"IsDeviceExist Error:{ex}");
  65. return false;
  66. }
  67. }
  68. public List<string> GetHardwareIdByDeviceName(string deivceName, EnumHardwareType hardwareType, string id)
  69. {
  70. try
  71. {
  72. PropertyData deviceIdProperty;
  73. using (var mc = new ManagementClass(_manageString))
  74. {
  75. using (ManagementObjectCollection moc = mc.GetInstances())
  76. {
  77. var hardwareList = moc.OfType<ManagementObject>().Where(x => x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "Name")?.Value?.ToString() == deivceName).ToList();
  78. if (!hardwareList.Any())
  79. {
  80. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,HardwareList Count is 0,DeviceName:{deivceName}");
  81. return new List<string>();
  82. }
  83. else if (hardwareList.Count() == 1 || (string.IsNullOrWhiteSpace(id) && hardwareType == EnumHardwareType.Camera))
  84. {
  85. PropertyData deviceIdPropertyData;
  86. switch (hardwareType)
  87. {
  88. case EnumHardwareType.Camera:
  89. deviceIdProperty = hardwareList.First().Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  90. if (deviceIdProperty?.Value is string[] hardwareIds)
  91. {
  92. return hardwareIds.ToList();
  93. }
  94. break;
  95. case EnumHardwareType.Mic:
  96. var deviceId = hardwareList.First().Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  97. var parentDeviceId = GetParentDriverId(deviceId);
  98. if (!string.IsNullOrWhiteSpace(parentDeviceId))
  99. {
  100. var identifierArray2 = parentDeviceId.Split('\\');
  101. if (identifierArray2.Count() >= 3 && identifierArray2[2].Length > 10)
  102. {
  103. var identifier = identifierArray2[2].Substring(0, 10).ToLower();
  104. var parentHardware = moc.OfType<ManagementObject>().FirstOrDefault(x => x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value != null && x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value.ToString().ToLower().Contains(identifier) && deivceName.Contains(x.Properties.OfType<PropertyData>().FirstOrDefault(z => z.Name == "Name")?.Value?.ToString()));
  105. if (parentHardware != null)
  106. {
  107. deviceIdPropertyData = parentHardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  108. if (deviceIdPropertyData?.Value is string[] hardwareIds2)
  109. {
  110. return hardwareIds2.ToList();
  111. }
  112. }
  113. }
  114. }
  115. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error: ParentDeviceId is Null, Type : Mic");
  116. break;
  117. case EnumHardwareType.Speaker:
  118. deviceId = hardwareList.First().Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  119. parentDeviceId = GetParentDriverId(deviceId);
  120. if (!string.IsNullOrWhiteSpace(parentDeviceId))
  121. {
  122. var identifierArray2 = parentDeviceId.Split('\\');
  123. if (identifierArray2.Count() >= 3 && identifierArray2[2].Length > 10)
  124. {
  125. var identifier = identifierArray2[2].Substring(0, 10).ToLower();
  126. var parentHardware = moc.OfType<ManagementObject>().FirstOrDefault(x => x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value != null && x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value.ToString().ToLower().Contains(identifier) && deivceName.Contains(x.Properties.OfType<PropertyData>().FirstOrDefault(z => z.Name == "Name")?.Value?.ToString()));
  127. if (parentHardware != null)
  128. {
  129. deviceIdPropertyData = parentHardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  130. if (deviceIdPropertyData?.Value is string[] hardwareIds3)
  131. {
  132. return hardwareIds3.ToList();
  133. }
  134. }
  135. }
  136. }
  137. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error: ParentDeviceId is Null, Type : Speaker");
  138. break;
  139. }
  140. deviceIdProperty = hardwareList.First().Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  141. if (deviceIdProperty?.Value is string[] hardwareIds4)
  142. {
  143. return hardwareIds4.ToList();
  144. }
  145. }
  146. else if (hardwareList.Count() > 1)
  147. {
  148. PropertyData deviceIdPropertyData;
  149. switch (hardwareType)
  150. {
  151. case EnumHardwareType.Camera:
  152. var identifierArray = id.Split('#');
  153. if (identifierArray.Count() < 4)
  154. {
  155. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,The Type: Camera,The id:{id},don't have enough # seperator, it will return the default value");
  156. }
  157. else if (identifierArray[3].Length < 10)
  158. {
  159. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,The Type: Camera,The id:{id},the 3rd part length<10, it will return the default value");
  160. }
  161. else
  162. {
  163. var identifier = identifierArray[2].Substring(0, 10).ToLower();
  164. foreach (var hardware in hardwareList)
  165. {
  166. var deviceId = hardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  167. if (deviceId.ToLower().Contains(identifier))
  168. {
  169. deviceIdPropertyData = hardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  170. if (deviceIdPropertyData?.Value is string[] hardwareIds)
  171. {
  172. return hardwareIds.ToList();
  173. }
  174. }
  175. }
  176. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,The Type: Camera,The id:{id},Device Id Pair Fail,Identifier:{identifier}, it will return the default value");
  177. }
  178. break;
  179. case EnumHardwareType.Mic:
  180. foreach (var hardware in hardwareList)
  181. {
  182. var deviceId = hardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  183. var parentDeviceId = GetParentDriverId(deviceId);
  184. if (!string.IsNullOrWhiteSpace(parentDeviceId))
  185. {
  186. var identifierArray2 = parentDeviceId.Split('\\');
  187. if (identifierArray2.Count() >= 3 && identifierArray2[2].Length > 10)
  188. {
  189. var identifier = identifierArray2[2].Substring(0, 10).ToLower();
  190. var parentHardware = moc.OfType<ManagementObject>().FirstOrDefault(x => x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value != null && x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value.ToString().ToLower().Contains(identifier) && deivceName.Contains(x.Properties.OfType<PropertyData>().FirstOrDefault(z => z.Name == "Name")?.Value?.ToString()));
  191. if (parentHardware != null)
  192. {
  193. deviceIdPropertyData = parentHardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  194. if (deviceIdPropertyData?.Value is string[] hardwareIds3)
  195. {
  196. return hardwareIds3.ToList();
  197. }
  198. }
  199. }
  200. }
  201. }
  202. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,The Type: Mic,The id:{id},Get Parent Device Id and Pair Fail, it will return the default value");
  203. break;
  204. case EnumHardwareType.Speaker:
  205. foreach (var hardware in hardwareList)
  206. {
  207. var deviceId = hardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  208. var parentDeviceId = GetParentDriverId(deviceId);
  209. if (!string.IsNullOrWhiteSpace(parentDeviceId))
  210. {
  211. var identifierArray2 = parentDeviceId.Split('\\');
  212. if (identifierArray2.Count() >= 3 && identifierArray2[2].Length > 10)
  213. {
  214. var identifier = identifierArray2[2].Substring(0, 10).ToLower();
  215. var parentHardware = moc.OfType<ManagementObject>().FirstOrDefault(x => x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value != null && x.Properties.OfType<PropertyData>().FirstOrDefault(y => y.Name == "DeviceID").Value.ToString().ToLower().Contains(identifier) && deivceName.Contains(x.Properties.OfType<PropertyData>().FirstOrDefault(z => z.Name == "Name")?.Value?.ToString()));
  216. if (parentHardware != null)
  217. {
  218. deviceIdPropertyData = parentHardware.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  219. if (deviceIdPropertyData?.Value is string[] hardwareIds3)
  220. {
  221. return hardwareIds3.ToList();
  222. }
  223. }
  224. }
  225. }
  226. }
  227. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetHardwareIdByDeviceName Error,The Type: Speaker,The id:{id},Get Parent Device Id and Pair Fail, it will return the default value");
  228. break;
  229. }
  230. deviceIdPropertyData = hardwareList.First().Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  231. if (deviceIdPropertyData?.Value is string[] hardwareIds2)
  232. {
  233. return hardwareIds2.ToList();
  234. }
  235. }
  236. }
  237. }
  238. return new List<string>();
  239. }
  240. catch (Exception ex)
  241. {
  242. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"GetVId Error:{ex}");
  243. return new List<string>();
  244. }
  245. }
  246. public bool EnableCaptureCard()
  247. {
  248. using (var mc = new ManagementClass(_manageString))
  249. {
  250. using (ManagementObjectCollection moc = mc.GetInstances())
  251. {
  252. foreach (ManagementObject mo in moc)
  253. {
  254. var nameProperty = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "Name");
  255. if (nameProperty.Value?.ToString() == _captureCard)
  256. {
  257. try
  258. {
  259. mo.InvokeMethod("Enable", null, new InvokeMethodOptions(null, TimeSpan.MaxValue));
  260. return true;
  261. }
  262. catch (Exception ex)
  263. {
  264. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"Driver Enable Fail,ex:{ex}");
  265. return false;
  266. }
  267. }
  268. }
  269. }
  270. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"Enable Failed: Can't Find Device");
  271. return false;
  272. }
  273. }
  274. public bool DisableCaptureCard()
  275. {
  276. using (var mc = new ManagementClass(_manageString))
  277. {
  278. using (ManagementObjectCollection moc = mc.GetInstances())
  279. {
  280. foreach (ManagementObject mo in moc)
  281. {
  282. var nameProperty = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "Name");
  283. if (nameProperty.Value?.ToString() == _captureCard)
  284. {
  285. try
  286. {
  287. mo.InvokeMethod("Disable", null, new InvokeMethodOptions(null, TimeSpan.MaxValue));
  288. return true;
  289. }
  290. catch (Exception ex)
  291. {
  292. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"Driver Disable Fail,ex:{ex}");
  293. return false;
  294. }
  295. }
  296. }
  297. }
  298. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"Disable Failed: Can't Find Device");
  299. return false;
  300. }
  301. }
  302. public void RefreshAllDevice()
  303. {
  304. try
  305. {
  306. using (var mc = new ManagementClass(_manageString))
  307. {
  308. using (ManagementObjectCollection moc = mc.GetInstances())
  309. {
  310. foreach (ManagementObject mo in moc)
  311. {
  312. var name = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "Name")?.Value?.ToString();
  313. var hardwareIdProperty = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "HardwareID");
  314. var deviceId = mo.Properties.OfType<PropertyData>().FirstOrDefault(x => x.Name == "DeviceID")?.Value?.ToString();
  315. var hardwareIdString = string.Empty;
  316. if (hardwareIdProperty?.Value is string[] hardwareIds)
  317. {
  318. foreach (var hardwareId in hardwareIds)
  319. {
  320. hardwareIdString += hardwareId + " ";
  321. }
  322. }
  323. var parentDeviceId = GetParentDriverId(deviceId);
  324. CrossPlatformHelper.Instance.LogWriter?.WriteLineInfo($"Name:{name},HardwareId:{hardwareIdString},DeviceID:{deviceId},ParentDeviceId:{parentDeviceId}");
  325. }
  326. }
  327. }
  328. }
  329. catch (Exception ex)
  330. {
  331. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"RefreshAllDevice Error:{ex}");
  332. }
  333. }
  334. /// <summary>
  335. /// 根据DeviceID获取父级DeviceID
  336. /// </summary>
  337. /// <param name="DeviceID">DeviceID</param>
  338. /// <param name="resultDeviceID">resultDeviceID</param>
  339. /// <returns></returns>
  340. private string GetParentDriverId(string DeviceID)
  341. {
  342. try
  343. {
  344. int CM_LOCATE_DEVNODE_NORMAL = 0x00000000;
  345. int CR_SUCCESS = 0x00000000;
  346. UInt32 parentInst;
  347. int curInst = 0;
  348. int pLen = 0;
  349. int apiResult = CM_Locate_DevNodeA(ref curInst, DeviceID, CM_LOCATE_DEVNODE_NORMAL);
  350. if (apiResult != CR_SUCCESS)
  351. {
  352. return "";
  353. }
  354. apiResult = CM_Get_Parent(out parentInst, (UInt32)curInst, CM_LOCATE_DEVNODE_NORMAL);
  355. if (apiResult != CR_SUCCESS)
  356. {
  357. return "";
  358. }
  359. apiResult = CM_Get_Device_ID_Size(out pLen, parentInst, CM_LOCATE_DEVNODE_NORMAL);
  360. if (apiResult != CR_SUCCESS)
  361. {
  362. return "";
  363. }
  364. char[] ptrInstanceBuf = new char[pLen];
  365. //获取设备id字符串地址
  366. apiResult = CM_Get_Device_ID(parentInst, ptrInstanceBuf, pLen, 0);
  367. if (apiResult != CR_SUCCESS)
  368. {
  369. return "";
  370. }
  371. return new string(ptrInstanceBuf);
  372. }
  373. catch (Exception ex)
  374. {
  375. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"DriverHelper GetParentDriverId Error:{ex}");
  376. return "";
  377. }
  378. }
  379. }
  380. }