Сейчас на форуме: tyns777 (+4 невидимых) |
eXeL@B —› Программирование —› Небольшие полезные коды |
. 1 . 2 . 3 . >> |
Посл.ответ | Сообщение |
|
Создано: 09 февраля 2010 18:42 · Поправил: Vol4ok · Личное сообщение · #1 Часто во время написания проектов возникают небольшие, но при этом довольно общие задачи, которые потом могут быть использованы в будущем, вот эта тема как раз для этого. В этой теме предлагаю размещать небольшие фрагменты кода, которые могут применятся в повседневной практике системного программирования. В этом топике можно - размещать только свои коды, а не копировать из общедоступных источников - желательно хорошо протестировать код, прежде чем разместить его. Если вы не уверены, что код работает точно будет работать так как надо на всех ОС и всех процах, то надо пометить - где и каким образом тестировался этот код, или вообще написать что код не тестирован (хорошо подумав при это, стоит ли вообще такой код размещать). - нормально его оформить, чтобы тот кому этот код пригодится смог разобраться в нем быстрее чем писать это же с нуля. Обязательно должны быть описания входных и выходных данных. Крайне приветствуются цели создания кода, основные требования которым он удовлетворяет, и описание того как работает этот код. Также приветствуются багфиксы, замечания по коду и варианты оптимизации. Итак начну с себя. Недавно столкнулся с необходимостью делать высокоточные паузы в работе кода, в моем случае необходимо было достигать точности десятых милисекунд. В итоге я написал микросекундный таймер Code:
- timeout - время таймаута в микросекундах код рекомендуется выполнять с повышением точности обыкновенного слипа, например так: #include <Mmsystem.h> ... timeBeginPeriod(1); precision_sleep(timeout); timeEndPeriod(1); Код делает таймауты с микросекундой точностью. Как извесно простой Sleep имеет огромную погрешность, допутим Sleep(1) - в нормальных условиях выполнется около 10-15мс (1,5-2мс при установке timeBeginPeriod(1)). Высокая точность достигается за счет использования цикла опроса высокоточного системного таймера (период <1нс - на современных компах и 300-400нс на более старых). Минимальная погрешность данной функции равна времени вызова QueryPerformanceCounter - которое на современных компах равно 200-300нс, на компах по старше может доходить до микросекунды. Ес-но в условиях нехватки процессорного времени погрешность может значительно возрастать. Конечно такой метод измерения сильно грузит проц, поэтому при ожидании более 1мс будет использоваться обыкновенный слип, но поскольку он имеет большую погрешность, то динамически в при многократном вызове, precision_sleep проводит пересчет предельной погрешности слипа, подгоняя его под оптимальное значение, при котором будет сохранена хорошая точность при минимальной нагрузке на процессор. Однако не смотря на это всегда имеется вероятность того что слип превысит предельное время и внесет дополнительную погрешность. Код тестировался на 2х ядероном компе с процом core2duo и на старом одноядерном Celeron-е При тестировании интервалов больших 3мс загрузка процессора скачет 1% до 15%, при интервалах больих 10мс в средем чтото около 2-3%. Хуже всего дело обстоит с таймаутами порядка 1мс и менее, загрузка может быть очень большой, так как слип в этом случае не работает, чуть чуть улутшить положение можно если заменить for (i=0;i<YIELD_LOOP;i++) YieldProcessor(); на Sleep(0), будет небольшая потеря точности, на моем компе Sleep(0) работает примерно за 1-2мкс (на старых компах может быть еще больше) когда YIELD_LOOP работает < 1 мкс Данный код может быть использован при написании сетевых приложений, например для того чтобы точно регуоировать скорость выходного трафика. |
|
Создано: 09 февраля 2010 20:23 · Личное сообщение · #2 DaRKSiDE пишет: Если эти коды будут еще и на асме... будет еще лучше Не вижу смысла писать такие вещи на асме, т. к. гимор >> польза. Следующим полезным кодом которым бы я хотел поделится, это моя реализация спинлоков (некое отдаленное подобие ядерных, только для юзер мода). Реализации возникла в следствии моих исследований по задаче описанной в этом топике. Code:
Как видно реализация простая как грабли, но зато тесты впечатляют. По-скольку наиболее быстрым аналогом спинлоков в версиях Windows <6 яаляется критическая секция, то сравнения производительности проводятся именно с ней. ------ итак, результаты тестирования для 64 потоков на 2х ядерном компе для обыкновенных критических секций 772.895203 с (суммарное время выполнение всех потоков) 12.076488 с (среднее время выполнения одного потока) для критических секций с оптимально подобранным значением spincount 354.903735 с 5.545371 с для моих спинлоков 110.581553 с 1.727837 с производительность на 220% выше -------- результаты тестирования для 2х потоков на 2х ядерном компе для критических секций с оптимально подобранным значением spincount 3.316628 с 1.658314 с для моих спинлоков 1.062527 с 0.531264 с производительность на 212% выше -------- результаты тестирования для 64 потоков на 1х ядерном компе для критических секций 580.160929 с 9.065015 с для моих спинлоков 494.444996 7.725703 производительность на 17% выше -------- Ес-но использование спинлоков подразумевает короткие обращения к разделяемым ресурсам, иначе их использование не будет оправданным. Я к сожалению пока поленился протестить на моих тестах SRW-локи, которые идут в винде начиная с висты, но на компах с ХП, не вижу реально ничего лучше. |
|
Создано: 10 февраля 2010 11:33 · Поправил: HiEndsoft · Личное сообщение · #3 Code:
Code:
----- продавец резиновых утёнков |
|
Создано: 10 февраля 2010 14:42 · Поправил: multiarc · Личное сообщение · #4 Code:
Code:
Code:
Code:
|
|
Создано: 10 февраля 2010 15:01 · Поправил: multiarc · Личное сообщение · #5 Code:
Code:
Code:
Code:
|
|
Создано: 10 февраля 2010 15:03 · Личное сообщение · #6 Code:
Code:
Code:
Code:
Code:
|
|
Создано: 10 февраля 2010 15:05 · Личное сообщение · #7 Code:
|
|
Создано: 10 февраля 2010 15:36 · Личное сообщение · #8 |
|
Создано: 10 февраля 2010 18:21 · Поправил: Vol4ok · Личное сообщение · #9 Реализация двусвязных списков, аналогичных ядерным, но для юзермода, написаны с использовании моих спинлоков, код которых описан выше. В качестве мануала по использованию можно читать WDK, все входные и выходные данные совпадают Code:
|
|
Создано: 10 февраля 2010 18:48 · Личное сообщение · #10 multiarc > так же желательно сделать все вызовы нативными, для возможности инжекта так же в графическую подсистему csrss! Нэйтив юзается изза следующих причин: o Самодостаточный код(вызов непосредственно через шлюзы). o Если не достаточно функционала более высокоуровневого кода. csrss это обычный гуи-процесс. > получает адрес процедуры в нужной библиотеке в чужом процессе Для этого есть системные апи, например RtlQueryProcessDebugInformation(). |
|
Создано: 10 февраля 2010 23:01 · Личное сообщение · #11 |
|
Создано: 11 февраля 2010 10:22 · Личное сообщение · #12 Замудреный юзермодный протектор от удаленных потоков (натив) 3726_10.02.2010_CRACKLAB.rU.tgz - InjProt.7z ----- продавец резиновых утёнков |
|
Создано: 11 февраля 2010 11:15 · Поправил: Twister · Личное сообщение · #13 HiEndsoft 1. GetProcAddressEx() не учитывает того, что возможен IAT-перехват искомой функции. Если это случится, все пойдет прахом. 2. Обработчик NewNtCreateThread() не учитывает того, что в PCLIENT_ID a5 может быть передан NULL. Сами знаете, чем такое закончится. 3. Внутри программы сервис NtCreateThread() может быть вызван напрямую в обход ntdll. В этом случае ваш алгоритм не распознает свой поток и прибъет его. |
|
Создано: 11 февраля 2010 11:19 · Поправил: HiEndsoft · Личное сообщение · #14 Clerk NtQueryVirtualMemory - тоже функция ничего для получения карты памяти процесса Twister Панацей не бывает в юзермоде (и даже практически в ядре) + Код делался для собственных целей для псевдозащиты cssrs тонкости там сами понимаете какие. Винду придумали-это хорошо, но идиоты - это плохо. ----- продавец резиновых утёнков |
|
Создано: 11 февраля 2010 12:32 · Поправил: Модератор · Личное сообщение · #15 |
|
Создано: 11 февраля 2010 13:30 · Поправил: HiEndsoft · Личное сообщение · #16 Либа для работы с частотниками Mitsubishi по RS485. (сорцы Си 6) d31f_11.02.2010_CRACKLAB.rU.tgz - watersky.7z ----- продавец резиновых утёнков |
|
Создано: 12 февраля 2010 00:44 · Поправил: Valemox · Личное сообщение · #17 |
|
Создано: 12 февраля 2010 01:10 · Поправил: Clerk · Личное сообщение · #18 HiEndsoft > NtQueryVirtualMemory - тоже функция ничего для получения карты памяти процесса Согласен, но причём тут это ? > Замудреный юзермодный протектор от удаленных потоков (натив) Сложный != эффективный. Code:
Тэги только у меня не робят, тогда как цитировать ? |
|
Создано: 12 февраля 2010 08:20 · Личное сообщение · #19 Valemox пишет: хотел собрать либ и поюзать, но чота не нашлось ntundoc хидера, мож поделишся? в аттаче Clerk ты прав f3ca_11.02.2010_CRACKLAB.rU.tgz - ntundoc.h ----- продавец резиновых утёнков |
|
Создано: 12 февраля 2010 19:36 · Поправил: Clerk · Личное сообщение · #20 Coderess Значит я не правильно понял, пенгвинчег - Трушный хидер(*avrf, [FLG_APPLICATION_VERIFIER, VerifierDlls]): Code:
HiEndsoft > колес надо меньше жрать. Я -то по пивку. Сложно понять вас |
|
Создано: 15 февраля 2010 02:33 · Личное сообщение · #21 Установка, запуск, остановка и удаление драйвера. Код полностью не тестил, возможны мелкие баги. Code:
|
|
Создано: 15 февраля 2010 02:50 · Личное сообщение · #22 Макросы для памяти Code:
----- Shalom ebanats! |
|
Создано: 15 февраля 2010 03:02 · Поправил: Clerk · Личное сообщение · #23 Code:
|
|
Создано: 15 марта 2010 10:08 · Поправил: HiEndsoft · Личное сообщение · #24 Т.к. пишу в основном в нативе, пригождаются след коды. Натив -аналог SleepEx и Sleep: Code:
Натив -аналог Beep: Code:
И до кучи аналог MessageBox ч/з csrss(где ico - как и у MessageBox): Code:
Здесь только вида "OK",но можно переделать под OK/Cancel и т.п. Вывод отладочного сообщения с форматированием, например в Dbgview (не натив, позаимствовано у мелкософта): Code:
----- продавец резиновых утёнков |
|
Создано: 15 марта 2010 10:22 · Поправил: SLV · Личное сообщение · #25 Code:
----- Shalom ebanats! |
|
Создано: 15 марта 2010 18:42 · Поправил: HiEndsoft · Личное сообщение · #26 Выделение по-возможности непрерывного участка памяти в куче (натив) Code:
----- продавец резиновых утёнков |
|
Создано: 15 марта 2010 20:45 · Личное сообщение · #27 HiEndsoft пишет: Выделение по-возможности непрерывного участка памяти в куче (натив) Вообще-то любое выделение из кучи всегда возвращает непрерывный участок виртуальной памяти. Иначе и быть не может, т.к. мы получаем 1 указатель. Приведенный тобой код включает использование Low-fragmentation Heap аллокатора, что имеет совсем другой смысл. ----- PGP key |
|
Создано: 15 марта 2010 22:47 · Поправил: Rockphorr · Личное сообщение · #28 у меня предложение собирать все выложенное в инклуд файл и поставить сыль на него в первом посте имхо для версии 1.0 собрано уже достаточно все что выложено выше Clerk Ранг: 140.2 (ветеран) Статус: Участник Создано: 10 февраля 2010 18:48:00 Цитата Личное сообщение #10 multiarc > так же желательно сделать все вызовы нативными, для возможности инжекта так же в графическую подсистему csrss! Нэйтив юзается изза следующих причин: o Самодостаточный код(вызов непосредственно через шлюзы). o Если не достаточно функционала более высокоуровневого кода. csrss это обычный гуи-процесс. > получает адрес процедуры в нужной библиотеке в чужом процессе Для этого есть системные апи, например RtlQueryProcessDebugInformation(). скопипастил в атач зы: копипаститься неахти - то номера то решетки вылезают adc3_20.03.2010_CRACKLAB.rU.tgz - codekit.c.txt |
|
Создано: 16 марта 2010 11:00 · Поправил: HiEndsoft · Личное сообщение · #29 ntldr Извечная тема для споров. Rockphorr к модераторам обратись, идея не плохая. Обнаружение изменения в составе устройств на самом высоком уровне (в оконном обработчике очереди сообщений) (здесь - добавление устройства, например вставка флешки): Code:
----- продавец резиновых утёнков |
|
Создано: 17 марта 2010 10:19 · Личное сообщение · #30 Native-код, создающий на FAT - FAT32 томе "неудаляемую" папку. Code:
В аттаче консольная прожка - создает "неудаляемую" папку "autorun.inf" на указанном FAT- диске (может быть полезно для защиты от автозагрузки флешек) . f507_17.03.2010_CRACKLAB.rU.tgz - NODIR.zip ----- продавец резиновых утёнков |
. 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Небольшие полезные коды |