重复句柄读取文件

Duplicate Handle to Read file

本文关键字:文件 读取 句柄      更新时间:2023-10-16

我有一个由进程a(第三方应用程序)独占打开的文件。我显然无法在我的应用程序中打开文件,所以我想到使用DuplicateHandle API复制句柄。

然而,我意识到文件句柄位置的变化也会反映在进程A中,这可能会导致不希望的行为。是否有一种方法可以复制文件句柄用于读取,而不影响进程a中的文件句柄(位置)?

不行。指向文件的HANDLE实际上是指向FILE_OBJECT的间接指针,如果文件以同步模式打开(FileObject->Flags & FO_SYNCHRONOUS_IO),则使用FILE_OBJECT.CurrentByteOffset作为文件指针偏移量。当您复制句柄时,您共享相同的FILE_OBJECT。为了有一个独立的文件指针,你需要打开另一个独立的FILE_OBJECT/HANDLE文件。

我终于想通了:

  1. 首先,你需要使用NtQuerySystemInformation和DuplicateHandle API创建一个Duplicate文件句柄。

  2. 使用重复句柄现在CreateFileMapping句柄和MapViewOfFile之后。MapViewOfFile将文件的某些部分映射到进程地址空间,可以用来读取文件,而不会干扰原始文件句柄的当前文件偏移量