2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

代替ストリーム(ADS)についてのメモ

Posted at

参考情報
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,
}
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?