====== 代替データストリームの取得はNtQueryInformationFile一択 ====== C#でNTFSの代替データストリーム(Alternate Data Stream)を読み書きしたくなったので調べたことをメモ。正確な部分は把握しきれてないが、非公開関数であるNtQueryInformationFileで列挙するのが確実のようだ。 代替データストリームの取得(列挙)には以下の3つの方法がある。 - BackupRead関数を使う - FindFirstStreamW関数, FindNextStreamW関数を使う (Windows Vista以降) - NtQueryInformationFile関数を使う (非公開関数) 正攻法は1, 2で、調べた限りADSの読み書きを行う既存のC#ライブラリは、1のBackupRead/BackupWriteを使っている。 ところがどう言う訳か、BackupReadでは列挙されないストリームが存在しうる。''dir /r''や[[https://www.nirsoft.net/utils/alternate_data_streams.html|NirSoft AlternateStreamView]]では表示されるにも関わらずだ。NTFSによるアクセス権限の問題らしいが、詳しいことは分からない。 NtQueryInformationFileはアクセス権限を無視して情報を取得できるらしく、前述のdirやAlternateStreamViewはこのAPIを使っているのだろう。多分。 2の方法は試してないが、アクセス権を無視するオプションはないらしいので望み薄と思われる。 [[https://fezg00.hatenadiary.org/entry/20091118/1258522994|こちら]]の記事のC#でNtQueryInformationFileを使ったサンプルで、無事目的のADSが取得できることを確認。というわけで、非公開関数ではあるもののNtQueryInformationFileを使うのが確実っぽい。 ===== 参考サイト ===== * [[https://fezg00.hatenadiary.org/entry/20091118/1258522994|NTFS代替データストリーム(ADS)一覧取得 | Memo+]] * [[https://www.nslabs.jp/ntfs_alt_stream.rhtml|NTFS代替ストリーム | Netsphere Laboratories]] * [[http://www.flexhex.com/docs/articles/alternate-streams.phtml|NTFS Alternate Streams: What, When, and How To]] * [[https://neos21.net/blog/2021/02/08-01.html|Windows の謎を調べた - Neo's World]] * [[https://www.facebook.com/dnobori/posts/2142836202459674|登 大遊 - Windows のファイルのコピーは、驚くほど奥が深い。 | Facebook]] * [[https://docs.microsoft.com/en-us/archive/msdn-magazine/2006/january/net-matters-iterating-ntfs-streams|.NET Matters: Iterating NTFS Streams | Microsoft Docs]] * [[https://www.codeproject.com/Articles/13667/Enumerating-Alternate-Data-Streams|Enumerating Alternate Data Streams - CodeProject]] * [[https://tsapps.nist.gov/publication/get_pdf.cfm?pub_id=50914|A Win32-Based Technique for Finding and Hashing NTFS Alternate Data Streams]]