Как создать и редактировать глобальный PCHAR без утечки памяти

0

Это может показаться основным вопросом, но я не могу найти решение нигде.

Я должен получить информацию из режима ядра. Поэтому я работаю с IOCTL. Мои приложения User-Mode отправляют этот IOCTL с помощью DeviceIoControl с METHOD_OUT_DIRECT, потому что мне нужно передавать большие объемы данных. Это отправляет char-Pointer моему драйверу.

Драйвер получает 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";

Редактирование (Other Source-File): *g_pDataPack++ = 'some stuff';

Моя проблема заключается в том, что я должен многократно редактировать и увеличивать глобальный PCHAR до того, как прерывание скопирует его на локальный PCHAR и отправит его обратно в мое приложение USER-Mode. Я попытался сбросить глобальный указатель каждые 5000 выпусков, но это не помогло.

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

Программа вылетает через определенное время. Думаю, потому что глобальный указатель выделяет много места?

Я попытался создать массив CHAR, но это не сработало.

Есть ли другой лучший или простой способ выделить специальный размер памяти, а затем отредактировать его и скопировать в локальный файл PCHAR pReturnData, когда он мне понадобится, или мне нужно научиться работать с DMA для этого проекта?

Теги:
visual-studio-2010
kernel

1 ответ

0
Лучший ответ

Объявите его таким образом, чтобы он был глобальным для модуля:

module.c:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

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

... и следующий способ сделать его глобальным для программы (#include module.h для каждого модуля, который должен иметь доступ к pglobal_buffer):

module.h:

#include <windows.h>

#define GLOBALBUFFERMAX (1024)

extern PCHAR g_pDataPack;

module.c

#include <windows.h>

#include "module.h"

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню