none
文件改名 RRS feed

  • 问题

  • windows 的 pe加载器 加载一个exe文件后(就是双击打开exe程序), 我还可以继续对这个.exe文件做重命名的操作.请问这是什么原因.

    另外,是不是每个win系统(如vista,win7...)都是如此,MS这种机制有什么用?

    还有,我也想在vc里用createfile API模拟这个方式打开一个文件,然后还可以用其它程序(如:explorer等)也能做重命名操作,我应该如何写这段代码?

    还有,我如何才能做到我写的.exe程序打开时,不能被其它程序重命名?

    欢迎专家指点.

     

     

    2010年5月6日 8:20

答案

  • 可以继续修改文件名的原因大概是这样的。 应该是你那个PE 加载器一次性的把exe文件读入内存,然后就关闭了文件操作的句柄。 此时这个exe 没有被载入内存运行,也没有被某个程序读取, 因此是可以修改名称的。

     

    这其实就很像迅雷, 迅雷之所以可以做到一边下载一边播放,是因为迅雷对下载文件采用随写入随打开的方式,而不是在本地创建一个临时文件一直写入,直到下载完成再释放这个文件的模式。 迅雷下载,在网速快时,一秒钟要打开、关闭文件数百次,这也是迅雷比较毁硬盘的地方。

    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 2:04
    版主
  • 可以继续修改文件名的原因大概是这样的。 应该是你那个PE 加载器一次性的把exe文件读入内存,然后就关闭了文件操作的句柄。 此时这个exe 没有被载入内存运行,也没有被某个程序读取, 因此是可以修改名称的。

     

    这其实就很像迅雷, 迅雷之所以可以做到一边下载一边播放,是因为迅雷对下载文件采用随写入随打开的方式,而不是在本地创建一个临时文件一直写入,直到下载完成再释放这个文件的模式。 迅雷下载,在网速快时,一秒钟要打开、关闭文件数百次,这也是迅雷比较毁硬盘的地方。

    迅雷很邪恶~~~
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 2:50
  • 文件名和文件是分开存储的,文件名保存在磁盘的目录索引中,而其中有一个指针指向磁盘上真正的文件,所以打开的时候你可以改变其名字,甚至移动文件的位置,改变文件时间和属性.不同的系统对加锁方式也不同


    0xBAADF00D
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 16:18
    版主
  • 问题是,并非所有可执行文件在执行过程中都可以重命名。
     
    "Jack.arain" 写入消息 news:31b67c9a-bbdd-4f94-9139-853466e248d0...
    > 非常感谢版主达达的回答!
     
    > 不过我觉得还是不太对,您可以尝试在你的windows系统上打开一个执行程序,然后对这个执行程序重命名,这时会成功,但你试图删除它或用其它工���修改它的时候,是不会成功的.
     
    > 这一点,说明和您所说的"一次性读入文件到内存,然后又关闭了文件句柄"不相符,如果关闭了这个文件句柄,那么是可以对这个文件进行删除或都修改文件内容的,所以我确定并没有关闭文件句柄.
     
     
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月11日 10:09
  • 你可以参考linux的源代码和泄露的Win2k代码就可以很清楚为什么fopen和CreateFile不同了。在Windows下fopen确实比CreateFile多加了锁,fopen调用了ntdll.dll里面关于文件的API NtCreateFile(目前还是不是这个就不知道了)。但是在调用API不加锁的情况下可以改变文件名和位置基本原理就是磁盘索引的修改
    0xBAADF00D
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月11日 16:28
    版主

全部回复

  • 可以继续修改文件名的原因大概是这样的。 应该是你那个PE 加载器一次性的把exe文件读入内存,然后就关闭了文件操作的句柄。 此时这个exe 没有被载入内存运行,也没有被某个程序读取, 因此是可以修改名称的。

     

    这其实就很像迅雷, 迅雷之所以可以做到一边下载一边播放,是因为迅雷对下载文件采用随写入随打开的方式,而不是在本地创建一个临时文件一直写入,直到下载完成再释放这个文件的模式。 迅雷下载,在网速快时,一秒钟要打开、关闭文件数百次,这也是迅雷比较毁硬盘的地方。

    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 2:04
    版主
  • 可以继续修改文件名的原因大概是这样的。 应该是你那个PE 加载器一次性的把exe文件读入内存,然后就关闭了文件操作的句柄。 此时这个exe 没有被载入内存运行,也没有被某个程序读取, 因此是可以修改名称的。

     

    这其实就很像迅雷, 迅雷之所以可以做到一边下载一边播放,是因为迅雷对下载文件采用随写入随打开的方式,而不是在本地创建一个临时文件一直写入,直到下载完成再释放这个文件的模式。 迅雷下载,在网速快时,一秒钟要打开、关闭文件数百次,这也是迅雷比较毁硬盘的地方。

    迅雷很邪恶~~~
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 2:50
  • 非常感谢版主达达的回答!

    不过我觉得还是不太对,您可以尝试在你的windows系统上打开一个执行程序,然后对这个执行程序重命名,这时会成功,但你试图删除它或用其它工具修改它的时候,是不会成功的.

    这一点,说明和您所说的"一次性读入文件到内存,然后又关闭了文件句柄"不相符,如果关闭了这个文件句柄,那么是可以对这个文件进行删除或都修改文件内容的,所以我确定并没有关闭文件句柄.

     

    2010年5月7日 6:47
  • 文件名和文件是分开存储的,文件名保存在磁盘的目录索引中,而其中有一个指针指向磁盘上真正的文件,所以打开的时候你可以改变其名字,甚至移动文件的位置,改变文件时间和属性.不同的系统对加锁方式也不同


    0xBAADF00D
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月7日 16:18
    版主
  • 但问题是我用fopen打开这个文件时,就无法重命名了,这足以说明跟磁盘的目录索引是没有关系的.这肯定是系统的某种机制,我就想了解这种机制的具体情况.
    2010年5月11日 10:04
  • 当你fopen打开了这个文件的时候,该文件就已经被锁定(包括文件名),只要不关闭该文件,文件便一直被锁定。
     
    "Jack.arain" 写入消息 news:aff0653c-21be-4610-9dff-3e277d53959c...
     
     
    2010年5月11日 10:08
  • 问题是,并非所有可执行文件在执行过程中都可以重命名。
     
    "Jack.arain" 写入消息 news:31b67c9a-bbdd-4f94-9139-853466e248d0...
    > 非常感谢版主达达的回答!
     
    > 不过我觉得还是不太对,您可以尝试在你的windows系统上打开一个执行程序,然后对这个执行程序重命名,这时会成功,但你试图删除它或用其它工���修改它的时候,是不会成功的.
     
    > 这一点,说明和您所说的"一次性读入文件到内存,然后又关闭了文件句柄"不相符,如果关闭了这个文件句柄,那么是可以对这个文件进行删除或都修改文件内容的,所以我确定并没有关闭文件句柄.
     
     
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月11日 10:09
  • 对啊,您说的我知道,关键是我想知道这其中的原因,他是怎么做到的?怎么做到锁定,又怎么做到不锁定?

    还有,可执行程序在什么情况下是锁定的,什么情况下不锁定,这是我想知道的.

    2010年5月11日 10:15
  • 你可以参考linux的源代码和泄露的Win2k代码就可以很清楚为什么fopen和CreateFile不同了。在Windows下fopen确实比CreateFile多加了锁,fopen调用了ntdll.dll里面关于文件的API NtCreateFile(目前还是不是这个就不知道了)。但是在调用API不加锁的情况下可以改变文件名和位置基本原理就是磁盘索引的修改
    0xBAADF00D
    • 已标记为答案 Jack.arain 2010年5月12日 1:28
    2010年5月11日 16:28
    版主