Блестяще! Все работает! Забил 6 нопов и никаких ошибок. Большое спасибо, crypto. Сейчас возникла еще одна проблема. Русифицированные надписи, не все отображаются корректно: абсолютно весь текст, который написан обычным шрифтом (названия меню, внутренние вкладки и т.д.) можно русифицировать (см. ниже), а вот тот текст, что указан на оборудовании никак перевести не удается (как ни старался - отображается "птичий язык"). Что касается русификации основного текста, вначале там также отображался "птичий язык", я поменял значения кодовых страниц в реестре: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage] "1250"="c_1251.nls" "1251"="c_1251.nls" "1252"="c_1251.nls" После этого все стало отображаться нормально, за исключением надписей на оборудовании (может быть они используют другую кодовую страницу?). Скачал программу NTRegmon, она показывает любые обращения к реестру любого процесса. WEWB32.EXE обращался к веткам, где находятся названия шрифтов, искал ключ Tahoma, но его там не оказалось (NTRegmon показал несколько неудачных обращений), тем не менее программа запускается и английский текст корректно отображается. Есть вероятность, что надписи на оборудовании используют отдельный шрифт, отличный от того, что используется для меню, этот шрифт - "MS Sans Serif". В папке с программой лежит файл EWBFNT.FON и он тоже где-то подругжается (это я видел в отладчике), я заменил его на Arial кириллицу, но ничего не произошло (даже очертание букв не изменилось). В приложении картинка с изображением оборудования (Function Generator), на ней видно, как вызвать это оборудование (пертащить второй слева квадратик из меню Instruments на рабочее поле и два раза щелкнуть на нем мышкой) и текстовые надписи на нем (Frequency, Duty Cycle, Offset и т.д.). Надпись Frequency для этого оборудования (Function Generator) находится в файле ресурсов WEWBMSG.RES по смещению 4C5C. Как определить и изменить кодовую страницу для надписей на оборудовании?
Странно, но когда я подправил сам файл WEWB32.EXE WinHex'ом, программа стала выдавать туже ошибку, что и вначале «No env file message located». До этого я запускал в отладчике и заменил нопами 6 байт по адресу 0051E5D5 и все запускалось без ошибок. Может быть проверка этого файла идет периодически на протяжении работы всей программы? А если этот алгоритм настолько прост (для Вас), может быть его можно исправить так, чтобы он просто выдавал для всех файлов одно и тоже значение и оно всегда считалось правильным. Тогда из какого бы участка программы мы не обращались (а не только из 0051E5D5), всегда программа будет запускаться без ошибок. Или это мои иллюзии?
aspirant Файл wewb.res (как я понимаю, он и задает подобные шрифты) содержит 3 релевантных ресурса: ewbd.fnt, ewb.fnt, std.fnt. Как они выглядят - хз. Но у меня возникла хулиганская идея - ежели затереть имена этих ресурсов в wewb.res и создать эти ресурса в той же директории, то есть надежда, что это заработает (т.е., если нет ресурса в ресурсном файле, то система может искать его отдельно по имени). Плохо, что формат ресурса шрифтов пока неясен...
Последняя идея на сегодня: может быть CRC проверяется не только для всего ресурсного файла в целом, но и для каждого отдельного составляющего ресурса?
Мне кажется, врядли проверяется сам код программы, т.к. выдавалась бы другая ошибка, а тут все та же, что и при обычном редактировании WEWBMSG.RES. Хотя, конечно же, это мое мнение, которое ничем не подкреплено. А по поводу шрифта, я попробую сегодня сделать так, как вы написали, если получится, конечно.
aspirant 1. Вроде-бы в описаниях ресурсов нет CRC. 2. Неплохо было бы выяснить, почему исправление под дебуггером привело к успеху, а исправление кода - нет. Для начала пройди это место в исправленном коде под дебугом.
Странно, сегодня утром удалил старый EWB, над которым проводил эксперименты и поставил чистый, в нем исправил тот самый jnz на 6 нопов и все прекрасно запускается, причем проверил специально на нескольких машинах. Так что, видимо, вчера я еще помимо этих изменений что-то вносил, вот он и ругался. Вначале обсуждения, я писал, что формат файла для меня не сильно важен. Сейчас же, когда начал переводить, получается полная чушь, например, не могу вставить ничего другого вместо надписи "Edit" в основном меню, кроме как "Прав", вместо "Правка" Посмотрел, как вы и писали, ресурсы, как я понял, файл WEWBMSG.RES - это некий архив, внутри которого располагаются еще несколько файлов, информация о которых находится в самом конце. По той структуре, что вы приводили, нашел начала всех файлов (каждый файл внутри WEWBMSG.RES отделяется от другого знаком "$"), где заканчивается каждый файл в структуре я не нашел (хотя там есть еще одно не понятное небольшое число), поэтому посчитал, что знак "$" является как концом одного файла, так одновременно и началом следующего. Далее я увеличил длину файла на 2 байта (в WinHex'е), чтобы добавить к слову "Прав" еще две недостающих буквы, запустил - программа вылетает с ошибкой "access violation (22903), reading 3A292528", из под отладчика запустить не получилось - он виснет. Кстати, в самом начале WEWBMSG.RES находится файл ewb.com, на сколько я понял, этот файл бинарный (обычный *.com), может быть он и отвечает за загрузку остальных (текстовых) файлов в память. Я попробовал вырезать WinHex'ом только его из WEWBMSG.RES, поставил расширение *.com, но он не запустился. Из под отладчика тоже самое. Сейчас стоит задача свободного изменения строки внутри WEWBMSG.RES. Надпись, которую я редактировал, находится в файле WEWBMSG.RES по смещению 813E. Любая надпись имеет формат "Текст" 0D 0A, если затирается хотя бы одна ковычка или один из спец. символов в конце - программа отображает этот текст квадратиками. Направьте, пожалуйста, в нужное русло (или процедуру) Спасибо.
Нашел место, после которого программа зависает: Код (Text): 0054CD40 /$ 55 PUSH EBP 0054CD41 |. 8BEC MOV EBP,ESP 0054CD43 |. 57 PUSH EDI 0054CD44 |. 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8] 0054CD47 |. B9 FFFFFFFF MOV ECX,-1 0054CD4C |. 32C0 XOR AL,AL 0054CD4E |. FC CLD [b]0054CD4F |. F2:AE REPNE SCAS BYTE PTR ES:[EDI][/b] 0054CD51 |. F7D1 NOT ECX 0054CD53 |. 8D41 FF LEA EAX,DWORD PTR DS:[ECX-1] 0054CD56 |. 5F POP EDI 0054CD57 |. 5D POP EBP 0054CD58 \. C3 RETN После строки 0054CD4F уже не работает. В этот кусок попадаем, из: Код (Text): 004787B7 |. E8 84450D00 CALL WEWB32.0054CD40 ; \WEWB32.0054CD40 Вот только что делает эта процедура, что после нее идет обращение к несуществующему участку памяти.
Пришел к следующему результату: в конце файла WEWBMSG.RES есть авторская надпись "!!!!!KEEP THIS AT THE END OF EWBMSG.TBL -- THIS MEANS ME!!!!!" , которая явно никак к названиям меню не относится, я удалил из файла по смещению этой надписи 2 байта, а по адресу 813E, где расположена надпись «&Прав» добавил два байта и дописал «&Правка», запустил – программа запускается без ошибок и отображает полные названия, которые я указал («Правка»). Таким образом, ей не важно, что и где будет дописано или отредактировано, главное, чтобы в память грузился файл именно этого размера (поддерживался баланс добавления/удаления байтов). В конце WEWBMSG.RES есть еще несколько таких записей и, в принципе, можно все их поудалять и вставить в нужные места необходимые символы, но, что если их не хватит? Там около 100 байт такого мусора. Можно ли как-то сделать, чтобы программа грузила любой (нужный мне) размер файла? Может быть в самом WEWBMSG.RES должна быть запись – сколько байт он содержит? Но я этого найти не смог.
aspirant Вот я об этом и писал в самом начале - надо понять структуру ресурсов (тут похоже скоро станет все ясно), написать разборщик, потому что основную часть ресурсов нужно будет оставить, написать сборщик, который по ресурсам скомпилит новый файл WEWBMSG.RES. Это проще и технологичнее, чем искать свободные места (а найти их будет непросто из-за избыточности русского по отношению к английскому).
aspirant Вот структуры, которые тебе помогут написать разборщик и сборщик: typedef struct { WORD ResNum; DWORD ResDirOffset;//Resource Directory Offset from start of file BYTE Version;//?? must be 2 BYTE Crc;//XOR of all bytes from start of file to (<) ResDirOffset WORD Magic;//Must be 0xAAAA } ResFileTrailer; Длина структуры 10 байт, она располагается в самом конце файла. Начиная со смещения ResDirOffset располагается массив структур (числом ResNum): typedef struct { char ResName[13];//zero padded DWORD ResOffset;//Resource offset from start of file DWORD ResLength;//Resource Length } ResInfo; Как ты уже заметил, в конце каждого ресурса следует два байта 0x24,0xA, они НЕ УЧИТЫВАЮТСЯ В ДЛИНЕ РЕСУРСА! Строки в ресурсах env.msg и wewb.msg разделены байтами 0xD,0xA, наверное они ищутся в памяти по номеру с учетом данных разделителей. Написать разборщик и сборщик по этой информации очень легко. Сохрани только порядок следования ресурсов на всякий случай. Я думаю, тебе этого будет достаточно. Чтобы разобраться со шрифтами, слей мне соответствующий файлик после разборки...
Большое спасибо за помощь, crypto. Попробую разобраться со всем, что вы написали. 8-) В Интернете нашел дизассемблер "IDA Pro 4.5" и теперь использую его, т.к. в отладчике OllyDbg довольно сложно ориентироваться (нет названий процедур, да и слишком все динамично). Так вот, в IDA отобразилось множество функций, используемых в этой программе (их около 200), я посмотрел их названия и увидел несколько, в имени которых есть слово "Font". Я понимаю, что это Windows API и сейчас пытаюсь найти тот момент, когда подгружается шрифт для надписей на оборудовании (сейчас он отображается "птичьим языком"). Посмотрим, что из этого получится. Что касается ресурсов, еще раз спасибо, за структуры, попытаюсь все сделать на грамотном уровне В WEWBMSG.RES я нашел места, где задается размер кнопок (длина, ширина) и раположение их на оборудовании, так что проблема сейчас только в отлове шрифта. Как приду к каким-либо результатам обязательно напишу.
Уважаемый, crypto, полностью разобрался с этими ресурсами, по данному вами описанию структур. Сборщик/разборщик написать попытался – ничего не получилось, мне надо долго с этим разбираться – не программист я , да и сделав все вручную, понял, что работы там не так уж и много. Добился самого главного – теперь могу растягивать этот файл (WEWBMSG.RES) как угодно и надписи могу вставлять также любого размера, программа обрабатывает без ошибок любой нужный мне файл. Осталась единственная проблема со шрифтом на оборудовании. Вытащил из файла WEWB.RES шрифты ewbd.fnt, ewb.fnt, std.fnt (в приложении), но стандартно открыть их не получилось. Сравнил их содержимое с EWBFNT.FON, который находится в папке с EWB и понял, что это не шрифты, а какие-то бинарные файлы (но начинка очень похожа на шрифт), т.к. EWBFNT.FON имеет начальную сигнатуру MZ, как обычный выполняемый файл. Поискал в Интернет информацию о *.fnt, пишут, что это шрифт, который подгружается в ходе выполнения программы и что можно как-то преобразовать его в *.fon, но ничего конкретного нет, одни только описания. Нашел программу “Raster Font Editor”, но она отказалась читать вытащенные мной файлы, хотя тот *.fnt, что шел с ней в комплекте читает и преобразует без проблем. Подскажите, как быть в этой ситуации с *.fnt и *.fon и как определить шрифт, используемый на оборудовании? Программа для создания и редактирования *.fnt Raster Font Editor: http://www.cylog.org/files/rfe009b.zip (450 Кб)