勿庸置疑,上面命令能够很好的工作,但对于理解交换流的技术来说仍然很困难。当然,借助Hex编辑器能够执行任何流操作。但对于copy或者rename操作来说,使用Hex编辑器不是最好的工具。
因此,一套用户操作交换流的工具被开发出来。
So When to Use Alternate Streams?
当然,在存储任何关键信息时都不需要用到交换流。就的文件系统仍然广泛在使用且不支持NTFS的高级特性。如果Copy一个NTFS文件到USB驱动器、flash Card、CDR/RW,或者其它非NTFS驱动器上的时候,系统将仅仅Copy主文件流(main stream),而忽略所有的交换流。对于FTP和HTTP传输也是如此。没有任何警告信息,一个依赖交换流的用户,可能得到吃惊的信息。因此,Microsoft也不希望提供给用户关于交换流的访问工具。
然而,交换流的确非常有用。交换流是存储一些非关键信息的最正常的位置。比如,极小的图形文件,程序代码的分析信息,文档的拼写检查和数据格式化,或者其它一些信息能够通过交换流轻而易举地获得。这种方式得到的文件能够被存放在任何文件系统上,但存放在NTFS上效率更高。
Programming Considerations
检测驱动器
使用GetVolumeInformation函数检测驱动器是否支持alternate streams:
char szVolName[MAX_PATH], szFSName[MAX_PATH];
DWORD dwSN, dwMaxLen, dwVolFlags;
::GetVolumeInformation("C:\\", szVolName, MAX_PATH, &dwSN,
&dwMaxLen, &dwVolFlags, szFSName, MAX_PATH);
if (dwVolFlags & FILE_NAMED_STREAMS) {
// File system supports named streams
}
else {
// Named streams are not supported
}
可以使用更安全的检测文件系统名的方法来代替标志:
if (_stricmp(szFSName, "NTFS") == 0) // If NTFS
创建和打开一个流
创建和打开命名流和未命名流的方法相同:
HANDLE hFile = ::CreateFile("file.dat:alt", ...
主要,如果文件不存在,则创建命名流也将同样创建一个0长度的未命名流。
删除一个流
API函数DeleteFile支持交换流的删除:
::DeleteFile("file.dat:alt");
注意,不能单独删除未命名流,而必须删除所有的交换流。
Copy一个流
可以使用CopyFile/CopyFileEx函数进行交换流的Copy。但这些函数常被用来进行文件拷贝,因此结果往往是用户非期望的。它们执行的是命名流到未命名流的Copy。应该明白下面的不同:
Unnamed stream to unnamed stream:就象操作一个普通文件,所有命名流也会一起被拷贝,如果目标存在,则被替换。
Named stream to unnamed stream:也象操作一个文件一样,但仅仅是一个流被拷贝。存在的目标文件将被删除。功能相当于将整个目标文件替换成一个新的单流(single-stream)文件。
下面是例子代码:
HANDLE hInFile = ::CreateFile(szFromStream, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
HANDLE hOutFile = ::CreateFile(szToStream, GENERIC_WRITE, FILE_SHARE_READ, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
BYTE buf[64*1024];
DWORD dwBytesRead, dwBytesWritten;
do {
::ReadFile(hInFile, buf, sizeof(buf), &dwBytesRead, NULL);
if (dwBytesRead) ::WriteFile(hOutFile, buf, dwBytesRead, &dwBytesWritten, NULL);
} while (dwBytesRead == sizeof(buf));
::CloseHandle(hInFile);
::CloseHandle(hOutFile);
重命名一个流
It seems there is no way - documented or undocumented - to rename a stream short of directly modifying the appropriate MFT entry.
Enumerating Streams
只有Win32 API函数BackupRead能用来列举流。但用起来却存在问题。即,为了得到流的名字,BackupRead必须读到所有文件的流才行。幸运的是,虽然文档没有记载,但却证明是有效的另一个函数能够被用来获得流信息,就是NtQueryInformationFile (or ZwQueryInformationFile).
// Open a file and obtain stream information
BYTE InfoBlock[64 * 1024]; // Buffer must be large enough
PFILE_STREAM_INFORMATION pStreamInfo = (PFILE_STREAM_INFORMATION)InfoBlock;
IO_STATUS_BLOCK ioStatus;
HANDLE hFile = ::CreateFile(szPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, 0, NULL);
NtQueryInformationFile(hFile, &ioStatus, InfoBlock,
sizeof(InfoBlock), FileStreamInformation);
::CloseHandle(hFile);
如果打开一个目录,则代码有一些细微的要求。首先,程序必须具备 SE_BACKUP_NAME权限。第二,必须在调用CreateFile函数时指定 FILE_FLAG_BACKUP_SEMANTICS参数。第三,必须时刻明白这一事实,即目录和普通文件不同,目录可能根本就没有流。对这种情况程序处理也应该考虑。
// Open a directory and obtain stream information
// Obtain backup privilege in case we don't have it
HANDLE hToken;
TOKEN_PRIVILEGES tp;
::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
::LookupPrivilegeValue(NULL, SE_BACKUP_NAME, &tp.Privileges[0].Luid);
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
::CloseHandle(hToken);
HANDLE hFile = ::CreateFile(szPath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
BYTE InfoBlock[64 * 1024]; // Buffer must be large enough
PFILE_STREAM_INFORMATION pStreamInfo = (PFILE_STREAM_INFORMATION)InfoBlock;
IO_STATUS_BLOCK ioStatus;
pStreamInfo->StreamNameLength = 0; // Zero in this field means empty info block
NtQueryInformationFile(hFile, &ioStatus, InfoBlock,
sizeof(InfoBlock), FileStreamInformation);
::CloseHandle(hFile);
函数NtQueryInformationFile在InfoBlock Buffer中存储一个FILE_STREAM_INFORMATION结构的序列。FILE_STREAM_INFORMATION是一个可变长的结构。它的大小存储在NextEntryOffset 中 ,序列的最后一个结构的NextEntryOffset field为0.
StreamName field 包含了流名称,采用UNICODE编码; StreamNameLength是名称的长度,单位是Byte。
现在,已经成功获得了流信息记录的队列,并且能够实现打印了:
WCHAR wszStreamName[MAX_PATH];
for (;;) {
// Check if stream info block is empty (directory may have no stream)
if (pStreamInfo->StreamNameLength == 0) break; // No stream found
// Get null-terminated stream name
memcpy(wszStreamName, pStreamInfo->StreamName, pStreamInfo->StreamNameLength);
wszStreamName[pStreamInfo->StreamNameLength / sizeof(WCHAR)] = L'\0';
print("%S", wszStreamName);
if (pStreamInfo->NextEntryOffset == 0) break; // No more stream records
pStreamInfo = (PFILE_STREAM_INFORMATION)
((LPBYTE)pStreamInfo + pStreamInfo->NextEntryOffset); // Next stream record
}
如果不打算处理目录,则可以将if (pStreamInfo->StreamNameLength == 0)一句移除。每个文件至少有一个流,因此,这一句不是必须的。
注意,流名字包括属性名。未命名看起来是::$DATA的样子,命名流看起来是:alt:$DATA 的样子。
如果安装了DDK ,则所有的头文件和lib文件都有了。在调用函数 NtQueryInformationFile 以前,应包括下面头文件和链接库:
NTQUERYINFORMATIONFILE NtQueryInformationFile;
(FARPROC&)NtQueryInformationFile = ::GetProcAddress(
::GetModuleHandle("ntdll.dll"), "NtQueryInformationFile");
完整的例子参考下面的下载链接。
Command Line Tools
这些工具均有源代码和编译后的工具提供下载。
All our stream-enabled command line tools are free and can be downloaded from the download section. You cannot distribute these tools separately, however you can distribute the original zip archive freely.
Copy Stream
Usage:
cs from_stream to_stream
This command copies separate streams, for example
cs C:\SomeFile.dat:str stream.dat:alt
If the stream is not specified, the command assumes the unnamed stream. For instance, the command
cs c:\report.txt reports.txt:r20
will copy the file's primary stream. If the file report.txt has any alternate streams, they will be ignored (use the standard copy command to copy the file as a whole).
Delete Stream
Usage:
ds stream
Delete the specified stream, for example
ds stream.dat:alt
If no stream name is specified, the command deletes the whole file (deleting the unnamed stream causes all the streams to be deleted).
The command don't ask for confirmation, so be careful.
Rename Stream
There is no known method of renaming a stream, so we have to use the copy/delete sequence. While this method will do the trick, renaming a large stream may take considerable time.
Usage:
rs file oldname newname
Rename the stream oldname of the file file to newname. For example, the command
rs stream.dat alt text
renames stream.dat:alt to stream.dat:text.
List Streams
This command lists all streams of the specified file and their size.
Usage:
ls file
Example:
The LS command returns the standard success code 0 only if at least one alternate stream was found. See the topic "Calling From a Batch File" below for a usage example.
Calling From a Batch File
Like most standard command line commands, the stream commands return the standard exit codes that can be analyzed with the if errorlevel batch command. There are two possible exit codes: 0 means success, and 1 means error. The technique is illustrated by the following example batch file:
@echo off
echo Copying stream...
cs c:\report.txt reports.txt:20
if errorlevel 1 goto cmderr
echo Successfully copied!
goto exitbatch
:cmderr
echo Some error occured.
:exitbatch
rem Exiting the batch file....
The LS command returns the standard success code 0 when at least one alternate stream present. The standard error code 1 is returned if the file contains an unnamed stream only or if I/O error occured. The following example shows how to check for presence of alternate streams:
@echo off
rem This batch file finds and list all files with ADS in the current directory
echo Files containing alternate streams:
for %%f in (*.*) do call :checkf %%f
goto exitbatch
:checkf
rem We don't want to list streams so throw out the output
ls %1 >nul
if not errorlevel 1 echo %1
:exitbatch
This batch file FS.bat can be downloaded as a part of the stream tools package.
Please refer to the Windows Help to learn more about Windows batch files and batch commands.
Downloads
Streamtools download
http://www.flexhex.com/docs/articles/download/streamtools.zip
Streams download
http://www.flexhex.com/docs/articles/download/streams.zip
相关推荐
在.NET框架中,Visual Basic .NET (VB.NET) 和 C# 是两种主要的编程语言,它们都支持对NTFS(New Technology File System)文件系统进行高级操作,包括处理文件的附加数据流。NTFS文件系统允许在一个文件内创建多个...
NTFS(New Technology File System)是Windows操作系统中广泛使用的文件系统,它引入了一种独特的特性——alternate data streams(ADS,备用数据流),这是标题“NTFS数据流(ADS)”的核心概念。ADS允许在一个文件...
5. **路由与交换**:路由器处理不同网络之间的数据传输,交换机则负责同一网络内部的数据交换。 **操作系统** 操作系统是管理计算机硬件和软件资源的系统软件。面试中可能会考察以下内容: 1. **进程与线程**:...
绘制DFD有助于软件设计师更好地理解业务流程,并为后续的设计与实现工作提供参考依据。 ### UML 统一建模语言(UML)是一套标准化的图形符号,用于描述软件系统的架构和行为。 #### 类图 类图用于展示系统中各个...
源代码将揭示如何访问和处理这些非主数据流,对于数据恢复和安全分析工作具有实用价值。 6. **undelsrc** 文件恢复工具`undelsrc`的源代码展示了如何在删除文件后找回数据。这涉及到对文件系统结构的理解,包括...
本课件全面涵盖了操作系统的基本概念、设计原理以及实现技术,旨在帮助教师进行教学,同时让学生深入理解操作系统的工作机制。 一、操作系统概述 操作系统(Operating System, OS)是计算机系统的核心组成部分,它...
- **关键技术**:深入分析NTFS的核心技术,比如流、压缩、加密等功能。 - **文件恢复**:研究如何通过编程手段实现文件恢复,可以使用C++或Python等语言编写一个小工具。 ### 4. 移动设备操作系统的研究报告 - **...
- **作用**: 加快交换数据的访问速度。 - **实现**: 利用内存的一部分作为缓存。 **3.10 页面的换入** - **定义**: 当页面被换出后,重新加载到内存的过程。 - **作用**: 恢复进程的状态。 - **触发条件**: 缺页...
6. P2P点对点文件传输原理:P2P技术允许网络中的每个节点既是客户端也是服务器,直接与其他节点交换数据。用户可以下载文件的同时上传文件给其他用户,降低了中心服务器的压力。 7. 互联网影响的翻译:互联网的发展...
《操作系统原理》作为高等教育出版社出版的高校教材,深入浅出地阐述了操作系统的基本概念、设计思想和实现技术,对于学习和理解操作系统的工作机制具有重要的指导价值。下面将详细讨论操作系统的一些关键知识点。 ...
黑龙江大学的操作系统题库将覆盖以上这些领域,并可能包括一些具体的编程题目,如C语言实现简单的操作系统功能或者分析系统调用的实现。通过深入学习和实践,学生可以全面掌握操作系统的核心概念和技术,为未来的...
标题提到的"u盘的加密(类似加密狗)"指的是使用特定的技术或工具对USB闪存驱动器(通常称为U盘)进行加密,以防止未经授权的访问或复制存储在其中的数据。加密狗是一种硬件设备,常用于软件授权,它可以通过插入...
操作系统是计算机系统的核心,面试中可能涉及进程与线程的区别、内存管理(如虚拟内存、页交换)、调度算法(如FCFS、SJF、优先级调度)、文件系统(如EXT3、EXT4、NTFS)以及I/O操作等知识点。 网络方面,TCP/IP...
- **虚拟内存**:提供比物理内存更大的地址空间,通过页表映射和页面交换实现。 - **I/O管理**:处理设备驱动程序,协调设备与CPU的数据传输。 - **安全与权限**:确保只有授权的用户或进程可以访问特定资源。 - **...
总的来说,这个“检测与读写SD卡的VC++6.0源代码”项目为开发者提供了一个实用的工具,帮助他们理解如何在Windows环境中使用C++与SD卡进行有效的数据交换。通过学习和分析这套源代码,开发者可以加深对硬件设备驱动...
- **定义**: 用于管理交换分区中的页面的数据结构。 - **作用**: 支持页面的换入换出操作。 - **实现**: 内核自动管理。 **3.10 页面的换入** - **定义**: 将页面从磁盘换入物理内存的操作。 - **过程**: 查找空闲...
虚拟内存技术使程序可以使用超过实际物理内存大小的地址空间,通过页面或段的交换实现内存的扩展。 4. **文件系统**:文件系统是操作系统管理数据存储的一种方式,它定义了文件的组织、命名、存储和检索规则。常见...
这份“操作系系统PPT讲义”涵盖了操作系统的基本概念、设计原理以及实现技术,对于学习和复习操作系统知识非常有帮助,特别是在应对操作系统相关的考试时。 一、操作系统概述 操作系统(Operating System,简称OS)...