QueryDosDevice()の第1引数NULL

QueryDosDevice() の第1引数に NULL を与えると、既存の MS-DOSバイス名をすべて得られる。

下は MSDN より引用したもの。

このパラメータには、NULL を指定することができます。その場合、QueryDosDevice 関数は既存の MS-DOSバイス名をすべて列挙したリストを、lpTargetPath パラメータが示すバッファに格納します。

[QueryDosDevice 関数]

んで、やってみた(ワイド文字版を使った)。失敗。GetLastError() で確認すると ERROR_INSUFFICIENT_BUFFER が返ってきている。情報の書き込み先配列の大きさは 10K にしてたのだけど……。
そんなに情報書くの?とか思いつつも、配列サイズを64Kにしてみたら、成功したよ。なんか、書き込まれてた文字数調べたら、1万字以上あった。
文字列を表示してみると、NT namespaceの"Global??"以下のものやらなにやら(あまり細かいことはわからん)が、ごっそりと列挙されている。……それで1万字以上書くわけか。
QueryDosDevice()って"C:"とか"COM1"とかそんなのしか渡せないと思ってたけど、ちがうのだな。"Volume{*GUID*}"みたいな文字列も渡せる(*GUID*の部分は、7eebeecd-f371-46e9-83f6-a09178edb56c みたいな文字列ね。)。

ためしに"C:"に割り当てられているボリュームを表す"Volume{*GUID*}"の文字列を渡したら、"C:"にマッピングされているデバイス名が返ってきた。

wchar_t wbuf[1024];
QueryDosDeviceW(L"Volume{*GUID*}", wbuf, 1024);

と、

wchar_t wbuf[1024];
QueryDosDeviceW(L"C:", wbuf, 1024);

の結果が同じもの*1

参考ページ

//msdn.microsoft.com/ja-jp/library/cc429649.aspx" title="QueryDosDevice 関数" target="_blank">[QueryDosDevice 関数]:QueryDosDevice()のヘルプ情報。MSDN内ページ。
//msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx" title="Naming Files, Paths, and Namespaces (Windows)" target="_blank">[Naming Files, Paths, and Namespaces (Windows)]:ファイルパスだのNT Namespaceだのなんだの。自分もあまりよくわかってない。きちんと読んでおきたい。
//msdn.microsoft.com/en-us/library/cc542456(v=VS.85).aspx" title="Displaying Volume Paths (Windows)" target="_blank">[Displaying Volume Paths (Windows)]:QueryDosDevice() が使われている。QueryDosDevice() の動作を知るための最初のサンプルにするには、ちょっと複雑だけど、いいサンプルだと思う。

*1:"*GUID*"の部分はシステムによって異なるだろうから、[WinObj]なりで調べてみてください。