Получение атрибутов файла через GetFileAttributes - Assembler

Узнай цену своей работы

Формулировка задачи:

Добрый день. Нужно получить и вывести атрибуты файла. Моя программа умеет получать атрибуты, и сохранять их в eax. Мне нужно вывести их на печать. Пример: в eax получаем 00000020h, что соотвествует 0010000b. Это соотвествует 5 биту, т.е. архивированному. Мне нужно вывести на печать, что он архивирован.
Листинг программы
  1. ; Консольное приложение, выводящее на консоль файл
  2. include typefile.inc
  3. .386
  4. .model FLAT,STDCALL
  5. .data
  6. hcons dd ?
  7. hfile dd ?
  8. buf db 100 dup(0)
  9. bufer db 300 dup(0)
  10. numb dd ?
  11. numw dd ?
  12. nameout db 'CONOUT$',0
  13. namefile db 'typefile.asm',0
  14. Errmsg db 'file not found',0
  15. bytesmsg db 'bytes',0
  16. result dw 0
  17. result2 dw 0
  18. .code
  19. _start: call CreateFile,offset nameout,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,0
  20. mov hcons,eax ;получение ссылки на консоль как на файл
  21. call GetCommandLine EAX - указатель на коммандную строку
  22. mov esi,eax
  23. xor ecx,ecx ;счетчик
  24. mov edx,1 ;признак
  25. n1: cmp byte ptr [esi],0 ;конец строки
  26. je end_ ;нет параметра
  27. cmp byte ptr [esi],32 ;пробел
  28. je n3
  29. add ecx,edx
  30. cmp ecx,2 ;Первый параметр - имя программы. Второй - имя файла.
  31. je n4
  32. xor edx,edx
  33. jmp n2
  34. n3: or edx,1
  35. n2: inc esi
  36. jmp n1
  37. n4: call GetFileAttributesA,esi
  38. end_: call ExitProcess,0
  39. p1 proc
  40. ;Процедура преобразования слова в строку в десятичном виде (без знака)
  41. ; eAX - слово
  42. ; DI - буфер для строки (5 символов). Значение регистра не сохраняется.
  43. word_to_udec_str:
  44. push eax
  45. push ecx
  46. push edx
  47. push ebx
  48. xor ecx,ecx ;Обнуление CX
  49. mov ebx,10 BX делитель (10 для десятичной системы)
  50. wtuds_lp1: ;Цикл получения остатков от деления
  51. xor edx,edx ;Обнуление старшей части двойного слова
  52. div ebx ;Деление AX=(DX:AX)/BX, остаток в DX
  53. add dl,'0' ;Преобразование остатка в код символа
  54. push edx ;Сохранение в стеке
  55. inc ecx ;Увеличение счетчика символов
  56. test eax,eax ;Проверка AX
  57. jnz wtuds_lp1 ;Переход к началу цикла, если частное не 0.
  58. wtuds_lp2: ;Цикл извлечения символов из стека
  59. pop edx ;Восстановление символа из стека
  60. mov [edi],dl ;Сохранение символа в буфере
  61. inc edi ;Инкремент адреса буфера
  62. loop wtuds_lp2 ;Команда цикла
  63. pop ebx
  64. pop edx
  65. pop ecx
  66. pop eax
  67. ret
  68. p1 endp
  69. end _start

Решение задачи: «Получение атрибутов файла через GetFileAttributes»

textual
Листинг программы
  1. ;fasm-code
  2. ;---------------------
  3. format  PE console
  4. entry   start
  5. include 'win32ax.inc'
  6. include 'api\kernel32.inc'
  7.  
  8. .data ;------------------------------------------------
  9. mes0    db   'File name: ',0
  10. mes1    db   'File not found..',0
  11. buff    db   16 dup(0)             ;буфер для имени файла
  12.  
  13. table   dd   mRead, mHide, mSys, mArch, mNorm, mDir
  14. ;-------------
  15. mRead   db   ' :READONLY',0
  16. mHide   db   ' :HIDDEN',0
  17. mSys    db   ' :SYSTEM',0
  18. mArch   db   ' :ARCHIVE',0
  19. mNorm   db   ' :NORMAL',0
  20. mDir    db   ' :DIRECTORY',0
  21.  
  22. .code ;------------------------------------------------
  23. start:
  24.      cinvoke  printf, mes0               ;запрос на ввод
  25.      cinvoke  gets, buff                 ;читаем имя файла в буфер
  26.       invoke  GetFileAttributesA, buff   ;запрос атрибутов
  27.  
  28.         or    eax,eax
  29.         jns   @begin
  30.      cinvoke  printf, mes1         ;ошибка имени!!!
  31.         jmp   @exit
  32.  
  33. @begin: mov   ecx,6                ;кол-во проходов (атрибов)
  34.         xor   ebp,ebp              ;начальное смещение в таблице
  35.         mov   edx,1                ;первый атрибут для проверки
  36. @find:  mov   ebx,eax              ;EBX = реальный атриб
  37.         and   ebx,edx              ;сбросим остальные..
  38.         cmp   ebx,edx              ;есть такой?
  39.         jnz   @fuck                ;нет
  40.         pushad                     ;иначе: PRINTF портит регистры
  41.     cinvoke   printf, [table+ebp]  ;выводим атрибут на экран!
  42.         popad                      ;
  43. @fuck:  add   edx,edx              ;сл.атрибут
  44.         cmp   edx,8                ;
  45.         jne   @okey                ;атрибута(8) нету в списке (хз почему)
  46.         add   edx,edx              ;   ..коррекция!
  47. @okey:  add   ebp,4                ;сл.смещение в таблице переходов
  48.         loop  @find                ;проверяем остальные ЕСХ-раз..
  49.  
  50. @exit:  jmp   $    ;<-->
  51.  
  52.         invoke   ExitProcess, 0
  53.  
  54. ;------------------------------------------------------
  55. section '.idata' import data readable
  56. library kernel32, 'kernel32.dll',\
  57.           msvcrt, 'msvcrt.dll',\
  58.           user32, 'user32.dll'
  59.  
  60. import  msvcrt,\
  61.         printf, 'printf',\
  62.           gets, 'gets'
  63.  
  64. import  user32,\
  65.         GetFileAttributes, 'GetFileAttributesA'

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут