当前位置: 首页 > news >正文

2.1.ReactOS源码分析ReadFile函数分解

2.1.ReactOS源码分析ReadFile函数分解

2.1.ReactOS源码分析ReadFile函数分解

文章目录

  • 2.1.ReactOS源码分析ReadFile函数分解
  • ReadFile函数的分析
  • ReadFile函数的声明
  • ReadFile函数的核心代码


ReadFile函数的分析

BOOL WINAPI ReadFile(HANDLE,PVOID,DWORD,PDWORD,LPOVERLAPPED);

ReadFile函数的声明

BOOL STDCALL
ReadFile(IN HANDLE hFile,IN LPVOID lpBuffer,IN DWORD nNumberOfBytesToRead,OUT LPDWORD lpNumberOfBytesRead  OPTIONAL,IN LPOVERLAPPED lpOverlapped  OPTIONAL)
{NTSTATUS Status;DPRINT("ReadFile(hFile %x)\n", hFile);if (lpNumberOfBytesRead != NULL){*lpNumberOfBytesRead = 0;}if (IsConsoleHandle(hFile)){return ReadConsoleA(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL);}if (lpOverlapped != NULL){LARGE_INTEGER Offset;PVOID ApcContext;Offset.u.LowPart = lpOverlapped->Offset;Offset.u.HighPart = lpOverlapped->OffsetHigh;lpOverlapped->Internal = STATUS_PENDING;ApcContext = (((ULONG_PTR)lpOverlapped->hEvent & 0x1) ? NULL : lpOverlapped);Status = NtReadFile(hFile,lpOverlapped->hEvent,NULL,ApcContext,(PIO_STATUS_BLOCK)lpOverlapped,lpBuffer,nNumberOfBytesToRead,&Offset,NULL);/* return FALSE in case of failure and pending operations! */if (!NT_SUCCESS(Status) || Status == STATUS_PENDING){if (Status == STATUS_END_OF_FILE &&lpNumberOfBytesRead != NULL){*lpNumberOfBytesRead = 0;}SetLastErrorByStatus(Status);return FALSE;}if (lpNumberOfBytesRead != NULL){*lpNumberOfBytesRead = lpOverlapped->InternalHigh;}}else{IO_STATUS_BLOCK Iosb;Status = NtReadFile(hFile,NULL,NULL,NULL,&Iosb,lpBuffer,nNumberOfBytesToRead,NULL,NULL);/* wait in case operation is pending */if (Status == STATUS_PENDING){Status = NtWaitForSingleObject(hFile,FALSE,NULL);if (NT_SUCCESS(Status)){Status = Iosb.Status;}}if (Status == STATUS_END_OF_FILE){/* lpNumberOfBytesRead must not be NULL here, in fact Win doesn'tcheck that case either and crashes (only after the operationcompleted) */*lpNumberOfBytesRead = 0;return TRUE;}if (NT_SUCCESS(Status)){/* lpNumberOfBytesRead must not be NULL here, in fact Win doesn'tcheck that case either and crashes (only after the operationcompleted) */*lpNumberOfBytesRead = Iosb.Information;}else{SetLastErrorByStatus(Status);return FALSE;}}DPRINT("ReadFile() succeeded\n");return TRUE;
}

ReadFile函数的核心代码

BOOL STDCALL
ReadFile(IN HANDLE hFile,IN LPVOID lpBuffer,IN DWORD nNumberOfBytesToRead,OUT LPDWORD lpNumberOfBytesRead  OPTIONAL,IN LPOVERLAPPED lpOverlapped  OPTIONAL)
{NTSTATUS Status;// ...Status = NtReadFile(hFile,NULL,NULL,NULL,&Iosb,lpBuffer,nNumberOfBytesToRead,NULL,NULL);//...return TRUE;
}

1,ReadFile函数的分析,转变为对函数NtReadFile函数的分析。
NtReadFile函数的分析请看本专栏NtReadFile函数的分析

http://www.lryc.cn/news/459729.html

相关文章:

  • Gridview配置数据源--信任服务器证书
  • 【Next.js 入门教程系列】08-发送邮件
  • Echarts合集更更更之树图
  • 线性代数 行列式
  • Ubuntu 通过 Docker 搭建 GitLab
  • 原来CDC数据同步可以这么简单,零代码可视化一键数据同步
  • Ubuntu环境使用 Whisper 与 ZhipuAI 实现本地批量视频转录与文本标点复原(本地亲测可用)
  • SPI机制
  • 生信分析流程:从数据准备到结果解释的完整指南
  • golang语法
  • 【fisco学习记录2】多群组搭建
  • 深度解读:路由交换、负载均衡与防火墙的网络交响
  • linux线程 | 线程的控制(二)
  • npm install报错一堆sass gyp ERR!
  • 微知-BlueField DPU在lspci中显示Flash Recovery是什么意思?
  • 【前端知识点】前端笔记
  • Sping Cache 使用详解
  • 动手学深度学习60 机器翻译与数据集
  • Python网络爬虫技术
  • 黑马程序员-redis项目实践笔记1
  • ES-入门聚合查询
  • 七维大脑: 探索人类认知的未来之路
  • spring |Spring Security安全框架 —— 认证流程实现
  • Django+vue自动化测试平台---正式开源!!!
  • 电子电气架构 --- 智能网联汽车未来是什么样子?
  • docker安装elasticsearch(es)+kibana
  • 大厂面试真题-说说redis的雪崩、击穿和穿透
  • 【Spring】获取Cookie和Session(@CookieValue()和@SessionAttribute())
  • 【C++打怪之路Lv8】-- string类
  • 【JS】node.js压缩文件的方式