NTFS下,支持一个非凡观念,那就是’流’.怎么个流法呢?先看’流’的界说:
stream
A sequence of bits, bytes, or other small structurally uniform units.
BIT的序列,可能小的统一布局单位.虽然,小的统一布局单位并不料味着必然要巨细统一,名目统一.
流依附于文件而存在,你可以在流中存储2进制数据,文字可能其他一些对象.就象文件一样.文件存什么,流就能存什么.每个文件可以含有多个流.可是流又和文件有些差异.每个流的打开需要单独的一个CreatFile(…)操纵,并不是打开文件就打开了流.
流的名字和文件名以’:’脱离.譬喻:ABC:A.
ABC就是文件名,而流的名字为A.当我们操纵流时,可以用如下简朴要领:
ECHO STREAM1>ABC:STREAM1
ECHO STREAM2>ABC:STREAM2
此刻,ABC就有了:STREAM1和:STREAM2共2个流.
而读出流可以用:
MORE <ABC:STREAM1
MORE <ABC:STREAM2
这样,内容就被读出了.CreateFile("ABC:STREAM1",…);
假如用编程的要领.操纵就和文件操纵一样.
那么为什么要用流呢?流的长处就是隐蔽.WINNT没有任何一个东西用来发明流的存在.我们看
C:\>ECHO "Hi Reader" > XX.TXT:MyStream
C:\>DIR XX.TXT
Volume in drive C is Wizard
Volume Serial Number is 40E5-92D4
Directory of C:\
03/18/98 08:36a 0 XX.TXT
1 File(s) 0 bytes
0 Dir(s) 3,399,192,576 bytes free
这就是长处.所以,在绿色兵团里有一篇文章专门先容了流.说是一种埋没很深的文件存取名目.
简直深,可是NT只不外没有提供东西罢了.而我们仍然有探测到流的存在.那就是,Inside Programming为各人提供的Stream.Exe.该东西可以看到含有流的文件以及所有的流的名字.
虽然,NT提供一个API,BackupRead(…)用于流名的读出.既然是Inside Programming,先容这个API显然不能提供更多辅佐,接下来先容的是一个NATIVE API:NtQueryInformationFile(…)
下面给出该API涉及流的部门:
/*+++
Streaminfo.h
author: lulin
date: 2000.8.25
Abstract:
interface to NtQueryInformationFile
stream portion.
---*/
#ifndef __STREAMINFO_H__
#define __STREAMINFO_H__
#include <windef.h>
extern "C"{
typedef LONG NTSTATUS;
typedef struct {
union {
NTSTATUS Status;
PVOID Pointer;
};
ULONG *Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
typedef struct { //infoclass 22
ULONG NextEntryOffset;
ULONG StreamNameLength;
LARGE_INTEGER EndOfStream;
LARGE_INTEGER AlloCationSize;
WCHAR StreamName[1];
}FILE_STREAM_INFORMATION,*PFILE_STREAM_INFORMATION;
__declspec(dllimport) NTSTATUS __stdcall NtQueryInformationFile(
HANDLE handle,
PIO_STATUS_BLOCK io_status_block,
PVOID FileInFormation,
ULONG FileInformationLength,
int FileInfomationClass
);
}
#endif //__STREAMINFO_H__
NTFS真正存储流名时,名字里会加上:$DATA,譬喻:ABC:STREAM1在存储时,流名被存为了:STREAM1:$DATA,所以在查询功效中需要去除:$DATA.在这里,我不具体接头STREAM.EXE如何运作