Консультация № 12301
07.09.2004, 19:23
0.00 руб.
0 3 3
Здраствуйте, уважаемые эксперты! Промеппировал файл в память, для поиска строки в файле использовал строковые команды, но потом подумал, а что если MapViewOfFile вернёт указатель на память близкий к 4 Гб и тогда при увеличении edi может обнулиться (первоначально edi=pMemory) и куда тогда будет обращение к памяти? Пришлось использовать обращение к памяти по базе (ebx=pMemory, edi=0, обращаюсь [ebx+edi]), но тогда нельзя использовать строковые команды (или как-то подогнать ds под pMemory, чтобы обращаться по ds:edi?). Ведь теоретически размер файла м.б. очень большой и указатель на память + размер файла могут не "влезть" в edi! Возможна ли такая ситуация в GlobalLock, когда указатель на память + размер запрошенной памяти превышают 4 Гб? Можно ли к памяти адресоваться по одному регистру или надо использовать базу?

Обсуждение

Неизвестный
07.09.2004, 19:23
общий
это ответ
Доброе время суток, Alex!
Размер доступного адресного пространства для процесса в Win32 равен 2 Гб (а не 4 Гб), так
что никто тебе не даст ничего переполнить. Тем более что в конце 4Гб находится ядро самой ОС. Если ты попытаешься выделить памяти
больше чем есть в наличии, функция MapViewOfFile просто завершится с ошибкой.
Неизвестный
07.09.2004, 19:23
общий
это ответ
Приветствую Вас, Alex!
Все гораздо проще, просто система не раззрешить тебе промаппировать файлы больших размеров.
Неизвестный
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 не обнулится никогда. Кроме этого, система внимательно следит за Вами. При попытке обратиться к недопустимому адресу, она выкинет ошибку и Ваша программа рухнет.
Удачи.
Форма ответа