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