gpt4 book ai didi

c - 内核驱动程序接收到结构体,但它仍然为空

转载 作者:行者123 更新时间:2023-11-30 16:37:24 27 4
gpt4 key购买 nike

我有一个内核驱动程序,我正在尝试让 ReadFile 工作。这是我的司机调度功能:

NTSTATUS DriverDispatch(PDEVICE_OBJECT DriverObject, PIRP irp)
{
UNREFERENCED_PARAMETER(DriverObject);
PIO_STACK_LOCATION io;
PGAME_INFO info;
NTSTATUS status = STATUS_SUCCESS;

io = IoGetCurrentIrpStackLocation(irp);
irp->IoStatus.Information = 0;

if (io->MajorFunction == IRP_MJ_WRITE)
{
io = IoGetCurrentIrpStackLocation(irp);

CHAR buffer[14] = "Got request\r\n";
ULONG cb = 14;

ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer, cb, NULL, NULL);

if (io)
{
info = (PGAME_INFO)irp->AssociatedIrp.SystemBuffer;
if (info)
{
HANDLE Pid = info->pid;
cb = 20;

ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, Pid, cb, NULL, NULL);

status = STATUS_SUCCESS;
}
else
{
CHAR buffer2[20] = "Struct was null\r\n";
cb = 20;

ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer2, cb, NULL, NULL);
}
}
else
{
CHAR buffer3[31] = "PIO_STACK_LOCATION is null\r\n";
cb = 31;

ZwWriteFile(handle, NULL, NULL, NULL, &ioStatusBlock, buffer3, cb, NULL, NULL);
}

irp->IoStatus.Information = sizeof(GAME_INFO);
}
else
{
status = STATUS_SUCCESS;
}

irp->IoStatus.Status = status;

IoCompleteRequest(irp, IO_NO_INCREMENT);
return status;
}

这是我正在使用的结构:

typedef struct _GAME_INFO {
HANDLE pid;
}GAME_INFO, *PGAME_INFO;

还有我的用户模式应用程序:

int main()
{
GAME_INFO GameInfo;

HANDLE hDevice = CreateFile("\\\\.\\Driver", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

if (hDevice == INVALID_HANDLE_VALUE)
{
printf("\nError: Unable to connect to the driver (%d)\n", GetLastError());
getchar();
return -1;
}

getchar();

GameInfo.pid = (HANDLE)1234;
DWORD written;

if (!WriteFile(hDevice, &GameInfo, sizeof(GAME_INFO), &written, NULL))
{
printf("\nError: Unable to write data to the driver (%d)\n", GetLastError());

CloseHandle(hDevice);
getchar();
return -1;
}
else
{
printf("%lu", written);
getchar();
}

CloseHandle(hDevice);
return 0;
}

驱动程序正在接收请求,但由于某种原因该结构为空。我对内核驱动程序和 C 语言都很陌生,所以请随时纠正我的任何问题

最佳答案

根据一些来回,这似乎是因为驱动程序 IO 设置为直接而不是缓冲。 direct 没有系统缓冲区,因为它实际上没有缓冲,因此该字段预计为 NULL。

接收代码需要通过 MDL 来工作。

参见https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/using-mdls为起点。

关于c - 内核驱动程序接收到结构体,但它仍然为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47952438/

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