yansm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2267回复:7

文件读写,奇怪的现象!!

楼主#
更多 发布于:2002-10-15 15:54
我的程序:
FILE *fp = fopen(\"test.txt\", \"r\");
fclose(fp);
编译后,可执行文件名为testalign.exe,用filemon输出如下
我想问,为什么我只是打开关闭,为什么实际上会发生这么多反复的create,cleanup,close啊?


296 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS
297 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS
298 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 147456 Length: 4096
299 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS
300 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe.Local FILE NOT FOUND Attributes: Any Options: Open
301 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 4096 Length: 32768
302 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 139264 Length: 8192
303 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 36864 Length: 32768
304 15:32:22 testalign.exe:1536 IRP_MJ_READ* H:\\my prog\\虚拟仪器\\testalign\\Debug\\testalign.exe SUCCESS Offset: 131072 Length: 8192
305 15:32:22 testalign.exe:1536 FSCTL_IS_VOLUME_MOUNTED H:\\my prog\\虚拟仪器\\testalign SUCCESS
306 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open
307 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open
308 15:32:22 testalign.exe:1536 IRP_MJ_QUERY_INFORMATION H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS FileInternalInformation
309 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS
310 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS
311 15:32:22 testalign.exe:1536 IRP_MJ_CREATE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Attributes: N Options: Open
312 15:32:22 testalign.exe:1536 FASTIO_QUERY_STANDARD_INFO H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS Size: 1226
313 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS
314 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS
315 15:32:22 testalign.exe:1536 IRP_MJ_CLEANUP H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS
316 15:32:22 testalign.exe:1536 IRP_MJ_CLOSE H:\\my prog\\虚拟仪器\\testalign\\test.txt SUCCESS

最新喜欢:

AxiAxi
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-16 09:55
这其实不难理解,计算机打开一个文件的流程如下:
1.定位文件,打开文件所在的驱动器。如H:\\,这将导致FSCTL_IS_VOLUME_MOUNTED 的调用。
2.定位到文件所在的完整路径,如H:\\my prog\\虚拟仪器\\testalign\\Debug\\,这里为什么是IRP_MJ_READ我认为是读入内容。
3.文件定位好以后,下面就是打开文件。在打开文件的第一步就是CreateFile,CreateFile的行为和其所带的参数有关,如文件不存在则创建,存在则覆盖或不覆盖等。这将导致IRP_MJ_CREATE的调用。
4.CreateFile将获得一个文件句柄,即HANDLE,根据这个HANDLE可以获取一些文件的信息,如文件的大小,以便系统知道需要分配多少内存来存放这个文件的内容,这可能导致IRP_MJ_QUERY_INFORMATION的调用。
5.文件的大小等信息被获取后,系统分配足够大的内存来存放文件内容。如果分配失败,则很显然IRP_MJ_CLEANUP和IRP_MJ_CLOSE会被调用,失败返回。如果成功,则IRP_MJ_READ会被调用一次或多次来读取文件的内容到内存。
6.如果文件是可执行文件,则可执行文件本身又可能引用到了其它的资源,可能是EXE,也可能是DLL,所以中间又有可能有一些IRP_MJ_CREATE、IRP_MJ_READ的调用。
。。。。。。。
我想,我说的足够多了。希望对你有帮助!
Tom_lyd
yansm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-16 14:38
多谢,基本清楚啦

301,302,303,304读文件的偏移好像没什么规律?操作系统会这么做吗?
313,314和315,316为什么是重复的呢?
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-16 15:22
多谢,基本清楚啦

301,302,303,304读文件的偏移好像没什么规律?操作系统会这么做吗?
313,314和315,316为什么是重复的呢?
 


301,302,303,304读文件为什么大小不一致我想研究的必要性不大,你不必关心这个东西。
而对于IRP_MJ_CLEANUP和IRP_MJ_CLOSE为什么重复的其实我上面已经解释出来了。狭隘地理解可以是有多个IRP_MJ_CREATE发生过。本质上可能是因为OS在打开这个程序的过程中还打开了其它必须的附加资源,也可能是被打开的程序(.exe)得到执行权后装载了其它的资源或DLL,那么在程序退出后或者装载失败时当然需要关闭,例如最普通的CloseHandle, Free等操作都会激发IRP_MJ_CLEANUP的调用。
Tom_lyd
yansm
驱动牛犊
驱动牛犊
  • 注册日期2002-02-21
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-10-16 15:34
呵呵,不管怎么样
还是放分吧
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-10-16 18:47
谢谢给分。
Tom_lyd
yymrhxf
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2011-10-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-10-17 16:34
我想对于test.txt文件引用到的其它文件而言,其对应的create,cleanup,close应该是它们自己的文件名,而不会再是test.txt了,这一点又如何解释呢?
yymrhxf
驱动牛犊
驱动牛犊
  • 注册日期2002-08-07
  • 最后登录2011-10-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-10-17 16:45
sorry,请把上面的test.txt替换成可执行文件。

如果在explorer里面看看很乱的IRP列表,我觉得可以理解,因为我们无法肯定explorer究竟发了些什么东西。但是这种api调用引起的过程(类似于test.txt文件的打开和关闭),我觉得应该是非常清楚和确定的。
游客

返回顶部