Сейчас на форуме: 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 мкс Данный код может быть использован при написании сетевых приложений, например для того чтобы точно регуоировать скорость выходного трафика. |
|
Создано: 11 апреля 2010 20:17 · Поправил: ADACH · Личное сообщение · #2 Самовыгружение dll из памяти. Ф-я принимает параметром ImageBase модуля который необходимо выгрузить. Warning! Поток в чьём контексте исполняется код, будет закрыт. Code:
|
|
Создано: 12 апреля 2010 09:41 · Личное сообщение · #3 |
|
Создано: 12 апреля 2010 12:57 · Личное сообщение · #4 |
|
Создано: 12 апреля 2010 16:05 · Личное сообщение · #5 |
|
Создано: 12 апреля 2010 22:08 · Личное сообщение · #6 |
|
Создано: 22 мая 2010 15:10 · Поправил: punxer · Личное сообщение · #7 |
|
Создано: 22 мая 2010 16:00 · Личное сообщение · #8 Code:
|
|
Создано: 22 мая 2010 16:01 · Личное сообщение · #9 Code:
|
|
Создано: 22 мая 2010 16:03 · Личное сообщение · #10 |
|
Создано: 26 мая 2010 14:34 · Личное сообщение · #11 Делает текущего пользователя владельцем файла Code:
|
|
Создано: 26 мая 2010 14:37 · Личное сообщение · #12 Добавляет ДЛЛ в таблицу импорта Code:
|
|
Создано: 26 мая 2010 14:45 · Личное сообщение · #13 |
|
Создано: 26 мая 2010 14:54 · Личное сообщение · #14 |
|
Создано: 26 мая 2010 14:59 · Поправил: punxer · Личное сообщение · #15 Оборачиваем чужой сокет в SSL Код выдернут из проекта так что много лишнего но суть ясна Code:
|
|
Создано: 27 мая 2010 05:42 · Поправил: HiEndsoft · Личное сообщение · #16 punxer прям прорвало тебя Вот старье от меня, прямо перед сисколом помена в ntdll на свой обработчик Code:
----- продавец резиновых утёнков |
|
Создано: 27 мая 2010 14:56 · Личное сообщение · #17 немного макросов и их применения Code:
Code:
|
|
Создано: 27 мая 2010 14:58 · Личное сообщение · #18 Немного DDraw Code:
|
|
Создано: 27 мая 2010 15:00 · Личное сообщение · #19 Code:
|
|
Создано: 27 мая 2010 15:01 · Поправил: punxer · Личное сообщение · #20 |
Ранг: 281.8 (наставник), 272thx Активность: 0.25↘0.01 Статус: Участник Destroyer of protectors |
Создано: 27 мая 2010 17:21 · Личное сообщение · #21 |
|
Создано: 28 мая 2010 07:57 · Личное сообщение · #22 Кидаю. Прорисовка подерх чужого DirectDraw7 Code:
Code:
Code:
Code:
Code:
Code:
|
|
Создано: 28 мая 2010 08:00 · Личное сообщение · #23 Code:
|
|
Создано: 01 июня 2010 09:06 · Личное сообщение · #24 Перехват функций с нестандартным не 5-байтовым прологом с помощью мостов. Code:
|
|
Создано: 02 июня 2010 11:37 · Поправил: HiEndsoft · Личное сообщение · #25 |
|
Создано: 02 июня 2010 21:02 · Личное сообщение · #26 |
|
Создано: 02 июня 2010 22:39 · Поправил: HiEndsoft · Личное сообщение · #27 |
|
Создано: 02 июня 2010 22:56 · Личное сообщение · #28 |
|
Создано: 02 июня 2010 23:01 · Личное сообщение · #29 |
|
Создано: 02 июня 2010 23:14 · Поправил: Модератор · Личное сообщение · #30 |
|
Создано: 02 июня 2010 23:14 · Поправил: HiEndsoft · Личное сообщение · #31 1. Утверждение: punxer пишет: как показывает опыт для WIN32API хватает 5 байт - не верно. 2. punxer пишет: connect [ws2_32] перехватывается и стандартно -5 connect [ws2_32] WinXP SP3: Code:
- уже 6 байт. Прежде чем копипастить здесь вагонами, в дизассемблер загляните. punxer пишет: конвертация исполняемого файла EXE в DLL Ув. модераторы: сбейте этот самолет он загнался. ----- продавец резиновых утёнков |
<< . 1 . 2 . 3 . >> |
eXeL@B —› Программирование —› Небольшие полезные коды |