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函数的分析
相关文章:
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)…...
Gridview配置数据源--信任服务器证书
目录 背景过程Gridview配置数据源GridView与数据源:数据库连接与安全:信任服务器证书:配置信任服务器证书:注意事项: 生成连接字符串程序运行报错问题解决 总结 背景 Gridview配置数据源之后,程序报错 过…...
【Next.js 入门教程系列】08-发送邮件
原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话, 给我的库点个star,关注一下吧 上一篇【Next.js 入门教程系列】07-身份验证 发送邮件 Setting Up React Email React Email 是一个高效便捷的 E…...
Echarts合集更更更之树图
实现效果 写在最后🍒 源码,关注🍥苏苏的bug,🍡苏苏的github,🍪苏苏的码云...
线性代数 行列式
一、行列式 1、定义 一个数学概念,主要用于 线性代数中,它是一个可以从方阵(即行数和列数相等的矩阵)形成的一个标量(即一个单一的数值) 2、二阶行列式 ,像这样将一个式子收缩称为一个 2*2 的…...
Ubuntu 通过 Docker 搭建 GitLab
准备工作 1.)更新软件。确保你的系统是最新 sudo apt update sudo apt upgrade -y 2.)安装 Docker 和 Docker Compose。 参考:Ubuntu 上安装 Docker-CSDN博客 1. 创建 GitLab 目录 创建一个用于存储 GitLab 数据和配置的目录࿱…...
原来CDC数据同步可以这么简单,零代码可视化一键数据同步
当前企业实时同步与分析场景中面临的挑战: 随着业务发展需要,实时分析成为企业目前的强需求,成为支撑企业业务发展的必须项。 一般来说,要满足数据实时分析的诉求,通常有两种方案: 第一种是直接使用源端…...
Ubuntu环境使用 Whisper 与 ZhipuAI 实现本地批量视频转录与文本标点复原(本地亲测可用)
使用 Whisper 与 ZhipuAI 实现批量视频转录与文本标点添加 在本篇博客中,我们将介绍一个实用的项目,帮助初学者了解如何使用 Whisper 和 ZhipuAI 的 API 来进行视频转录和文本处理。这个项目主要功能是将视频转录成文本,并利用大语言模型为转…...
SPI机制
一、SPI简介 SPI(Service Provider Interface)机制是一种服务发现机制,广泛用于Java生态中。它允许框架或库通过接口解耦具体实现,用户可以在运行时动态地提供接口的实现,而不是在编译时确定。这种机制在很多场景下非…...
生信分析流程:从数据准备到结果解释的完整指南
介绍 生物信息学(生信)分析是一个复杂的过程,涉及从数据准备到结果解释的多个步骤。随着高通量测序技术的发展和生物数据的迅猛增长,了解和掌握生信分析的标准流程变得尤为重要。这不仅有助于提高分析的准确性,还能优…...
golang语法
参考链接:https://www.runoob.com/go/ 创建变量 // 3种方法 var a int a : 10 // 类型推断 a : make() // 复合类型循环 // 3种循环 for i : 0; i < 10; i {// 循环体} // 传统for循环 for index, num : range nums {// 循环体} // nums是可迭代的复合类型…...
【fisco学习记录2】多群组搭建
说明 文档参考: 多群组部署 — FISCO BCOS 2.0 v2.11.0 文档 (fisco-bcos-documentation.readthedocs.io) 多群组搭建之前,先暂停之前的单群组,并删除: cd fisco bash nodes/127.0.0.1/stop_all.sh rm -rf nodes/ 实现图&…...
深度解读:路由交换、负载均衡与防火墙的网络交响
一、路由交换:网络流动的“大动脉” 1. 路由:决定命运的“路径规划师” 路由技术如同现代交通网络中的导航系统,决定了数据从起点到终点的最佳路径。路由器基于网络层IP地址,对每个数据包进行精确的路径选择,并确保其…...
linux线程 | 线程的控制(二)
前言: 本节内容是线程的控制部分的第二个小节。 主要是列出我们的线程控制部分的几个细节性问题以及我们的线程分离。这些都是需要大量的代码去进行实验的。所以, 准备好接受新知识的友友们请耐心观看。 现在开始我们的学习吧。 ps:本节内容适合了解线程…...
npm install报错一堆sass gyp ERR!
执行npm install ,出现一堆gyp含有sass错误的情况下。 解决办法: 首页可能是node版本问题,太高或者太低,也会导致npm install安装错误(不会自动生成node_modules文件),本次试验,刚开…...
微知-BlueField DPU在lspci中显示Flash Recovery是什么意思?
效果: lspci |grep BlueField10:00.0 Memory controller: Mellanox Technologies MT42822 Family [BlueField-2 SoC Flash Recovery] (rev 01)*原因: 表示此时flash是empty空的,或者在flash中的FW是无法工作的。比如烧录错误。 这里指的一提…...
【前端知识点】前端笔记
css 引入css文件的文件路径 <!-- 引入外部 CSS 文件 --> <!-- 当前文件所在文件夹目录 --> <link rel"stylesheet" href"./"> <!-- 当前文件所在父文件夹目录 --> <link rel"stylesheet" href"../">j…...
Sping Cache 使用详解
缓存是提升应用性能的常用手段。它通过将耗时的操作结果存储起来,下次请求可以直接从缓存中获取,从而避免重复计算或查询数据库,显著减少响应时间和服务器负载。Spring 框架提供了强大的缓存抽象 Spring Cache,它简化了缓存的使用…...
动手学深度学习60 机器翻译与数据集
1. 机器翻译与数据集 import os import torch from d2l import torch as d2l#save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5)#save def read_data_nmt():"""载入“英语-法语”数据集"&qu…...
Python网络爬虫技术
Python网络爬虫技术详解 引言 网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定规则自动抓取互联网信息的程序或脚本。它们通过遍历网页链…...
Windows安卓应用安装器终极指南:3种方法实现跨平台无缝体验
Windows安卓应用安装器终极指南:3种方法实现跨平台无缝体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在移动互联网时代,我们经常遇到这样…...
终极CH55xduino指南:5分钟构建低成本USB微控制器项目
终极CH55xduino指南:5分钟构建低成本USB微控制器项目 【免费下载链接】ch55xduino An Arduino-like programming API for the CH55X 项目地址: https://gitcode.com/gh_mirrors/ch/ch55xduino CH55xduino为CH55X系列低成本MCS51 USB微控制器提供了完整的Ardu…...
WinDirStat:3步快速上手Windows磁盘空间高效管理
WinDirStat:3步快速上手Windows磁盘空间高效管理 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat 你是否经常遇到Windows电脑磁…...
如何用KLOGG在5分钟内成为日志分析高手
如何用KLOGG在5分钟内成为日志分析高手 【免费下载链接】klogg Really fast log explorer based on glogg project 项目地址: https://gitcode.com/gh_mirrors/kl/klogg 你是否曾在海量日志文件中迷失方向?面对数十GB的日志数据,传统的grep命令显…...
Spring Boot安全脚手架:openclaw-security-starter核心架构与实战指南
1. 项目概述:一个面向开发者的安全脚手架最近在梳理团队内部的安全开发规范时,发现一个普遍痛点:每个新项目启动,安全相关的配置总是东拼西凑,从依赖扫描、密钥管理到API安全策略,都得重新来一遍࿰…...
Taotoken用量看板如何帮助开发者洞察API消费明细
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken用量看板如何帮助开发者洞察API消费明细 对于依赖大模型API进行开发的团队或个人而言,清晰、透明地掌握资源消…...
KNN算法调参实战:如何为你的数据选择合适的距离度量(从闵可夫斯基距离说起)
KNN算法调参实战:如何为你的数据选择合适的距离度量(从闵可夫斯基距离说起) 在机器学习项目中,K近邻(KNN)算法因其简单直观而广受欢迎。但许多实践者往往忽略了一个关键环节——距离度量的选择。当你在Scik…...
Claude 代码在大型代码库中的运作方式:最佳实践与入门指南
How Claude Code works in large codebases: Best practices and where to start Claude 代码在大型代码库中的运作方式:最佳实践与入门指南 https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start The most succ…...
Python热重载工具Reloadium:原理、配置与实战避坑指南
1. 项目概述:重新定义Python热重载的开发体验如果你是一名Python开发者,无论是做Web后端、数据分析脚本还是机器学习模型训练,大概率都经历过这样的场景:修改了一行代码,保存文件,然后不得不手动停止当前运…...
PyTorch实战:手写Sobel与Laplace算子实现图像边缘检测
1. 图像边缘检测与卷积算子基础 第一次接触图像处理时,我对"边缘检测"这个概念特别好奇。简单来说,边缘就是图像中物体轮廓或纹理变化明显的区域。想象一下用铅笔描边一幅画的过程,边缘检测就是让计算机自动完成这个工作。 为什么边…...
