LOM-файлы
Просматривая листинг 14.2, нетрудно заметить, что формат LOM-файлов, генерируемых программой GENLIMODS.EXE, в точности соответствует формату файлов *.INI. В первой секции ([Module info]) хранится главная информация того модуля, который использовался при построении LOM-файла (включая имя модуля, его базовый адрес и метку даты/времени). Когда LIMODSDLL.DLL просматривает модуль в памяти, он проверяет его по этой части LOM-файла; если метка даты/времени модуля отличается от соответствующей метки LOM-файла в LIMODSDLL.DLL, то программа GENLIMODS.EXE генерирует новый LOM-файл для этого модуля. Я сохраняю базовый адрес модуля для того, чтобы LIMODSDLL.DLL мог повторно, "на лету" вычислять диапазоны адресов (в случае перемещения модуля загрузчиком образа). LIMODSDLL.DLL также сообщит пользователю (через вызов функции outputoebugstring), что модуль был перемещен.
Листинг 14-2. Пример LOM-файла
[Module Info]
DateTimeStamp=380b75e8
BaseAddress=400000
ModuleName=LIMODS.exe
[Ranges]
RangeCount=11
Range0=0x004017D0|0x00401C8E|0 ID:\Book\SourceCode\LIMODS\About.cpp
Rangel=0x00401EF0|0x00402313|0 ID:\Book\SourceCode\LIMODS\BigIcon.CPP
Range2=0x00402430|0x00402A5E|0|D:\Book\SourceCode\LIMODS\LIMODS.cpp
Range3=0x00402D60| 0x00403727111D:\Book\SourceCode\LIMODS\LIMODSDoc.cpp
Range4=0x004044B0 0x0040480010|D:\Book\SourceCode\LIMODS\LIMODSOptions.cpp
Range5=0x00404950I 0x00405823|0 ID:\Book\SourceCode\LIMODS\LIMODSView.cpp
Range6=0x00405D70|0x00405DB0|0 ID:\Book\SourceCode\LIMODS\LIMODSDoc.h
Range7=0x00406150|0x0040752110 ID:\Book\SourceCode\LIMODS\LOMFile.cpp
Range8=0x00408D00|0x004090FF|0|D:\Book\SourceCode\LIMODS\MainFrm.cpp
Range9=0x00409270 I 0x00409516|0 ID:\Book\SourceCode\LIMODS\OptionsDialog.cpp
RangelO=0x0040A0A0|0x0040A140I 0 Iappmodul.cpp
[Sources]
Source0=0|D:\Book\SourceCode\LIMODS\About.cpp
Sourcel=0|D:\Book\SourceCode\LIMODS\BigIcon.CPP
Source2=0|D:\Book\SourceCode\LIMODS\LIMODS.cpp
Source3=lID:\Book\SourceCode\LIMODS\LIMODSDoc.cpp
Source4=0|D:\Book\SourceCode\LIMODS\LIMODSOptions.cpp
Source5=0ID:\Book\SourceCode\LIMODS\LIMODSView.cpp
Source6=0|D:\Book\SourceCode\LIMODS\LIMODSDoc.h
Source7=0|D:\Book\SourceCode\LIMODS\LOMFile.cpp
Source8=0|D:\Book\SourceCode\LIMODS\MainFrm.cpp
Source9=0|D:\Book\SourceCode\LIMODS\OptionsDialog.cpp
Sourcel0=0|appmodul.cpp
SourceCount=l1
В секции [Ranges] указаны ( в определенном формате) диапазоны адресов исходных файлов. Именно эту секцию, прежде всего, и использует LIMODSDLL.DLL, чтобы определить, какие предложения трассировки показывать и когда их показывать. Поля каждой записи этой секции расположены в следующем порядке: адрес начала диапазона, адрес конца диапазона, булевское значение (флажок) показа трассы и имя исходного файла. Секция [Sources] используется LIMODS.EXE, чтобы показать имена исходных файлов в их полной форме (с именем диска и полным путем в дереве каталогов). Первоначально формат INI-файла был выбран, чтобы облегчить исходное тестирование и скрыть его в специальном классе доступа в файлах LOMFILE.H и LOMFILE.CPP. В дальнейшем выяснилось, что производительность LIMODS.EXE вполне приемлема, поэтому я так и не перешел "к другому формату.