Приложение перечисляющее подключенные сетевые ресурсы (компиляция) - Assembler

Узнай цену своей работы

Формулировка задачи:

В общем задание «Написать консольное приложение Win32, которое перечисляет все подключенные сетевые ресурсы, используя системные функции WNetOpenEnum(), WNetEnumResource() и WNetCloseEnum()». прописал асм файл (нашел в инете похожее), но не могу скомпилировать, то ругается на библиотеки то на содержание асм файла. Помогите пожалуйста скмпилировать приложение
;netenum.asm
;Консольное приложение для Win32, перечисляющее сетевые ресурсы
 
include def32.inc
include kernel32.inc
include mpr.inc
 
includelib kernel32.lib
includelib mpr.lib

    .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 resources for user"
user_buff db 64 dup (?)         ;буфер для WnetGetUser
user_buff_l dd $-user_buff      ;размер буфера для WNetGetUser
enum_buf_l dd 1056          ;длина enum_buf в байтах
enum_entries dd 1           ;число ресурсов, которые в нем помещаются
.data?
 
enum_buf NTRESOURCE <?,?,?,?,?,?,?,?>   ;буфер для WNetEnumResource
dd 256 dup (?)              ;1024 байта для строк
message_l dd ?              ;переменная для WriteConsole
enum_handle dd ?            ;идентификатор для WNetEnumResource
    .code
    
_start:
;получить от системы идентификатор буфера вывода stdout
push STD_OUTPUT_HANDLE
call GetStdHandle           ;возвращает идентификатор STDOUT в еах,
mov ebx,eax                 ;а мы будем хранить его в ЕВХ
 
;вывести строку greet_message на экран
mov esi, offset greet_message
call output_string
 
;определить имя пользователя, которому принадлежит наш процесс
mov esi, offset user_buff
push offset user_buff_l         ;адрес переменной с длиной буфера
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_l      ;длина буфера в байтах
push offset enum_buf            ;адрес буфера
push offset enum_entries        ;число ресурсов
push dword ptr enum_handle      ;идентификатор от WNetOpenEnum
call WNetEnumResource
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.IpLocalName      ;локальное имя устройства
call output_string                          ;на консоль
mov esi, offset enum_msg2                  ;вторая часть строки
call output_string                          ;на консоль
mov esi, dword ptr enum_buf.IpRemoteName    ;удаленное имя устройства
call output_string                          ;туда же
jmp short enumeration_loop                 ;продолжить перечисление
 
; конец цикла
end_enumeration:
push dword ptr enum_handle
call WNetCloseEnum                          ;конец перечисления
mov esi, offset good_exit_msg
 
exit_program:
call output_string                          ;вывести строку
push 0                                      ;код выхода
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,esi
repne scasb
dec edi
sub edi, esi
 
;послать ее на консоль
push 0
push offset message_l   ;сколько байт выведено на консоль
push edi                ;сколько байт надо вывести на консоль
push esi                ;адрес строки для вывода на консоль
push ebx                ;идентификатор буфера вывода
call WriteConsole       ;WriteConsole (hConsoleOutputm, lpvBuffer, cchToWrite, lpcchWritten, lpvReserved)
ret
output_string endp
end _start
В общем выдает вот что Assembling: netenum.asm mpr.inc<100> : error A2005: : __imp__WNetCloseEnum@4 G:\СПО>link /subsystem:console "netenum.obj" Microsoft Incremental Linker Version 5.12.8078 Copyright Microsoft Corp 1992-1998. All rights reserved. LINK : fatal error LNK1181: cannot open input file "netenum.obj"

Решение задачи: «Приложение перечисляющее подключенные сетевые ресурсы (компиляция)»

textual
Листинг программы
cls
set filename=netenum
set masm_path=c:\masm32
%masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm  || exit
%masm_path%\bin\Link /SUBSYSTEM:CONSOLE /LIBPATH:%masm_path%\lib ^
/NOLOGO %filename%.obj

Объяснение кода листинга программы

  1. cls - очистка консоли перед выводом результатов работы программы
  2. set filename=netenum - присвоение переменной filename значения netenum, используется для имени файла
  3. set masm_path=c:\masm32 - присвоение переменной masm_path значения c:\masm32, используется для пути к MASM (Microsof Assembler)
  4. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm - компиляция файла netenum.asm в объектный файл netenum.obj с помощью MASM (Microsof Assembler)
  5. %masm_path%\bin\Link /SUBSYSTEM:CONSOLE /LIBPATH:%masm_path%\lib ^/NOLOGO %filename%.obj - связывание объектного файла netenum.obj в исполняемый файл с помощью утилиты Link (linker), указана консольная подсистема, путь к библиотекам и отключена запись отладочной информации
  6. exit - завершение работы программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5