例えば、hello.txtに対して、
というコマンドを実行することでhello.txtのhogeというADSに"hello"というデータが書き込まれます。
echo hello > hello.txt:hoge
本来この機能により作成されたファイルは見えませんが、
のように見ることができます。
dir /r >hello.txt:hoge:$DATA
さて、HSPでこの代替データストリームのファイル名を取得し、またファイルの内容も取得したいと考えております。
調べたところ、Windows Vista以降はFindFirstFileとFindNextFileを使ってADSを含むデータを取得できるとありました。
そこでFindNextFileを使ってファイルの一覧を取得したのですが、ADSが検出されません。
ADSの内容の取得は
により可能でした。
bload "file_name:ads_name:$DATA", buf
つまり、ADSの名前(上のads_name)の部分さえ取得できればよいのですが、FindNextFileでは検出できないのでしょうか。
以下に今回書いた、ADS以外のファイル一覧を取得するコードを載せます。
NTFSなので、ファイルを指す文字列は全てUnicodeにしています。
#uselib "kernel32.dll" #cfunc FindFirstFile "FindFirstFileW" str, int #cfunc FindNextFile "FindNextFileW" int, int #func FindClose "FindClose" int // 変数初期化 sdim lpFileName, 512 ; lpFileName sdim lpFindFileData, 512 ; lpFindFileData sdim cFileName, 512 ; ファイル名(WIN32_FIND_DATA) hFile = 0 ; ファイルハンドル // ファイル一覧取得 chdir "C:\\" ; 探索対象ディレクトリ lpFileName = "*" ; 全てのファイル cnvstow lpFileName, lpFileName ; Unicodeに対応 hFile = FindFirstFile( lpFileName, varptr(lpFindFileData) ) if ( hFile == -1 ) : mes "Directory Not Found." : stop while FindNextFile( hFile, varptr(lpFindFileData) ) // lpFindFileDataのバイナリを見る限り0x2CからUnicodeでファイル名? memcpy cFileName, lpFindFileData, 64, 0, 0x2C cFileName = cnvwtos(cFileName) mes cFileName wend FindClose hFile stop
厄介なプログラムですが、どなたかご教示お願いします。