gpt4 book ai didi

c - NtWriteFile - ERROR_INVALID_PARAMETER(错误 87)

转载 作者:太空宇宙 更新时间:2023-11-04 08:01:42 27 4
gpt4 key购买 nike

我为 NtWriteFile 做了一个简单的包装,但我遇到了来自 NtWriteFile 的错误。这是我的代码:

BOOL WINAPI WriteFile(HANDLE hFile, PVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten) {
IO_STATUS_BLOCK IOBlock;
NTSTATUS Status = NtWriteFile(hFile, NULL, 0, NULL, &IOBlock, lpBuffer, nNumberOfBytesToWrite, 0, NULL);

DWORD A = RtlNtStatusToDosError(Status); // just to get the error code

if (Status == STATUS_PENDING) {
Status = NtWaitForSingleObject(hFile, FALSE, NULL);
if (NT_SUCCESS(Status)) Status = IOBlock.Status;
}
if (NT_SUCCESS(Status)) {
*lpNumberOfBytesWritten = IOBlock.uInformation;
return TRUE;
}
return FALSE;
}

A在下行设置断点后的值为87,指向ERROR_INVALID_PARAMETR,问题是哪个参数无效?我做错了什么?

最佳答案

因为您在代码中准备了 STATUS_PENDING 并在 NtWriteFile 之后等待,在这种情况下 - 我假设您使用文件 (hFile) 打开或为异步 I/O 创建。否则在 NtWriteFile 之后调用 NtWaitForSingleObject 是没有意义的。所以我假设您在调用 NtOpenFileNtCreateFile 时没有使用 FILE_SYNCHRONOUS_IO_ALERTFILE_SYNCHRONOUS_IO_NONALERT (或者您使用 FILE_FLAG_OVERLAPPEDCreateFile 调用中)

在异步 I/O 的情况下,ByteOffset(倒数第二个)参数是必需的。来自 Windows 源代码:

ByteOffset - Specifies the starting byte offset within the file to begin the write operation. If not specified and the file is open for synchronous I/O, then the current file position is used. If the file is not opened for synchronous I/O and the parameter is not specified, then it is in error.

还有一段代码,你在内核中失败的地方:

} else if (!ARGUMENT_PRESENT( ByteOffset ) && !(fileObject->Flags & (FO_NAMED_PIPE | FO_MAILSLOT))) {

//
// The file is not open for synchronous I/O operations, but the
// caller did not specify a ByteOffset parameter. This is an error
// situation, so cleanup and return with the appropriate status.
//

if (eventObject) {
ObDereferenceObject( eventObject );
}
ObDereferenceObject( fileObject );
return STATUS_INVALID_PARAMETER;

}

所以如果我们为异步 I/O 打开或创建,我们需要或总是直接使用 ByteOffset。或者如果我们使用同步文件句柄 - NtWriteFile 从不 返回 STATUS_PENDING 并且操作总是同步完成 - 这是设计使然。所以在这种情况下没有任何意义检查 STATUS_PENDING。您可以放弃此检查和 NtWaitForSingleObject(也可以等待 hFile,但如果同时对文件执行多个操作则不太正确)


来自MSDN

If the call to ZwCreateFile set either of the CreateOptions flags, FILE_SYNCHRONOUS_IO_ALERT or FILE_SYNCHRONOUS_IO_NONALERT, the I/O Manager maintains the current file position. If so, the caller of ZwWriteFile can specify that the current file position offset be used instead of an explicit ByteOffset value. This specification can be made by using one of the following methods:

  • Specify a pointer to a LARGE_INTEGER value with the HighPart member set to -1 and the LowPart member set to the system-defined value
    FILE_USE_FILE_POINTER_POSITION.
  • Pass a NULL pointer for ByteOffset.

尽管没有明确说明其他情况(没有FILE_SYNCHRONOUS_IO_ALERTFILE_SYNCHRONOUS_IO_NONALERT 标志)- 可以理解在这种情况下 I/O 管理器不是 维护当前文件位置,我们不能指定使用当前文件位置偏移量 - 只有明确的 ByteOffset 值必须是

关于c - NtWriteFile - ERROR_INVALID_PARAMETER(错误 87),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169999/

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