
Быстрый поиск
Введите фрагмент названия статьи для поиска
Как узнать, что программа запущена под Администратором
20.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Как узнать, что программа запущена под Администратором
Иногда требуется узнать, запущена ли ваша программа под учетной записью с правами Администратора, или же от обычного пользователя. Для чего это нужно? Например, некоторые операции с реестром или файлами требуют права Администратора. При попытке выполнить их обычному пользователю вернется ошибка ERROR_ACCESS_DENIED, но для более точного анализа ситуации надо будет проверить права доступа и уведомить об этом пользователя. Проверить, что программа запущена под Администратором, можно несколькими способами.
Читать статью целиком »
Просмотров: 10998 | Комментариев: 25
Диалог открытия файлов и юзабилити Windows
02.11.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
При всех удобствах Windows некоторые моменты меня очень сильно раздражают. Особенно поведение системы при вызове диалогов открытия файлов. Сперва немного предыстории. При работе с файлами через функцию GetOpenFileName или GetSaveFileName в структуре OPENFILENAME есть возможность указать путь, который должен открыться по умолчанию. Если это значение не задано, то система сама где-то запоминает папку, в которой последний раз был удачно открыт файл (то есть окно выбора файла было закрыто через кнопку "Ok"). Где именно хранится эта информация - я пока не выяснил, да и не особо надо. Второй вариант. Предположим, что некоторая программа самостоятельно запоминает путь к папке, в которой последний раз ею выполнялись какие-то действия с файлами. Это может быть, например, текстовый редактор, просмотрщик графики и т.п., не суть. Главное, что задумка очень хорошая и правильная. При следующем запуске или вызове диалога выбора файла в соответствующее поле OPENFILENAME будет подставлен сохраненный путь и пользователь продолжит работу с того места, где он в прошлый раз остановился. Что-то типа такого:Code (Assembler) : Убрать нумерацию
- ...
- invoke GetModuleHandle,0
- mov [ofn.hInstance],eax
- mov [ofn.lStructSize], sizeof.OPENFILENAME
- mov [ofn.hwndOwner],0
- mov [ofn.nMaxFile],MAX_PATH
- mov [ofn.lpstrFile],buff
- ; Открывать с последней сохраненной папки
- mov [ofn.lpstrInitialDir],saved_dir
- mov [ofn.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST
- invoke GetOpenFileName,ofn
- ...
Читать статью целиком »
Просмотров: 7477 | Комментариев: 6
Новый алгоритм получения Google PageRank
11.10.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Буквально на днях Google поменял алгоритм, по которому генерировалась ссылка для получения показателей Google PageRank. В результате этого отвалились многие сервисы, вспомогательные программы, сторонние тулбары, счетчики и еще бессчетное количество сеошного барахла. Мне было бы глубоко фиолетово на их проблемы, но у меня на сайте тоже используется система автоматического съема значений Google PR. Поэтому пришлось быстренько адаптироваться к новым условиям. Я установил себе гугловский тулбар, быстренько выпотрошил его и получил алгоритм генерации ссылки для получения Google PageRank. Вот как он выглядит на JavaScript:Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Программисты Google явно с юмором :)
- var HASH_SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. "+
- "Yes, I'm talking to you, scammer.";
- // Расчет хэша строки запроса
- awesomeHash = function(a) {
- var b = 16909125;
- for (c = 0; c < a.length; c++) {
- b ^= HASH_SEED.charCodeAt(c % HASH_SEED.length) ^ a.charCodeAt(c);
- b = b >>> 23 | b << 9;
- }
- return '8'+hexEncodeU32(b);
- };
- // Перевод числа в HEX-значение
- hexEncodeU32 = function(a) {
- var b = toHex8(a >>> 24);
- b += toHex8(a >>> 16 & 255);
- b += toHex8(a >>> 8 & 255);
- return b + toHex8(a & 255)
- };
- toHex8 = function(a) {
- return (a < 16 ? "0": "") + a.toString(16)
- };
- // Функция получения ссылки для запроса Google PR
- getPageRankLink = function(a) {
- return 'http://toolbarqueries.google.ru/tbr?features=Rank'+
- '&client=navclient-auto-ff&ch='+awesomeHash(a)+'&q=info:'+
- encodeURIComponent(a);
- }
- </script>
Code (JavaScript) : Убрать нумерацию
- <script type="text/javascript">
- // Пример использования
- st='http://www.manhunter.ru/'
- alert(getPageRankLink(st));
- </script>
Читать статью целиком »
Просмотров: 7457 | Комментариев: 12
Расчет CRC8 на Ассемблере
25.09.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
Контрольная сумма CRC8 применяется в основном для коротких сетевых пакетов и в микроконтроллерах. Из-за большой вероятности появления коллизий, использовать ее можно или для контроля целостности небольших объемах данных (оптимально - до 15 байт информации), или в случаях, когда возможность появления искажений исходных данных крайне мала. Алгоритм расчета CRC8 реализуется очень просто, работает очень быстро, из-за чего до сих пор находит свое применение. Первый вариант - прямой расчет.Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------------------------
- ; Функция вычисления хеша CRC8
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;-----------------------------------------------------------------------
- ; Параметры:
- ; lpData - указатель на строку
- ; dSize - длина строки
- ; На выходе:
- ; AL = полученный хеш
- ;-----------------------------------------------------------------------
- proc CRC8 lpData:DWORD, dSize:DWORD
- push ebx ecx edx esi edi
- CRC8_POLYNOM = 31h
- ; Инициализация
- mov al,0FFh
- ; Длина строки
- cmp [dSize],0
- je .loc_ret
- ; Указатель на начало строки
- xor ecx,ecx
- @@:
- ; Получить символ из строки
- mov ebx,[lpData]
- xor al,byte [ebx+ecx]
- xor esi,esi
- .loc_cycle:
- test al,80h
- jz .loc_1
- shl al,1
- xor al,CRC8_POLYNOM
- jmp .loc_next
- .loc_1:
- shl al,1
- .loc_next:
- inc esi
- cmp esi,8
- jb .loc_cycle
- ; Следующий символ
- inc ecx
- cmp ecx,[dSize]
- jb @b
- .loc_ret:
- and eax,0FFh
- pop edi esi edx ecx ebx
- ret
- endp
Читать статью целиком »
Просмотров: 12304 | Комментариев: 3
Принудительное завершение процесса
20.08.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter

Принудительное завершение процесса
Рано или поздно в программистской практике возникает задача по управлению процессами, в частности их принудительного завершения. Для дочерних процессов, порожденных собственным приложением, обычно хватает вызова TerminateProcess, но в некоторых случаях требуется принудительно завершить чужой процесс. Зная идентификатор процесса сделать это не составит большого труда. Открываем процесс функцией OpenProcess с правами PROCESS_TERMINATE, а затем, в случае успеха, отдаем полученный хэндл функции TerminateProcess. Вроде бы все просто, но не тут-то было.
Читать статью целиком »
Просмотров: 8712 | Комментариев: 18


