レジストリの制限

VistaでSetupDiGetDeviceRegistryPropertyW()が失敗するので調べてみたところ、PropertyBufferSizeに65535以上を与えるとエラーを返すことがわかった。SetupDiGetDeviceRegistryPropertyA()は変換がかかるせいか失敗しない。2000/XPにはこの謎の挙動はないし、ただのバグか?
格納バッファの大きさは、下限はチェックしても上限はチェックしないだろうという思い込みがあったのだが、この挙動が正しいものなのであれば、よく例にあるように、まず格納するのに必要なサイズを調べて、そのサイズを格納バッファの大きさとして教えてあげないといけない。

ついでなのでレジストリに書き込める値に制限はあったっけ、というのが気になって試した。
REG_SZしか調べていないのだが、Windows2000で(値の)文字数が16384以上だとregedit.exeからは値が見えなくなる。regedt32.exeでは見えるし、XPのregedit.exeは(regedt32の内容が統合されているらしく)不可視にならない。ちなみに2000だとキー名が長い場合も不可視になるそうな。
(もしかして16bitコードで32kバイトを超えると長さが負になるから、とかそういう理由か)
2000/XPともに、文字数が524286以上だと失敗するので、値は1MB未満に制限されているようだ。
(ちなみに長さが512KBの文字列を編集しようとすると何秒も待たされるが、それでもエディットボックスで編集できることに驚き)