Apr 20, 2011 · Comments
РИТ++
Цель доклада – познакомить разработчиков с принципами работы стека TCP/IP в Windows, его основными компонентами и связями между ними; объяснить, что именно происходит с данными на пути к приложению и от него, и как работа сетевого стека сказывается на приложениях. В докладе описываются NDIS, существующие возможности аппаратного ускорения, работа с прерываниями и асинхронным вводом-выводом, возможности настройки сетевых адаптеров и протокола TCP/IP, перечисляются программные интерфейсы, описывается Windows Filtering Platform и её связь с IPsec, антивирусными сканнерами и фаерволами.
Read On →
Apr 7, 2011 · Comments
Отладка
Сижу я сегодня на работе, никого не трогаю, отладчиком отладчик отлаживаю. А что, отладчик - тоже человек программа. Тем более что немногим ранее я его немножко совсем поломал, пытаясь добавить поддержку некоей конфигурации, которая текущей реинкарнацией отладчика не поддерживается. Ну вот, запускаю я его примерно вот таким образом:
windbg.exe kd.exe -k com:port=com1,baud=115200
…и замечаю, что что-то не так. А именно - опять сломался наш корпоративный прокси. А я как раз хотел посмотреть в… ну скажем MSDN. Попробовал и так и сяк. Не работает, вылетает по таймауту. Ну хорошо, но тут начитают происходить еще более мистические вещи. Outlook вдруг перестает реагировать мышь и клавиатуру; IE вообще не запускается – процесс стартует, но окно не показывается. Несколько подозрительно для проблем с прокси.
Read On →
Apr 2, 2011 · Comments
ПрограммированиеРИТ++WindowsWindows Kernel
Меня пригласили выступить на конференции РИТ++ 2011, которая пройдет в Москве в конце апреля. Предварительная тема доклада: «Сетевая подсистема Windows глазами разработчика. Краткий, неполный и, в основном, неверный обзор. :-)» Я собираюсь рассказать о том, как работает ядерная часть сетевой подсистемы, как данные попадают в user mode и что с ними происходит по пути. Заходите на огонёк.
Mar 30, 2011 · Comments
Всякая всячинаРабота
Попался замечательный топик на Привете. Не берусь сказать правда это или нет – все таки это пересказ через третьи руки. Тем не менее с проявлениями подобного инфантилизма сталкиваюсь чаще, чем хотелось бы.
Оптимистичное начало:
Подскажите, реально ли найти работу тестером после 2-месячных курсов? Человек не имеет никакого ИТ образования, кроме этих 2 месяца курсов с мужиком, которого нашли по газете…
у человека предыдущее образование связано с социальными каким то науками - что то типа не то десткая психолошия, не то социология и что то с детьми… То есть ни о каком выше среднего уровне компьютерного пользователя речи не иедт, навыков бухшалтерии нема.
Read On →
Mar 29, 2011 · Comments
Юмор
— Так вот, — говорит Морковьева. — Нам нужно нарисовать семь красных линий. Все они должны быть строго перпендикулярны, и кроме того, некоторые нужно нарисовать зеленым цветом, а еще некоторые — прозрачным. Как вы считаете, это реально?
— Нет, — говорит Петров.
— Давайте не будем торопиться с ответом, Петров, — говорит Сидоряхин. — Задача поставлена, и ее нужно решить. Вы же профессионал, Петров. Не давайте нам повода считать, что вы не профессионал.
Read On →
Mar 21, 2011 · Comments
Программирование
Главная проблема с хуками состоит не в том, как зацепиться, а в том, как отцепиться и ничего не порушить. К примеру, приходит недавно письмо:
We recently saw an AV in stress where our vectored exception handler was called after our dll was unloaded. After investigating the issue, it seems like removing the vectored exception handler does not wait for all users of that exception handler to finish (and does not even remove the exception handler from list for future users if there is one current user). So, there seems to be no way to synchronize removing the exception handler and the dll unloading – any synchronization within the exception handler is useless since the exception thread may be about to call the exception handler.
Недавно мы наблюдали падение приложения во время стрессового тестирования, вызванное тем, что векторный обработчик исключения был вызван после того, как наша DLL была выгружена из памяти. В процессе расследования выяснилось, что, похоже, снятие векторного обработчика исключения не ожидает, пока все пользователи этого обработчика закончат работу (и даже не удаляет обработчик для будущих пользователей, если обработчик в данный момент используется). Так, похоже, что не существует способа синхронизировать снятие векторного обработчика и выгрузку DLL – любая синхронизация в пределах обработчика исключения бесполезна, поскольку поток, в котором произошло исключение, может только готовится вызвать обработчик исключения.
Read On →
Mar 10, 2011 · Comments
Программирование
Функция DebugBreak() объявлена вот таким образом:
void WINAPI DebugBreak(void); Если подумать, то это не очень удачный вариант объявления. Гораздо более удобным вариантом был бы:
void __cdecl DebugBreak(...); Почему? В такую функцию можно передать любой набор параметров. Например, значения переменных интересующих нас в данной точке останова. Или значение нетривиального выражения. А затем в отладчике посмотреть уже готовый результат вместо утомительных попыток понять, куда наш неутомимый компилятор опять заоптимизировал переменную.
Feb 13, 2011 · Comments
ПрограммированиеNDIS
Писал я тут свой первый драйвер для сетевой карты. Взял, как полагается, за основу готовый образец драйвера. Выкинул всю аппаратно-зависимую часть. Добавил свою. По ходу дела выяснил, что tear-down код в примере отсутствует напрочь, чтение стандартной конфигурации не сделано, кругом hardcoded константы. В общем, обычная история, что вы хотите от образца?
Дописал до работающего состояния, протестировал скорость TCP/IP соединения. Получается примерно 3 MByte/sec на одно соединение, около 12 MByte/sec – пиковая пропускная способность нескольких параллельных соединений. Маловато для 1 Gbit/sec соединения.
Read On →
Feb 9, 2011 · Comments
Интервью
В комментариях к задаче про пакеты было задано много вопросов. Отвечу здесь.
Во-первых, задача действительно простая, иначе никак не уложиться в формат собеседования. На написание кода и сопутствующее общение есть всего около получаса. Плюс писать код на доске сложнее, чем в любимом редакторе. Тем не менее, в задаче любовно набросано граблей, на которые по возможности кандидат должен суметь не наступить. Условие задачи не полное (естественно!), не смотря на кажущееся обилие деталей. Кандидат всегда может прояснить у собеседующего недостающие детали и получить +1 к карме. Либо он может её решить, предположив разумные умолчания. В этом случае собеседующий всегда может добавить недостающее условие к задаче и попросить поправить код соответственно.
Read On →
Feb 8, 2011 · Comments
Интервью
А хотите задачку, которую я даю претендентам на контрактную позицию в нашей команде? Вот она, родимая. Есть библиотечная функция:
char get_byte(); Функция читает байт из некоего соединения. При необходимости, функция ждет, пока не придет очередной байт. По соединению пересылаются пакеты следующего формата: два байта длины, за которыми следует данные. Длина пакета включает в себя заголовок пакета, т.е. те самые два байта.
Нужно написать функцию recv, получающую очередной пакет:
size_t recv(char* buf, size_t size); В buf передается указатель на буфер, куда должен быть записан пакет (полностью, включая заголовок).
Read On →