Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Консольное приложение для win32, Программа перечисляющая сетевые ресурсы 
:(
    Опции темы
serrggeee
Дата 9.3.2012, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 29.12.2011

Репутация: нет
Всего: нет



Код


; 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\Сергей>
Если не сможете подсказать в чем проблема то подскажите где искать расшифровки этих ошибок.
PM MAIL   Вверх
Cheloveck
Дата 9.3.2012, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



Цитата(serrggeee @  9.3.2012,  17:58 Найти цитируемый пост)
подсказать в чем проблема

Проблема в нежелании понять, что происходит. Тебе английским по белому написано
Цитата(serrggeee @  9.3.2012,  17:58 Найти цитируемый пост)
syntax error : ,

Ошибка синтаксиса: запятая
Цитата(serrggeee @  9.3.2012,  17:58 Найти цитируемый пост)
too many initial

Что-то не так с инициализацией.
Цитата(serrggeee @  9.3.2012,  17:58 Найти цитируемый пост)
undefined symbol

Используешь необъявленную переменную.


--------------------
user posted image
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.