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



         

Программа осуществляющая соединение с сетевым ресурсам - часть 2


; структуры NETRESOURCE STRUC dwScope DWORD ? dwType DWORD ? dwDisplayType DWORD ? dwUsage DWORD ? lpLocalName DWORD ? lpRemoteName DWORD ? lpComment DWORD ? lpProvider DWORD ? NETRESOURCE ENDS

; директивы компоновщику для подключения библиотек IFDEF MASM includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\mpr.lib ELSE includelib c:\tasm32\lib\import32.lib ENDIF

;———————————————————————————————————————————————

; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' LENS DWORD ? ; количество выведенных символов HANDL DWORD ? NR NETRESOURCE <0> ENT DB 13,10,0 BUF DB 100 dup (0) _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить дескриптор выхода вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; запустить процедуру поиска сетевых ресурсов PUSH 0 PUSH OFFSET NR CALL POISK _END: PUSH 0 CALL ExitProcess@4 ; процедура поиска PAR1 EQU [EBP+8] ; указатель на структуру PAR2 EQU [EBP+0CH] ; признак ; локальные переменные HANDLP EQU [EBP-4] ; дескриптор поиска CC EQU [EBP-8] NB EQU [EBP-12] NR1 EQU [EBP-44] ; структура BUFER EQU [EBP-144] ; буфер RS EQU [EBP-32144] ; массив структур POISK PROC PUSH EBP MOV EBP,ESP SUB ESP,32144 CMP DWORD PTR PAR2,0 JNE SECOND ; при первом запуске NULL XOR EBX,EBX JMP FIRST SECOND: ; запуск при рекурсивном вызове ; вначале скопировать структуру в локальную ; переменную, хотя для данной программы это излишне PUSH 32 PUSH DWORD PTR PAR1 LEA EAX,DWORD PTR NR1 PUSH EAX CALL RtlMoveMemory@12 ; при вторичном поиске указатель на структуру LEA EBX,DWORD PTR NR1 FIRST: ; запуск при первом вызове LEA EAX,HANDLP PUSH EAX PUSH EBX PUSH 0 PUSH RESOURCETYPE_ANY PUSH RESOURCE_GLOBALNET CALL WNetOpenEnumA@20 CMP EAX,0 JNE _EN ; здесь осуществляется основной поиск REPI: ; запуск функции WNetEnumResource ; объем массива структур NETRESOURCE MOV DWORD PTR NB,32000 LEA EAX,NB PUSH EAX LEA EAX,RS PUSH EAX ; искать максимальное количество объектов MOV DWORD PTR CC,0FFFFFFFFH LEA EAX,CC PUSH EAX PUSH DWORD PTR HANDLP CALL WNetEnumResourceA@16 CMP EAX,0 JNE _CLOSE ; цикл по полученному массиву MOV ESI,CC SHL ESI,5 ; умножаем на 32 MOV EDI,0 L00: CMP EDI,ESI JE REPI ; вывод информации ; провайдер MOV EBX,DWORD PTR RS[EDI]+28 CALL SETMSG ; удаленное имя MOV EBX, DWORD PTR RS[EDI]+20 CALL SETMSG ; сохранить нужные регистры PUSH ESI PUSH EDI ; теперь рекурсивный вызов PUSH 1 LEA EAX,DWORD PTR RS[EDI] PUSH EAX CALL POISK ; восстановить регистры POP EDI POP ESI ADD EDI,32 JMP L00 ;----------------------------------- JMP REPI ;----------------------------------- _CLOSE: PUSH DWORD PTR HANDLP CALL WNetCloseEnum@4 _EN: MOV ESP,EBP POP EBP RET 8 POISK ENDP

; вывод сообщения ; EBX -> строка SETMSG PROC ; скопировать текст в отдельный буфер PUSH EBX PUSH OFFSET BUF CALL lstrcpy@8 LEA EBX,BUF ; перекодировать для консоли PUSH EBX PUSH EBX CALL CharToOemA@8 ; добавить перевод строки PUSH OFFSET ENT PUSH EBX CALL lstrcat@8 ; определить длину строки PUSH EBX CALL lstrlen@4 ; вывести строку PUSH 0 PUSH OFFSET LENS PUSH EAX PUSH EBX PUSH HANDL CALL WriteConsoleA@20 RET SETMSG ENDP _TEXT ENDS END START




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