ХАНДЫФАР

Функция CloseHandleEx закрывает файловый дескриптор. Функция CloseHandleEx автоматически выравнивает стек на 2 байта.

Параметры:

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

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____fName___db "test.txt", 0
  7. ____fBuffer db 255 dup(0)
  8. ____rError__db "Произошла ошибка при "
  9. ____________db "чтении из '%s'. Код "
  10. ____________db "ошибки: %d\0"
  11. ____fHandle_dw ?
  12. data ends
  13. code segment public
  14. ____assume _ds:data, cs:code
  15. ____include Handyfar.inc
  16. ____include Handymac.inc
  17. ____main proc
  18. ________call____SetDataSegment
  19. ________push____READ_WRITE
  20. ________pushs___ds:[fName]
  21. ________call____OpenFileEx
  22. ________mov_____fHandle, ax
  23. ________push____0FFh
  24. ________push____fHandle
  25. ________pushs___ds:[fBuffer]
  26. ________call____ReadFileEx
  27. ________jnc_____@NoReadFileError
  28. ________push____ax
  29. ________pushs___ds:[fName]
  30. ________leaax___ds:[rError]
  31. ________call____PrintFormatString
  32. ________add_____sp, 4
  33. ________jmp_____@Done
  34. ____@NoReadFileError:
  35. ________pushs___ds:[fBuffer]
  36. ________call____WriteStringEx
  37. ____@Done:
  38. ________push____fHandle
  39. ________call____CloseHandleEx
  40. ________push____0
  41. ________call____ExitProcessEx
  42. ____main endp
  43. code ends
  44. end main
Функция CloseHandleEx закрывает файловый дескриптор. Функция CloseHandleEx автоматически выравнивает стек на 2 байта.

Параметры:

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

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

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

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

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

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

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

  1. title Автор: Довгополов Евгений Сергеевич
  2. .286C
  3. .model small
  4. .stack 100h
  5. data segment public
  6. ____fName___db "test.txt", 0
  7. ____fBuffer db 255 dup(0)
  8. ____rError__db "Произошла ошибка при чтении из '%s'. Код ошибки: %d\0"
  9. ____fHandle_dw ?
  10. data ends
  11. code segment public
  12. ____assume _ds:data, cs:code
  13. ____include Handyfar.inc___________; Подключаем файл с функциями
  14. ____include Handymac.inc___________; Подключаем файл с макросами
  15. ____main proc
  16. ________call____SetDataSegment_____; Вызываем процедуру SetDataSegment
  17. ________push____READ_WRITE_________; 2-й: Ложим на вершину стека атрибут READ_WRITE
  18. ________pushs___ds:[fName]_________; 1-й: Ложим на вершину стека адрес переменной fName
  19. ________call____OpenFileEx_________; Вызываем процедуру OpenFileEx(fName, READ_WRITE) := AX и CF
  20. ________mov_____fHandle, ax________; Сохраняем файловый дескриптор в переменной fHandle
  21. ________push____0FFh_______________; 3-й: Ложим на вершину стека число байт для считывания
  22. ________push____fHandle____________; 2-й: Ложим на вершину стека файловый дескриптор fHandle
  23. ________pushs___ds:[fBuffer]_______; 1-й: Ложим на вершину стека адрес переменной fName
  24. ________call____ReadFileEx_________; Вызываем процедуру ReadFileEx(fBuffer, fHandle, 255) := AX и CF
  25. ________jnc_____@NoReadFileError___; Если CF=0, то прыгаем на метку @NoReadFileError
  26. ________push____ax_________________; 3-й: Ложим на вершину стека ax (код ошибки)
  27. ________pushs___ds:[fName]_________; 2-й: Ложим на вершину стека адрес переменной fName
  28. ________leaax___ds:[rError]________; 1-й: Загружаем адрес строки формата rError в регистр ds:ax
  29. ________call____PrintFormatString__; Вызываем процедуру PrintFormatString(ax:rError, fName, ax)
  30. ________add_____sp, 4______________; Выравниваем стек
  31. ________jmp_____@Done______________; Выполняем безусловный переход на метку @Done
  32. ____@NoReadFileError:
  33. ________pushs___ds:[fBuffer]_______; Ложим на вершину стека адрес переменной fBuffer
  34. ________call____WriteStringEx______; Вызываем процедуру WriteStringEx(fBuffer)
  35. ____@Done:
  36. ________push____fHandle____________; Ложим на вершину стека файловый дескриптор fHandle
  37. ________call____CloseHandleEx______; Вызываем процедуру CloseHandleEx(fHandle)
  38. ________push____0__________________; Ложим на вершину стека байтовое значение кода возврата
  39. ________call____ExitProcessEx______; Вызываем процедуру ExitProcess(0)
  40. ____main endp
  41. code ends
  42. end main
Made on
Tilda