首页
社区
课程
招聘
[求助]如何瞬间创建大文件
发表于: 2014-6-30 14:47 11491

[求助]如何瞬间创建大文件

2014-6-30 14:47
11491
创建一个文件,再移动指针到1GB的位置,写入512字节,关闭句柄。
这样创建一个1GB的文件要很长的时间啊。有没有方法可以瞬间创建一个
大文件的?
hFile = CreateFile("c:\111", GENERIC_ALL, 0, 0, OPEN_ALWAYS,   FILE_ATTRIBUTE_NORMAL, 0);
SetFilePointer(hFile, 1048576000, 0, FILE_BEGIN);
char lpbuffer[512];
int a;
WriteFile(hFile,lpBuffer,512,&a,NULL);
CloseHandle (hFile);

稀疏文件的不要啊。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (29)
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你要瞬间写入一个1G的文件?
硬盘读写速度有这么快么?SSD也不行吧
2014-6-30 15:14
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
不是要瞬间写入1GB啊,只是瞬间创建一个1GB的文件,其内容是不确定的。然后根据需要该写入哪个offset,写入多少内容,根据需要而定,只是先要创建出来,再硬盘上分配好这么多的扇区,在ntfs文件系统中存在了这个文件就可以了啊。就像Hibernat休眠文件一样,瞬间就创建出来了,但是只是在休眠的时候才把Hibernat.sys的内容写进去啊。
2014-6-30 15:25
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Linux 可以创建空洞文件、 Windows 不清楚是不是直接支持。
2014-6-30 15:38
0
雪    币: 164
活跃值: (53)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
许可虚拟机系统有类似的功能,可以深入研究一下.
2014-6-30 15:40
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
FSIOCTL_SET_SPARESE
2014-6-30 15:45
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
windows有稀疏文件啊,但是我说了稀疏文件的不要。只是要确实在硬盘分配1GB的扇区给我的文件就可以了,我以后再按需要读写这些数据。稀疏文件是不分配扇区的,只有在写入数据时才分配扇区,我说了不要稀疏文件,要确实先分配1GB的扇区给我。要瞬间完成,就是不知道该使用哪个API啊?像Hibernat.sys就是瞬间分配几个GB的扇区给Hibernat.sys使用嘛。
2014-6-30 15:46
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
那目测是要写驱动。。这玩意太高端,暂时还玩不转。 等半年后哥再来解决。
2014-6-30 15:52
0
雪    币: 1259
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
stu
9
记得自带有一个命令行工具,fsutil file createnew 文件名 长度。
2014-6-30 16:10
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
修改PE头
2014-6-30 16:14
0
雪    币: 239
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
记得好像修改CrateFileMapping大小参数可以扩充文件大小
2014-6-30 16:19
0
雪    币: 16451
活跃值: (1715)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
明显需要提前量 和 预判性
2014-6-30 16:54
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
是的是的,就是这个功能,只是不知道是哪个API,现在需要编程使用,不是用命令行。
2014-6-30 16:59
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
一、去逆向一下fsutil  

二、直接代码中使用system("fsutil ")
2014-6-30 17:09
0
雪    币: 31
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
只要是实际分配1G空间扇区,除非硬盘上确实很空,否则怎么也快不起来吧,要不断寻址寻找空闲空间,然后标记为已使用
2014-6-30 17:46
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
要有1G的连续空间和磁盘大小关系不大
2014-6-30 18:12
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
17
动不动就逆向,有必要吗?只是要寻求一个答案,没必要非那么大功夫去逆向,不可能什么东西都去逆向吧,难道把整个windows逆向。

其实很简单的,后来找到了部分答案,
BOOL WINAPI SetEndOfFile(
  _In_  HANDLE hFile
);

The SetEndOfFile function can be used to truncate or extend a file. If the file is extended, the contents of the file between the old end of the file and the new end of the file are not defined.
既然说增加的文件长度,又说增加的内容是不确定的,可以理解是直接分配1G的内容而并不写入1G的数据,所以应该是瞬间完成。

但是我想要驱动层实现,又查了一下。
NTSTATUS ZwSetInformationFile(
  _In_   HANDLE FileHandle,
  _Out_  PIO_STATUS_BLOCK IoStatusBlock,
  _In_   PVOID FileInformation,
  _In_   ULONG Length,
  _In_   FILE_INFORMATION_CLASS FileInformationClass
);

参数FileInformationClass 可取值 FileEndOfFileInformation

If you set FileInformationClass to FileEndOfFileInformation, and the EndOfFile member of FILE_END_OF_FILE_INFORMATION specifies an offset beyond the current end-of-file mark, ZwSetInformationFile extends the file and pads the extension with zeros.

驱动层里面,会填充数据0知道文件结尾,这又让我头痛了,这是要写入1GB的0的节奏啊。
为什么r3和r0是不同的呢?
2014-6-30 18:36
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
18
不要1GB连续空间啊,不连续也可以,有1GB的容量就可以了。要瞬间完成,可不要写入1GB的0,那多浪费啊。
2014-6-30 18:39
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
19
参数FileInformationClass 可取值 FileValidDataLengthInformation

File system filter drivers can find it useful to set a valid data length in the following scenarios:

When creating large files where performance is an issue. This avoids the time it takes to fill the file with zeros when the file is created or extended.
可以设置文件有效数据的长度。一般在一下情况下使用。当创建一个大文件而又要求效率的时候,这个功能可以避免对文件进行0数据的填充。

估计是这样使用,先设置FileEndOfFileInformation=1GB,再设置FileValidDataLengthInformation=512,是不是就可以避免对512-1GB的区域进行0的填充了?或者是先后顺序倒过来?
2014-6-30 19:03
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
大哥。。 逆向并不是叫你逆代码 。 你把exe 拖进去, 看一下导入 函数表, 有哪些API长的比较像不就猜出来了么。
2014-6-30 19:43
0
雪    币: 16451
活跃值: (1715)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
那个迅雷下载什么的 不就瞬间诞生一个几G的文件么,又长知识和开眼了。
2014-6-30 21:27
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
22
ZwCreateFile有个参数叫AllocationSize
2014-6-30 23:56
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
23
谢谢,这个应该是对的。
2014-7-1 07:41
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
24
CreateFile

SetEndOfFile

DeviceIoCtl(,FSCTL_SET_SPARSE,...)

CloseHandle
2014-7-1 09:10
0
雪    币: 228
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
或者  CreateFileMapping
2014-7-1 09:16
0
游客
登录 | 注册 方可回帖
返回
//