Как исправить мусорную печать USB Serial принтера в Windows 10 IoT
Решение проблемы некорректной работы USB Serial принтера в Windows 10 IoT Enterprise. Узнайте, как заменить драйвер или создать фильтр для устранения мусорной печати.
Проблема некорректной работы USB Serial принтера в Windows 10 IoT Enterprise
Система: Windows 10 IoT Enterprise (замена на другую систему невозможна)
Проблема: При подключении USB Serial принтера к системе принтер начинает печатать “мусорные бланки”, даже когда разработанное ПО не запущено.
Подробности:
- Принтер подключается через USB-B to USB-A кабель
- В системе определяется как USB Serial Device с COM9
- Во время “мусорной” печати программное открытие COM порта невозможно
- Проблема возникает только в Windows 10 IoT Enterprise
- На Windows 10 Pro и Windows 10 Enterprise Evaluation такого поведения нет
Исследования:
- Проблема связана с драйвером usbser.sys в Windows 10 IoT Enterprise
- FTDI драйвер для устройства корректно не устанавливается
- Мусорная печать начинается при запуске системы или при подключении кабеля к уже загруженной системе
- При отключении кабеля печать сразу останавливается
- Проблема не связана с “грязным внутренним буфером” или питанием принтера
Теоретическая причина:
Драйвер USB в IoT Enterprise отличается форматом отправляемых дескрипторов для этого класса устройств, и принтер воспринимает низкоуровневые USB запросы как данные для печати.
Вопрос:
Есть ли возможность заменить драйвер для этого устройства или создать для него фильтр? Информация о настройке фильтров найдена, но неясно, как их правильно настроить.
Проблема с “мусорной” печатью USB Serial принтера в Windows 10 IoT Enterprise вызывается особенностями работы стандартного драйвера usbser.sys, который отправляет принтеру некорректные дескрипторы, воспринимаемые как команды печати. Существует несколько способов решения этой проблемы.
Содержание
- Анализ проблемы
- Методы решения
- Замена драйвера usbser.sys
- Создание фильтр-драйвера
- Настройка INF-файла
- Использование WinUSB
- Практическая реализация
- Заключение
Анализ проблемы
Проблема возникает из-за того, что Windows 10 IoT Enterprise использует usbser.sys - встроенный драйвер для USB Serial устройств. Этот драйвер автоматически загружается для устройств с классом кодом 02 и подклассом 02 (CDC-ACM).
Ключевые особенности проблемы:
- Драйвер отправляет дескрипторы в формате, который принтер интерпретирует как данные для печати
- Происходит даже при отсутствии запущенного программного обеспечения
- Характерно только для IoT Enterprise edition
- На других версиях Windows (Pro, Enterprise Evaluation) работает корректно
Согласно документации Microsoft, “если устройство указывает код класса 02, но код подкласса отличный от 02, Usbser.sys не загружается автоматически” источник.
Методы решения
Для решения проблемы доступны следующие подходы:
- Замена стандартного драйвера на специализированный
- Создание фильтр-драйвера для перехвата и коррекции USB-команд
- Модификация INF-файла для изменения поведения устройства
- Использование WinUSB для прямого управления USB-интерфейсом
Замена драйвера usbser.sys
Прямая замова драйвера usbser.sys в Windows IoT Enterprise сопряжена с трудностями, так как это системный компонент. Однако можно создать свой драйвер для конкретного устройства:
; Пример INF-файла для замены драйвера
[Version]
Signature = "$Windows NT$"
Class = USBDevice
ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}
Provider = %ManufacturerName%
CatalogFile = MyDriver.cat
[Manufacturer]
%ManufacturerName% = Standard,NTarm
[Standard.NTarm]
%DeviceName% = USB_Install, USB\VID_1234&PID_ABCD
[USB_Install.NT.Services]
AddService = %ServiceName%, 0x00000002, Service_Inst
Важно отметить, что “если устройство указывает код класса 02, но код подкласса отличный от 02, Usbser.sys не загружается автоматически” источник.
Создание фильтр-драйвера
Фильтр-драйвер позволяет перехватывать и модифицировать USB-команды, отправляемые устройству:
-
Определение точки фильтрации:
- IRP_MJ_DEVICE_CONTROL
- IRP_MJ_WRITE
- IRP_MJ_READ
-
Основные функции фильтра:
cNTSTATUS FilterDispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { // Перехват и проверка команд USB // Фильтрация "мусорных" дескрипторов return PassThrough(DeviceObject, Irp); } -
Регистрация фильтра:
- Создание службы с типом SERVICE_KERNEL_DRIVER
- Установка драйвера через Device Manager или DISM
Настройка INF-файла
Ключ к решению может лежать в правильной настройке INF-файла для устройства:
[DDInstall.NT]
include=mdmcpq.inf
CopyFiles=FakeModemCopyFileSection
[DDInstall.NT.Services]
include=mdmcpq.inf
AddService=usbser, 0x00000000, LowerFilter_Service_Inst
[DDInstall.NT.HW]
include=mdmcpq.inf
AddReg=LowerFilterAddReg
Как отмечено на Stack Overflow, “даже если вы запускаете inf-файл перед подключением USB устройства, он будет использовать стандартный драйвер USB serial” источник. Требуется более глубокая настройка.
Использование WinUSB
Альтернативный подход - использование WinUSB для прямого управления USB-интерфейсом:
-
Создание INF-файла для WinUSB:
inf[Version] Signature = "$Windows NT$" Class = USBDevice ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6} Provider = %ManufacturerName% CatalogFile = WinUSBInstallation.cat [Manufacturer] %ManufacturerName% = Standard,NTarm [Standard.NTarm] %DeviceName% = USB_Install, USB\VID_1234&PID_ABCD -
Преимущества WinUSB:
- Прямой доступ к USB-дескрипторам
- Полный контроль над передачей данных
- Отсутствие проблем с “мусорной” печатью
-
Ограничения IoT Enterprise:
“Эта функция поддерживается только в редакции Windows IoT Enterprise LTSC” источник.
Практическая реализация
Шаг 1: Анализ устройства
Используйте утилиты для анализа USB-устройства:
- USBView (из Windows SDK)
- Device Tree Viewer
- Wireshark с USB-каптурой
Шаг 2: Разработка фильтра
- Создание минидрайвера:c
#include <ntddk.h> #include <wdm.h> DRIVER_UNLOAD DriverUnload; NTSTATUS DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp); NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { DriverObject->DriverUnload = DriverUnload; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl; return STATUS_SUCCESS; } void DriverUnload(PDRIVER_OBJECT DriverObject) { // Очистка ресурсов } NTSTATUS DispatchDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION irpSp; ULONG ioControlCode; PVOID inputBuffer; PVOID outputBuffer; ULONG inputBufferLength; ULONG outputBufferLength; irpSp = IoGetCurrentIrpStackLocation(Irp); ioControlCode = irpSp->Parameters.DeviceIoControl.IoControlCode; switch (ioControlCode) { case IOCTL_USB_RESET_PORT: // Обработка сброса порта break; default: break; } Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; }
Шаг 3: Установка и тестирование
-
Сборка драйвера:
- Visual Studio с Windows Driver Kit (WDK)
- Компиляция для архитектуры ARM64 (для IoT устройств)
-
Установка драйвера:
- Через DISM:
dism /online /add-driver /driver:<path>.inf /force - Через Device Manager с отключенной проверкой подписи
- Через DISM:
-
Тестирование:
- Мониторинг порта COM9
- Проверка отсутствия “мусорной” печати
- Тестирование корректной работы приложений
Заключение
Проблема “мусорной” печати USB Serial принтера в Windows 10 IoT Enterprise решаема несколькими способами:
-
Наиболее эффективный подход - создание фильтр-драйвера, который будет перехватывать и корректировать USB-команды, предотвращая отправку “мусорных” дескрипторов принтеру.
-
Альтернативное решение - использование WinUSB для прямого управления USB-интерфейсом, что позволяет избежать проблем со стандартным драйвером usbser.sys.
-
Для временного решения можно попробовать отключить службу USB Serial через DISM:
dism /online /disable-feature /featurename:OneCoreUSB-Serial
Важно помнить, что “при выборе удаления любого пакета из Windows IoT Enterprise необходимо убедиться, что ваше решение не зависит от функциональности удаленного пакета” источник.
Для успешной реализации рекомендуется начать с анализа устройства и разработки специализированного драйвера или фильтра, который будет корректно обрабатывать USB-дескрипторы для конкретного принтера.
Источники
- USB Serial Driver (Usbser.sys) - Windows drivers | Microsoft Learn
- Use or reference Usbser.sys driver from USB modem .inf files - Windows Client | Microsoft Learn
- USB Serial Driver (usbser) Service Defaults in Windows 10
- WinUSB driver on Windows 10 IoT - Super User
- Why the usbser.sys is not used with a USB CDC-ACM device? - Stack Overflow
- Package - USB Function Driver - Windows IoT Enterprise | Microsoft Learn
- Device Drivers | Microsoft Learn
- Windows IOT core : How to develop CDC device class driver? - MSDN Forum
- Accessing UART on Win10 Enterprise ltsc — upcommunity
- Package - Printer Drivers - Windows IoT Enterprise | Microsoft Learn