ХАНДЫФАР

Функция CloseHandle закрывает файловый дескриптор.

Параметры:

  • AX: Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.

Возвращаемое значение:

  • Если CF = 0: Дескриптор файла успешно закрыт.
  • Если CF = 1: AX содержит код ошибки.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция не изменяет значения регистров, кроме AX и флагов.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fBuffer_db 255 dup(0)
  7. ____rError__db "Произошла ошибка при "
  8. ____________db "чтении из файла '%s'. "
  9. ____________db "Код ошибки: %d\0"
  10. ____fHandle_dw ?
  11. data ends
  12. code segment public
  13. ____assume _ds:data, cs:code
  14. ____include Handyfar.inc
  15. ____main proc
  16. ________call____SetDataSegment
  17. ________mov_____bl, READ_WRITE
  18. ________lea_____ax, ds:[fName]
  19. ________call____OpenFile
  20. ________mov_____fHandle, ax
  21. ________mov_____cx, 0FFh
  22. ________mov_____bx, fHandle
  23. ________lea_____ax, ds:[fBuffer]
  24. ________call____ReadFile
  25. ________jnc_____NoReadFileError
  26. ________push____ax
  27. ________lea_____ax, ds:[fName]
  28. ________push____ax
  29. ________lea_____ax, ds:[rError]
  30. ________call____PrintFormatString
  31. ________add_____sp, 4
  32. ________jmp_____Done
  33. ____NoReadFileError:
  34. ________mov_____ax, fHandle
  35. ________call____CloseHandle
  36. ________lea_____ax, ds:[fBuffer]
  37. ________call____WriteString
  38. ____Done:
  39. ________xor_____al, al
  40. ________call____ExitProcess
  41. ____main endp
  42. code ends
  43. end main
Функция CloseHandle закрывает файловый дескриптор.

Параметры:

  • AX: Дескриптор файла, полученный после вызова функций CreateFile или OpenFile.

Возвращаемое значение:

  • Если CF = 0: Дескриптор файла успешно закрыт.
  • Если CF = 1: AX содержит код ошибки.

Состояние флагов:

  • Функция влияет на все флаги.

Особенности:

  • Функция не изменяет значения регистров, кроме AX и флагов.

  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. data segment public
  5. ____fName___db "test.txt", 0
  6. ____fBuffer_db 255 dup(0)
  7. ____rError__db "Произошла ошибка при чтении из файла '%s'. Код ошибки: %d\0"
  8. ____fHandle_dw ?
  9. data ends
  10. code segment public _______________; Начало сегмента кода
  11. ____assume _ds:data, cs:code
  12. ____include Handyfar.inc___________; Подключаем файл с функциями
  13. ____main proc _____________________; Начало процедуры main
  14. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  15. ________mov_____bl, READ_WRITE_____; 2-й: Устанавливаем атрибут чтение и запись в регистр bl
  16. ________lea_____ax, ds:[fName]_____; 1-й: Загружаем адрес строки fName в регистр ds:ax
  17. ________call____OpenFile___________; Вызываем процедуру OpenFile(ds:ax, READ_WRITE) := AX и CF
  18. ________mov_____fHandle, ax________; Сохраняем файловый дескриптор в переменной fHandle
  19. ________mov_____cx, 0FFh___________; 3-й: Копируем максимальное число байт для считывания в регистр cx
  20. ________mov_____bx, fHandle________; 2-й: Копируем файловый дескриптор fHandle в регистр bx
  21. ________lea_____ax, ds:[fBuffer]___; 1-й: Загружаем адрес буфера fBuffer в регистр ds:ax
  22. ________call____ReadFile___________; Вызываем процедуру ReadFile(ax:fBuffer, bx:fHandle, cx:0FFh)
  23. ________jnc_____NoReadFileError____; Если CF=0, то прыгаем на метку NoReadFileError
  24. ________push____ax_________________; 3-й: Сохраняем значение регистра ax(код ошибки) в стеке
  25. ________lea_____ax, ds:[fName]_____; Загружаем адрес переменной fName в регистр ds:ax
  26. ________push____ax_________________; 2-й: Сохраняем значение регистра ax в стеке
  27. ________lea_____ax, ds:[rError]____; 1-й: Загружаем адрес строки формата rError в регистр ds:ax
  28. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:rError, fName, ax)
  29. ________add_____sp, 4______________; Выравниваем стек
  30. ________jmp_____Done_______________; Выполняем безусловный переход на метку Done
  31. ____NoReadFileError:
  32. ________mov_____ax, fHandle________; Копируем файловый дескриптор fHandle в регистр ax
  33. ________call____CloseHandle________; Вызываем процедуру CloseHandle(ax:fHandle)
  34. ________lea_____ax, ds:[fBuffer]___; Загружаем адрес буфера fBuffer в регистр ds:ax
  35. ________call____WriteString________; Вызываем процедуру WriteString(ax:fBuffer)
  36. ____Done:
  37. ________xor_____al, al_____________; Обнуляем регистр al
  38. ________call____ExitProcess________; Вызываем процедуру ExitProcess
  39. ____main endp _____________________; Конец процедуры main
  40. code ends _________________________; Конец сегмента кода
  41. end main __________________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda