Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 412
от 09.11.2002, 10:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1740 Отправлено ответов: 5484 Активность: 315.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Maverick Статус: Опытный Общий рейтинг: 138.69 URL: Страница по асму и вирмейку Телефон: 89039415024 (BiLine GSM) [Подробней >>] |
LIFO Статус: Профессиональный Общий рейтинг: 128.2 URL: наш сайт Телефон: 8 01710 24758 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 154.46 [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 123.39 URL: Страничка рассылки по Паскаля... Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
baldr Статус: Профессиональный Общий рейтинг: 114.84 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
St Статус: Доверительный Общий рейтинг: 116.72 [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 153.57 [Подробней >>] |
Atmion Статус: Доверительный Общий рейтинг: 124.62 [Подробней >>] |
oleg Статус: Опытный Общий рейтинг: 125.55 URL: форум по математике, компьютерным сетям Телефон: (8432) 995153 [Подробней >>] |
MeGAdOZ Статус: Начальный Общий рейтинг: 101.3 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 118.28 URL: Мой сайтик... [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 128.14 [Подробней >>] |
Sub0 Статус: Начальный Общий рейтинг: 104.37 [Подробней >>] |
Beeblebrox Статус: Профессиональный Общий рейтинг: 113.03 URL: Beeblebrox / TMA HomePage [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.42 URL: Страничка обо мне и моих друзьях [Подробней >>] |
kvINT Статус: Профессиональный Общий рейтинг: 107.84 Телефон: (34316)2-31-45 [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 130.7 URL: моя рассылка по Protected Mode [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1702. Люди скажите где хранится архив рассылки по ассемблеру (но не FAQ)... (ответов: 1)
Вопрос № 1703. Здравствуйте! Вы, наверное, уже запарились получать подобные "вопросы" :) Но, не могли бы ... (ответов: 1)
Вопрос № 1704. Я вроде как подписался на две рассылки по асму: с уроками и FAQ-и, но пока наблюдаю только FAQ-и кот... (ответов: 6)
Вопрос № 1705. Здравстуйте! У меня пара вопросов: 1. Отвечаете ли вы по e-mail или надо подписываться? Если отвечае... (ответов: 2)
Вопрос № 1706. Здравствуйте! Объясните, plz, как происходит определение реального адреса вызываемой из проги виндов... (ответов: 4)
Вопрос № 1707. Доброе время суток, уважаемые эксперты. Хочу спросить, как можно повысить привилегии с Гостя до Syst... (ответов: 2)
Вопрос № 1709. Привет всем... Вот, пишу я наименьшую прогу под Win32 - где есть только ExitProcess, а файл получа... (ответов: 6)
Вопрос № 1710. При отладке SoftАйсом одного из скачанного из сети скринсейвера для получени регистрац. номера встре... (ответов: 8)
Вопрос № 1711. Здравствуйте, эксперты! Подскажите, пожалуйста, пример, как определить текущий путь к программе из с... (ответов: 5)
Вопрос № 1712. Приветствую, Эксперты! У меня к вам такой вопрос: Имеется прога (см. приложение). Я использую GetPro... (ответов: 2)
Вопросов: 10, ответов: 37
Вопрос № 1702 |
Люди скажите где хранится архив рассылки по ассемблеру (но не FAQ)
Вопрос отправлен: 04.11.2002, 10:47
Отправитель: Kiran
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Здравствуйте, Kiran!
Помоему нигде.
Тока на компах у читателей и экспертов.
Ответ отправлен: 04.11.2002, 11:23
Отправитель: Maverick
Вопрос № 1703 |
Здравствуйте!
Вы, наверное, уже запарились получать подобные "вопросы" :)
Но, не могли бы вы выслать мылом tasm.exe, tlink.exe, а
также, если есть, прерывания биоса, доса и линуха.
Заранее благодарен!
buriakove@inpred.ru
Вопрос отправлен: 04.11.2002, 13:03
Отправитель: Jendos
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Здравствуйте, Jendos!
http://www.pobox.com/~ralf/files.html-Здесь список прерываний Ральфа Брауна(COOL)
www.filesearch.ru-Ввел в строке поиска Tasm и наслаждайся результатом
Ответ отправлен: 04.11.2002, 14:54
Отправитель: Maverick
Вопрос № 1704 |
Я вроде как подписался на две рассылки по асму: с уроками и FAQ-и, но пока наблюдаю только FAQ-и которые мне как "рыбке зонтик" так как хотелось бы сначала научиться всетаки а потом уже вопросы...
"Где бык, Багира?" :)
Вопрос отправлен: 04.11.2002, 16:22
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает LIFO
Здравствуйте, Alex!
А уроки уже не выходят (это надо архив выпусков найти, их около 30)
Ответ отправлен: 05.11.2002, 14:05
Отправитель: LIFO
Отвечает Maverick
Добрый день, Alex!
Смотря какая рассылка.
Под дос закончилась уж с год назад, щас есть под винду.
Ищи архивы.
Ответ отправлен: 04.11.2002, 21:19
Отправитель: Maverick
Отвечает Bob Johnson
Доброе время суток, Alex!
Ну и что? Как я понял, ты именно в рассылку с FAQ и пишешь...
Ответ отправлен: 05.11.2002, 13:05
Отправитель: Bob Johnson
Отвечает Sensey
Доброе время суток, Alex!
Рассылка "Ассемблер?Это просто!Учимся программировать." для ДОС уже прекратила свое существование, так как все написано. Скачивай с SUBSCRIBE выпуски с 1 по 28.
То же самое под Вин - с 29 и дальше, но она очень нерегулярно выходит, так как писать некому.
Еще что скажу - бумажную книгу + свой опыт написания чего-нить ничего не заменит, поэтому не расстраивайся. Пытайся учится сам, а если что непонятно - задавай вопросы.
Но архивы скачай! Они помогут
Ответ отправлен: 04.11.2002, 16:57
Отправитель: Sensey
Отвечает baldr
Приветствую Вас, Alex!
Я так понимаю, Вам нужно рассылку "Assembler - это просто"? Кроме как на Subscribe.ru
ее вряд ли где можно достать. Там она лежит в жутко неудобном виде, но больше IMHO никак...
Программирование для DOS закончилось, теперь несколько человек пытаются вести рассылку по
программированию для виндов, но это очень неторопливо у них получается... Раз в два месяца она
примерно выходит...
Можно попросить старый архив у Олега Калашникова - у него раньше на старом сайте лежал полный
архив рассылки про asm-DOS... Сейчас, видимо, уже нет...
Ответ отправлен: 04.11.2002, 23:51
Отправитель: baldr
Отвечает --- Нет данных ---
Добрый день, Alex!
Ладно тебе ныть - я вообще уже не хочу, не получать, не писать, не читать, не задавать вопросы - у меня работы в связи с ассемблером на 5 лет вперед появилось - причем все готовы платить LV(или друзья в доску)...Так что
"Подводная лодка в степях Украины храбро погибла в воздушном бою...Какой такой павлин-мавлин? - не видишь ми кушаем";-)Тут зовут...там зовут...не узнают и убъют:-(
Ответ отправлен: 05.11.2002, 08:32
Отправитель: --- Нет данных ---
Вопрос № 1705 |
Здравстуйте!
У меня пара вопросов:
1. Отвечаете ли вы по e-mail или надо подписываться? Если отвечаете на мыло, то просьба мне ответить именно туда.
2. Я пишу программу на Delphi 5. Использую THyperParse (вряд ли что вам это скажет) для парсинга скрипта, представляющего из себя HTML ( каждый тег - команда скрипта, параметры тега - параметры команды тега). Но чего то не получается. Может кто подкинет ссылки на ресурсы по парсингу строк или созданию скрипт языка, а то с этим ThyperParse уже замучался. Хочу свой модуль написать! Спасибо!
Вопрос отправлен: 04.11.2002, 16:41
Отправитель: Oshepkoff (oshepkoff@newgen.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Oshepkoff!
1.Можно и на мыло ответить, только зачем, все равно ответ ты получишь на свой эл. адрес.
2.А я пишу на ассемблере 80386, при отправке вопроса слабо галочку поставить в нужное место :)))
Ответ отправлен: 04.11.2002, 21:19
Отправитель: Maverick
Отвечает Bob Johnson
Здравствуйте, Oshepkoff!
1. Подписываться не обязательно, т.к. ты можешь просто посмотреть нужный выпуск рассылки на Subscribe.ru. Ответ там появляется через 4 дня.
2. Есть такая штука, которая называется Flex - это достаточно мощный лексический анализатор, который будет анализировать текст так, как ты ему это скажешь. Ссылку подсказать не могу, потому что сам переписал его. Но он не большой (300 - 400 кб). Поставляется в исходных кодах, в результате генерирует С++ код (но ты можешь оформить это в DLL и использовать из Delphi). С его помощью твою задачу решить будет легко.
Ответ отправлен: 05.11.2002, 13:05
Отправитель: Bob Johnson
Вопрос № 1706 |
Здравствуйте!
Объясните, plz, как происходит определение
реального адреса вызываемой из проги виндовой
функции (через API)?
Вопрос отправлен: 04.11.2002, 19:41
Отправитель: IanPo
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, IanPo!
Этот адрес определяет загрузчик, когда загружает прогу в память. Ты также можешь сам узнать адрес требуемой функции, вызвав GetProcAddress.
Ответ отправлен: 05.11.2002, 13:06
Отправитель: Bob Johnson
Отвечает St
Привет, IanPo!
Обычно это не требуется делать - это происходит на стадии линковки, при использовании библиотек импорта. Однако если вам всё же нужно вызвать функцию из DDL, то см Приложение
St
Приложение:
Ответ отправлен: 04.11.2002, 20:14
Отправитель: St
Отвечает masquer
Доброе время суток, IanPo!
Обычно через GetProcAddress. Или что-то еще имелось ввиду?
Ответ отправлен: 05.11.2002, 10:45
Отправитель: masquer
Отвечает Atmion
Добрый день, IanPo!
Не совсем понял вопрос. Ты имеешь в виду, когда ты пишешь прогу под Win32 и в ней указываешь например функцию CreateFile, и когда твоя прога запускается, откуда в ней оказывается правильный адрес CreateFile? Так это загрузчик делает - при загрузке проги он настраивает адреса вызываемых функций в таблице импорта PE-файла
Ответ отправлен: 06.11.2002, 02:49
Отправитель: Atmion
Вопрос № 1707 |
Доброе время суток, уважаемые эксперты.
Хочу спросить, как можно повысить привилегии с Гостя до System в осях на базе NT? Буду рад даже алгоритму без листинга. Кстати, может кто-нибудь слышал о алгоритме, описанном в статье "Использование уязвимостей архитектуры
Win32 для повышения уровня привилегий пользователя", которую можно найти на "Void.ru", или сходном с ним (т.к. приведённый алгоритм не учень удобен в плане того, что нужна какая-то прога с привелегиями System?
Вопрос отправлен: 04.11.2002, 20:15
Отправитель: Сергей
[Следующий вопрос >>] [Список вопросов]
Отвечает oleg
Доброе время суток, Сергей!
Братан крякинг в других местах.
А статьи уголовного кодекса мы чтим.
Ответ отправлен: 05.11.2002, 09:42
Отправитель: oleg
Отвечает Bob Johnson
Приветствую Вас, Сергей!
Я скачивал утилитку Debploit, которая именно это и делает. Работает она по похожему принципу, как ты написал. В кратце объясню так - она начинает отлаживать какой-то процесс, в результате чего получает хэндл на процесс с привелегиями SYSTEM, который потом подставляет в качестве своего хэндла при запуске любого другого приложения. Получается так, как будто процесс SYSTEM запустил этот процесс со всеми привелегиями. Чем не удобен такой алгоритм? Процесс с такими привелегиями есть в системе всегда. Если нужна эта прога (рабочий вариант) - пиши.
Ответ отправлен: 05.11.2002, 13:07
Отправитель: Bob Johnson
Вопрос № 1709 |
Привет всем...
Вот, пишу я наименьшую прогу под Win32 - где есть только ExitProcess, а файл получается
в 1.5 Кб, причем, большую часть занимают нули. При добавлении каких-нибудь данных (небольших - строчка...)
размер увеличивается на килобайт, причем при изменении этой строки на пару байт общий размер
не изменяется. Я понимаю про фиксированный размер сегментов (ну разделов или как оно там называется...),
но ведь как-то можно это обойти? А как уменьшить размер заголовка?
Можно ли использовать inc-, lib-файлы от masm32 в Tasm 5.0 ?
Спасибо...
Вопрос отправлен: 04.11.2002, 23:53
Отправитель: baldr (baldr@pisem.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает MeGAdOZ
Hi, minimalnyj obem fajla pod windows 1024 baita, no tak poluchaetsya tolko esli ego kompilit c--(http://sheker.chat.ru), ostalnye kompilery generyat exe ~ 1.5 kb
Ответ отправлен: 05.11.2002, 12:32
Отправитель: MeGAdOZ
Отвечает Portnov
Здравствуйте, baldr!
Где-то я читал, что можно:
1) поставить линкеру какие-то ключи (не то -Ao:xxx, не то -Af:xxx) для минимального выравнивания заголовка
2) БОльшую часть этих нулей можно вырезать гекс-редактором без большого ущерба. В обоих случаях файл сильно уменьшится, но несколько замедлится его загрузка.
Inc-файлы от masm32 в tasm'е использовать точно можно, насчет lib - сильно сомневаюсь.
С уважением, Portnov.
Ответ отправлен: 05.11.2002, 15:54
Отправитель: Portnov
Отвечает Dark_Lord
Добрый день, baldr!
Размер блока в Windows 512 байт, но не это занимает столько места, а заголовок программы(PE). Хотя зачем тебе меньший размер?!
Ответ отправлен: 05.11.2002, 22:39
Отправитель: Dark_Lord
Отвечает Sub0
Добрый день, baldr!
AFAIK это издержки PE формата - в инете полно PE чистильщиков, ужимальщиков.
Ответ отправлен: 05.11.2002, 04:20
Отправитель: Sub0
Отвечает Beeblebrox
Доброе время суток, baldr!
Прочитай эту статью:
http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
где речь идет об ELF. Файлы PE имеют сходную структуру. Найди в MSDN статью "The Portable Executable File Format from Top to Bottom", кроме того, у кого-то из наших экспертов на сайте есть статья о сравнении PE и ELF и о том, как происходит загрузка тех и других. Найди в инете утилиты TinyStub и WipeReloc. О результатах доложить :)
Ответ отправлен: 05.11.2002, 10:05
Отправитель: Beeblebrox
Отвечает masquer
Добрый день, baldr!
Ну, тут тебе нужно формат РЕ смотреть, чтобы разобраться что к чему. Можно и МСДН смотреть, но там запутано все, есть более понятные вещи. Вкратце речь идет о размере секции, т.е. если в секции данных задано выравнивание 200h, то при объеме данных (или кода, ресурсов, etc) 201 и более файл выровняется до 400h и так далее. Т.е. если изначально у тебя не было вообще никаких данных, то и секции такой не было, соответственно, добавил данные=>появилась секция=>увеличился размер...
Инклуды дорабатывать нужно, а либы долны прокатить. Зачем тебе тасм, он под виндой не очень...
Ответ отправлен: 05.11.2002, 10:43
Отправитель: masquer
Вопрос № 1710 |
При отладке SoftАйсом одного из скачанного из сети скринсейвера для
получени регистрац. номера встретился с вызовом поочередно двух вот таких функций:
EnterCriticalSection() и LeaveCriticalSection().
Не подскажите их назначение и параметры.
Вопрос отправлен: 05.11.2002, 02:14
Отправитель: Speedy Gonsalez
[Следующий вопрос >>] [Список вопросов]
Отвечает baldr
Приветствую Вас, Speedy Gonsalez!
Это вход и выход из критического интервала... Помнится, на экзамене по операционным системам
мне вопросик с ними достался... :-// Короче говоря, критический интервал - это такая часть кода,
которая не должна прерываться какими-либо прерываниями (сорри за каламбур!). Например, когда ты
изменяешь под DOS вектор прерывания вручную, ты даешь команду cli, что в данном случае аналогично
входу в критический интервал. А sti - закончить критический интервал. Есть и более высокоуровневые
функции - в прерывании 29h... В общем, то, что у тебя в этом скринсейвере - это может быть и
несложной защитой от отладки (в критическом интервале нежелательно и отладчик использовать..), а
может и в самом деле инициализация каких-то сложных функций... В общем, посмотри просто дизассемблером,
без отладки - что там есть... Должно быть понятно из содержимого...
Ответ отправлен: 05.11.2002, 22:57
Отправитель: baldr
Отвечает Dark_Lord
Приветствую Вас, Speedy Gonsalez!
Критические секции существуют для обмена информации между процессами, для того чтоб моч обратиться к такому сектору команда должна получить к ней доступ, для этого и служит функция EnterCriticalSection, а LeaveCriticalSection это естественно обратное действие!
Ответ отправлен: 05.11.2002, 22:42
Отправитель: Dark_Lord
Отвечает Atmion
Доброе время суток, Speedy Gonsalez!
Функции EnterCriticalSection() и LeaveCriticalSection() связаны с объектами синхронизации Win32, а именно c критическими секциями. Объекты синхронизации нужны для синхронизации потоков (чтобы два и более потока ОДНОВРЕМЕННО не обращались к одной и той же области памяти).
Сначала в своей программе ты должен определить структуру типа CRITICAL_SECTION, а затем инициализировать ее вызовом функции InitializeCriticalSection(), единственным параметром которой должен быть адрес структуры. Вот теперь, когда в одном потоке тебе понадобилось что-то делать с данными, ты должен вызвать EnterCriticalSection(), а как только ты закончил операции с данными, вызывай LeaveCriticalSection(). ПРИЧЕМ ТЫ ДОЛЖЕН вызывать обе этих функции в КАЖДОМ из твоих потоков, которые работают с общими данными. Тогда, если поток А вызовет EnterCriticalSection(), и еще работает с данными, т.е. не вызвал пока LeaveCriticalSection(), и поток Б в этот момент тоже вызовет EnterCriticalSection(), то операционка остановит поток Б, и он будет ждать до тех пор, пока поток А не вызовет LeaveCriticalSection(), и вот тогда операционка возобновит исполнение потока Б.
Как только критическая секция перестанет быть тебе нужна, вызови DeleteCriticalSection(), и удали ее. Но, ты не удалишь собственно структуру типа CRITICAL_SECTION, а просто деинициализируешь ее поля, точно так же, как инициализировал ее при вызове InitializeCriticalSection(). Все эти четыре функции - InitializeCriticalSection(), EnterCriticalSection(), LeaveCriticalSection(), DeleteCriticalSection() - получают единственный параметр-адрес критической секции, и не возвращают значение (тип возвращаемого значения - VOID).
P.S. Подробную инфу про объекты синхронизации Win32 смотри у Джеффри Рихтера, очень толково написано.
Ответ отправлен: 06.11.2002, 21:48
Отправитель: Atmion
Отвечает Bob Johnson
Доброе время суток, Speedy Gonsalez!
Это функции, предназначенные для синхронизации. Например, у тебя есть двухпоточное приложение и ОС типа Windows 2K. Вот тебе нужно, чтобы один поток (который обрабатывает интерфейс) подавал другому потоку команды, а тот, в свою очередь, их выполнял. Команды выстраиваются у тебя в очередь, т.к. время их выполнения может быть значительным, в то время как пользователь постоянно подает новые. Пусть у тебя есть двухпроцессорная система, тогда может получиться, что один процессор будет выполнять один поток команд твоего приложения, другой - другой. Т.е. они будут работать ПОЛНОСТЬЮ параллельно. Вот тут и возникает задача - как добавить информацию в очередь так, чтобы в процессе добавления команды (а команда в очереди может занимать несколько сотен байт), другой поток ее не начал читать (тогда он может прочесть только часть команды и произойдет сбой). Вот тут нужна синхронизация.
Critical Section представляет собой один из вариантов синхронизации - "обладать" critical section в один момент времени может только один(!) поток команд. Для получения critical section в свое распоряжение, поток вызывает функцию EnterCriticalSection, при этом, если в то время, как один поток вызвал эту функцию, получил себе critical section и что-то делает и другой поток попытается вызвать эту фукнцию, он заблокируется до тех пор, пока первый эту секцию не освободит. Освобождается она функцией LeaveCriticalSection. Пример:
EnterCriticalSection
... работа с "расшаренными" переменными
LeaveCriticalSection
Ответ отправлен: 06.11.2002, 13:44
Отправитель: Bob Johnson
Отвечает Sub0
Здравствуйте, Speedy Gonsalez!
Существует ряд функций для работы с критическими секциями, критические секции созданы для синхронизации доступа к коду и данным в многопоточных приложениях, существуют и другие методы синхронизации, всякие там объекты ядра.
Работа с крит. секцией:
Создаём критическую секцию:
CRITICAL_SECTION gCrSec;
где-либо в коде инициализируем критическую секцию
InitializeCriticalSection(&gCrSec);
а затем используем функции входа и выхода из критической секции:
EnterCriticalSection(&gCrSec);
...
тут идёт код, который должен быть выполнен единолично.
...
LeaveCriticalSection(&gCrSec);
При вызове EnterCriticalSection система проверяет "занятость" критической секции, если занято, то ждём освобождения, если нет - то занимаем критическую секцию.
Помю Джефри Рихтер сравнил критическую секцию с туалетом в самолёте.
Ответ отправлен: 05.11.2002, 04:19
Отправитель: Sub0
Отвечает Gibbel
Добрый день, Speedy Gonsalez!
Ну, назначение тебе уже объяснили...
Параметры:
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section
);
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // critical section
);
Ну а вообще, смотри MSDN: http://msdn.microsoft.com
Ответ отправлен: 05.11.2002, 09:55
Отправитель: Gibbel
Отвечает St
Привет, Speedy Gonsalez!
Прошу прощения за встречный вопрос: у вас нет help-а по программированию WIN32.HLP? Там описано большинство функций а размер файла всего около 15 Мб - не так уж много.
The EnterCriticalSection function waits for ownership of the specified critical section object. The function returns when the calling thread is granted ownership.
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // address of critical section object
);
Parameters
lpCriticalSection
Points to the critical section object.
Return Value
This function does not return a value.
The LeaveCriticalSection function releases ownership of the specified critical section object.
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // address of critical section object
);
Parameters
lpCriticalSection
Points to the critical section object.
Return Value
This function does not return a value.
Вот описание с сайта http://www.firststeps.ru: Критическая секция (Critical Section) это участок кода, в котором поток (thread) получает доступ к ресурсу (например переменная), который доступен из других потоков.
Объект критическая секция обеспечивает синхронизацию. Этим объектом может владеть только один поток, что и обеспечивает синхронизацию. Для работы с критическими секциями есть ряд функций API и тип данных CRITICAL_SECTION. Для использования критической секции нужно создать переменную данного типа, и проинициализировать ее перед использованием с помощью функции InitializeCriticalSection(). Для того, чтобы войти в секцию нужно вызвать функцию EnterCriticalSection(), а после завершения работы LeaveCriticalSection(). Что будет, если поток обратится к секции, в которой сейчас другой поток ? Тот поток, который обратится будет блокирован пока критическая секция не будет освобождена. Саму критическую секцию можно удалить функцией DeleteCriticalSection(). Для того, чтобы обойти блокировку потока при обращении к занятой секции есть функция TryEnterCriticalSection(), которая позволяет проверить критическую секцию на занятость.
Здесь есть один маленький и тонкий момент, который относится к синхронизации как таковой. Этот момент в том, что физически данные не защищены. Никто не помещает потоку обратиться к разделяемым данным. Синхронизация это подсказка как должен себя вести объект при доступе к данным. Хороший пример - это светофор. На красный нужно стоять. Но не факт, что все это выполняют :-)
St
Ответ отправлен: 05.11.2002, 13:17
Отправитель: St
Отвечает kvINT
Доброе время суток, Speedy Gonsalez!
The EnterCriticalSection function waits for ownership of the specified critical section object. The function returns when the calling thread is granted ownership.
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // pointer to critical section object
);
Parameters
lpCriticalSection
Points to the critical section object.
Return Values
This function does not return a value.
The LeaveCriticalSection function releases ownership of the specified critical section object.
VOID LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection // address of critical section object
);
Parameters
lpCriticalSection
Points to the critical section object.
Return Values
This function does not return a value.
Ответ отправлен: 05.11.2002, 14:41
Отправитель: kvINT
Вопрос № 1711 |
Здравствуйте, эксперты!
Подскажите, пожалуйста, пример, как определить текущий путь к программе из самой программы (знаю, что как-то через окружение DOS).
Заранее благодарен,
EraSer
Вопрос отправлен: 05.11.2002, 08:42
Отправитель: EraSer (eraser99@tut.by)
[Следующий вопрос >>] [Список вопросов]
Отвечает Portnov
Приветствую Вас, EraSer!
Берете слово по адресу PSP:2Ch. Обозначим его some_seg. По some_seg:0 расположено окружение Дос для вашей программы.
Формат его, надеюсь, знаете? Набор строк, разделенных нулевым байтом, заканчивается двумя нулевыми байтами. Сразу после этих двух нулевых байтов расположен полный путь к вашей программе.
Предупреждение! Многие отладчики не совсем корректно загружают программы, в результате чего при отладке после окружения Дос оказывается не полный путь к программе, а только имя файла программы. При отладке это придется учитывать.
С уважением, Portnov.
Ответ отправлен: 05.11.2002, 16:07
Отправитель: Portnov
Отвечает Dark_Lord
Здравствуйте, EraSer!
В дос:
ah=47h
al=0
ds:si=буфер для приёма строки(64-байта)
int 21h
в Windows:
push адрес приёмника
push максимальный размер приёмника
call GetCurrentDirectory
Ответ отправлен: 05.11.2002, 22:46
Отправитель: Dark_Lord
Отвечает Bob Johnson
Здравствуйте, EraSer!
Я поискал, но нигде не нашел. Тогда решил посмотреть, как это делает Watcom С - он просто просматривает таблицу переменных окружения (сегментный адрес которой находится в слове по адресу 2Ch в PSP), находит ее конец (два нуля подряд), после чего пропускает 2 байта, и вот тут и находится полный путь к программе вместе с ее именем. Он его копирует куда ему нужно.
P.S. Я пытался послать тебе файл исходника RAS звонилки некоторое время назад - но мне пришел ответ, что такого адреса не существует.
Ответ отправлен: 06.11.2002, 13:44
Отправитель: Bob Johnson
Отвечает Atmion
Доброе время суток, EraSer!
Угу, это можно сделать через окружение. Значит, загрузчик ДОСа, когда загружает программу в память, то выделяет ей два блока памяти: в первом блоке содержится окружение программы, а во втором - сама программа (вместе с PSP).
В блоке окружения содержатся переменные окружения (они в формате ASCIIZ, т.е. они текстовые и завершаются двоичным нулем). Последняя переменная окружения - это полное имя запущенной программы в виде Диск:ПутьИмя_файла.exe Значит, сначала ты узнаешь сегментный адрес блока окружения (он хранится в PSP по смещению 2Ch), а потом последовательно просматриваешь одну за другой переменные окружения, и как только твоя прога наткнулась на переменную, которая начинается примерно так: C: ну и так далее, значит ты нашел путь к файлу программы. Да, еще ты можешь посмотреть, что в конце этой переменной окружения, потому что последняя переменная окружения завершается не ОДНИМ нулем, а ДВУМЯ. И если два нуля, значит это точно последняя переменная, а значит она точно содержит полное имя проги.
Ответ отправлен: 06.11.2002, 21:47
Отправитель: Atmion
Отвечает Broken Sword
Добрый день, EraSer!
В PSP по смещению 2Ch лежит сегм. адрес копии окружения текущего процесса. В этом сегменте (начиная с нулевого смещения) подряд идут ASCIZ-строки, по окончании последней строки стоит дополнительный нулевой байт, затем слово (обычно 1) - количество дополнительных строк окружения, а затем - сами дополнительные строки. Первая дополнительная строка - всегда полный путь и имя текущей программы, также в форме ASCIZ-строки.
Ну или еще можно вот так :)
Get full path for running program:
mov ax,1203h
int 2Fh ; get DOS data-segment
mov ax,ds
lds si,ds:[bp-1Ah] ; ds:si – full path
Ответ отправлен: 05.11.2002, 13:44
Отправитель: Broken Sword
Вопрос № 1712 |
Приветствую, Эксперты!
У меня к вам такой вопрос:
Имеется прога (см. приложение). Я использую GetProcAddress для вычисления entry point
самой же GetProcAddress. Если после этого взять из eax этот самый энтри поинт и передать
ему те же параметры (см. приложение), он вернет другой адрес, который больше предыдущего на 10H. Если уже этому адресу передать управление, то он вернет entry point на 20H больший, чем первый. И так далее.
Заранее благодарен.
Alex Osipov alex_osipov@inbox.ru
Приложение:
Вопрос отправлен: 05.11.2002, 10:05
Отправитель: Alex Osipov
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, Alex Osipov!
Хе-хе, это уже обсуждалось когда-то. Вобщем после GetProcAddress в eax мы получаем всего лишь указатель на такой код
push 0BFF76DA8h ; вот это - реальный адрес функции
jmp near ХХХХХХХХ ;куда-то там
Поэтому после вызова значения eax будут меняться, но сам адрес, естественно, будет одним и тем же.
Ответ отправлен: 05.11.2002, 11:01
Отправитель: masquer
Отвечает Bob Johnson
Добрый день, Alex Osipov!
Это так потому, что ты смотришь свою прогу (и результаты, возвращаемые GetProcAddress) в дебугере. Если бы ты запустил бы прогу без него, все было бы одинаково и ОК (прилагаю такой вариант) - только для этого надо научиться печатать значение регистров. Почему так происходит под дебагером - не могу точно утверждать, но код, находящийся по адресу функций там одинаков:
push _какое-то значение_
jmp _реальный адрес функции_
Причем этот код в твоем случае появляется там по мере вызова GetProcAddress! Наверное это сделано для отладки - типа по завершении функция возвращается не в код приложения, а вначае куда-то еще.
Приложение:
Ответ отправлен: 06.11.2002, 13:44
Отправитель: Bob Johnson
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (38) C / C++ (25) Perl (6) Delphi (14) Pascal (19) Basic / VBA (8) Java / JavaScript (10) PHP (7) MySQL / MSSQL (8) |
Пользователю Windows 95/98/Me (27) Windows NT/2000/XP (17) "Железо" (26) Поиск информации (10) |
Администратору Windows NT/2000/XP (10) Linux / Unix (14) |
Юристу Гражданское право (9) Семейное право (6) Трудовое право (5) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||