| Код |
; netenum.asm абс ; Консольное приложение для win32, перечисляющее сетевые ресурсы .386 .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include C:\masm32\include\kernel32.inc ; include C:\masm32\include\shell32.inc include C:\masm32\bin\netenum\INCLUDE\def32.inc include C:\masm32\bin\netenum\INCLUDE\mpr.inc include C:\masm32\include\windows.inc ; includelib C:\masm32\lib\kernel32.lib ; includelib C:\masm32\lib\shell32.lib ; includelib C:\WINDOWS\system32\mpr.dll ; .386 ; .model flat .const greet_message db 'Example win32 console program',0Dh, 0Ah, 0Dh, 0Ah,0 error1_message db 0Dh,0Ah,'Could not get current user name',0Dh, 0Ah,0 error2_message db 0Dh,0Ah,'Could not enumerate',0Dh, 0Ah,0 good_exit_msg db 0Dh,0Ah,0Dh,0Ah,'Normal termination',0Dh, 0Ah,0 enum_msg1 db 0Dh,0Ah,'Local',0 enum_msg2 db 'remote-',0 .data user_name db "List of connected resourses for user" user_buff db 64 dup (?) ;Буфер для WNetGetUser. user_buff_1 dd $-user_buff ;Размер буфера для WNetGetUser enum_buff_1 dd 1056 ;Длина enum_buf в байтах enum_entries dd 1 ;Число ресурсов, которое в нем помещаются. .data? enum_buf NTRESOURCE <?,?,?,?,?,?,?,?,> ;Буфер для буфера для WNetGetResource dd 256 dup(?) ;1024 байта для строк. message_1 dd ? ;Переменная для WriteConsole enum_handle dd ? ;Идентификатор для WNetEnumResource .code start: ; Получить от системы идентификатор буфера.вывода stdout. push STD_OUTPUT_HANDLE call GetStdHandle ; возвращает идентификатор STDOUT в eax, mov ebx, eax ; а мы будем хранить его в EBX. ; Вывести строку greet_message на экран. mov esi, offset greet_message call output_string ; Определить имя пользователя, которому принадлежит наш процесс. mov esi, offset user_buff push offset user_buff_1 ; Адрес переменной с длиной буфера. push esi ; Адрес буфера. push 0 ; NULL call WNetGetUser cmp eax, NO_ERROR ; Если произошла ошибка jne error_exit1 ; выйти mov esi, offset user_name ; иначе вывести строку на экран. call output_string
; Начать перечисление сетевых ресурсов. push offset enum_handle ; Идентификатор для WNetEnumResource. push 0 ; push RESOURCEUSAGE_CONNECTABLE ; Все присоединяемые ресурсы. push RESOURCETYPE_ANY ; Ресурсы любого типа. push RESOURCE_CONNECTED ; Только присоединённые сейчас. call WNetOpenEnum ; Начать перечисление. cmp eax, NO_ERROR ; Если произошла ошибка jne error_exit2 ; выйти ; Цикл перечисления ресурсов. enumeration_loop: push offset enum_buf_1 ; Длина буфера в байтах. push offset enum_buf ; Адрес буфера. push offset enum_buf_1 push offset enum_entries ; Число Ресурсов. push dword ptr enum_handle ; Идентификатор от WNetOpenEnum. call WNetEnumResuurce cmp eax, ERROR_NO_MORE_ITEMS ; Если они закончились, je end_enumeration ; звершить перечисление, cmp eax, NO_ERROR ; если произовшла ошибка, jne error_exit2 ; выйти с сообщением об ошибке. ; Вывод информации о ресурсах на экран. mov esi, offset enum_msg1 ; Первая часть строки- call output_string ; на консоль. mov esi, dword ptr enum_buf.lpLocalName ; Локальное имя устройства- call output_string ; на консоль. mov esi, offset enum_msg2 ; Вторая часть строки call output_string ; на консоль. mov esi, dword ptr enum_buf.lpRemoteName ; Удаленное имя устройства- call output_string ; туда же.
jmp short enumeration_loop ; Продолжить перечисление. ; Конец цикла. egd_enumeration: push dword ptr enum_handle call WNetCloseEnum ; Конец перечисления.
mov esi, offset good_exit_msg exit_program: call output_string ; Вывести строку. push o ; Код выход. call ExitProcess ; Конец программы. ; Выход после ошибок. error_exit1: mov esi, offset error1_message jmp short, exit_program error_exit2: mov esi, offset error2_message jmp short, exit_program ; Процедура output_string. ; Вывод на экран строку. ; Вход: esi - адрес строки. ; ebx - идентификатор stdout или дркугого консольного буфера. output_string proc near ; Определить длину строки. cld xor eax, eax mov edi, edi repne scasb dec edi sub edi, esi ; Послать ее на консоль. push 0 push offset message_l ; Сколько байтов выведено на консоль. push edi ; Сколько бацтов надо вывести на консоль. push esi ; Адрес строки для вывода на консоль. push ebx ; Идентификатор буфера вывода. call WriteConsole ; WriteConsole (hConsoleOutput, lpvBuffer, ; cchToWrite, lpcchWritten, lpvReserved) ret output_string endp
end start
|
по условию нужно в файл kernel32.inc добавить вот этот код:
| Код |
IFDEF _TASM_ extrn GetStdHandle:near extrn WriteConsoleA:near WriteConsole equ WriteConsoleA else extrn __imp__GetStdHandle@4 extrn __imp__WriteConsoleA@20 GetStdHandle equ __imp__GetStdHandle@4 WriteConsole equ __imp__WriteConsoleA@20 endif
|
далее нужно создать файл mpr.inc:
| Код |
; mpr.inc ; Включаемый файл с определениями функций из mpr.dll. ifdef _TASM_ includelib import32.lib ; Имена используемых функций. extrn WNetGetUserA:near extrn WNetOpenEnumA:near extrn WNetEnumResourceA:near extrn WNetCloseEnume:near ; Присваивания для облегчения читаемости кода WNetGetUser equ WNetGetUserA WNetOpenEnum equ WNetOpenEnumA WNetEnumResource equ WNetEnumResourceA else includelib mpr.lib ; Истинны имена используемых функций. extrn __imp__WNetGetUserA@12:dword extrn __imp__WNetOpenEnumA@20:dword extrn __imp__WNetEnumResourceA@16:dword extrn __imp__WNetCloseEnumA@4:dword ; Присваивания для облегчения читаемости кода. WNetGetUser equ __imp__WNetGetUserA@12 WNetOpenEnum equ __imp__WNetOpenEnumA@20 WNetEnumResource equ __imp__WNetEnumResourceA@16 WNetCloseEnum equ __imp__WNetCloseEnumA@4 endif
|
И дословно потребуется файл def32.inc, куда мы поместим определения констант и структур из разных включаемых файлов для языка С. Существует утилита h2.inc, преобразующая эти файлы целиком, но нас интересует собственный включаемый файл, в который будем добавлять новые определения по мере надобности.
Честно говоря не совсем понял что это за утилита на как я понял она нам не понадобится и я просто создал файл.
def32.inc:
| Код |
; def32.inc ; Файл с определением констант и типов для примеров программ под ; win32. ; Из winbase.h STD_OUTPUT_HANDLE equ -11 ;Из winerror.h. NO_ERROR equ 0 ERROR_NO_MORE_ITEMS equ 259 ; Из winnetwk.h RESOURCEUSAGE_CONNECTABLE equ 1 RESOURCETYPE_ANY equ 0 RESOURCE_CONNECTED equ 1 NTRESOURCE struc dwScope dd ? dwType dd ? dwDisplayType dd ? dwUsage dd ? lpLocalName dd ? lpRemontName dd ? lpComment dd ? lpProveder dd ? NTRESOURCE ends
|
Вот что выходит:
Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\Сергей>c:\masm32\bin\ml.exe /Cookies/coff /Cp "C:\m
asm32\bin\netenum\ISHODNIC\Step_One.asm"
Microsoft ® Macro Assembler Version 6.14.8444
Copyright © Microsoft Corp 1981-1997. All rights reserved.
MASM : warning A4018: invalid command-line option : /Cookies/coff
Assembling: C:\masm32\bin\netenum\ISHODNIC\Step_One.asm
C:\masm32\include\kernel32.inc(1514) : error A2008: syntax error : in directive
C:\masm32\include\kernel32.inc(1515) : error A2008: syntax error : in directive
C:\masm32\include\kernel32.inc(1516) : error A2005: symbol redefinition : GetStd
Handle
***********
ASCII build
***********
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(97) : error A2008: syntax error : ,
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(100) : error A2008: syntax error : ,
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(30) : error A2036: too many initial
values for structure
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(64) : error A2006: undefined symbol
: enum_buf_1
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(68) : error A2006: undefined symbol
: WNetEnumResuurce
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(70) : error A2006: undefined symbol
: end_enumeration
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(80) : error A2006: undefined symbol
: lpRemoteName
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(92) : error A2006: undefined symbol
: o
C:\masm32\bin\netenum\ISHODNIC\Step_One.asm(115) : error A2006: undefined symbol
: message_l
C:\Documents and Settings\Сергей>
Если не сможете подсказать в чем проблема то подскажите где искать расшифровки этих ошибок.