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

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

Я должен получить информацию из режима ядра. Поэтому я работаю с IOCTL.
Мои User-Mode-Applications отправляют этот 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";

Редактирование (Другой исходный файл): *g_pDataPack++ = 'some stuff';

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

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

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

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

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

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;
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]