Программный поиск процессов, использующих определенное USB-устройство (через идентификатор устройства) в C # / .NET

#c# #.net #windows #winapi

#c# #.net #Windows #winapi

Вопрос:

Мы с моей группой работаем над программой на C # / .NET, которая будет отображать, какие процессы используют веб-камеру и / или микрофон пользователя (в основном, для проверки конфиденциальности). Мы можем отображать все USB-устройства и их свойства, такие как их идентификаторы устройств. Однако мы изо всех сил пытаемся выяснить, как посмотреть, какие процессы используют их через идентификаторы устройств. Мы пытаемся сделать что-то похожее на функцию поиска дескриптора или DLL в Process Explorer.

Вот тестовый код, который у нас есть на данный момент. Он отображает информацию обо всех USB-устройствах, подключенных к компьютеру:

 namespace PrivacyHub
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ManagementObjectCollection collection;
            using (var searcher = new ManagementObjectSearcher(@"Select * from Win32_USBControllerDevice"))
                collection = searcher.Get();

            foreach(var device in collection) {
                string curDeviceInfo = (string)device.GetPropertyValue("Dependent");
                string usbAddress = (curDeviceInfo.Split(new String[] { "DeviceID=" }, 2, StringSplitOptions.None)[1]);

                ManagementObjectCollection devices;
                using (var searcher = new ManagementObjectSearcher("Select * from Win32_PnPEntity where PNPDeviceID = "   usbAddress))
                    devices = searcher.Get();

                foreach(var usbDevice in devices) {
                    Console.WriteLine("----------------DEVICE---------------");
                    foreach(var property in usbDevice.Properties)
                        Console.WriteLine(property.Name   ": "   property.Value);
                    Console.WriteLine("----------------END---------------");
                }

                devices.Dispose();
            }

            
            collection.Dispose();
            
        }
    }
}
 

Я просмотрел документы Win32 API, но не нашел никакой информации о том, как это сделать. Возможно, я что-то упускаю. Кто-нибудь знает, как мы можем программно находить процессы, использующие эти устройства?

Комментарии:

1. Process Hacker реализует ту же функциональность, что и Process Explorer, с открытым исходным кодом, поэтому вы можете найти там некоторые подсказки: github.com/processhacker/processhacker

2. @AlexK. очень просто перечислить все открытые дескрипторы в системе. для этого не нужно искать Process Hacker. но что это дает?

3. @LiamHG Удалось ли вам найти решение для этого? Я ищу что-то подобное — найти все процессы, использующие определенные устройства.