2016-11-14 117 views
0

我有一个由进程A(第三方应用程序)专门打开的文件。我显然无法打开我的应用程序中的文件,所以我想使用DuplicateHandle API复制句柄。重复句柄读取文件

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

+1

你试图绕过的根本问题是非独占地打开一个专门打开的文件。通常有文件被完全打开的原因。 – MSalters

+0

*“我显然无法在我的应用程序中打开该文件”* - 我不明白,这很明显。只要他们对兼容的访问和共享模式达成一致,您可以随意打开多个文件句柄。你甚至从来没有解释过,什么访问和共享模式的过程A使用,你从来没有解释,你需要哪些。 – IInspectable

+0

@不可预见的OP明确指出,进程A已将文件打开以进行独占访问。这意味着不使用共享模式,因此无论请求的访问权限如何,都无法打开文件。 –

回答

1

我终于想通了:

  1. 首先,你需要创建使用NtQuerySystemInformationDuplicateHandle API重复文件句柄。

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

希望这可以帮助别人。

2

没办法。对文件而言,HANDLE实际上是间接指向FILE_OBJECT的指针,并且如果该文件在同步模式下打开(FileObject->Flags & FO_SYNCHRONOUS_IO),则将FILE_OBJECT.CurrentByteOffset用作文件指针偏移量。当您复制句柄时,您可以使用相同的FILE_OBJECT。为了具有独立的文件指针,您需要打开另一个独立的文件FILE_OBJECT/HANDLE