· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Bug in CreateFile

Посл.отвђт Сообщенiе


Дата: Фев 1, 2003 20:04:48

Недавно обнаружил прикольный баг в вин2000 и ХР:
если перед вызовом функции CreateFile выполнить команду STD, то программа вываливается по int03 вызванному из какой-то библиотеки,
хотя когда DF=0 файл нормально создается. Кто-нибудь знает: не описанно ли это где-нибудь как соглашения по вызову?


Дата: Фев 1, 2003 21:53:39

Да, скорее всего это багю Просто при написании функции забыли флаг направления сбросить.


Дата: Фев 3, 2003 13:12:54

Black_mirror
Хехе...
Это не только ты обнаружил.
Баг с флагом направления существует уже давно и не только для CreateFile!!!


Дата: Фев 3, 2003 13:35:49

Нет, это не баг и никто ничего не забывал.
"The C run-time routines assume that the direction flag is cleared. If you are using other functions with the C run-time functions, you must ensure that the other functions leave the direction flag alone or restore it to its original condition. Expecting the direction flag to be clear upon entry makes the run-time code faster and more efficient."

Из описалова к C Run-Time Libraries. CreateFile небось тоже crt статически юзает.


Дата: Фев 3, 2003 14:31:40

Four-F
Согласен..., и тем не менее это БАГ!!!
Так как такое соглашения должно было бы войти в STDCALL, но не вошло.


Дата: Фев 3, 2003 15:37:03

Ну тогда там же и про esi, edi, ebx и ebp должно быть.
Однако нету.


Дата: Фев 3, 2003 15:41:15

Four-F
Нет?
Гм.
Тогда пожалуй мы добавим :))


Дата: Фев 3, 2003 18:19:33

Four-F
Причем тут Run-Time Libraries? Если программа написанна на асме!
К тому же в 98 винде CreateFile работает вне зависимости от этого флага.


Дата: Фев 3, 2003 22:44:48

Просто придёться cld прописывать, и всё-таки это баг.


Дата: Фев 4, 2003 10:03:19 · Поправил: Four-F

[ Black_mirror: Причем тут Run-Time Libraries? Если программа написанна на асме!
К тому же в 98 винде CreateFile работает вне зависимости от этого флага.
]

Так. Давай разбираться если ты сам не помнишь че спрашивал.

[ Black_mirror: ...если перед вызовом функции CreateFile выполнить команду STD, то программа вываливается по int03 вызванному из какой-то библиотеки,... ]

Из чего следует, что "программа вываливается по int03 вызванному из какой-то библиотеки".
Насколько я понял, ты уходишь в CreateFile и больше не возвращаешься.
При чем же здесь асм.

Насчет Run-Time Libraries. CreateFile принимает строку, значит она будет с ней работать: измерять длину, копировать и т.п. Для этого скорее всего будут использованы классические crt функции. Только они вшиты в тело kernel32.dll, которой CreateFile принадлежит. И в этом смысле Run-Time Libraries строго говоря не являются. Но сами-то функции оттуда взяты. Я не настаиваю на этом, но на 99.99% уверен, что это так. Можно просто дизасмнуть kernel32.dll и посмотреть.

[ Black_mirror: К тому же в 98 винде CreateFile работает вне зависимости от этого флага. ]

Тут я не знаю. Может cld где нить мелькает внутри CreateFile.
Проверь флаг на выходе из CreateFile.


Дата: Фев 4, 2003 15:39:25

All

"Глюк" с флагом направления как я уже говорил, методично наблюдается у многих функция из кернел32.

Насчет Run-Time Libraries.

В вин2000 кишит так называемые Rtl функциями, и входят они не в kernel32, хотя последнее по моему перенаправляет некоторые, такие как RtlUnwind.

Если, то, что я прочитал от Four-F истина, то истина и то, что в соглашение STDCALL стоит добавить такое условие.


Дата: Фев 4, 2003 16:22:06

Для стабильной работы программы главное не отдавать управление операционной системе 8)


Дата: Фев 5, 2003 13:54:59 · Поправил: Four-F

Глянул я ради интереса CreateFile под w2k.
Трабла случается внутри ntdll.dll когда функция RtlDosPathNameToNtPathName_U зовет другую неименованную функцию по адресу 77F890B3 (w2k +sp2). Так что рантайм тут не при чем.

И тем не менее. Когда система создает процесс и передает управление на точку входа, direction flag всегда сброшен. Если даже какая-нибудь API-функция его установит, то ана же его и сбросит. Все библиотечные функции поступят таким же образом. А рядовому программисту на ЯВУ вообще не дано познать что это такое. И уж если находятся такие уникумы, то для них в MSDN есть раздел "Using and Preserving Registers in Inline Assembly", в котором помимо всего прочего утверждается:

"Note: If your inline assembly code changes the direction flag using the STD or CLD instructions, you must restore the flag to its original value."

Просто ребята из M$ посчитали расточительным перед каждым rep* stos*, rep* scas* и т.д. и т.п. запоминать флаг направления и потом возвращать его назад. И правильно, IMHO, сделали. А к соглашению о передаче параметров это отношение не имеет. Вот.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076