Получение атрибутов файла через 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'
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д