Ассемблер для Windows



         

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


; структуры ; структура сообщения MSGSTRUCT STRUC MSHWND DD ? MSMESSAGE DD ? MSWPARAM DD ? MSLPARAM DD ? MSTIME DD ? MSPT DD ? MSGSTRUCT ENDS

; файл driv.asm .386P ; плоская модель .MODEL FLAT, stdcall include driv.inc ; директивы компоновщику для подключения библиотек IFDEF MASM includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ELSE includelib c:\tasm32\lib\import32.lib ENDIF ;-------------------------------------------------

; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' PRIZ DB 0 MSG MSGSTRUCT <?> HINST DD 0 ; дескриптор приложения PA DB "DIAL1",0 ROO DB "?:\", 0 BUFER DB 40 DUP (0) TYP0 DB " Нет устройства",0 TYP1 DB " Нет устройства",0 TYP2 DB " Гибкий диск",0 TYP3 DB " Жесткий диск",0 TYP4 DB " Сетевой диск",0 TYP5 DB " Лазерный диск",0 TYP6 DB " Электронный диск",0 INDEX DD OFFSET TYP0 DD OFFSET TYP1 DD OFFSET TYP2 DD OFFSET TYP3 DD OFFSET TYP4 DD OFFSET TYP5 DD OFFSET TYP6 _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить дескриптор приложения PUSH 0 CALL GetModuleHandleA@4 MOV [HINST], EAX ;-------------------------------------- PUSH 0 PUSH OFFSET WNDPROC PUSH 0 PUSH OFFSET PA PUSH [HINST] CALL DialogBoxParamA@20 CMP EAX,-1 JNE KOL ; сообщение об ошибке KOL: ;-------------------------------------- PUSH 0 CALL ExitProcess@4 ;-------------------------------------- ; процедура окна ; расположение параметров в стеке ; [BP+014Н] ; LPARAM ; [BP+10Н] ; WAPARAM ; [BP+0CН] ; MES ; [BP+8] ; HWND WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH ESI PUSH EDI ;-------------------------------------- CMP DWORD PTR [EBP+0CH],WM_CLOSE JNE L1 PUSH 0 PUSH DWORD PTR [EBP+08H] CALL EndDialog@8 JMP FINISH L1: CMP DWORD PTR [EBP+0CH],WM_INITDIALOG JNE L2 L4: ; здесь анализ устройств и заполнение списка MOV ECX,65 L00: PUSH ECX MOV ROO, CL ; определить тип устройства PUSH OFFSET ROO CALL GetDriveTypeA@4 ; полный список CMP PRIZ,0 JZ _ALL CMP EAX,2 JB L3 _ALL: ; получить индекс SHL EAX,2 PUSH EAX ; создать строку для списка PUSH OFFSET ROO PUSH OFFSET BUFER CALL lstrcpy@8 POP EBX PUSH INDEX[EBX] PUSH OFFSET BUFER CALL lstrcat@8 ; отправить строку в список PUSH OFFSET BUFER PUSH 0 PUSH LB_ADDSTRING PUSH 101 PUSH DWORD PTR [EBP+08H] CALL SendDlgItemMessageA@20 L3: ; проверить, не достигнута ли граница цикла POP ECX INC ECX CMP ECX,91 JNE L00 JMP FINISH L2: CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN JNE FINISH PUSH 0 PUSH 0 PUSH LB_RESETCONTENT PUSH 101 PUSH DWORD PTR [EBP+08H] CALL SendDlgItemMessageA@20 CMP PRIZ,0 JE YES_0 MOV PRIZ,0 JMP L4 YES_0: MOV PRIZ,1 JMP L4 FINISH: MOV EAX,0 POP EDI POP ESI POP EBX POP EBP RET 16 WNDPROC ENDP _TEXT ENDS END START




Содержание  Назад  Вперед