сделать устройство веб-камеры невидимым для процесса - PullRequest
0 голосов
/ 09 октября 2018

Некоторый контекст:

У меня есть приложение, которое открывает первое устройство веб-камеры в Windows 10 64bit (независимо от индекса 0 при перечислении устройств) и выполняет некоторую обработку кадров.Исходный код приложения недоступен.

Вопрос:

Мне нужно, чтобы это приложение работало с двумя веб-камерами одновременно.Я подумал, что, возможно, есть способ сделать следующее:

  1. скрыть веб-камеру 2
  2. запустить приложение (снимает веб-камеру 1)
  3. скрыть веб-камеру 1, показать веб-камеру2
  4. запустить приложение (снимает веб-камеру 2)

Есть ли способ сделать это, не прерывая работу камеры?Обратите внимание, что оба приложения работают одновременно, поэтому жесткое отключение камеры невозможно.Вызов API Win32 или выполнение этого в PowerShell допустимо.

Спасибо!

1 Ответ

0 голосов
/ 12 октября 2018

Благодаря комментариям к моему первоначальному вопросу, мне удалось решить мою проблему, подключив CM_Get_Device_Interface_List_ExW вызов Win32 API.

Мне пришлось проверить, какой API вызывается, поэтому я использовал и инструмент трассировки API(API-монитор v2 64 бит).Отладчик тоже должен работать, но по какой-то причине мой VS-отладчик не показывал мне никаких символов (возможно, отсутствующих pdbs).

Исходный процесс, который я пытался подключить, написан на C #, поэтому я подключился к вызову через вставленныйC # DLL, содержащая EasyHook .Вот мой фрагмент кода (фактический код внедрения пропущен):

using System;
using System.Runtime.InteropServices;

using EasyHook;

public class HookDevices : IEntryPoint
{
    LocalHook FunctionLocalHook;

    // construct this to hook into calls
    HookDevices()
    {
        try
        {
            FunctionLocalHook = LocalHook.Create(
                LocalHook.GetProcAddress("CfgMgr32.dll", "CM_Get_Device_Interface_List_ExW"),
                new FunctionHookDelegate(CM_Get_Device_Interface_List_Ex_Hooked),
                this);
            FunctionLocalHook.ThreadACL.SetExclusiveACL(new Int32[] { 0 });
        }
        catch (Exception ExtInfo)
        {
            Debug.LogException(ExtInfo);
            return;
        }
    }

    [UnmanagedFunctionPointer(CallingConvention.StdCall,
        CharSet = CharSet.Unicode,
        SetLastError = true)]
    delegate uint FunctionHookDelegate(
        ref Guid interfaceClassGuid,
        string deviceID,
        IntPtr buffer,
        uint bufferLength,
        uint flags,
        IntPtr hMachine);

    [DllImport("CfgMgr32.dll",
        CharSet = CharSet.Unicode,
        SetLastError = true,
        CallingConvention = CallingConvention.StdCall)]
    static extern uint CM_Get_Device_Interface_List_ExW(
        ref Guid interfaceClassGuid,
        string deviceID,
        IntPtr buffer,
        uint bufferLength,
        uint flags,
        IntPtr hMachine);

    // this is where we are intercepting all API accesses!
    static uint CM_Get_Device_Interface_List_Ex_Hooked(
        ref Guid interfaceClassGuid,
        string deviceID,
        IntPtr buffer,
        uint bufferLength,
        uint flags,
        IntPtr hMachine)
    {
        // pass-through original API
        uint ret = CM_Get_Device_Interface_List_ExW(
            ref interfaceClassGuid,
            deviceID,
            buffer,
            bufferLength,
            flags,
            hMachine);
        // do custom logic here and re-arrange "buffer"
        return ret;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...