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



         

Результат работы программы - часть 4


; структуры 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' BUF1 DB 100 dup (0) BUF2 DB 100 dup (0) LENS DWORD ? ; количество выведенных символов HANDL DWORD ? NR NETRESOURCE <0> PUSTO DB 0 ERR2 DB "Ошибка!",0 ERR1 DB "Мало параметров!",0 ST1 DB "->",0 _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; получить дескриптор выхода вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; получить количество параметров CALL NUMPAR CMP EAX,3 JNB PAR_OK LEA EBX,ERR1 CALL SETMSG JMP _END PAR_OK: ; получить параметры MOV EDI,2 LEA EBX,BUF1 CALL GETPAR MOV EDI,3 LEA EBX,BUF2 CALL GETPAR ; пытаемся произвести подсоединение ; вначале заполняем структуру NETRESOURCE ; для Windows NT NR.dwType = 0 MOV NR.dwType, RESOURCETYPE_DISK LEA EAX,BUF2 MOV NR.lpLocalName,EAX LEA EAX,BUF1 MOV NR.lpRemoteName,EAX MOV NR.lpProvider,0 ; вызов функции, осуществляющей соединение PUSH 0 PUSH OFFSET PUSTO PUSH OFFSET PUSTO PUSH OFFSET NR CALL WNetAddConnection2A@16 CMP EAX,0 JE _OK ; сообщение об ошибке LEA EBX,ERR2 CALL SETMSG JMP _END _OK: ; сообщение об успешном соединении PUSH OFFSET ST1 PUSH OFFSET BUF1 CALL lstrcat@8 PUSH OFFSET BUF2 PUSH OFFSET BUF1 CALL lstrcat@8 LEA EBX,BUF1 CALL SETMSG _END: PUSH 0 CALL ExitProcess@4

; определить количество параметров (->EAX) NUMPAR PROC CALL GetCommandLineA@0 MOV ESI,EAX ; указатель на строку XOR ECX,ECX ; счетчик MOV EDX,1 ; признак @@L1: CMP BYTE PTR [ESI],0 JE @@L4 CMP BYTE PTR [ESI],32 JE @@L3 ADD ECX,EDX ; номер параметра MOV EDX,0 JMP @@L2 @@L3: OR EDX,1 @@L2: INC ESI JMP @@L1 @@L4 : MOV EAX,ECX RET NUMPAR ENDP

; получить параметр ; EBX - указывает на буфер, куда будет помещен параметр ; в буфер помещается строка с нулем на конце ; EDI - номер параметра GETPAR PROC CALL GetCommandLineA@0 MOV ESI,EAX ; указатель на строку XOR ECX,ECX ; счетчик MOV EDX,1 ; признак @@L1: CMP BYTE PTR [ESI],0 JE @@L4 CMP BYTE PTR [ESI],32 JE @@L3 ADD ECX,EDX ; номер параметра MOV EDX,0 JMP @@L2 @@L3: OR EDX,1 @@L2: CMP ECX,EDI JNE @@L5 MOV AL,BYTE PTR [ESI] CMP AL,32 JE @@L5 MOV BYTE PTR [EBX],AL INC EBX @@L5: INC ESI JMP @@L1 @@L4: MOV BYTE PTR [EBX],0 RET GETPAR ENDP

; вывод сообщения ; EBX -> строка SETMSG PROC 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




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