Мини-фильтр получает постоянное значение от приложения пользовательского режима
Эй,
У меня возникла проблема, когда я отправляю сообщение в пользовательский режим из режима ядра с помощью FltSendMessage, которое ожидает ответа.Передаваемая структура содержит значение and int, равное либо 0, либо 1. Пользовательский режим отвечает, устанавливая этот флаг и вызывая FilterReplyMessage. Однако, когда сообщение принимается ядром, его значение всегда равно 56. Независимо от того, какое число я установил флаг в пользовательском режиме. Ядро всегда получает значение 56. Я не совсем понимаю, в чем моя ошибка. Я попытался изменить тип данных passFlag с int на другие типы (USHORT и т. д.), которые, как я знал, вероятно, не будут иметь значения, но попробовать стоило.
Поскольку сообщение ядра отвечает успешно (проверка пользовательского режима HRESULT не возвращает ошибок и нет таймаута, поэтому, если ответ не будет получен, система зависнет, чего она не делает), я знаю, что ошибка должна быть связана с буферами, передаваемыми между пользовательским режимом и режимом ядра. Кажется, я не могу найти причину, по которой passFlag не интерпретируется правильно в режиме ядра.
Спасибо всем, кто найдет время рассмотреть мой вопрос.
Ваше здоровье!
Общая Структура:
typedef struct _REPLY_MESSAGE_STRUCT { // Message header. FILTER_REPLY_HEADER header; // Flag to be set // by user mode. int passFlag; }REPLY_MESSAGE_STRUCT, *PREPLY_MESSAGE_STRUCT;
код ядра:
DbgPrint("Sending Message...\n"); replyBuffer.passFlag = 0; ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer)); REPLY_MESSAGE_STRUCT replyBuffer; // Note: Try-catch statement has been omitted in this question to save time. // In the actual code there is a try-catch statement surrounding FltSendMessage. status = FltSendMessage(imageFilterData.filterHandle, &imageFilterData.clientPort, (PVOID)&sendingBuffer.messageBuffer, sizeof(sendingBuffer.messageBuffer), (PVOID)&replyBuffer, &replySize, 0 ); // Always returns 56 // When a reply has been received. DbgPrint("Message received: %i\n", replyBuffer.passFlag);
код пользователя:
// User-mode buffer is the same size as kernel-mode buffer. ULONG replySize = ((ULONG)sizeof(replyBuffer.header)) + ((ULONG)sizeof(replyBuffer)); replyMessage.header.MessageId = messageFromKernel.header.MessageId; REPLY_MESSAGE_STRUCT replyMessage; // User-mode setting flag. replyMessage.passFlag = 1; // Flag is changed to 1 successfully. printf("Test: %i\n", replyMessage.passFlag); // Reply is sent successfully, but flag value on kernel end is always 56 hResult = FilterReplyMessage(port, &replyMessage.header, replySize); _com_error err2(hResult); errorMessage = err2.ErrorMessage(); // No errors. printf("Result: %s\n", errorMessage);
Что я уже пробовал:
Изменение типа данных passFlag.
Проходя через каждый шаг до и после сообщения FltSendMessage и FilterReply, чтобы узнать, изменяется ли значение перед отправкой обратно в ядро.