0%

Alternative Data Streams (ADS)是Windows文件系统中引入的一项功能,可以为文件关联额外的数据流。这项功能的诞生原因是为了提高文件系统的兼容性和功能性,特别是与Macintosh和Unix系统创建的文件进行交互时。

在Macintosh和Unix系统中,文件可以具有多个数据流,而Windows文件系统中最初只支持一个数据流。为了使Windows文件系统与其他操作系统更兼容,Microsoft引入了ADS功能,使Windows文件系统能够处理多个数据流。这项功能可以用于存储文件的元数据,如作者、创建日期、修改日期等,还可以用于存储图像和音频文件的缩略图、元数据等。

ADS功能可以提供重要的功能和灵活性,但也带来了一些安全风险。因为ADS可以隐藏在文件中,不容易被普通的文件系统API或一些防病毒软件所发现,因此,它也可能被恶意软件利用来隐藏其存在,使得系统的安全受到威胁。

尽管如此,ADS仍然被保留在Windows文件系统中,因为它在某些应用程序和使用情况下提供了重要的功能。但是,用户和组织需要意识到ADS所带来的安全风险,并采取措施来减轻这些风险,例如使用专门设计用于检测ADS中隐藏的恶意软件的防病毒软件等。本文将介绍ADS的创建和检测,以及如何用Win32 API读写ADS。

阅读全文 »

上一篇文件我们主要介绍了Windows文件系统的基本特性及文档阅读方式,本文将介绍Windows文件系统中一种特殊的概念:指向点(Reparse Point)

回顾上一章节,我们在文件dwFileAttributes依据符号位FILE_ATTRIBUTE_REPARSE_POINT实现了一个方法:

bool StatResult::IsReparsePoint() const {
return (m_handleFileInformation.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
}

我们还没有说明这个方法的意义,该方法说明该文件是一个指向点(Reparse Point)。Reparse Point是一种特殊机制,用于实现Windows文件系统的重定向。Windows的挂载和软连接就是基于它实现的。在详解FILE_ATTRIBUTE_REPARSE_POINT之前,我们先从Windows软链接开始看起。

创建软连接

cmd.exe提供了mklink命令用于在Windows创建软链接:

C:\Users\XUranus>mklink
MKLINK [[/D] | [/H] | [/J]] Link Target
/D 创建目录符号链接。默认为文件符号链接。
/H 创建硬链接而非符号链接。
/J 创建目录联接。
Link 指定新的符号链接名称。
Target 指定新链接引用的路径 (相对或绝对)。

阅读全文 »

最近接触Windows文件备份相关的业务,从Win32 API入手对Windows文件系统的基本概念做一个总结。学习Windows文件系统最好方式还是阅读官方文档,本文只是对相关概念进行粗浅的介绍,权当抛砖引玉。
本文完整代码见:https://github.com/XUranus/FileSystemUtil

Win32 API Doc

官方文档。文档会详细描述每一个API的入参、出参、返回的字段含义和取值范围,部分还会给出Example程序。

Windows程序开发一般使用MSVC,和GCC有不少区别。为了更有效率的学习Windows文件系统,在介绍文件系统之前,本文先给Linux转Windows的开发者介绍一下Windows的编码和文档阅读方式,磨刀不误砍柴工。

UTF-8/UTF-16

涉及字符串的Win32 API一般提供两类接口:

  • Ansi字符串接口(一般以A结尾)
  • UTF-16宽字符串接口(一般以W结尾)

例如GetFileAttributesAGetFileAttributesW

typedef _Null_terminated_ CONST WCHAR *LPCWSTR, *PCWSTR;
typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;
...
DWORD GetFileAttributesA(
[in] LPCSTR lpFileName
);

DWORD GetFileAttributesW(
[in] LPCWSTR lpFileName
);

阅读全文 »

Linux上可以快速创建一个超过卷自身大小的文件。例如/dev/nvme0n1p2对应的大小只有234GB:

╭─xuranus@Thanos ~/workspace 
╰─$ df -h
Filesystem Size Used Avail Use% Mounted on
dev 7.8G 0 7.8G 0% /dev
run 7.8G 1.6M 7.8G 1% /run
/dev/nvme0n1p2 234G 196G 26G 89% /
tmpfs 7.8G 172M 7.6G 3% /dev/shm
tmpfs 7.8G 21M 7.8G 1% /tmp
/dev/nvme0n1p1 500M 114M 386M 23% /boot
tmpfs 1.6G 76K 1.6G 1% /run/user/1000

dd if=/dev/zero bs=1M count=1 of=sparsefile seek=1000000以1MB为单位,从1000000的位置,即offset = 1M * 1000000处写入一个1M的数据块:
╭─xuranus@Thanos ~/workspace 
╰─$ dd if=/dev/zero bs=1M count=1 of=sparsefile seek=1000000
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.00405439 s, 259 MB/s

ll -h可以看到文件空间占用达到了977GB:

阅读全文 »

项目地址https://github.com/XUranus/minijson

JSON是非常常用的结构对象序列化方式。相比于其他基于字节流的序列化方案(thrift,protobuff),JSON易于阅读和编辑;相较于同样基于文本的序列化方案XML,JSON在网络传输占用更小的空间。JSON很好平衡了序列化/反序列化的性能、可读性、空间占用的问题。

很多语言都在标准库中添加了JSON相关的API,但C/C++还没有。C++较为完善的开源JSON库有jsoncpp。这篇文件将介绍如何用1K行左右的代码实现一个精简C++的Json库。

阅读全文 »