У вас файл, ассоциированный с VCP, переоткрывается. Это
действительно надо делать со стороны программы. Но инициализацию
USB-порта Windows делает сама, когда в него что-то втыкают. Однако
проблема чаще бывает в другом - на плате линию от PA12 подтягивают
резистором к питанию. Тогда при после ресета MK забывает свой
прежний коннект, а Windows всё еще его помнит и повторную
инициализацию соединения не вызывает. Т.е. порт остается открытым,
и файл, ассоциированный с ним, тоже, а передачи нет как нет. Исправить положение можно только при повторной инициализации, а для этого коннект надо сперва разорвать, а файл открыть заново.
А что касается мессаджа WMDeviceChange, то мне не удается сходу определить, мое устройство отсоединилось или какое-то другое (приходится этот вопрос специально решать через ухо). В этом смысле мне ваш код интересен, а именно, откуда вы достали имя девайса. А строка "PDEV_BROADCAST_PORT lpdbpr = reinterpret_cast", полагаю, обгрызена вами с конца, а потому не дает возможности определить, откуда взялся lpdbpr, из которого выбирается dbcp_name.