Difference in USB NCM class driver behavior for Windows 10 and Windows 11?

Mayank Machhi 10 Reputation points
2024-02-14T04:17:41.25+00:00

We have developed a Network Control Model (NCM) device, adhering to the CDC (0x02) class and the NCM (0x0D) subclass, as outlined in Microsoft’s supported USB classes (USB Device Class Drivers Included in Windows - Windows drivers | Microsoft Learn). Our aim is to utilize Microsoft’s UsbNcm.sys driver, which is designed to manage devices compatible with USB NCM. However, we are encountering a problem with this configuration on Windows 10 Pro (Version 22H2, OS build 19045.2965, installed on 23-03-2023, with Windows Feature Experience Pack 1000.19041.1000.0). According to the NCM specification, the communication interface subclass is identified as the Ethernet Control Model. As per this Ethernet Control Model specification, the host driver of an NCM device’s communication interface is expected to send a Zero-Length Packet (ZLP) when the Nth packet equals the maximum packet size. This specification is correctly adhered to by the host driver in Windows 11, which sends the ZLP as expected. However, this is not the case in Windows 10. We have confirmed this discrepancy through Lacro and Wireshark logs. Consequently, our compact USB NCM device does not operate correctly with the UsbNcm.sys driver in Windows 10. The version of the UsbNcm.sys driver we are using is DriverVer = 04/21/2009, 10.0.19041.1. Therefore, we are puzzled as to why the UsbNcm.sys driver in Windows 10 does not comply with the specification. Have we missed any points?

Windows for business | Windows Client for IT Pros | Devices and deployment | Set up, install, or upgrade
Windows for business | Windows Client for IT Pros | Networking | Network connectivity and file sharing
Windows for business | Windows Client for IT Pros | User experience | Other
{count} vote

1 answer

Sort by: Most helpful
  1. Mayank Machhi 10 Reputation points
    2025-12-02T04:17:44.68+00:00

    We eventually resolved the issue by adding a small workaround on the device side, rather than modifying the Windows NCM driver.

    In our implementation, we detected the case where the host sends a bulk OUT transfer whose size equals the maximum packet size, and the next bulk OUT transfer is a Zero-Length Packet (ZLP). According to the NCM/ECM specification, this ZLP should be treated only as a transfer terminator and must not be interpreted as data.

    So we updated the device firmware logic as follows:

    If the device receives a max-packet-size bulk OUT transfer,

    and the next bulk OUT transfer is a ZLP,

    then the device discards that ZLP and does not treat it as payload data.

    With this change, our NCM device now works correctly on both Windows 10 and Windows 11, despite the inconsistent ZLP behavior in the Windows 10 UsbNcm.sys driver.

    This workaround solved the communication issue for us and allowed the device to operate without disturbances on both OS versions

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.