Blog. Just Blog

Быстрый поиск

Введите фрагмент названия статьи для поиска

Программное выключение монитора

08.02.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Выключить монитор из программы можно, но только если он совместим со стандартом EnergyStar. Об этом можно не беспокоиться, все современные мониторы удовлетворяют этому условию. Беспокоиться надо о другом. По непонятной причине с сайта на сайт упорно копируют один и тот же код на разных языках программирования, который якобы должен выключить монитор. Вот его вариант на Ассемблере:
  1. ; ВНИМАНИЕ! Это НЕПРАВИЛЬНЫЙ код!!!
  2. invoke  GetDesktopWindow
  3. invoke  SendMessage, eax, WM_SYSCOMMAND, SC_MONITORPOWER, 0
Во-первых, через хэндл из функции GetDesktopWindow достучаться до монитора не получится, причем ни в обычном Explorer'e, ни в альтернативных шеллах типа Aston Desktop. Чтобы сообщение дошло до нужного адресата, надо использовать широковещательную рассылку через HWND_BROADCAST. Во-вторых, непонятно откуда взялся последний параметр - 0. В MSDN четко прописано, что для выключения монитора через SC_MONITORPOWER значение lParam должно быть равно 2. Более того, нулевого значения параметра для этого сообщения вообще не предусмотрено. В двух строчках кода две принципиальные ошибки! И это уже далеко не первый случай, когда код из различных популярных источников является заведомо нерабочим. Всем любителям бездумного копипаста очень рекомендую сперва сверяться с первоисточниками, а перед публикацией проверять весь код на практике.

Но хватит о грустном. Правильный код программного выключения монитора будет таким:
  1. ;-------------------------------------------------
  2. ; Правильный код выключения монитора
  3. ;-------------------------------------------------
  4. ; В FASM не определена константа HWND_BROADCAST, сделаем это самостоятельно
  5. HWND_BROADCAST = 0FFFFh
  6. ; Выключить монитор
  7. invoke  SendMessage, HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, 2
Для включения монитора обратно достаточно пошевелить мышкой или нажать любую кнопку на клавиатуре. А можно также сделать это из нашей программы. У копипастеров этот код также содержит ошибку, потому что для включения монитора значение lParam должно быть равно -1, а не 1.

Читать статью целиком »
Просмотров: 13214 | Комментариев: 20

Apache Server Control 1.1a

23.01.2009 | Категория: Мои программы | Автор: ManHunter

Скриншот программы Apache Server Control

Еще одна программа, написанная для личных нужд. Apache Server Control позволяет управлять HTTP-сервером Apache версий 1.3.x под Windows: запускать, останавливать и перезапускать его службу. В дистрибутивах Apache 2.x аналогичная программа уже имеется. Кроме управления сервером вы можете редактировать файлы hosts и httpd.conf прямо в окне Apache Server Control. Программа должна находиться в одном каталоге с установленным Apache, тогда все пути к нужным файлам будут определены автоматически. Я использую Apache Server Control когда надо по-быстрому добавить локальный хост, прописать его во все настройки и перезапустить Apache. Может еще кому пригодится.

Читать статью целиком »
Просмотров: 4436 | Комментариев: 5

Рекурсивный обход дерева каталогов

19.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Обход дерева каталогов является одной из классических прикладных задач на применение рекурсии. В Windows штатных API-функций для этого нет, поэтому поиск файлов выполняется при помощи пары API-функций FindFirstFile и FindNextFile. Совершенно непонятно, почему разработчики Windows не дали возможность точно настраивать критерии поиска, ограничившись только маской имени файла. Даже в MS-DOS для решения аналогичной задачи можно было задать по крайней мере атрибуты файлов, например для поиска только каталогов. Более расширенные возможности для поиска предоставляет API-функция FindFirstFileEx, но она доступна только в операционной системе Windows 2000 и выше.

Для рекурсивного обхода дерева каталогов я написал следующую функцию. Она сканирует дерево каталогов, начиная с указанного, и передает все найденные имена файлов в заданную функцию-обработчик. Все действия с найденными файлами выполняются уже в ней.
  1. ;------------------------------------------------------------------
  2. ; Функция рекурсивного обхода дерева каталогов
  3. ; (C) ManHunter / PCL
  4. ; http://www.manhunter.ru
  5. ;
  6. ; Параметры вызова:
  7. ; lpFStr - указатель на начальный каталог без завершающего слеша.
  8. ;          он должен быть в буфере размером не менее MAX_PATH байт
  9. ; lpProc - указатель на callback-функцию для передачи имен файлов,
  10. ;          это обязательный параметр
  11. ; dFlag  - флаг "передавать в callback-функцию имена найденных
  12. ;          каталогов" (TRUE/FALSE)
  13. ;------------------------------------------------------------------
  14. proc    FindFileRecursive lpFStr:dword,lpProc:dword,dFlag:dword
  15.         local   hFind:DWORD     ; Локальный хэндл текущего поиска
  16.  
  17.         locals
  18.         FndData WIN32_FIND_DATA ; Локальная структура WIN32_FIND_DATA
  19.         endl
  20.  
  21.         ; Сохранить изменяемые регистры
  22.         push    ebx ecx edx
  23.  
  24.         ; Добавить к пути поиска '\*.*'
  25.         invoke  lstrcat,[lpFStr],ff_mask
  26.  
  27.         ; Найти первый файл
  28.         lea     eax,[FndData]
  29.         push    eax
  30.         invoke  FindFirstFile,[lpFStr]
  31.         ; В случае ошибки полностью прекратить дальнейшее сканирование
  32.         cmp     eax,INVALID_HANDLE_VALUE
  33.         jne     @f
  34.         xor     eax,eax
  35.         jmp     ff_exit
  36. @@:
  37.         ; Сохранить хэндл текущего поиска
  38.         mov     [hFind],eax
  39.  
  40. ff_chk_file:
  41.         ; Проверить имя файла на недопустимое
  42.         lea     eax,[FndData.cFileName]
  43.         push    eax
  44.         ; Имя файла '.'
  45.         invoke  lstrcmp,ff_skip1
  46.         or      eax,eax
  47.         ; Да, пропустить
  48.         jz      ff_next_file
  49.  
  50.         lea     eax,[FndData.cFileName]
  51.         push    eax
  52.         ; Имя файла '..'
  53.         invoke  lstrcmp,ff_skip2
  54.         or      eax,eax
  55.         ; Да, пропустить
  56.         jz      ff_next_file
  57.  
  58.         ; Если установлен флаг dFlag=TRUE, то передавать в callback-процедуру
  59.         ; все найденные результаты, в том числе и каталоги
  60.         cmp     [dFlag],0
  61.         jne     @f
  62.  
  63.         ; Установлен флаг передавать только файлы. Проверить атрибуты
  64.         ; найденного файла
  65.         mov     eax,[FndData.dwFileAttributes]
  66.         and     eax,FILE_ATTRIBUTE_DIRECTORY
  67.         ; Это каталог, пропустить
  68.         jnz     ff_do_not_callback
  69. @@:
  70.         ; Вычислить длину текущей строки поиска и обрезать '*.*'
  71.         invoke  lstrlen,[lpFStr]
  72.         sub     eax,3
  73.         add     eax,[lpFStr]
  74.         mov     byte [eax],0
  75.         push    eax
  76.  
  77.         ; Дописать к пути имя найденного файла или каталога
  78.         lea     eax,[FndData.cFileName]
  79.         push    eax
  80.         invoke  lstrcat,[lpFStr]
  81.         ; Передать имя файла в callback-функцию
  82.         stdcall [lpProc],[lpFStr]
  83.  
  84.         ; Вернуть маску поиска на место
  85.         pop     ecx
  86.         mov     dword [ecx],'*.*'
  87.  
  88.         ; Если callback-функция вернула 0, то прекратить сканирование
  89.         or      eax,eax
  90.         jz      ff_stop_scan
  91.  
  92.         ; Это каталог?
  93.         mov     eax,[FndData.dwFileAttributes]
  94.         and     eax,FILE_ATTRIBUTE_DIRECTORY
  95.         je      ff_next_file
  96.  
  97. ff_do_not_callback:
  98.         ; Вычислить длину текущей строки поиска и обрезать '*.*'
  99.         invoke  lstrlen,[lpFStr]
  100.         sub     eax,3
  101.         add     eax,[lpFStr]
  102.         mov     byte [eax],0
  103.         push    eax
  104.  
  105.         ; Дописать к пути имя найденного каталога
  106.         lea     eax,[FndData.cFileName]
  107.         push    eax
  108.         invoke  lstrcat,[lpFStr]
  109.  
  110.         ; Рекурсивный вызов поиска файлов в новом каталоге
  111.         stdcall FindFileRecursive,[lpFStr],[lpProc],[dFlag]
  112.  
  113.         ; Вернуть маску поиска на место
  114.         pop     ecx
  115.         mov     dword [ecx],'*.*'
  116.  
  117.         ; Если callback-функция вернула 0, то прекратить сканирование
  118.         or      eax,eax
  119.         jz      ff_stop_scan
  120.  
  121. ff_next_file:
  122.         ; Найти следующий файл
  123.         lea     eax,[FndData]
  124.         push    eax
  125.         invoke  FindNextFile,[hFind]
  126.         or      eax,eax
  127.         ; Файл найден, обработать его
  128.         jnz     ff_chk_file
  129.         ; По умолчанию установить флаг "продолжать сканирование"
  130.         mov     eax,TRUE
  131. ff_stop_scan:
  132.         ; Закрыть хэндл текущего поиска
  133.         push    eax
  134.         invoke  FindClose,[hFind]
  135.         pop     eax
  136. ff_exit:
  137.         ; Восстановить измененные регистры
  138.         pop     edx ecx ebx
  139.  
  140.         ; Возврат из процедуры.
  141.         ; Код возврата EAX=1 - продолжать сканирование, EAX=0 - стоп
  142.         ret
  143.  
  144. ff_mask  db '\*.*',0    ; Маска файлов для поиска
  145. ff_skip1 db '.',0       ; Запрещенное имя файла
  146. ff_skip2 db '..',0      ; Запрещенное имя файла
  147.  
  148. endp
Путь к начальному каталогу должен размещаться в буфере размером не менее определенного в системе MAX_PATH (обычно 256 символов). Обязательным параметром является адрес callback-функции RecursiveFindFileProc, которой поочередно передаются все результаты поиска. Флаг dFlag указывает, будут передаваться в callback-функцию все найденные результаты, включая каталоги, или же будут передаваться только найденные файлы. Код возврата из FindFileRecursive EAX=1 - сканирование было закончено, когда больше ни одного файла не было найдено, EAX=0 - сканирование завершилось аварийно или же было остановлено из callback-функции.

Читать статью целиком »
Просмотров: 7962 | Комментариев: 2

Chameleon Clock Fixer 1.0

28.11.2008 | Категория: Мои программы | Автор: ManHunter
Есть такая хорошая программа-часики Chameleon Clock, всех ее достоинств расписывать не буду, кто пользуется - тот знает. Но к сожалению, примерно с версии 3.10, в ней перестала работать опция "Убрать из Alt-Tab". В настройках галочка ставится, но фактически ничего не происходит. Автор на багрепорты и просьбы пользователей не реагирует, предпочитает тратить свое время на борьбу с варезными ссылками на файлообменниках. Пришлось самому писать мелкую утилитку для принудительного убирания значка Chameleon Clock из меню Alt-Tab. Противозаконных действий эта программа не выполняет, никаких защит не ломает и изменений в файлы не вносит, так что всякие заshitники аффтарских прав могут не напрягаться.

Chameleon Clock Fixer сделан в двух вариантах: загрузчик основной программы и стационарная версия. Loader рекомендуется использовать в автозагрузке. Для этого отключите в Chameleon Clock штатную функцию автозагрузки, поместите файл chamfix_loader.exe в папку с программой и пропишите в автозагрузку ярлычок на него. Рабочей папкой в ярлыке загрузчика укажите папку Chameleon Clock. Стационарная версия chamfix_standalone.exe после запуска выдерживает паузу в 5 секунд и потом выполняет основные действия. Ее рекомендуется использовать когда Chameleon Clock уже запущен, но также можно использовать в автозагрузке, при условии что стационарная версия будет запускаться после Chameleon Clock.

Читать статью целиком »
Просмотров: 7628 | Комментариев: 7

Время непрерывной работы (Uptime) Windows

01.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для получения времени непрерывной работы системы обычно используется функция API GetTickCount. Она возвращает количество миллисекунд, прошедших с момента последнего старта системы. Проблема в том, что счетчик имеет тип dword, и по прошествии примерно 50 дней (49,7 если быть точным) достигает предельного значения и обнуляется. Конечно, продержать систему без перезагрузки почти два месяца трудно, но не значит что невозможно. Поэтому для получения гарантированно точного времени работы системы воспользуемся функцией NtQuerySystemInformation. Достаточно долго эта функция относилась к разряду недокументированных, теперь же на MSDN по ней имеется описание с примечанием, что ее использование в прикладных программах все равно нежелательно.
  1. ; Сегмент данных
  2. section '.data' data readable writeable
  3.  
  4. ; По умолчанию структура в FASM не определена, сделаем это самостоятельно
  5. ; Для получения необходимой информации нужны только два первых значения
  6. struct SYSTEM_TIME_INFORMATION
  7.        liKeBootTime       dq ?  ; Время старта системы
  8.        liKeSystemTime     dq ?  ; Текущее время
  9.        liExpTimeZoneBias  dq ?
  10.        uCurrentTimeZoneId dd ?
  11.        dwReserved         dw ?
  12. ends
  13.  
  14. SystemTime   SYSTEM_TIME_INFORMATION  ; Наша структура с данными
  15.  
  16. ; Константа нужного класса информации тоже не определена, сделаем это сами
  17. GET_SYSTEM_TIME_INFORMATION = 3 
  18.  
  19. ; Сегмент кода
  20. section '.code' code readable executable
  21. ...
  22.         invoke  NtQuerySystemInformation, GET_SYSTEM_TIME_INFORMATION,\
  23.                 SystemTime, sizeof.SYSTEM_TIME_INFORMATION, 0
  24.         ; Записать в регистры EDX:EAX текущее время в миллисекундах
  25.         mov     eax, dword [SystemTime.liKeSystemTime]
  26.         mov     edx, dword [SystemTime.liKeSystemTime+4]
  27.         ; Вычесть время старта системы
  28.         sub     eax, dword [SystemTime.liKeBootTime]
  29.         sbb     edx, dword [SystemTime.liKeBootTime+4]
  30.         ; Теперь в регистры EDX:EAX записано реальное количество миллисекунд,
  31.         ; прошедшее с момента старта системы
  32. ...
Преобразовать миллисекунды в обычный вид даты и времени можно при помощи пары стандартных функций FileTimeToLocalFileTime и FileTimeToSystemTime.

Читать статью целиком »
Просмотров: 5484 | Комментариев: 1

Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.17 сек. / MySQL: 3 (0.0672 сек.) / Память: 4.75 Mb
Наверх