1. Trang chủ
  2. » Công Nghệ Thông Tin

delphi dưới con mắt của hacker tiếng Nga phần 9 pptx

36 224 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 36
Dung lượng 1,18 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Здесь может быть любая комбинация щих флагов:следую-• FS_CASE_IS_PRESERVED — указывает на то, что файловая система храняет регистр имен файлов, когда сохраняет имя на диске; со-• FS_CASE

Trang 1

Помимо доступного пространства можно узнать серийный номер тома, накотором установлена программа С помощью такого номера очень удобно инадежно делается защита от копирования программы без инсталляции По-сле установки программа может запомнить где-нибудь серийный номер то-

ма и затем проверять его при старте Если серийный номер изменился, топрограмма должна требовать переустановки, где вы можете реализовать бо-лее жесткие возможности защиты программы

Trang 2

if GetVolumelnformation( lpRootPathName, lpVolumeNameBuffer,

nVolumeNameSize, @lpVolumeSerialNumber, lpMaximumComponentLength,lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize )then

begin

VolumeName.Caption := lpVolumeNameBuffer;

VolumeSerial Caption := IntToHex(HB?ord(lpVolumeSerialNumber>, 4) + '-'

+ IntToHex(LOWord(lpVolumeSerialNumber), 4);

FileSysteniName.Caption:= lpFileSystemNameBuf fer;

GetDiskFreeSpace( PChar(DriveComboBoxl.Drive+':\'), Cluster, FBytesPerSector,

для предыдущих переменных

Для получения информации о выбранном диске используется цедура Getvoiumeinformation, у которой следующие параметры:

Trang 3

• флаги файловой системы Здесь может быть любая комбинация щих флагов:

следую-• FS_CASE_IS_PRESERVED — указывает на то, что файловая система храняет регистр имен файлов, когда сохраняет имя на диске;

со-• FS_CASE_SENSITIVE — файловая система чувствительна к региструимен файлов;

Вот теперь рассмотрим пример универсальной функции, которая вает размер диска:

рассчиты-function GetFreeDiskSize(Root: string): Longlnt;

var

SpC, BpS, NfC, TnC: DWORD;

FreeDiskSize: Double;

begin

Trang 4

вто-в секторе Результат расчета делим на 1024, чтобы перевто-вести результат из

байтов в килобайты.

На компакт-диске в директории \Примеры\Глава 6\System Info вы можетеувидеть пример программы, обсуждаемой в данном разделе

6.4 Частота и загрузка процессора

В этом разделе речь пойдет о сердце компьютера — процессоре Как быстро

он работает? Сильно ли его загружает то или иное приложение? На эти просы можно ответить самим, написав программы, тестирующие работупроцессора

во-6.4.1 Частота процессора

В данном разделе я хочу показать, как определить частоту работы

процессо-ра Несмотря на то, что в реальных условиях трудно найти пример

програм-мы, где это может пригодиться, используемые в этом примере приемыпрограммирования очень интересны и познавательны

текст Скорость процессора: Во втором мы будем выводить текст,

содержа-щий значение частоты процессора Мою форму программы вы можете деть на рис 6.5

Trang 5

1 В первой вызывается функция Getcpuspeed Результат ее выполненияпревращаем в строку с помощью функции FloatToStr и присваиваемкомпоненту TLabei, который отображает частоту процессора.

2 Во ВТОРОЙ вызывается Метод ProcessMessages, который ДЭ6Т Другим

программам поработать, чтобы наша маленькая утилита не отобрала всепроцессорное время и не произошел эффект зависания

Процедура Getcpuspeed приведена в листинге 6.3

Trang 6

TimerHi, TimerLo: DWORD;

PriorityClass, Priority: Integer;

asm

dw 310Fh

mov TimerLo, eax

mov TimerHi, edx

mov TimerLo, eax

mov TimerHi, edx

ка события onclick кнопки Запустить Перепишите ее себе, и сейчас мы

рассмотрим все содержимое процедуры более подробно,

В самом начале мы узнаем приоритет класса и приоритет потока с помощьюФУНКЦИЙ GetPriorityClass И GetThreadPriority По УМОЛЧЭНИЮ все Про-граммы получают нормальный приоритет и работают наравне с другими.Значения приоритетов сохраняются в отдельных переменных

Trang 7

После этого значения приоритетов изменяются на максимальные с помощьюфункций SetPriorityClass И SetThreadPriority Для класса устанавливаетсяприоритет реального времени — REALTIME_PRIORITY_CLASS ДЛЯ потока указыва-ется критический ко времени приоритет — THREAD_PRIORITY_TIME_CRITICAL ЭТО

необходимо, чтобы получить абсолютно все ресурсы компьютера

Изменив приоритет, делаем задержку в десять миллисекунд с помощью зова процедуры sieep(io), чтобы Windows смогла среагировать на измене-ния и выделить все ресурсы

вы-Вот теперь начинает происходить само определение частоты Для этого жды вызывается ассемблерный код Между вызовами происходит задержка

два-на период, указанный в константе DeiayTime Сам ассемблерный код я сывать не буду, потому что он выходит за рамки книги и потребует от вас до-полнительных знаний Я только скажу, что с помощью ассемблера замеряетсяработа таймера процессора за интервал времени, указанный в DeiayTime

распи-По умолчанию этот интервал равен 500 миллисекундам

После замера работы таймера значения приоритета класса и потока навливаются с помощью все тех же функций изменения приоритета и со-храненных исходных значений:

восста-SetThreadPriority(GetCurrentThread, Priority);

SetPriorityClass(GetCurrentProcess, PriorityClass);

Если этого не сделать, то может произойти сбой и Windows будет работатьнекорректно Критичный приоритет и приоритет реального времени отдаетпрограмме все ресурсы и могут произойти конфликты, потому что на такомприоритете работает только ядро Windows и некоторые особо критичныеприложения Если мы добавим свою программу, то она может конфликто-вать с ядром и вызвать системный сбой Именно поэтому желательно полу-чать у Windows такие ресурсы только на короткие промежутки времени.Результату выполнения функции я присваиваю результат расчета работычастоты Процессора— TimerLo / (ЮОО.О * DeiayTime} Именно ЭТО ЗНЭ-чение мы переводим потом в строку и выводим на экран

Trang 8

На компакт-диске в директории \Примеры\Глава 6\CPU Speed вы можетеувидеть пример этой программы.

6.4.2 Загрузка процессора

Для определения загрузки процессора я воспользуюсь модулем adCpuUsage,который написал Alexey A Dynnikov Этот человек явно русского происхож-дения, но писать его фамилию на русском я побоялся, чтобы случайно неошибиться в правильности написания Этот модуль вы можете найти накомпакт-диске в директории Headers или в той же директории, что и при-мер программы

Для реализации примера на форме нам понадобятся один компонент chart

с закладки Additional и таймер с закладки System У таймера нужно

устано-вить свойство Enabled равным true, чтобы после старта программы он сразу

же был во включенном состоянии Форму будущей программы вы можетеувидеть на рис 6.7

О 1 2 3 4 5 6 78 9 1011121314 1516 1718 1Э20 21 22 2324 25

Рис 6.7 Форма будущей программы определения загрузки процессора

Trang 9

В обработчике события onTimer компонента Ttimer пишем следующий код:procedure TForml.TimerlTimer(Sender: TObject);

Попробуйте скомпилировать пример и запустить на выполнение Убедитесь,что программа работает верно и без ошибок

Trang 10

цессора После этого запускается цикл от 0 до количества процессоров, тановленных на компьютере В большинстве случаев на компьютере уста-новлен только один процессор, но надо учитывать и сервера, где их можетбыть не только два, но и более.

ус-Внутри цикла проверяется: если у компонента charti, который строит фик по внесенным в него значениям, накопилось более 20 параметров, тонужно удалить самый старый из них, т е нулевой После этого в компонентcharti добавляется текущее значение загруженности, которое можно полу-чить с помощью функции Getcpuusage Это значение дается нам в долях(от нуля до единицы), поэтому его нужно умножить на 100, чтобы получитьпроцентное отношение

гра-На компакт-диске в директории \Примеры\Глава 6\CPU Usage вы можетеувидеть пример программы и цветные рисунки этого раздела

6.5 Работа с СОМ-портом

По своему опыту могу сказать, что работа с СОМ-портом одна из наиболеечасто решаемых задач на предприятиях, если не считать финансовых про-грамм На производствах везде используют современное оборудование(контроллеры, устройства сбора информации), с которыми чаще всего мож-

но работать через стандартный порт компьютера — СОМ

Порт СОМ в промышленности часто называют RS-232 Вы должны знатьэто название, чтобы случайно не растеряться, когда увидите его В докумен-тации на промышленные приборы используется именно это название, хотя

мы привыкли к названию СОМ-порт

Итак, для работы с портами компьютера я привык использовать компонентcomm32. ЭТОТ компонент я уже давно нашел на просторах сети Интернет

и немного переработал, усилив его надежность и улучшив возможности.Исходный код компонента вы можете найти на компакт-диске в директорииHeaders Он инсталлируется в Delphi, поэтому перед использованием его

нужно установить, выбрав в меню Component пункт Install Component

указы-П coitiLogFiieMame — имя файла, в который будет сохраняться вся

инфор-мация от работы с портом

Trang 11

Помимо этого, во время работы компонент использует следующие тельные настройки, которые нельзя изменить с помощью свойств

дополни-• четность — не установлена (с помощью четности проверяется ность передаваемых данных);

целост-О управление потоком — не установлено (может быть Xon, Xoff или ратное и также помогает обеспечить целостность данных)

Trang 12

прие-чтобы пользователь не нажал второй раз на кнопку Открыть порт, потому

что это вызовет ошибку

Не советую сразу же после открытия отправлять данные, потому что реальноданные могут не уйти После открытия порта желательно делать задержку хотя

бы в 100 миллисекунд Обычно я добавляю в проект следующую функцию:Procedure WaitT{time: integer);

за-В обработчике нажатия кнопки Послать нужно написать следующий код:

procedure TForml.SendButtonClick(Sender: TObject);

Trang 13

Запрос данных Введите данные, которые надо отправить

GK Cancel

Рис 6.10 Окно ввода отправляемых данных

Если пользователь ввел какие-нибудь данные и нажал ОК, то отправляем их

с помощью метода writeCommData компонента Сотшпзг У этого метода двапараметра:

• Отправляемые данные в формате pchar К отправляемым данным ляем символы конца строки и перевода каретки: #13#ю Эти символыочень часто используются в оборудовании

добав-D Во втором параметре указываем длину отправляемых данных Узнаем

длину введенной строки плюс два символа на перевод каретки и конецстроки

ДЛЯ Получения ДаННЫХ НУЖНО СОЗДатЬ Обработчик СОбыТИЯ OnReceiveDataкомпонента сот32 В этом обработчике я написал следующий код:

procedure TForml.Corrm321ReceiveData (Sender: TObject; Buffer: Pointer;BufferLength: Word);

Trang 14

Этот обработчик события будет вызываться каждый раз, когда на порт ходят какие-либо данные В качестве первого параметра нам передаетсястандартный параметр для любого обработчика — объект, сгенерировавшийсобытие Во втором параметре передается буфер, содержащий принятыеданные Третий параметр — размер принятых данных.

при-Теперь разберемся с кодом обработчика В первой строке кода преобразуемпринятый буфер данных в привычную строку string Во второй строчкедобавляем данные в компонент Memoi

Пример готов Вы можете протестировать его на любом имеющемся довании, которое может работать с компьютером через СОМ-порт, напри-мер модем Таким образом, вы практически написали простейшую терми-нальную программу, с помощью которой можно работать с модемом илидаже программировать его

обору-На компакт-диске в директории Документация вы найдете документ граммирование Модема.рёГ в формате Adobe Acrobat, в котором описаныосновные команды большинства модемов С помощью этих команд можнопрограммировать большинство модемов, потому что все современные моде-

Про-мы умеют обрабатывать стандартные АТ-команды

На компакт-диске в директории \Примеры\Глава 6\С0М Port вы можетеувидеть пример данной программы

6.6 Работа с LPT-портом

Точнее сказать, этот раздел будет посвящен управлению принтером, рый естественно подключается к LPT-порту Если вы работаете через этотпорт только со сканером, то вы точно можете переворачивать страницу, и неодну С принтерами, установленными через USB, обсуждаемый примерсможет работать только на половину В общем, давайте посмотрим на при-мер, который я подготовил, и все увидим своими глазами

кото-В большинстве книг описывается, как работать с принтером в графическомрежиме А что если надо выводить информацию построчно? Этот вопроспочему-то опускается Я решил исправить эту ситуацию и обсудить этутему

Запустите Delphi и в новом проекте поместите на форму две кнопки и одинкомпонент тмелю Внешний вид формы вы можете увидеть на рис 6.11.Для правильной компиляции примера можете сразу же добавить в раз-дел uses модуль winSpooi и не дожидаться, когда вам сообщит об этомDelphi

Trang 15

1 Работа с приншром L i ПНХEnglish:

This is the (est program, which show you how to work with printer in the text modeРоссия

Это тестовая программа, которая показывает вам, как работать с принтером в текстовом режиме

Trang 16

Здесь в первой строке кода мы открываем принтер с помощью функцииopenPrinter У этой функции указано три параметра:

П имя принтера, установленного в системе;

• параметр через который мы получим указатель на открытый принтер;

• указатель на структуру настроек по умолчанию PRINTER_DEFAULTS. Здесьвписываем нулевой указатель — nil

Дальше заполняем переменную Docinfoi, которая объявлена в-виде туры типа TDocinfoi Она понадобится нам уже на следующем этапе приоткрытии нового документа на принтере Самое главное — это свойствоpDataType Здесь мы пишем параметр RAW Таким образом мы выбираем типданных, с которыми будет работать наш принтер Все типы данных вы мо-жете увидеть в окне свойств принтера (на панели управления) на закладке

струк-Дополнительно, если нажать на кнопку Обработчик очереди (у вас, конечно,

это может быть устроено по-другому) На рис 6.12 вы можете увидеть окнонастроек моего принтера

Управление цветом Параметры устройства ( Обслуживание Обшие доступ : Порты Дополнительно

Обработчик заданий печати

Выбор другого обработчика печати может привести к вменению доступных параметров для еьйранных по умолчанию типов данных.

Если тип данных для службы не задан, используется указанный ниже тип,

Обработчик печати: Тип данных по умолчанию:

RftW [FF appended]

RAW [FF auto]

NTEMF 1.003 , NTEMF 1.006 NTEMF 1.007 NTEMF 1,008 TEXT

Отмена Включить дополнительные возможности печати

Умолчания Обработчик печати Страница-разделитель.

Рис 6.12 Окно настройки типов данных по умолчанию

Теперь мы готовы запустить новый документ на открытом принтере Дляэтого вызывается API-функция StartDocPrinter У нее есть три параметра:

• указатель на открытый принтер;

Trang 17

П версия структуры Docinfo Если вы хотите, чтобы ваша программа

нор-мально работала в Windows NT, то вы можете использовать только вую версию структуры, для Windows 95/98 можно использовать и вторуюверсию;

пер-П структура Docinfoi, которую мы недавно заполнили необходимыми раметрами

па-Открыв документ, мы должны запустить на нем новую страницу Для этоговызывается функция startPagePrinter У нее только один параметр — ука-затель на открытый принтер

Теперь можно построчно выводить информацию на принтер с помощьюфункции writePrinter, которой нужно передать четыре параметра:

ЗЭ-Этот метод построчной печати очень хорош и удобен тем, что будет тать даже там, где принтер подключен по USB или другим способом Сле-дующий метод, который я буду описывать, стабильно работает только черезLPT-порт, а с принтерами, работающими по USB, иногда возникают про-блемы Возможно, это связано не с методом доступа, а с невозможностьюпринтеров работать в таком режиме, тут уже я сказать уверенно не могу, таккак сам с такими проблемами нос к носу не сталкивался

рабо-Для открытия принтера в текстовом режиме вторым способом используетсяпроцедура AssignPrn В качестве единственного параметра этой процедуренадо передать переменную типа TextFiie После этого переменной назна-чен принтер по умолчанию Дальше его нужно открыть с помощью проце-дуры Rewrite

Как только файл открыт, в него можно печатать с помощью процедурыwritein, у которой два параметра:

• переменная типа TextFiie, которой назначен принтер;

• текст, который надо распечатать

После печати переменную надо освободить (закрыть файл, ный С Принтером) С ПОМОЩЬЮ Процедуры CloseFile

ассоциирован-Итак, в обработчике события Onclick второй кнопки пишем следующий код:

var

f:TextFile;

11 Зак 978

Trang 18

Между finally и end (код, написанный здесь, будет выполняться всегда,вне зависимости от того, была ошибка или нет) происходит закрытие файла.Если не использовать try finally, end, а во время печати произошла бы

ошибка, то файл, ассоциированный с принтером, остался бы открытым.

А это значит, что последующая нормальная работа принтера уже не тируется

гаран-В предыдущем примере мы открывали принтер с помощью функцииAssignPrn, а потом обращались к принтеру как к файлу Для более полнойиллюстрации того, что вы работаете с LPT-портом как с настоящим тексто-вым файлом, попробуйте изменить строку открытия на эту:

AssignFileff, 'LPT1•);

Здесь использована функция Assignriie для открытия файла Первая менная указывает на переменную текстового файла (TextFiie) Второй па-раметр должен содержать имя открываемого файла, а мы указываем LPTI.

пере-Если вы запустите этот пример, то сможете убедиться в том, что наш коддействительно работает напрямую с портом и, соответственно, с принтером

С другими устройствами, подключенными к LPT, поддерживающими вой режим, работа будет происходит точно так же, т е как с простым тек-стовым файлом

тесто-Обратите внимание, если вместо русского языка вы увидите абракадабру, тотекст придется перекодировать в кодировку DOS О переводе в различныекодировки будет написано в следующей главе

На компакт-диске в директории \Примеры\Глава 6\Printer вы можете деть пример данной программы

Ngày đăng: 12/08/2014, 16:21

TỪ KHÓA LIÊN QUAN