- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我为 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
是没有意义的。所以我假设您在调用 NtOpenFile
或 NtCreateFile
时没有使用 FILE_SYNCHRONOUS_IO_ALERT
或 FILE_SYNCHRONOUS_IO_NONALERT
(或者您使用 FILE_FLAG_OVERLAPPED
在 CreateFile
调用中)
在异步 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_ALERT 或FILE_SYNCHRONOUS_IO_NONALERT 标志)- 可以理解在这种情况下 I/O 管理器不是 维护当前文件位置,我们不能指定使用当前文件位置偏移量 - 只有明确的 ByteOffset 值必须是
关于c - NtWriteFile - ERROR_INVALID_PARAMETER(错误 87),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169999/
我正在尝试通过 wifi 连接将数据发送到接收器以进行实验。我设法使用适用于 wifi 的 Windows API Native 将卡连接到接收器。 我将卡的 GUID 存储在 pIfInfo 指针
我正在尝试使用 ReadFile 函数。这是我的代码: #define BUFFERSIZE 5 int main(int argc, char* argv[]) { OVERLAPPED o
我正在尝试执行 SetIpInterfaceEntry功能,但我总是得到 ERROR_INVALID_PARAMETER 结果。我想更改哪个确切参数并不重要,因为即使我不更改任何内容,我也会收到此错误
我使用 visual studio 2008 service pack1(9.0.30729.1)、windows 7 professional 64 位和 8 GB 内存运行我的应用程序 我的应用程
我的目标是从集群中获取文件名。为此,我使用函数 FSCTL_LOOKUP_STREAM_FROM_CLUSTER。使用它时,我收到错误 87,根据 MSDN,它代表 ERROR_INVALID_PAR
我正在尝试获取 betfair API使用 Windows API。 我无法尝试使用以下代码登录(用户名和密码已更改)。 char *headers = "X-Application: MakJhSA
在尝试读取和获取事件日志中的事件数时,出现错误 87。 #include #include #include #define PROVIDER_NAME "System" void wmain(
Windows 嵌入式紧凑型。 Trying to send and receive a message with MsgQueue. 看起来写入工作正常但读取给出了不正确的参数错误。 知道缺少什么吗
CryptHashData ( https://msdn.microsoft.com/en-us/library/windows/desktop/aa380202(v=vs.85).aspx) 一直返
重现我的问题的示例代码: #include #include int main() { using namespace std; HANDLE hdl = CreateFile("test
此代码在 Windows 7 上启动时完全没问题: HANDLE hVol = CreateFile(L"\\\\.\\c:", GENERIC_WRITE | GENERIC_READ,
我为 NtWriteFile 做了一个简单的包装,但我遇到了来自 NtWriteFile 的错误。这是我的代码: BOOL WINAPI WriteFile(HANDLE hFile, PVOID l
DnsQueryConfig的文档在这里: https://docs.microsoft.com/en-us/windows/win32/api/windns/nf-windns-dnsqueryco
我一直在开发一个使用 winapi 获取管理员组成员的应用程序。为此,我使用了 NetLocalGroupGetMembers 方法。我的问题是当我尝试释放缓冲区的堆空间时,我从 NetApiBuff
我的程序创建了一个邮槽,但是当我调用 ReadFile 时,我得到了 ERROR_INVALID_PARAMETER。 参数不对怎么办? 程序代码: SECURITY_DESCRIPTOR sd;
我在调用 AttachThreadInput() 时得到一个 ERROR_INVALID_PARAMETER 错误代码。这是代码块: HWND hwnd = MYFINDWINDOW::FindWin
我正在尝试使用 LsaCallAuthenticationPackage 从缓存中清除特定票证。我总是在包状态中得到 ERROR_INVALID_PARAMETER 87。可能是什么原因?这是我的
我在下面编写了这段代码,它在 code::blocks 下运行良好,使用 mingw gcc 4.7 进行编译。从那以后,我决定开始使用 Visual Studio 2013 Express。现在调用
我正在调用 Windows 事件跟踪 StartTrace功能: StartTrace(sessionHandle, KERNEL_LOGGER_NAME, sessionProperties); 失
我正在尝试使用 EvtQuery 读取 Windows 事件日志和 winapi crate . 我收到系统错误 87 - ERROR_INVALID_PARAMETER fn to_vec(str:
我是一名优秀的程序员,十分优秀!