gpt4 book ai didi

c++ - 如何在没有任何内存泄漏的情况下创建和编辑全局 PCHAR

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

这似乎是一个基本问题,但我在任何地方都找不到解决方案。

我必须从内核模式获取信息。因此我与 IOCTL 一起工作。我的用户模式应用程序使用 DeviceIoControl 和 METHOD_OUT_DIRECT 发送此 IOCTL,因为我需要传输大量数据。这会向我的驱动程序发送一个字符指针。

驱动程序获取 IOCTL 并可以在中断请求中对其进行响应。

代码如下所示:

case IOCTL_FILTERIO_REQUEST_DATA:
{
PVOID pInputBuffer;
PVOID pOutputBuffer;
ULONG outputBufferLength;

PCHAR pReturnData = g_pDataPack;
ULONG dwDataSize = 8000;
ULONG dwDataRead = 0, dwDataWritten = 0;

status = STATUS_UNSUCCESSFUL;
pInputBuffer = Irp - > AssociatedIrp.SystemBuffer;
pOutputBuffer = NULL;

if (Irp - > MdlAddress) {
pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp - > MdlAddress, NormalPagePriority);
}

if (pOutputBuffer) {
RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize);
status = STATUS_SUCCESS; * g_pDataPack = 0;
db_counter = 0;
}
}
break;

但是我需要从内核模式的另一部分复制信息。

我尝试创建一个全局 PCHAR,如下所示:

头文件(声明):extern PCHAR g_pDataPack;

源文件(定义):PCHAR g_pDataPack = "IOCTL DEFINITION";

编辑(其他源文件):*g_pDataPack++ = 'some stuff';

我的问题是,在中断将全局 PCHAR 复制到本地 PCHAR 并将其发送回我的用户模式应用程序之前,我必须多次编辑和放大全局 PCHAR。我尝试每 5000 个版本重置一次全局指针,但这并没有真正起作用。

if (db_counter > 5000)
{
*g_pDataPack = 0;
db_counter = 0;
}

程序在经过一段特殊时间后崩溃。我猜是因为全局指针分配了很多空间?

我尝试创建一个 CHAR 数组,但根本不起作用。

是否有另一种更好或更简单的方法来分配特殊大小的内存,然后编辑这个内存,并在需要时将其复制到本地 PCHAR pReturnData,或者我是否必须学习如何在该项目中使用 DMA?

最佳答案

以这种方式声明它,使其成为模块的全局变量:

模块.c:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

CHAR dataPack[GLOBALBUFFERMAX] = "";
PCHAR g_pDataPack = dataPack;

...以及以下方式使其对程序具有全局性(#include module.h 到每个能够访问 pglobal_buffer 的模块):

模块.h:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

extern PCHAR g_pDataPack;

模块.c

#include <windows.h>

#include "module.h"

CHAR dataPack[GLOBALBUFFERMAX] = "";
PCHAR g_pDataPack = dataPack;

关于c++ - 如何在没有任何内存泄漏的情况下创建和编辑全局 PCHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20048124/

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