07.09.2004, 19:23
общий
это ответ
Доброе время суток, Alex!
Позвольте немного напомнить Вам о структуре памяти в Windows.
Вся память программы разделяется на два блока по 2 Гб каждый. Нижний блок используется программой. Верхний блок используется Windows.
При проецировании Вы указываете размер блока в файле, который Вы хотели бы отобразить. Операционная система ищет свободное пространство и отображает файла на это пространство. При недостатке пространства, система возвратил NULL.
А теперь к Вашему вопросу.
Если Вы отображаете часть файла, Вы указываете размер этой части (пусть это будет iSize). Система возвращает Вам указатель (pMapFile). Вы моэете быть уверены, что начиная с адреса pMapFile и до адреса pMapFile+iSize-1 находится Ваш файл.
Если Вы отображаете весь файл, то желателно иметь знать размер. Это делает функция GetFileSize. И опять-таки. Если размер файла равен iSize, а система возвратила указатель pMapFile, то начиная с адреса pMapFile и до адреса pMapFile+iSize-1 находится Ваш файл.
Если Вы будете аккуратны при использовании строковых команд (загрузите в ECX размер iSize и будете использовать необходимый префикс REP/REPNE и др), то у Вас регистр EDI не обнулится никогда. Кроме этого, система внимательно следит за Вами. При попытке обратиться к недопустимому адресу, она выкинет ошибку и Ваша программа рухнет.
Удачи.