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 размер передаваемого буфера, все заработало как положено.