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

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

6   голосов , оценка 3.833 из 5