【问题标题】:How to create and edit a global PCHAR without any memory leak如何在没有任何内存泄漏的情况下创建和编辑全局 PCHAR
【发布时间】:2013-11-18 12:43:44
【问题描述】:

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

我必须从内核模式中获取信息。因此,我与 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++ c visual-studio-2010 kernel pchar


    【解决方案1】:

    以这种方式声明它以使其对模块具有全局性:

    module.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;
    

    【讨论】:

      猜你喜欢
      • 2013-01-23
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2011-04-16
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多