Определение правильности указателя

По моим наблюдениям, если вызывается free (ptr) , где ptr не является допустимым указателем на память, выделенную системой, происходит нарушение доступа. Допустим, я вызываю ] бесплатно вот так:

LPVOID ptr = (LPVOID)0x12345678;
free( ptr );

Это определенно вызовет нарушение прав доступа. Есть ли способ проверить, что ячейка памяти, на которую указывает ptr , является действительной памятью, выделенной системой?

Мне кажется, что часть управления памятью ядра ОС Windows должна знать, какая память имеет выделено и какая память остается для выделения. В противном случае как он мог узнать, достаточно ли памяти осталось для удовлетворения данного запроса? (риторический) Тем не менее, кажется разумным сделать вывод, что должна существовать функция (или набор функций), которая позволила бы пользователю определить, является ли указатель допустимой памятью, выделенной системой. Возможно, Microsoft не обнародовала эти функции. Если Microsoft не предоставила такой API, я могу только предположить, что это было сделано по преднамеренной и конкретной причине. Будет ли создание такого крючка в системе серьезной угрозой безопасности системы?

Отчет о ситуации

Хотя знание того, действителен ли указатель памяти, может быть полезно во многих сценариях, это моя конкретная ситуация:

Я написание драйвера для нового оборудования, которое должно заменить существующее оборудование, которое подключается к ПК через USB. Моя задача - написать новый драйвер, чтобы вызовы существующего API для текущего драйвера продолжали работать в приложениях ПК, в которых он используется. Таким образом, единственное, что требуется изменить в существующих приложениях, - это загрузить соответствующие библиотеки DLL драйвера при запуске. Проблема здесь в том, что существующий драйвер использует обратный вызов для отправки полученных последовательных сообщений в приложение; указатель на выделенную память, содержащую сообщение, передается от драйвера к приложению через обратный вызов. После этого приложение должно вызвать другой API-интерфейс драйвера, чтобы освободить память, передав тот же указатель из приложения в драйвер. В этом сценарии второй API не имеет возможности определить, действительно ли приложение вернуло указатель на действительную память.

12
задан Jim Fell 30 September 2011 в 17:36
поделиться