Получение атрибутов файла через 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'