参考情報
NTFS Alternate Streams- What, When, and How To
初めてのNTFS代替データストリームとstreamsの出力について
NTFSにこういう機能があるのを、そういえばWin2000時代に目にした覚えがあったのですが、
最近まですっかり忘れてました。ざっと走り書き。
###コマンドラインでの表示
cmd.exe
からdir /w
で見えます。
###どうやってアクセスするの?
普通にファイル名に:(コロン)で区切ったファイルを指定すると作成できます。
下記の例だと、同時にtest.txt
も作成されます。
FILE *fp;
fp=fopen("c:\\Temp\\test.txt:1", "w");
if(fp!=NULL){
fprintf(fp, "test\n");
fclose(fp);
}
fp=fopen("c:\\Temp\\test.txt:1", "r");
if(fp!=NULL){
char buf[32];
fscanf(fp, "%s", buf);
fclose(fp);
}
###代替ストリームがあるか、どうやって調べるの?
FindFirstFile()
に類似の名称のFindFirstStreamW()
で調べることができます。
ただし、*を使用してのワイルドカード指定はできないようで、直接ファイル名を入力します。
(下記、いまだANSIでコーディングしてるので、ちょっと見づらくてごめんなさい)
char pdir[MAX_PATH]{};
char cdir[MAX_PATH]{};
sprintf(pdir, "c:\\Temp");
GetCurrentDirectory(MAX_PATH, cdir);
SetCurrentDirectory(pdir);
{
WIN32_FIND_DATA fileData;
HANDLE fileHandle=FindFirstFile("*", &fileData);
while(fileHandle!=INVALID_HANDLE_VALUE){
if(((fileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)==0)&&
(strcmp(fileData.cFileName, ".")!=0)&&(strcmp(fileData.cFileName, "..")!=0)){
wchar_t wtxt[MAX_PATH]{};
MultiByteToWideChar(CP_ACP, 0, fileData.cFileName, -1, wtxt, MAX_PATH);
{
WIN32_FIND_STREAM_DATA streamData;
HANDLE streamHandle=FindFirstStreamW(wtxt, FindStreamInfoStandard, &streamData, 0);
while(streamHandle!=INVALID_HANDLE_VALUE){
char mtxt[MAX_PATH]{};
WideCharToMultiByte(CP_ACP, 0, streamData.cStreamName, -1, mtxt, MAX_PATH, NULL, NULL);
if(!FindNextStreamW(streamHandle, &streamData)) break;
}
FindClose(streamHandle);
}
}
if(!FindNextFile(fileHandle, &fileData)) break;
}
FindClose(fileHandle);
}
SetCurrentDirectory(cdir);
とすると、こんな感じで取得できます。
test.txt
::$DATA
:1:$DATA
###代表的な使用例は?
「このファイルは、インターネット上の場所から取得されており、安全でない可能性があります。」とかいう表示有無にこっそりと使用されています。
そのストリーム名は
filename:Zone.Identifier:$DATA
ということです。
そのストリーム内に下記IDが書かれるようです。(詳細はリンクとかたどってください。)
[ZoneTransfer]
ZoneId=3
public enum SecurityZone
{
NoZone = -1,
MyComputer = 0,
Intranet = 1,
Trusted = 2,
Internet = 3,
Untrusted = 4,
}