WDM IOCTL передача строки из Kernel Mode в User Mode

Пытаюсь разобраться с WDM IOCTL, понять как отправлять и получать от драйвера данные. При отправке драйверу строки через вызов DeviceIoControl(…), все работает нормально, она выводится в DebugView

if (controlCode == IOCTL_SENDDATA) 
{
    PCHAR inBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
    DbgPrint("inBuffer: %s\n", inBuffer);
    status = STATUS_SUCCESS;
    byteIO = sizeof(PCHAR);
}

Но если отправить драйверу подготовленный в клиенте буфер, и в драйвере с помощью strcpy(…) или strcpy_s(…), скопировать в него строку.

if (controlCode == IOCTL_RECEIVEDATA)
{
    PCHAR outBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
    strcpy(outBuffer, "outBuffer: Hello, from driver!");
    status = STATUS_SUCCESS;
    byteIO = sizeof(PCHAR);
}

То клиентом она выводится неправильно

C:\_shared>WDM_IoctlClient.exe
outBuffeЁй┴∙⌂

Хочу разобраться что я делаю не правильно и почему так происходит. Код клиента

CHAR inBuffer[256], outBuffer[256];
DWORD bytes;

strcpy_s(inBuffer, 256, "Hello, from client!");

BOOL result = DeviceIoControl(hDevice, IOCTL_SENDDATA, &inBuffer, sizeof(inBuffer), NULL, 0, &bytes, NULL);

if (!result) 
{
    tPrintError(TEXT("Data was not sent"));
}
    
result = DeviceIoControl(hDevice, IOCTL_RECEIVEDATA, NULL, 0, &outBuffer, sizeof(outBuffer), &bytes, NULL);

if (!result) 
{
    tPrintError(TEXT("Data was not received"));
}

printf("%s\n", outBuffer);

На всякий случай проект (5 кб)


Ответы (1 шт):

Автор решения: Алексей Смирнов

Пока писал вопрос разобрался в чем проблема. Задав byteIO размер передаваемого буфера, все заработало как положено.

→ Ссылка