Как сделать, чтобы не загружался рантайм?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 6:09

arthur2 писал(а):А если я знаю va, может быть вообще не выделять строки, а сразу передавать этот адрес?

Всё зависит от типа аргумента. Если LPCSTR, то можно передавать адрес строки в секции кода, если просто LPSTR, то надо сделать копию, и передавать её адрес, если BSTR, то надо вызывать SysAllocString и передавать полученный от неё адрес.

А как объявить на бейсике структуру IMAGE_IMPORT_DESCRIPTOR?
viewtopic.php?p=6725674#p6725674


Код: Выделить всё
Type IMAGE_IMPORT_DESCRIPTOR
    Characteristics_or_OriginalFirstThunk As Long
    TimeDateStamp As Long
    ForwarderChain As Long
    Name As Long
    FirstThunk As Long
End Type   
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 7:13

А что тогда за число в поле name?

Хакер писал(а):Всё зависит от типа аргумента.
А если самому в тлб объявить с нужным типом? или это не для всех функций будет работать?
В чём разница между LPCSTR и LPSTR?
Например, я объявил как any...
Код: Выделить всё
[entry("MessageBoxA")] long stdcall MessageBox(
               [in] long hwnd,
               [in] void* lpText,
               [in] void* lpCaption,
               [in] long wType);
так можно сразу va передавать?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 7:18

Типы придуманы не для того, чтобы портить кому-то жизнь. Они созданы для того, чтобы ты знал, как именно функция поступает с данными.

Подменив типы в TLB ты совершил самообман — теперь ты ничего не знаешь о том, что именно ждёт от тебя функция (а она как ждала от тебя определённые данные, так продолжает, несмотря на то, что ты поменял типы в TLB).

Разница между LPSTR и LPCSTR в букве C, а сама буква C означает константность. Наличие этой буквы в типе указателя на строку гарантирует, что функция ничего с этой строкой не сделает, и даже пытаться не будет.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 7:29

то есть, если я знаю, что функция не меняет строку, то могу объявлять лонг и сразу передавать va?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 7:36

Ты в любом случае передаёшь Long-овый адрес.
Если функция не меняет строку, то можно передавать адрес оригинальной строки, лежащей в секции данных.
Если функция меняет, то тоже можно, но чревато.
Если секция имеет атрибут, делающий её страницы доступными для записи, то просто поменяется значение строковой константы.
Если секция не имеет его, то попытка функции переписать это место в памяти приведёт к исключению, т.е. к краху, если у тебя обработчик не установлен (а он ведь не установлен).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 7:43

про константы - очень интересно :)
Я подумал - а ведь в процедуре самомодификации можно получить va констант и оттуда же переписать их в экзешнике?

Интересно, а почему мой вариант с фиксированным байтовым массивом не прокатил?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 7:52

Каким образом в процедуре самомодификации ты получишь их адреса?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 7:54

А strptr вернет адрес копии? тады облом :)
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 7:56

Конечно облом. Но направление правильное. Копия создаётся же как-то. Какой-то функцией. Которая из оригинала делает копию. И что если эту функцию перехватить и получить адрес оригинала?

Думай дальше...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 8:02

что-то где-то у тебя я читал про строки, строковые константы и, кажется, указатели :) пошел поищу

Нет, не помогло :oops:

А как организованы строковые константы? ведь не совсем так, как строки? Если попробовать varptr и сколько-то там прибавить... или это тоже будет на копию?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 26.06.2009 (Пт) 8:36

Что значит, как они организованы? Не понял вопроса.

VarPtr позволяет получить адрес переменной, ссылка на которую передана.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 26.06.2009 (Пт) 21:01

arthur2 писал(а):Интересно, а почему мой вариант с фиксированным байтовым массивом не прокатил?

Прочитал вот этот тёмычевский топик и понял, почему:
viewtopic.php?t=25400
Без рантайма и с фиксированным массивом бейсик работать не может - потому что и у фиксированного есть дескриптор SAFEARRAY. А вот если поместить фиксированный массив в структуру, то SAFEARRAY ему будет не нужен!

Переписал свою функцию winmain на вот так:
Код: Выделить всё
Function WinMain(hInstance As Long _
                         , hPrevInstance As Long _
                         , lpCmdLine As Long _
                         , nCmdShow As Long _
                         ) As Long
With myStr
.b(0) = 207 'П
.b(1) = 240 'р
.b(2) = 232 'и
.b(3) = 226 'в
.b(4) = 229 'е
.b(5) = 242 'т

MessageBox 0, .b(0), ByVal 0, 0

End With
End Function

Теперь модифицированный файл работает!

Ну вот, теперь нужно разобраться-таки с импортом :)

Собственно, если получится разобраться со строками в секции - буду пользоваться строками в секции.

А оригинальну main, из которой происходит модификация, не нужно случайно затирать? А то там функции из рантайма. Или раз эта main всё равно не будет вызываться, её можно оставить?
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 27.06.2009 (Сб) 4:03

Не будет, прото мусор.

Я настоятельно рекомендую забыть про A-функции. Или ты заботишься об обратной совместимости с 9x?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 28.06.2009 (Вс) 20:14

Не, ну в принципе, совместимость не помешает - ведь А работают и там и там :)

Насчёт таблицы импорта: IMAGE_IMPORT_DESCRIPTOR я вроде бы получаю. В файле их две штуки, в третьей все поля заполнены нулями.

Смотрю строку по полю name. У второй структурки по этому адресу "MSVBVM60.DLL". Я забиваю все поля нулями и записываю её обратно.

Файл после этого работает. Но в импорте MSVBVM60.DLL почему-то остался :( Что я сделал не так?
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 29.06.2009 (Пн) 12:57

Так-с, IMAGE_IMPORT_DESCRIPTOR оказался непричём :(
Я отказался от модификации таблицы импорта из main (стал делать это снаружи) и теперь ни в одной IMAGE_IMPORT_DESCRIPTOR ссылки на msvbvm60 просто нет... Но где-то ссылка всё-таки есть! Куда смотреть?

Просмотровщик показывает ссылку под именем "Bound import Directory Table". Что это за зверь? в каких полях каких структур он живет? Никак не могу найти Изображение
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 29.06.2009 (Пн) 15:09

Всё, таблицу импорта победил :)

Но мой способ с массивом байт вместо строк таки не работает без рантайма :( Где-то что-то оттуда всё же вызывается. С бипом - работает, с месаджебоксом - не хочет
Артур
 
   

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как сделать, чтобы не загружался рантайм?

Сообщение Хакер » 29.06.2009 (Пн) 15:11

Я тебе сказал, что используется, и как проверять, используется ли.

И сказал, как обойтись без дурацких массивов. И выбросить в топку использование ANSI-строк для сообщений.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Как сделать, чтобы не загружался рантайм?

Сообщение arthur2 » 29.06.2009 (Пн) 15:18

Я помню :) Просто все в порядке очереди. Импорт победил, пошел долбиться головой о строки

А как проверять, используется ли, не помню, где говорил :oops: В смысле, отладчиком?
Артур
 
   

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 72

    TopList