gpt4 book ai didi

c++ - 如何使用文件句柄写入特定偏移量

转载 作者:行者123 更新时间:2023-11-28 01:23:24 25 4
gpt4 key购买 nike

我正在将一个 DLL 注入(inject)一个进程,检索一个文件句柄。

然后我尝试使用 WriteFile 来写Winapi函数。这很好用,但是如果我想写入特定的偏移量(添加偏移量 arg,而不是 NULL),

_OVERLAPPED offset;
offset.Offset = 0xFFFFFFFF;
offset.OffsetHigh = 0xFFFFFFFF;
if (!WriteFile(hFile, &buffer, 9, &written,&offset)) {
Debug(GetLastErrorStdStr());
}

然后我得到:

ERROR_ALREADY_EXISTS 183 Cannot create a file when that file already exists.

这让我觉得我做不到,因为 HANDLE 是在没有 FILE_FLAG_OVERLAPPED 的情况下创建的。这可能来自其他东西吗?

如果这确实是错误的原因,是否有 hacky 解决方法?

最佳答案

用于通过 WriteFile 写入特定偏移量我们需要在 OVERLAPPED 中设置这个偏移量:

This offset is specified by setting the Offset and OffsetHigh members of the OVERLAPPED structure.

这是一个很常见的错误假设我们可以使用OVERLAPPED仅使用异步文件句柄(如果 hFile 使用 FILE_FLAG_OVERLAPPED 打开)。但事实并非如此。我们可以始终使用指向OVERLAPPED的指针在 WriteFile作为参数。仅在下一个不同 - 如果异步文件处理,这是强制参数,否则可选

OVERLAPPED structure is required if the hFile parameter was opened with FILE_FLAG_OVERLAPPED, otherwise this parameter can be NULL.

可以但不是必须。

设置文件位置的另一种方法 - 使用 SetFilePointer[Ex] - 已过时,效率不高并且指针会引发条件 - 所有这个 api 的作用 - 在里面设置 CurrentByteOffset FILE_OBJECT结构。然后在 WriteFile 中,如果我们没有通过 OVERLAPPED 提供显式偏移 - 使用隐式偏移 FILE_OBJECT.CurrentByteOffset。这样做(对内核的几次额外调用实际上并不需要) - 非常低效比较 OVERLAPPED 上的显式文件偏移量(以及当其他人并发使用文件时 - 此偏移量可以在 SetFilePointer 之间更改[Ex]WriteFileReadFile 调用)还有The old DOS SetFilePointer API is an anachronism. One should specify the file offset in the overlapped structure even for synchronous I/O.

但是当我们使用 OVERLAPPED结构 - 我们必须将其 hEvent 成员初始化为 0 或使用 SYNCHRONIZE|EVENT_MODIFY_STATE 访问权限的有效事件句柄(并且此事件必须 unique per I/O request - not used in concurrent in another I/O request, until this not finished).

因此,当您未在 _OVERLAPPED 偏移量内初始化 hEvent 时,您当前的代码; 实际上是 UB。有时它可以正常工作,如果 hEvent 是随机的 0。否则你会得到下一个状态错误:STATUS_INVALID_HANDLE(hEvent 中的随机值根本不是有效句柄),STATUS_OBJECT_TYPE_MISMATCH(句柄有效但不是事件),STATUS_ACCESS_DENIED(句柄没有EVENT_MODIFY_STATE)

但我确定 WriteFile 不会返回给您错误 ERROR_ALREADY_EXISTS。只有 STATUS_OBJECT_NAME_COLLISION 被转换为这个错误,我没有看到任何地方,NtWriteFile 如何返回这种状态。我绝对确定您没有遇到此错误,而是另一个错误。并且总是很好地调用 RtlGetLastNtStatus(); 代替(或与)GetLastError() 在这种情况下更好地诊断

关于c++ - 如何使用文件句柄写入特定偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55107281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com