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