Jump to content
    

Как создать новый COM-порт в диспетчере устройств при помощи fakemodem.sys?

Добрый день!
Разбираюсь в процессе написания драйверов. Почитал Павла Йосифовича. Выкачал WDK, настроил Visual Studio, создал виртуалку с Windows. Вывел через KdPrint("Hello, world!"). И по скопипащенному из книги примеру при помощи драйвера и консольного приложения поменял приоритет треда. В последнем примере в функции DriverEntry создаётся (при помощи IoCreateSymbolycLink) текстовая ссылка (условно "MyDriver"), при помощи которой в main() приложения получается хэндлер:

HANDLE hDevice = CreateFile(L"\\\\.\\MyDriver", ...

Хочу создать виртуальный COM-порт. Для этого взял пример fakemode из майкрософтовских примеров. Я его успешно собрал, установил на виртуалку и запустил. COM-порт в диспетчере устройств не появился (что, наверное, логично). Значит, надо как-то сообщить драйверу о необходимости создания этого COM-порта. Но как? В DriverEntry у примера fakemodem нет создания текстовой ссылки:

NTSTATUS DriverEntry(
           IN PDRIVER_OBJECT  DriverObject,
           IN PUNICODE_STRING RegistryPath
           )
{
    NTSTATUS            status = STATUS_SUCCESS;
    WDF_DRIVER_CONFIG   config;
    KdPrint(("Fakemode Function Driver Sample - Driver Framework Edition.\n"));
    KdPrint(("Built %s %s\n", __DATE__, __TIME__));
    WDF_DRIVER_CONFIG_INIT( &config, FmEvtDeviceAdd );
    status = WdfDriverCreate(
                            DriverObject,
                            RegistryPath,
                            WDF_NO_OBJECT_ATTRIBUTES,
                            &config,          // Driver Config Info
                            WDF_NO_HANDLE
                            );
    if (!NT_SUCCESS(status)) {
        KdPrint( ("WdfDriverCreate failed with status 0x%x\n", status));
    }
    return status;
}

Но даже если как-нибудь (может, дописав в код fakemodem создание текстовой ссылки, а может , при помощи OpenDriver(...), но это не точно) удастся получить в приложении хэндлер, то что делать дальше? В примере от Microsoft нет кода приложения usermode для использования самого драйвера fakemodem.sys. Как ему внушить, что мне требуется создать COM-порт?

Share this post


Link to post
Share on other sites

33 минуты назад, flammmable сказал:

Я его успешно собрал, установил на виртуалку и запустил.

Он запустился? От него есть отладка в DebugView? Дело в том, что современные версии Windows не запускают драйвера без цифровой подписи, если не сделать определенных движений в этом направлении (тестовые ключи для подписи и/или временно отключение проверки подписи).

Share this post


Link to post
Share on other sites

On 1/13/2023 at 10:37 AM, makc said:

Он запустился? От него есть отладка в DebugView? Дело в том, что современные версии Windows не запускают драйвера без цифровой подписи, если не сделать определенных движений в этом направлении (тестовые ключи для подписи и/или временно отключение проверки подписи).

Вполне запустился и выдал отладку ) Разумеется, есть проблемы с запуском неподписанных драйверов. Но у Павла Йосифовича написаны рекомендации, как притупить бдительность системы проверки цифровой подписи, которым я следовал )

Share this post


Link to post
Share on other sites

3 часа назад, flammmable сказал:

Для этого взял пример fakemode из майкрософтовских примеров.

Мне кажется в контексте задачи виртуального COM-порта интереснее взять за основу https://github.com/microsoft/Windows-driver-samples/tree/main/serial/VirtualSerial2

Модем - это драйвер более верхнего уровня по отношению к COM-порту и логически он является потребителем функций, экспортируемых драйвером COM-порта.

PS: обратите внимание на страничку https://docs.microsoft.com/windows-hardware/drivers/serports/, на которую указывает Readme из вышеуказанной ссылки.

Share this post


Link to post
Share on other sites

On 1/13/2023 at 1:26 PM, makc said:

Мне кажется в контексте задачи виртуального COM-порта интереснее взять за основу https://github.com/microsoft/Windows-driver-samples/tree/main/serial/VirtualSerial2

Модем - это драйвер более верхнего уровня по отношению к COM-порту и логически он является потребителем функций, экспортируемых драйвером COM-порта.

PS: обратите внимание на страничку https://docs.microsoft.com/windows-hardware/drivers/serports/, на которую указывает Readme из вышеуказанной ссылки.

fakemodem гораздо более лаконичен (хотя ioctl.c у него будь здоров) в сравнении с VirtualSerial2. По моему мнению начинать нужно с малого и двигаться к большому. Так-то исходный код com0com тоже выложен, но с начальными знаниями определить, что является в нём основным, а что вспомогательным, не представляется возможным.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...