gpt4 book ai didi

c - Windows native 程序 ZwReadFile 返回错误参数

转载 作者:行者123 更新时间:2023-11-30 17:06:43 27 4
gpt4 key购买 nike

我正在尝试创建一个 native 应用程序(使用 Zw* API/Subsystem:native),但我找不到读取文件的方法。

这是基本的,但是当我调用 ZWReadFile 时,返回值为 0xC000000D(错误参数)。我已经尝试了很多东西,但我没有更多的想法:/

这是我的代码:

#define _X86_
#include <wdm.h>
#include <stdio.h>

NTSTATUS ZwTerminateProcess(_In_opt_ HANDLE ProcessHandle,_In_ NTSTATUS ExitStatus);
NTSTATUS NTAPI ZwDelayExecution(IN BOOLEAN Alertable, IN PLARGE_INTEGER Interval);
NTSTATUS NTAPI ZwDisplayString(IN PUNICODE_STRING String);
//NTSTATUS ZwRtlStringCbPrintf( _Out_ LPTSTR pszDest, _In_ size_t cbDest, _In_ LPCTSTR pszFormat, ... );



void NtProcessStartup()
{
UNICODE_STRING us;
UNICODE_STRING drivePath;
LARGE_INTEGER liSize;
LARGE_INTEGER delay;
OBJECT_ATTRIBUTES driveAttribute;
IO_STATUS_BLOCK status;

unsigned int milliseconds = 10000;

DbgPrint("NATIVE APP STARTED");

delay.QuadPart = (milliseconds > 1) ? -10000LL * (milliseconds - 1) : -1LL;

RtlZeroMemory(&driveAttribute, sizeof(OBJECT_ATTRIBUTES));
RtlInitUnicodeString(&drivePath, L"\\DosDevices\\C:\\test.txt");
InitializeObjectAttributes(&driveAttribute, &drivePath, OBJ_INHERIT | OBJ_CASE_INSENSITIVE, (HANDLE) NULL, NULL);
ZwDisplayString(driveAttribute.ObjectName);

HANDLE drive;
RtlZeroMemory(&liSize, sizeof(LARGE_INTEGER));
liSize.LowPart = 1024;
NTSTATUS open = ZwCreateFile(&drive, FILE_READ_DATA | FILE_WRITE_DATA | SYNCHRONIZE, &driveAttribute, &status, &liSize, FILE_ATTRIBUTE_NORMAL | FILE_SYNCHRONOUS_IO_NONALERT, FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE, NULL, 0);
if ( open == STATUS_SUCCESS) {
RtlInitUnicodeString(&us, L"Device Open \n");
DbgPrint("Device Open");
ZwDisplayString(&us);

char buff[440];

LARGE_INTEGER byteOffset;
byteOffset.HighPart = -1;
byteOffset.LowPart = FILE_USE_FILE_POINTER_POSITION;
NTSTATUS ret = ZwReadFile(drive, NULL, NULL, NULL, &status, (PVOID)buff, 440, &byteOffset, NULL);
ZwClose(drive);

DbgPrint("Return %02X \t %d \n", ret, ret);

if (ret == STATUS_SUCCESS) {
RtlInitUnicodeString(&us, L"READ OK \n");
ZwDisplayString(&us);
}
else {
RtlInitUnicodeString(&us, L"READ fail \n");
ZwDisplayString(&us);
}

}
else {
RtlInitUnicodeString(&us, L"!Open Device \n");
ZwDisplayString(&us);
DbgPrint("ZwCreateFile status = 0x%x\n", open);
}

ZwDelayExecution(FALSE, &delay);
ZwTerminateProcess((HANDLE)-1, 0);

}

需要设置的参数不多,但我不明白错误在哪里。

谢谢。

最佳答案

由于您使用的是 FILE_USE_FILE_POINTER_POSITION,因此必须在 ZwCreateFile 的 CreateOptions 参数中指定 FILE_SYNCHRONOUS_IO_ALERTFILE_SYNCHRONOUS_IO_NONALERT。您在 FileAttributes 参数中错误地传递了此标志,该标志无效。 (它恰好与 FILE_ATTRIBUTE_ARCHIVE 具有相同的值,因此这就是它的解释方式。)

尝试

NTSTATUS open = ZwCreateFile(&drive, FILE_READ_DATA | FILE_WRITE_DATA | SYNCHRONIZE, 
&driveAttribute, &status, &liSize, FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ | FILE_SHARE_WRITE, FILE_OPEN_IF,
FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);

关于c - Windows native 程序 ZwReadFile 返回错误参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34485922/

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