Так нет там такой ф-ции. Есть ___crtGetEnvironmentStringsA И в то же время есть __crtGetEnvironmentStringsW и __imp__GetEnvironmentStringsW@0
2 cresta в том то и дело что в kernel32.inc есть: Код (Text): \\------------------------------------------------ GetEnvironmentStringsA PROTO GetEnvironmentStrings equ <GetEnvironmentStringsA> GetEnvironmentStringsW PROTO \\------------------------------------------------ и если я буду пользовать GetEnvironmentStrings в своих *.asm файлах то, я думаю, всё будет OK, но в libc.lib имеем: Код (Text): \\---------------a_env.obj libc.lib IDA------------- ... push ebp mov ebp, dword ptr ds:__imp__GetEnvironmentStringsW@0 push esi push edi xor ebx, ebx xor esi, esi xor edi, edi cmp eax, ebx jnz short loc_0_52 call ebp ; __imp__GetEnvironmentStringsW@0 mov esi, eax cmp esi, ebx jz short loc_0_33 mov ds:_?f_use@?1??__crtGetEnvironmentStringsA@@9@9, 1 jmp short loc_0_5B ; -------------------------------------------------- loc_0_33: call dword ptr ds:__imp__GetEnvironmentStrings@0 mov edi, eax cmp edi, ebx ... extrn __imp__GetEnvironmentStrings@0:near extrn __imp__GetEnvironmentStringsW@0:near ... \\---------------a_env.obj libc.lib IDA------------- то есть __imp__GetEnvironmentStringsW@0 линкер устраивает, а __imp__GetEnvironmentStrings@0 нет. Вопрос: почему? Я предположил что это из за того что в kernel32.dll _GetEnvironmentStringsW@0 присутствует а _GetEnvironmentStrings@0 нет. может я и неправ...
acdel1 А из какой либы это (_?ClockWin@@3VClockObj@@A) - я должен сам икать или напишеш? Передирать надо уметь однако Я откомпилю, но как будет работать это не ко мне Например самый тяжелый случай сделаю (LoadLibrary + offset) я так много раз делал. А причем сдесь libc.lib? Чтобы разговор поддержать
2 cresta как я показал выше в a_env.obj присутствует extrn __imp__GetEnvironmentStrings@0:near я думаю что __imp_ приставку IDA добавляет когда функция вызывается не непосредственно из этого места, то есть когда выполняется код: call dword ptr ds:__imp__GetEnvironmentStrings@0 например, то управление передаётся не в kernel32.dll, а сначала в ту часть исполняемого модуля где находятся "операции перехода" (не знаю как это правильно назвать - ) и там выполняется команда jmpf address где address это кусок памяти содержащий адрес точки входа в вызываемую функцию в данном случае GetEnvironmentStrings. Я так думаю орентируясь на PE исполняемые файлы но возможно я и не прав... тем более, что все эти размышления не объясняют почему линкер не видит __imp__GetEnvironmentStrings@0 находящийся в libc.lib 2 bober ?ClockWin@@3VClockObj@@A находится в ClockObj.asm и представляет собой: _BSS SEGMENT ?ClockWin@@3VClockObj@@A DB 0268H DUP (?) ; ClockWin _BSS ENDS строка 153 а насчёт "передирать" вы погорячились... - может быть вам будет удобнее если я также и с сорцы выложу?
acdel1 а насчёт "передирать" вы погорячились... - думаю что __imp_ приставку IDA добавляет IDA это у вас среда разработки? ?ClockWin@@3VClockObj@@A - если это твоя функция, почему ее кмпилятор ненаходит? Если не хотел показывать код сделал бы заглушку. Лично я много передираю и строить из себя благородного рыцаря не вижу необходимости.
2 bober IDA это у вас среда разработки? нет. просто дезассемблирование производилось с включенным "Rename DLL entries".
acdel1 Тогда обознач ее как-нибудь по другому, а то у меня вот что на нее выскакивает: " unresolved external symbol _?ClockWin@@3VClockObj@@A " Если у тебя есть сишный код то его наверно проще переписать на асм самому, чем это делать через IDA.
2 bober я переименовал ?ClockWin@@3VClockObj@@A в ClockWin@@3VClockObj надеюсь это поможет хотя у меня такое имя ошибки не вызывало, не знаю в чём тут дело - Если у тебя есть сишный код то его наверно проще переписать на асм самому, чем это делать через IDA. Я не пользовался IDA для получения *.asm, листинги сгенерированы MSVC за исключением файла new_del.asm _1708379992__ScreenClock.rar
Результат не изменился. Это вероятно из-за старой версии ml.exe(6.14.8444) и link.exe(5.12.8078). Но я не понял какой ты хочеш получить бонус с этой затеи(компилирование на MASM) если даже рунтайм весь переносиш? Даже теоретически должно быть одинаково. А на си еще есть оптимизатор так что вроде плюсов больше.
2 bober Собственно никакого бонуса с этого проекта мне нет это просто пример использования libc.lib. А по поводу оптимизатора: Например самый тяжелый случай сделаю (LoadLibrary + offset) вы вроде как нашли места где возможна оптимизация... а по поводу ClockWin@@3VClockObj: у вас только это компилятор не находит или что то ещё?
2 bober В make.bat пауза стоит не по делу перед (\masm32\bin\Link) Извиняюсь забыл убрать А можно посмотреть что получилось? И если не секрет что у вас за libc.lib?
2 bober что то у него с секцией импорта не так: у меня просходит ошибка по адресу 004011сb а в этом месте должен быть вызов CreateSolidBrush из gdi32.dll \vs70builds\3077\....... size 2,58 MB (2 707 332 bytes) а нельзя ли её где нибудь в интернете взять? (что то я не понял что есть \vs70builds\3077\ - )
2 bober проверил. с секцией импорта всё OK неверно сделаны вызовы. все (или основная масса) в случае с CreateSolidBrush имеем: call ds:00401fb6 а нужно call ds:00409030 и т.д.