Наблюдение за записью из приложения по указанному указателю памяти, полученному из DLL

Я постараюсь объяснить мою проблему как можно лучше. Итак, у меня есть приложение, написанное на C / C ++ (язык в клиентском приложении не имеет значения), которое импортирует одну функцию из DLL, например, uint32_t * GetMemoryPointer (). Затем он записывает последовательности в этот указатель памяти следующим образом:

uint32_t* ptr = (uint32_t*)GetMemoryPointer();
*ptr = 3;
*ptr = 4;
*ptr = 1050;

Это делает эту последовательность без какой-либо информации для DLL, что значение было изменено. Можно ли посмотреть это значение в DLL? Я пытался создать поток и в цикле искать изменения, но это не надежно. Есть ли лучшее решение? Я заинтересован в том, чтобы делать это следующим образом: приложение пишет, DLL обнаруживает, что значение было изменено, приложение HOLDS выполняет интерпретацию этого значения, а затем ПОЗВОЛЯЕТ приложению продолжить выполнение. Другим способом без удержания приложения может быть добавление в стек нового значения, но мне нужно знать о каждом изменении. Платформа, в которой я заинтересован — это Windows. Язык не имеет значения, может быть C или C ++. Можно ли этого добиться? Это действительно важно для меня, и у меня нет идей. Я не хочу код, но я хотел бы, чтобы мне сообщили, если это возможно и каким образом мне нужно идти. Заранее спасибо.

-1

Решение

На мой взгляд, если вы можете пометить память как доступную только для чтения, и когда кто-нибудь попытается записать в нее ОС, будет выдано исключение / ошибка, вы должны ее перехватить. Я не знаю, существуют ли какие-либо библиотеки для этого, так что попробуйте поискать в Google.

0

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

Один из вариантов заключается в реализации Value тип, который содержит фактические данные для мониторинга и использовать схема наблюдателя отправлять уведомления при изменении значения. Начнем с простой реализации, которая содержит значение нужного типа (uint32_t в этом случае) вместе с оператором присваивания, который вызывает обратные вызовы каждый раз, когда оператор изменяет значение.

Пример ниже делает именно это и включает в себя оператор преобразования, чтобы позволить достаточное количество операций быть выполненными с другими uint32_t ценности. Вы можете расширить это, чтобы удовлетворить ваши требования, включая предоставление полного набора операторов (operator+, operator/и т. д.), чтобы сделать его немного более надежным.

#include <iostream>
#include <vector>
#include <cstdint>class Value
{
uint32_t    value;
std::vector<void(*)()> observers;

public:

Value() : value(0) {}

//  Allows you to register a observer that gets called when
//  the value changes
void RegisterListener(void (*f)())
{
observers.push_back(f);
}

//  Conversion operator that allows implicit conversions
//  from Value to uint32_t.
operator uint32_t() const
{
return value;
}

Value& operator=(uint32_t newValue)
{
//  Only alert observers if the value is actually changing.
if (value != newValue)
{
value = newValue;
for (std::vector<void(*)()>::const_iterator it = observers.begin();
it != observers.end();
++it)
{
//  Call the observer
(*it)();
}
}
return *this;
}
};

void Callback()
{
std::cout << "value changed\n";
}

int main()
{
Value value;
value.RegisterListener(Callback);

//  Value held in object can be assigned to a uint32_t due to the
//  conversion operator.
uint32_t original = value;

//  Change the value see the callback get invoked
value = value + 1;

//  Restore the value to it's original and see the callback get invoked.
value = original;
}
1

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