Анимация
JavaScript
|
Главная Библионтека
invoke DispatchMessage,offset message no message: jmp msg loop end loop: invoke FreeLibrary,hLib exit: invoke ExitProcess,[message.wParam] WindowProc proc stdcall, @@hwnd:dword, @@wparam:dword, @@Iparam;dword pushad invoke MessageBox,[main win hand1e],offset about string,offset about title,MB OK @@wmsg:dword, mov eax,@ @wmsg crap eax,WM DESTROY je destroy window crap eax,WM COMMAND je @3Handle Command @@Default Proc: popad invoke DefWindowProc, @@hwnd,@@wmsg,@@wparam,@@Iparam ret @@Handle Command: eax,eax file exit: close exit: destroy window: invoke PostQuitMessage,0 popad xor eax,eax ret WindowProc endp end START End Проведем пошаговый анализ текста профаммы md5. Как видно программа начинав свою работу с метки START. Следующий за ней блок кода выполняет «ручное» связыва ние исполняемого модуля md5.exe с библиотекой mscapit.dll. START: invoke LoadLibrary,addr LibName .if eax==NULL invoke MessageBox,NULL,addr Dl1 NotFound, add: «indow title,MB OK jmp exit .else mov hLib,еах invoke GetProcAddress,hLib,addr FunctionName . if eax ==NULL invoke MessageBox,NULL,addr FunctionNotFound,adc window title,MB OK jmp end loop else mov [TestFunction],eax .endif .endif Функция LoadLibrary принимает в качестве параметра указатель на строку с именем библиотеки, которую требуется зафузить в адресное просфанстю текущего процесса, в случае успеха возвращается ненулевой ее описатель для дальнейшего манипулирования с ней (импорта функций, выфузки). В случае неудачи возвращается NULL, и в данной ситуации наша профамма отображает соответствующее сообщение и завершает работу. Далее вызов GetProcessAddress, принимающий в качестве парамефОВ описатель зафуженной DLL и указатель на сфоку с именем фебующейся функции, в случае успеха возвращает ее адрес в адресном просфанстве текущего процесса, что в дальнейшем позволяет осуществлять косвенные вызовы данной функции, естественно, при правильном соблюдении протокола ее вызова. В нашем случае это функция TestFunction из библиотеки mscapit.dll. Библиотека mscapit.dll должна находиться либо в текущей директории с исполняемым модулем md5.exe, либо в одной из системных директорий Windows. В случае неуспеха вызов GetProcessAddress возвращает NULL, и, соответственно наша профамма, предварительно выфузив библиотеку из памяти, завершает работу. Такая ситуация может возникнуть в случае, если DLL с И1йенем mscapit.dll будет доступна, но в ней отсутствует функция с именем TestFunction. Следующий блок кода формирует основное окно профаммы. invoke GetModuleHandle,О mov [hInst],еах mov [class struct.style],CS HREDRAW or CS VREDRAW mov [class struct.IpfnWndProc],offset WindowProc mov [class struct.cbClsExtra],0 mov [class struct.cbWndExtra],0 mov [class struct.hinstance],eax invoke Loadlcon,0,IDI APPLICATION mov [class struct.hIcon],eax invoke LoadCursor,0,IDC ARROW mov [class struсt.hCursоr],eax [class struct.hbrBackground],COLOR BACKGROUND+1 mov [class struct.IpszMenuName],offset class name mov [class struct.IpszClassName],offset class name invoke RegisterClass,offset class struct mov eax,WS CAPTION or WS SYSMENU or WS MINI MIZEBOX or jjS BORDER invoke CreateWindowEx,0,offset с 1 ass name,оffset window title,eax,CW USEDEFAULT,CW USEDEFAULT,4 20,14 0,0,0,hInst,0 mov [main win handle],eax invoke CreateDialogParam, [hInst], I DD CHILD DLG, [main win handle],оffset :hildDlgProc, 0 or eax,eax jz end loop mov [child dlg handle] , eax invoke ShowWindow,[main win handle],SW NORMAL Для того чтобы приложение Windows обладало собственньпк! окном, необходимо заре-гисфировать класс окна, на его основе создать новое окно, провести его первичную Офи-совку (инициализацию изображения окна) и организовать цикл обработки сообщений. Вызов GetModuleHandle возвращает описатель исполняемого модуля md5.exe нашей профаммы, что необходим для дальнейшей манипуляции с ресурсами профаммы. Как уже говорилось, для создания окна Windows профамме необходимо зарегистрировать класс окна - сфуктуру типа WNDCLASS, поля которой описывают основные свойства производных от нее окон. WNDCLASS STRUCT style DWORD ? IpfnWndProc DWORD ? CbClsExtra DWORD ? CbWndExtra DWORD ? hinstance DWORD ? hIcon DWORD ? hCursor DWORD ? hbrBackground DWORD ? IpszMenuName DWORD ? IpszClassName DWORD ? WNDCLASS ENDS style - стиль окон, создаваемых из этого класса. Возможно комбинирование HecKojjj ких стилей посредством оператора "or". IpfhWndProc - адрес процедуры окна, ответственной за обработку сообщений все;, окон данного класса. cbCIsExtra - количество дополнительных байтов, которые нужно зарезервировав, (будут следовать в памяти сразу за самой структурой). По умолчанию, операционна,. система инициализирует это число нулем. hinstance - описатель исполняемого модуля программы. hicon - описатель отображаемой иконки в верхнем левом углу экземпляра окна дан ного ютасса. hCursor - описатель курсора мыщи при расположении его над окном. Информацщ об оконных стилях, типах курсоров мыши и иконок можно найти в документации М Platform SDK. Функции Loadlcon и LoadCursor возвращают соответствующие описател курсора и иконки для зарезервированных в ОС Windows или размещенных в разделе р., сурсов иконок и курсоров. hbrBackground - цвет фона Окна. IpszMenuNarae- описатель меню для окон, созданных на базе данного класса. IpszClassName - символьное ИМЯ класса окна. hIconSm - описатель «маленькой» иконки, которая сопоставляется классу окна. Ее. этот элемент структуры равен NULL, система ищет иконку, определенную для элемен Ысоп, чтобы преобразовать ее размер. Самый важный член WNDCLASS - это IpfeWndProc. Ipfe означает дальний указате на функцию. Каждому классу окна должна быть сопоставлена процедура окна, котор ответственна за обработку сообщений всех окон этого класса. Windows посылает со( щения процедуре окна, чтобы уведомить его о важных событиях, касающихся окон, которые она ответственена, например о вводе с клавиатуры или перемещении мыс Процедура окна должна избирательно реагировать на получаемые ею сообщения. Г разработке процедуры окна большая часть ее кода представляет собой обработчики бытии этих событий. Заполненная структура classstruct передается в качестве параметра выз RegisterCIass для регистрации класса в системе. Затем вызов CreateWindowEx создает персональное окно нашей профамме. Описа параметров данной функции приводятся ниже. CreateWindowEx proto dwExStyle:DWORD,\ lpClassName:DWORD,\ IpWindowName:DWORD,\ dwStyle:DWORD,\ X:DWORD,\ Y:DWORD,\ nWidth:DWORD,\ pHeight:DWORD,\ hWndParent:DWORD ,\ l,Menu-. DWORD, \ hinstance:DWORD,\ IpParam:DWORD dwExStyle - дополнительные стили окна. Здесь можно указать новые стили окон, появившиеся в Windows 9х и NT. Обычные стили окна указываются в dwStyle, но если нужно придать окну дополнительные стили, такие, как topmost окно (которое всегда наверху), вы должны поместить их здесь. В случае значения NULL дополнительные стили не используются. IpClassName - обязательный параметр. Адрес ASCIIZ строки, содержащей имя класса окна, которое вы хотите использовать как шаблон для нового окна Это может бьпъ ваш собственный зарегистрированный класс шш один из предопределенных класЬов. Как отмечено выше, каждое создаваемое окно основьшается на некотором зарегистрированном классе. IpWindowName - адрес ASCIIZ строки, содержащей названия окна. Оно будет отражено в строке заголовка окна. Если этот параметр будет равен NULL, заголовок окна останется пустым. dwStyle - стиль окна. Существует некоторое количество предопределенных стилей, объединяемых оператором "or" и задающих парамефы определенных элементов окна. Можно передавать значение NULL в этом параметре, тогда у окна не будет кнопок изменения резмеров, закрытия и системного меню, но большого прока в этом нет. Самый общий стиль WSOVERLAPPEDWINDOW, - это в действительности комбинация некоторого числа предопределенных стилей, наиболее подходящая для большинства типов окон. X, Y - координаты вернего левого угла окна на экране компьютера. Обычно эти значения равны CWUSEDEFAULT, что позволяет Windows самостоятельно решать, куда поместить окно. nWidth, nHeight - ширина и высота окна в пикселях. Вы можете также использовать CWUSEDEFAULT, чтобы позволить Windows выбрать наиболее подходящие размеры за вас. hWndParent - описатель родительского окна (если оно существует). Этот параметр говорит Windows, является ли это окно дочерним (подчиненным) другому окну. Заметьте, что это не родительско-дочерние отношения окна MDI (multiply document interface). Дочерние окна не офаничены фаницами клиентской области родительского окна. Эти отношения нужны для внутреннего использования Windows. Если родительское окно уничтожено, все дочерние окна уничтожаются автоматически. Так как в нашем примере всего лишь одно окно, мы устанавливаем этот параметр в NULL. hMenu - описатель меню окна. NULL - в случае использования меню, определенного S классе окна IpszMenuName сфуктуры WNDCLASS «по умолчанию». Каждое окно. Созданное на базе класса будет иметь меню по умолчанию, если в вызове CreateWindowEx вы не определите специально новое меню, используя парамеф hMenu. от параметр двойного назначения. В случае если ваше окно основано на одном из 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 [ 54 ] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |