Lokale Variablen verlieren ihre Gültigkeit beim Verlassen der Routine. _msg aus HidAfterReceive ist in Decode-Dingsbums unbekannt. Zu mal du in Decode-Dingsbums _msg auch deklariert hast. Das sind zwei unterschiedliche Variablen, auch wenn sie gleich heißen.
Oberflächlich betrachtet ist diese Aussage natürlich korrekt - aber wenn man es genauer anschauen würde, würde man erkennen, dass zwischen den beiden Funktionen die erwähnte Windows-Message-Queue steckt, welche den Pointer auf den vermeindlich nicht freigegebenen Speicher an die Funktion überliefert, welche den Speicher dann korrekt freigibt - das Speicher-Handling ist korrekt...