ReactOS源码分析ReadFile函数分析

news/2024/9/25 14:38:33/

ReactOSReadFile_0">ReactOS源码分析ReadFile函数分析

ReactOS源码分析ReadFile函数分析
ReadFile(IN HANDLE hFile,
IN LPVOID lpBuffer,
IN DWORD nNumberOfBytesToRead,
OUT LPDWORD lpNumberOfBytesRead OPTIONAL,
IN LPOVERLAPPED lpOverlapped OPTIONAL)

文章目录

  • ReactOS源码分析ReadFile函数分析
  • ReadFile


ReadFile

BOOL WINAPI
ReadFile(IN HANDLE hFile,IN LPVOID lpBuffer,IN DWORD nNumberOfBytesToRead,OUT LPDWORD lpNumberOfBytesRead OPTIONAL,IN LPOVERLAPPED lpOverlapped OPTIONAL)
{NTSTATUS Status;TRACE("ReadFile(hFile %p)\n", hFile);if (lpNumberOfBytesRead != NULL) *lpNumberOfBytesRead = 0;hFile = TranslateStdHandle(hFile);if (IsConsoleHandle(hFile)){if (ReadConsoleA(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL)){DWORD dwMode;GetConsoleMode(hFile, &dwMode);if ((dwMode & ENABLE_PROCESSED_INPUT) && *(PCHAR)lpBuffer == 0x1a){/* EOF character entered; simulate end-of-file */*lpNumberOfBytesRead = 0;}return TRUE;}return FALSE;}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;BaseSetLastNTError(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't* check that case either and crashes (only after the operation* completed).*/*lpNumberOfBytesRead = 0;return TRUE;}if (NT_SUCCESS(Status)){/** lpNumberOfBytesRead must not be NULL here, in fact Win doesn't* check that case either and crashes (only after the operation* completed).*/*lpNumberOfBytesRead = Iosb.Information;}else{BaseSetLastNTError(Status);return FALSE;}}TRACE("ReadFile() succeeded\n");return TRUE;
}

http://www.ppmy.cn/news/1530326.html

相关文章

在Linux中运行flask项目

准备 这里我准备了一个GitHub上某个大佬写的留言板的Flask项目,就用这个来给大家做示范了。 查看留言板的目录结构 查看主程序所用的库函数 只有一个第三方库 Flask 安装pip sudo apt install python3-pip -y测试 pip 安装成功 修改pip镜像源 修改pip的默认下载…

Hadoop的安装

文章目录 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。二. 环境变量三. 配置 一. 到Hadoop官网下载安装文件hadoop-3.4.0.tar.gz。 随后点击下载即可 由于Hadoop不直接支持Windows系统,因此,需要修改一些配置才能运行 二. 环境变量 三. 配置 进…

2024双十一好物推荐 五款性价比高的好物分享

随着2024年的双十一日益临近,消费者们正翘首以待,期待着在这个年度盛事中淘到心仪的好物。今年的双十一,各大品牌和电商平台纷纷推出了众多优惠活动和新品,让消费者在享受购物乐趣的同时,也能以更实惠的价格入手高品质…

Unity 延迟时间 Threading.Tasks

在代码中,Task.Delay创建了一个异步任务,该任务将在指定的时间(以毫秒为单位)延迟。await关键字暂停了Main方法的执行,直到Task.Delay完成。这允许在等待期间,主程序是非阻塞的。 using System; using Syst…

真正厉害的项目经理都做到了这一点

在项目管理中,沟通是贯穿始终的关键要素,它能够打开团队协作的大门,推动项目稳步前行。 而那些真正厉害的项目经理,无一不是沟通的高手,他们通过清晰、有效且富有策略性的沟通,确保了项目的每一个环节都紧密…

指挥平台在应急场所中的主要表现有哪些

在应对自然灾害、公共安全事件等突发危机时,指挥平台作为应急管理体系的核心枢纽,其重要性不言而喻。它不仅承载着信息的快速汇聚、精准分析与高效调度功能,更在应急场所中有一定的关键表现。接下来就跟着北京嘉德立一起了解一下。 一、信息集…

EmguCV学习笔记 VB.Net 11.9 姿势识别 OpenPose

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

蓝桥杯【物联网】零基础到国奖之路:十. OLED

蓝桥杯【物联网】零基础到国奖之路:十.OLED 第一节 硬件解读第二节 MDK配置 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fa7660b81be9407aa19c603561553db0.png)第三节 代码 第一节 硬件解读 OLED硬件知识: 第二节 MDK配置 第三节 代码 include头文件。 编…