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