Получение атрибутов файла через GetFileAttributes - Assembler
Формулировка задачи:
Добрый день. Нужно получить и вывести атрибуты файла. Моя программа умеет получать атрибуты, и сохранять их в eax. Мне нужно вывести их на печать.
Пример: в eax получаем 00000020h, что соотвествует 0010000b. Это соотвествует 5 биту, т.е. архивированному. Мне нужно вывести на печать, что он архивирован.
Листинг программы
- ; Консольное приложение, выводящее на консоль файл
- include typefile.inc
- .386
- .model FLAT,STDCALL
- .data
- hcons dd ?
- hfile dd ?
- buf db 100 dup(0)
- bufer db 300 dup(0)
- numb dd ?
- numw dd ?
- nameout db 'CONOUT$',0
- namefile db 'typefile.asm',0
- Errmsg db 'file not found',0
- bytesmsg db 'bytes',0
- result dw 0
- result2 dw 0
- .code
- _start: call CreateFile,offset nameout,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
- mov hcons,eax ;получение ссылки на консоль как на файл
- call GetCommandLine ;в EAX - указатель на коммандную строку
- mov esi,eax
- xor ecx,ecx ;счетчик
- mov edx,1 ;признак
- n1: cmp byte ptr [esi],0 ;конец строки
- je end_ ;нет параметра
- cmp byte ptr [esi],32 ;пробел
- je n3
- add ecx,edx
- cmp ecx,2 ;Первый параметр - имя программы. Второй - имя файла.
- je n4
- xor edx,edx
- jmp n2
- n3: or edx,1
- n2: inc esi
- jmp n1
- n4: call GetFileAttributesA,esi
- end_: call ExitProcess,0
- p1 proc
- ;Процедура преобразования слова в строку в десятичном виде (без знака)
- ; eAX - слово
- ; DI - буфер для строки (5 символов). Значение регистра не сохраняется.
- word_to_udec_str:
- push eax
- push ecx
- push edx
- push ebx
- xor ecx,ecx ;Обнуление CX
- mov ebx,10 ;В BX делитель (10 для десятичной системы)
- wtuds_lp1: ;Цикл получения остатков от деления
- xor edx,edx ;Обнуление старшей части двойного слова
- div ebx ;Деление AX=(DX:AX)/BX, остаток в DX
- add dl,'0' ;Преобразование остатка в код символа
- push edx ;Сохранение в стеке
- inc ecx ;Увеличение счетчика символов
- test eax,eax ;Проверка AX
- jnz wtuds_lp1 ;Переход к началу цикла, если частное не 0.
- wtuds_lp2: ;Цикл извлечения символов из стека
- pop edx ;Восстановление символа из стека
- mov [edi],dl ;Сохранение символа в буфере
- inc edi ;Инкремент адреса буфера
- loop wtuds_lp2 ;Команда цикла
- pop ebx
- pop edx
- pop ecx
- pop eax
- ret
- p1 endp
- end _start
Решение задачи: «Получение атрибутов файла через GetFileAttributes»
textual
Листинг программы
- ;fasm-code
- ;---------------------
- format PE console
- entry start
- include 'win32ax.inc'
- include 'api\kernel32.inc'
- .data ;------------------------------------------------
- mes0 db 'File name: ',0
- mes1 db 'File not found..',0
- buff db 16 dup(0) ;буфер для имени файла
- table dd mRead, mHide, mSys, mArch, mNorm, mDir
- ;-------------
- mRead db ' :READONLY',0
- mHide db ' :HIDDEN',0
- mSys db ' :SYSTEM',0
- mArch db ' :ARCHIVE',0
- mNorm db ' :NORMAL',0
- mDir db ' :DIRECTORY',0
- .code ;------------------------------------------------
- start:
- cinvoke printf, mes0 ;запрос на ввод
- cinvoke gets, buff ;читаем имя файла в буфер
- invoke GetFileAttributesA, buff ;запрос атрибутов
- or eax,eax
- jns @begin
- cinvoke printf, mes1 ;ошибка имени!!!
- jmp @exit
- @begin: mov ecx,6 ;кол-во проходов (атрибов)
- xor ebp,ebp ;начальное смещение в таблице
- mov edx,1 ;первый атрибут для проверки
- @find: mov ebx,eax ;EBX = реальный атриб
- and ebx,edx ;сбросим остальные..
- cmp ebx,edx ;есть такой?
- jnz @fuck ;нет
- pushad ;иначе: PRINTF портит регистры
- cinvoke printf, [table+ebp] ;выводим атрибут на экран!
- popad ;
- @fuck: add edx,edx ;сл.атрибут
- cmp edx,8 ;
- jne @okey ;атрибута(8) нету в списке (хз почему)
- add edx,edx ; ..коррекция!
- @okey: add ebp,4 ;сл.смещение в таблице переходов
- loop @find ;проверяем остальные ЕСХ-раз..
- @exit: jmp $ ;<-->
- invoke ExitProcess, 0
- ;------------------------------------------------------
- section '.idata' import data readable
- library kernel32, 'kernel32.dll',\
- msvcrt, 'msvcrt.dll',\
- user32, 'user32.dll'
- import msvcrt,\
- printf, 'printf',\
- gets, 'gets'
- import user32,\
- GetFileAttributes, 'GetFileAttributesA'
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д