Irvine32 库中包含了一些简化的文件 I/O 过程。这些过程已经封装到本章描述的 Win32 API 函数中。
下面的源代码就给岀了 CreateOutputFile、OpenFile、WriteToFile、ReadFromFile 和 CloseFile:
- ;------------------------------------------------------
- CreateOutputFile PROC
- ;
- ; 创建一个新文件并以输出模式打开
- ; 接收: EDX 指向文件名
- ; 返回: 如果文件创建成功, EAX 包含一个有效的文件句柄。
- ; 否则,EAX 等于 INVALID_HANDLE_VALUE
- ;------------------------------------------------------
- INVOKE CreateFile,
- edx, GENERIC_WRITE, DO_NOT_SHARE, NULL,
- CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
- ret
- CreateOutputFile ENDP
- ;-------------------------------------------------------
- OpenFile PROC
- ;打开一个新的文本文件进行输入。
- ;接收:EDX 指向文件名。
- ;返回:如果文件打开成功,EAX 包含一个有效的文件
- ;句柄。否则,EAX 等于 INVALID_HANDLE_VALUE。
- ;-------------------------------------------------------
- INVOKE CreateFilez
- edx, GENERIC_READ, DO_NOT_SHARE, NULL,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0
- ret
- OpenFile ENDP
- ;--------------------------------------------------------
- WriteToFile PROC
- ;
- ; 将缓冲区内容写入一个输出文件
- ; 接收: EAX = 文件句柄, EDX = 缓冲区偏移量,
- ; ECX = 写入字节数
- ; 返回: EAX = 实际写入文件的字节数
- ; 如果 EAX 返回的值小于 ECX 中的参数, 则可能发生错误
- ;--------------------------------------------------------
- .data
- WriteToFile_1 DWORD ? ; 已写入字节数
- .code
- INVOKE WriteFile, ; 向文件写缓冲区
- eax, ; 文件句柄
- edx, ; 缓冲区指针
- ecx, ; 写入字节数
- ADDR WriteToFile_1, ; 已写入字节数
- 0 ; 覆盖执行标志
- mov eax,WriteToFile_1 ; 返回值
- ret
- WriteToFile ENDP
- ;--------------------------------------------------------
- ReadFromFile PROC
- ; 将一个输入文件读入缓冲区
- ; 接收: EAX = 文件句柄, EDX = 缓冲区偏移量,
- ; ECX = 读字节数
- ; 返回: 如果 CF=0,EAX = 已读字节数
- ; 如果 CF=1,则EAX包含Win32 API 函数 GetLastError 返回的系统错误码
- ;--------------------------------------------------------
- .data
- ReadFromFile_1 DWORD ? ; 已读字节数
- .code
- INVOKE ReadFile,
- eax, ; 文件句柄
- edx, ; 缓冲区指针
- ecx, ; 读取的最大字节数
- ADDR ReadFromFile_1, ; 已读字节数
- 0 ; 覆盖执行标志
- mov eax,ReadFromFile_1
- ret
- ReadFromFile ENDP
- ;--------------------------------------------------------
- CloseFile PROC
- ; 使用句柄为标识符关闭一个文件
- ; 接收: EAX = 文件句柄
- ; 返回: EAX = 非 0,如果文件被成功关闭
- ;--------------------------------------------------------
- INVOKE CloseHandle, eax
- ret
- CloseFile ENDP