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

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



Рисунок 3.4.3. Программа, осуществляющая соединение с сетевым ресурсам.

Трансляция программы на Рисунок 3.4.3.

MASM32:

ml /c /coff /DMASM net.asm link /subsystem:console net.obj

TASM32:

tasm32 /ml net.asm tlink32 -ap net.obj

  1. Рассматривая программу на Рисунок 3.4.3, прежде всего обратите внимание на использование локальных меток. MASM распознает локальные метки автоматически. TASM требует, чтобы локальная метка имела в начале два символа "@@". Кроме того, в начале программы требуется директива LOCALS.
  2. Отметим одну существенную особенность функции WNetAddConnection2A@16. При заполнении структуры NETRESOURCE поле dwType для операционной системы Windows NT должно заполняться нулем, а не RESOURCETYPE_DISK. К сожалению, имеются и другие подобные нюансы при работе с ресурсами локальной сети. Если Вы всерьез займетесь программированием в локальной сети, Вам придется проверять свою программу на разных компьютерах и разных сетях.
  3. Данная программа далека от совершенства. Попробуйте над ней поработать. В частности, не мешало бы проверять, является ли локальное устройство сетевым или нет, и если является, спросить разрешение на переподключение данного устройства. В этом случае необходимо вначале отключить устройство от старого сетевого ресурса при помощи известной Вам функции WNetCancelConnection2.
  4. Если необходимо подключать сетевой принтер, то поле dwType должно быть равно RESOURCETYPE_PRINT.
  5. Следующая программа (Рисунок 3.4.4) осуществляет рекурсивный поиск сетевых ресурсов. Работая в консольном режиме, она выдает на экран название провайдера и удаленное имя ресурса. Данная программа должна правильно работать и в сетях Microsoft, и в сетях Novel.

    ;программа NET1, осуществляющая поиск сетевых ресурсов .386P ; плоская модель .MODEL FLAT, stdcall ; константы STD_OUTPUT_HANDLE equ -11 RESOURCETYPE_DISK equ 1h RESOURCE_GLOBALNET equ 2h RESOURCETYPE_ANY equ 0h

    ; прототипы внешних процедур IFDEF MASM EXTERN CharToOemA@8:NEAR EXTERN RtlMoveMemory@12:NEAR EXTERN WNetCloseEnum@4:NEAR EXTERN WNetEnumResourceA@16:NEAR EXTERN WNetOpenEnumA@20:NEAR EXTERN lstrcpy@8:NEAR EXTERN lstrcat@8:NEAR EXTERN lstrlen@4:NEAR EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN ExitProcess@4:NEAR EXTERN GetCommandLineA@0:NEAR ELSE EXTERN CharToOemA:NEAR EXTERN RtlMoveMemory:NEAR EXTERN WNetCloseEnum:NEAR EXTERN WNetEnumResourceA:NEAR EXTERN WNetOpenEnumA:NEAR EXTERN lstrcpy:NEAR EXTERN lstrcat:NEAR EXTERN lstrlen:NEAR EXTERN GetStdHandle:NEAR EXTERN WriteConsoleA:NEAR EXTERN ExitProcess:NEAR EXTERN GetCommandLineA:NEAR CharToOemA@8 = CharToOemA RtlMoveMemory@12 = RtlMoveMemory WNetCloseEnum@4 = WNetCloseEnum WNetEnumResourceA@16 = WNetEnumResourceA lstrcpy@8 = lstrcpy WNetOpenEnumA@20 = WNetOpenEnumA lstrcat@8 = lstrcat lstrlen@4 = lstrlen GetStdHandle@4 = GetStdHandle WriteConsoleA@20 = WriteConsoleA ExitProcess@4 = ExitProcess GetCommandLineA@0 = GetCommandLineA ENDIF




    ; структуры 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


    Содержание раздела