Было моим наблюдением, что если free( ptr )
вызывается там, где ptr
не является допустимым указателем на системно-распределенную память, происходит нарушение прав доступа. Скажем, что я называю free
следующим образом:
LPVOID ptr = (LPVOID)0x12345678;
free( ptr );
Это наиболее определенно приведет к нарушению доступа. Есть ли способ проверить, что ячейка памяти, на которую указывает ptr
, является допустимой системной памятью?
Мне кажется, что часть управления памятью ядра ОС Windows должна знать, какая память была выделена и какая память остается для выделения. В противном случае, как узнать, хватит ли памяти для удовлетворения данного запроса? (риторический). При этом представляется разумным сделать вывод о том, что должна существовать функция (или набор функций), которая позволила бы пользователю определить, является ли указатель действительной системно-распределенной памятью. Возможно, Microsoft не сделала эти функции общедоступными. Если Microsoft не предоставила такой API, я могу только предположить, что это было по преднамеренной и конкретной причине. Предоставило бы такой крючок в системную прозу значительную угрозу безопасности системы?
Отчет о ситуации
Хотя знание того, действительно ли указатель памяти действительно может быть полезным во многих сценариях, это моя особая ситуация:
Я пишу драйвер для нового оборудования, которое заменит существующее аппаратное обеспечение, которое подключается к ПК через USB. Мой мандат заключается в том, чтобы написать новый драйвер, чтобы вызовы существующего API для текущего драйвера продолжали работать в приложениях ПК, в которых он используется. Таким образом, только необходимые изменения в существующих приложениях - это загрузка соответствующих DLL драйверов при запуске. Проблема заключается в том, что существующий драйвер использует обратный вызов для отправки полученных последовательных сообщений в приложение; указатель на выделенную память, содержащую сообщение, передается из драйвера в приложение через обратный вызов. В этом случае приложение должно вызвать другой API-интерфейс драйвера, чтобы освободить память, передав тот же указатель из приложения в драйвер. В этом случае второй API не имеет возможности определить, действительно ли приложение передало указатель на действительную память.