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

kernel32!GetQueuedCompletionStatus函数分析之返回值得有效性

第一部分://#define STATUS_SUCCESS 0x0返回值为0
           } else {

                //
                // Set the completion status, capture the completion
                // information, deallocate the associated IRP, and
                // attempt to write the completion information.
                //

                Status = STATUS_SUCCESS;        //#define STATUS_SUCCESS 0x0返回值为0
                try {
                    MiniPacket = CONTAINING_RECORD(Entry,
                                                   IOP_MINI_COMPLETION_PACKET,
                                                   ListEntry);

                    if ( MiniPacket->PacketType == IopCompletionPacketIrp ) {
                        Irp = CONTAINING_RECORD(Entry, IRP, Tail.Overlay.ListEntry);
                        LocalApcContext = Irp->Overlay.AsynchronousParameters.UserApcContext;
                        LocalKeyContext = (PVOID)Irp->Tail.CompletionKey;
                        LocalIoStatusBlock = Irp->IoStatus;
                        IoFreeIrp(Irp);

                    } else {

                        LocalApcContext = MiniPacket->ApcContext;
                        LocalKeyContext = (PVOID)MiniPacket->KeyContext;
                        LocalIoStatusBlock.Status = MiniPacket->IoStatus;
                        LocalIoStatusBlock.Information = MiniPacket->IoStatusInformation;
                        IopFreeMiniPacket(MiniPacket);
                    }

                    *ApcContext = LocalApcContext;
                    *KeyContext = LocalKeyContext;
                    *IoStatusBlock = LocalIoStatusBlock;

                } except(ExSystemExceptionFilter()) {
                    NOTHING;
                }
            }

            //
            // Deference I/O completion object.
            //

            ObDereferenceObject(IoCompletion);
        }

    //
    // If an exception occurs during the probe of the previous count, then
    // always handle the exception and return the exception code as the status
    // value.
    //

    } except(ExSystemExceptionFilter()) {
        Status = GetExceptionCode();
    }

    //
    // Return service status.
    //

    return Status;
}

第二部分:

BOOL
WINAPI
GetQueuedCompletionStatus(
    HANDLE CompletionPort,
    LPDWORD lpNumberOfBytesTransferred,
    PULONG_PTR lpCompletionKey,
    LPOVERLAPPED *lpOverlapped,
    DWORD dwMilliseconds
    )
{

    LARGE_INTEGER TimeOut;
    PLARGE_INTEGER pTimeOut;
    IO_STATUS_BLOCK IoSb;
    NTSTATUS Status;
    LPOVERLAPPED LocalOverlapped;
    BOOL rv;


    pTimeOut = BaseFormatTimeOut(&TimeOut,dwMilliseconds);
    Status = NtRemoveIoCompletion(
                CompletionPort,
                (PVOID *)lpCompletionKey,
                (PVOID *)&LocalOverlapped,
                &IoSb,
                pTimeOut
                );

    if ( !NT_SUCCESS(Status) || Status == STATUS_TIMEOUT ) {
        *lpOverlapped = NULL;
        if ( Status == STATUS_TIMEOUT ) {
            SetLastError(WAIT_TIMEOUT);
            }
        else {
            BaseSetLastNTError(Status);
            }
        rv = FALSE;
        }
    else {
        *lpOverlapped = LocalOverlapped;            //lpOverlapped 有非0值

        *lpNumberOfBytesTransferred = (DWORD)IoSb.Information;

        if ( !NT_SUCCESS(IoSb.Status) ){
            BaseSetLastNTError( IoSb.Status );
            rv = FALSE;
            }
        else {
            rv = TRUE;        //成功。返回1!!!
            }
        }
    return rv;
}


第三部分:

参考:
1: kd> kc
 #
00 nt!NtRemoveIoCompletion
01 nt!_KiSystemService
02 SharedUserData!SystemCallStub
03 ntdll!ZwRemoveIoCompletion
04 kernel32!GetQueuedCompletionStatus
05 RPCRT4!COMMON_ProcessCalls
06 RPCRT4!LOADABLE_TRANSPORT::ProcessIOEvents
07 RPCRT4!ProcessIOEventsWrapper
08 RPCRT4!BaseCachedThreadRoutine
09 RPCRT4!ThreadStartRoutine
0a kernel32!BaseThreadStart


1: kd> p
Breakpoint 40 hit
RPCRT4!COMMON_ProcessCalls+0xe9:
001b:77c66f8d 85c0            test    eax,eax
1: kd> r
eax=00000001 ebx=77e47889 ecx=00000000 edx=7ffe0304 esi=77be9fc4 edi=77f6a8dc
eip=77c66f8d esp=00acfef0 ebp=00acff18 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
RPCRT4!COMMON_ProcessCalls+0xe9:
001b:77c66f8d 85c0            test    eax,eax
1: kd> dv

                    b = 0n1

         lpOverlapped = 0x00b002b8


第一种情况:都为0

        if (!b && !lpOverlapped)
            {
            // If lpOverlapped is NULL this mean no IO completed.


第二种情况:b为0,lpOverlapped)不为0。调用GetLastError();,前面有BaseSetLastNTError( IoSb.Status );
        if (!b)
            {
            pBaseOverlapped = FindOverlapped(lpOverlapped);
            pRequest = FindRequest(lpOverlapped);

            LastError = GetLastError();

第三种情况:成功,有数据完成了。
        // here we actually have a completed IO
        pBaseOverlapped = FindOverlapped(lpOverlapped);
        pRequest = FindRequest(lpOverlapped);

相关文章:

kernel32!GetQueuedCompletionStatus函数分析之返回值得有效性

第一部分://#define STATUS_SUCCESS 0x0返回值为0 } else { // // Set the completion status, capture the completion // information, deallocate the associated IRP, and // attempt to write the…...

gazebo 启动卡死的解决方法汇总

1. 排查显卡驱动是否正常安装 nvidia-smi # 英伟达显卡--------------------------------------------------------------------------------------- | NVIDIA-SMI 535.230.02 Driver Version: 535.230.02 CUDA Version: 12.2 | |------------------------…...

硬件设计-MOS管快速关断的原因和原理

目录 简介: 来源: MOS管快关的原理 先简单介绍下快关的原理: 同电阻时为什么关断时间会更长 小结 简介: 本章主要介绍MOS快速关断的原理和原因。 来源: 有人会问,会什么要求快速关断,而…...

塔能科技解节能密码,工厂成本“效益方程式”精准破题

在全球积极推进可持续发展战略的当下,各行业都在努力探索节能减排、绿色发展的新路径,对于工厂而言,节能早已不是锦上添花的选择,而已成为关乎企业生死存亡与长远发展的核心要素,是实现可持续运营的必由之路。塔能科技…...

swift ui基础

一个朴实无华的目录 今日学习内容:1.三种布局(可以相互包裹)1.1 vstack(竖直):先写的在上面1.1 hstack(水平):先写的在左边1.1 zstack(前后)&…...

格式工厂 v5.18最新免安装绿色便携版

前言 用它来转视频的时候,还能顺便给那些有点小瑕疵的视频修修补补,保证转出来的视频质量杠杠的。更厉害的是,它不只是转换那么简单,还能帮你把PDF合并成一本小册子,视频也能合并成大片,还能随心所欲地裁剪…...

CSPM认证对项目论证的范式革新:从合规审查到价值创造的战略跃迁

引言 在数字化转型浪潮中,全球企业每年因项目论证缺陷导致的损失高达1.7万亿美元(Gartner 2023)。CSPM(Certified Strategic Project Manager)认证体系通过结构化方法论,将传统的项目可行性评估升级为战略…...

TcxCustomCheckComboBoxProperties.EditValueFormat 值说明

TcxCheckStatesValueFormat 类枚举复选框状态对 edit 值的可能解释。以下选项可用。 价值 意义 cvf字幕 编辑值是一个字符串,其中包含两个由分号分隔的子字符串。分号前的子字符串包含灰显项目的标题列表。分号后面的子字符串包含已选中项目的标题列表。请注意&a…...

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…...

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符&#xff0c;整个运算符会将宏的参数转换为字符串字面量&#xff0c;它仅可以出现在带参数的宏的替换列表中&#xff0c;我们可以将其理解为字符串化。 我们先看下面的一段代码&#xff1a; 第二个printf中是由两个字符串组成的&am…...

IIC通信协议

一、概述 IIC协议&#xff1a;是一种各种电子设备之间进行数据交换和通信的串行&#xff0c;半双工通信协议&#xff0c;主要用于近距离&#xff0c;低速的芯片之间的通信。 I2C协议采用双线结构传输数据&#xff0c;由一个数据线&#…...

SpringBoot原生实现分布式MapReduce计算(无第三方中间件版)

一、架构设计调整 核心组件替换方案&#xff1a; 注册中心 → 数据库注册表任务队列 → 数据库任务表分布式锁 → 数据库行级锁节点通信 → HTTP REST接口 二、数据库表结构设计 -- 节点注册表 CREATE TABLE compute_nodes (node_id VARCHAR(36) PRIMARY KEY,last_heartbea…...

02-libVLC的视频播放器:播放音视频文件以及网络流

libvlc_new(0, nullptr)功能:创建并初始化libVLC的核心实例,是使用所有libVLC功能的前提。 参数:第一个参数:参数数量(通常设为0)第二个参数:参数列表(通常为nullptr,表示使用默认配置)返回值:成功返回libvlc_instance_t*指针,失败返回nullptr。注意事项:可通过参…...

Autoware源码总结

Autoware源码网站 项目简介 教程 Autoware的整体架构如下图&#xff0c;主要包括传感器sensing、高精地图map data、车辆接口vehicle interface、感知perception&#xff08;动态障碍物检测detection、跟踪tracking、预测prediction&#xff1b;交通信号灯检测detection、分类c…...

PowerBI 条形图显示数值和百分比

数据表: 三个度量值 销售额 SUM(销量表[销售量])//注意, 因为Y轴显示的产品&#xff0c;会被筛选&#xff0c;所以用ALLSELECTED来获取当前筛选条件下&#xff0c;Y轴显示的产品 百分比 FORMAT(DIVIDE([销售额],CALCULATE([销售额],ALLSELECTED(销量表[产品编码]))),"0…...

Sa-Token 自定义插件 —— SPI 机制讲解(一)

前言 博主在使用 Sa-Token 框架的过程中&#xff0c;越用越感叹框架设计的精妙。于是&#xff0c;最近在学习如何给 Sa-Token 贡献自定义框架。为 Sa-Token 的开源尽一份微不足道的力量。我将分三篇文章从 0 到 1 讲解如何为 Sa-Token 自定义一个插件&#xff0c;这一集将是前沿…...

基于 Termux 在移动端配置 Ubuntu 系统并搭建工作环境

本套方案主要参考了以下内容&#xff0c;并根据自身体验进行了修改。 【教程】用Termux搭建桌面级生产力环境Termux安装完整版Linux(Ubuntu)详细步骤 前言 自己的电脑太重&#xff0c;有时候外出不想带&#xff0c;平板生产力有有限。所以一直在折腾用平板替代电脑的事情。之前…...

JAVA SDK通过proxy对接google: GCS/FCM

前言&#xff1a;因为国内调用google相关api需要通过代理访问(不想设置全局代理)&#xff0c;所以在代理这里经常遇到问题&#xff0c;先说一下结论 GCS 需要设置全局代理或自定义代理选择器&#xff0c; FCM sdk admin 在初始化firebaseApp时是支持设置的。 GCS: 开始时尝试在…...

JAVA EE_多线程-初阶(三)

我对未来没有底气 我也不知道当下该如何做 那就活着&#xff0c;活着就能把日子过下去 ---------陳長生. 1.多线程案例 1.1.单例模式 单例模式是常见的设计模式之一 设计模式&#xff1a;一些编程大佬制定的一些通用代码&#xff0c;再特定的场景下能套用进去&#xff0c;即…...

@PKU秋招互联网产品经理求职分享

从校园到职场 非常荣幸能够在毕业后两年半再次回到燕园。今天&#xff0c;我主要想和大家分享一下我在互联网行业的求职和工作经验。从最初面对职场的迷茫&#xff0c;到现在能够从容应对职场各种挑战&#xff0c;这一路走来积累了不少心得。互联网行业变化迅速&#xff0c;持续…...

uniapp日常总结--uniapp页面跳转方式

uniapp日常总结--uniapp页面跳转方式_uniapp 跳转-CSDN博客...

【能源节约管理系统行业树组件优化总结】

能源节约管理系统行业树组件优化总结 问题背景 在能源节约管理系统中&#xff0c;我们需要一个行业选择组件&#xff0c;以树形结构展示国民经济行业分类数据。由于行业数据量大且层级多&#xff0c;我们采用了懒加载的方式实现。然而&#xff0c;在编辑和详情模式下&#xf…...

青少年编程考试 CCF GESP图形化编程 二级认证真题 2025年3月

图形化编程 二级 2025 年 03 月 一、单选题&#xff08;共 10 题&#xff0c;每题 3 分&#xff0c;共 30 分&#xff09; 1、2025 年春节有两件轰动全球的事件&#xff0c;一个是 DeepSeek 横空出世&#xff0c;另一个是贺岁片《哪吒 2》票房惊人&#xff0c;入了全球票房榜…...

【Hadoop入门】Hadoop生态之Flume简介

1 什么是Flume&#xff1f; Flume是Hadoop生态系统中的一个高可靠、高性能的日志收集、聚合和传输系统。它支持在系统中定制各类数据发送方&#xff08;Source&#xff09;、接收方&#xff08;Sink&#xff09;和数据收集器&#xff08;Channel&#xff09;&#xff0c;从而能…...

十六、Linus网络编程基础

1、Linux 网络的历史发展 ​早期阶段&#xff08;1991–1995&#xff09;​ ​1991年&#xff1a;Linus Torvalds 发布 Linux 内核的初始版本&#xff08;0.01&#xff09;&#xff0c;此时内核不支持网络功能&#xff0c;仅是一个单机操作系统。​1992年&#xff1a;受 BSD …...

【激活函数:神经网络的“调味料】

1. 激活函数&#xff1a;神经网络的“调味料” 想象你在做菜&#xff1a; 没有激活函数&#xff1a;就像只用水煮食材&#xff0c;味道单调&#xff08;只能拟合线性关系&#xff09;。加入激活函数&#xff1a;像加了盐、糖、辣椒&#xff0c;让菜有酸甜苦辣&#xff08;非线…...

006.Gitlab CICD流水线触发

文章目录 触发方式介绍触发方式类型 触发方式实践分支名触发MR触发tag触发手动人为触发定时任务触发指定文件变更触发结合分支及文件变更触发正则语法触发 触发方式介绍 触发方式类型 Gitlab CICD流水线的触发方式非常灵活&#xff0c;常见的有如下几类触发方式&#xff1a; …...

服务器远程端口详解

服务器远程端口详解 一、服务器远程端口的概念与作用 1. 端口的基本定义 服务器远程端口是计算机网络中用于标识不同应用程序或服务的逻辑接口。通过TCP/IP协议栈的"Socket"机制&#xff0c;计算机可以通过软件方式与其他设备建立通信通道。每个端口对应一个16位无…...

如何在 Vue 3 中实现百度地图位置选择器组件

如何在 Vue 3 中实现百度地图位置选择器组件 前言 在开发前端应用时&#xff0c;地图选择器是一个非常常见的需求。尤其是在一些需要用户选择地址的场景&#xff0c;如电商平台、旅游网站、酒店预定等&#xff0c;百度地图组件能提供准确的地理位置服务。在本文中&#xff0c…...

es6学习02-let命令和const命令

一、let命令 1.let块级作用域&#xff1a; let关键字 VS var关键字 2.for循环计数器很适合let命令 var&#xff1a;整个for循环中一直都是同一个i在做1&#xff0c;最后输出的就是10&#xff1b; let&#xff1a;每循环一次都是多一个i的赋值&#xff0c;最后输出是可以调出…...

电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案

tips&#xff1a;资料来自网络&#xff0c;仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明&#xff1a; 典型应用…...

DeepSeek大语言模型部署指南:从基础认知到本地实现

目录 一、DeepSeek简介&#xff1a;开源领域的新兴力量 1.1 公司背景与发展历程 1.2 核心产品DeepSeek-R1的技术特点 1.3 行业影响与伦理挑战 二、官方资源获取&#xff1a;全面掌握DeepSeek生态 2.1 官方网站与API服务 2.2 开源代码库资源 2.3 模型部署工具Ollama简介…...

09-设计模式 企业场景 面试题-mk

你之前项目中用过设计模式吗? 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类图设计如下: 上面的对象都是ne…...

达梦数据库-学习-18-ODBC数据源配置(Linux)

一、环境信息 名称值CPU12th Gen Intel(R) Core(TM) i7-12700H操作系统CentOS Linux release 7.9.2009 (Core)内存4G逻辑核数2DM版本1 DM Database Server 64 V8 2 DB Version: 0x7000c 3 03134284194-20240703-234060-20108 4 Msg Versi…...

解决VS2022中scanf报错C4996

这个的原因是因为新版的VS认为scanf不安全&#xff0c;要去使用scanf_s&#xff0c;但在C语言中就需要scanf&#xff0c;所以我们只要以以下步骤解决就可以了。 只要加入宏定义即可 #define _CRT_SECURE_NO_WARNINGS 因为本人已经很少写小案例了&#xff0c;所以就用这个办法…...

Python(11)Python判断语句全面解析:从基础到高级模式匹配

目录 一、条件逻辑的工程价值1.1 真实项目中的逻辑判断1.2 判断语句类型矩阵 二、基础判断深度解析2.1 多条件联合判断2.2 类型安全判断 三、模式匹配进阶应用3.1 结构化数据匹配3.2 对象模式匹配 四、判断语句优化策略4.1 逻辑表达式优化4.2 性能对比测试 五、典型应用场景实战…...

Quartus II的IP核调用及仿真测试

目录 第一章 什么是IP核&#xff1f;第二章 什么是LPM&#xff1f;第一节 设置LPM_COUNTER模块参数第二节 仿真 第三章 什么是PLL&#xff1f;第一节 设置ALTPLL&#xff08;嵌入式锁相环&#xff09;模块参数第二节 仿真 第四章 什么是RAM&#xff1f;第一节 RAM_1PORT的调用第…...

如何修改服务器TTL值

Windows默认返回的TTL值为128&#xff0c;Linux为64&#xff0c;我们怎么修改这个值呢&#xff1f; 目录 一. Windows 二. Linux 临时更改 永久更改 一. Windows WinR输入regedit&#xff0c;打开注册表 路径&#xff1a;计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro…...

大模型LLM表格报表分析:markitdown文件转markdown,大模型markdown统计分析

整体流程&#xff1a;用markitdown工具文件转markdown&#xff0c;然后大模型markdown统计分析 markitdown https://github.com/microsoft/markitdown 在线体验&#xff1a;https://huggingface.co/spaces/AlirezaF138/Markitdown 安装&#xff1a; pip install markitdown…...

劫持SUID程序提权彻底理解Dirty_Pipe:从源码解析到内核调试

DirtyPipe(CVE-2022-0847)漏洞内核调试全流程指南 本文主要面向对内核漏洞挖掘与调试没有经验的初学者,结合 CVE-2022-0847——著名的 Dirty Pipe 漏洞,带你从零开始学习 Linux 内核调试、漏洞复现、原理分析与漏洞利用。该漏洞危害极大,并且概念简单明了,无需复杂前置知…...

React 组件样式

在这里插入图片描述 分为行内和css文件控制 行内 通过CSS中类名文件控制...

嵌入式人工智能应用-第三章 opencv操作3 图像平滑操作 下

5 高斯噪声&#xff08;Gaussian Noise&#xff09; 高斯噪声&#xff08;Gaussian Noise&#xff09;是一种符合正态&#xff08;高斯&#xff09;分布的随机噪声&#xff0c;广泛存在于传感器采集、信号传输等场景中。以下是关于高斯噪声的详细说明、添加方法及滤波方案。 …...

OSPF的接口网络类型【复习篇】

OSPF在不同网络环境下默认的不同工作方式 [a3]display ospf interface g 0/0/0 # 查看ospf接口的网络类型网络类型OSPF接口的网络类型&#xff08;工作方式&#xff09;计时器BMA&#xff08;以太网&#xff09;broadcast &#xff0c;需要DR/BDR的选举hello&#xff1a;10s…...

maven编译jar踩坑[sqlite.db]

背景&#xff1a; 最近在项目中搞多数据源切换的job,在src/resource下有初始化的sqlite默认文件供后续拷贝使用&#xff0c;在测试阶段没有什么问题&#xff0c;但是一部署到服务器上运行就有问题。 报错现象&#xff1a; 找不到这个sqlite.db文件或者文件格式有问题&#x…...

【软考系统架构设计师】软件工程

1、 软件开发生命周期 软件定义时期&#xff1a;包括可行性研究和详细需求分析过程&#xff0c;任务是确定软件开发工程必须完成的总目标&#xff0c;具体分为问题定义、可行性研究、需求分析等 软件开发时期&#xff1a;软件的设计与实现&#xff0c;分为概要设计、详细设计、…...

蓝桥杯单片机刷题——ADC测量电位器的电压

设计要求 通过PCF8591的ADC通道测量电位器RB2的输出电压&#xff0c;并使用套件上提供的USB转串口功能&#xff0c;完成下列程序设计要求。 串口每次接收包含5个字符的字符串&#xff0c; 1&#xff09;若接收的5个字符中有字符’a’或’A’&#xff0c;则数码管显示一位小数…...

零基础上手Python数据分析 (12):DataFrame 数据清洗与预处理 (下) - 类型转换、格式化、文本与日期处理

写在前面 上一篇博客,我们学习了如何使用 Pandas 处理数据分析中最常见的 “脏数据”:缺失值、重复值和异常值。 这为我们处理数据质量问题打下了坚实的基础。 然而,数据清洗的挑战远不止于此。 在实际数据中,我们还会经常遇到 数据类型不一致、数据格式不规范、文本数据混…...

免费下载 | 2025清华五道口:“十五五”金融规划研究白皮书

《2025清华五道口&#xff1a;“十五五”金融规划研究白皮书》的核心内容主要包括以下几个方面&#xff1a; 一、五年金融规划的重要功能与作用 凝聚共识&#xff1a;五年金融规划是国家金融发展的前瞻性谋划和战略性安排&#xff0c;通过广泛听取社会各界意见&#xff0c;凝…...

制造一只电子喵 (qwen2.5:0.5b 微调 LoRA 使用 llama-factory)

AI (神经网络模型) 可以认为是计算机的一种新的 “编程” 方式. 为了充分利用计算机, 只学习传统的编程 (编程语言/代码) 是不够的, 我们还要掌握 AI. 本文以 qwen2.5 和 llama-factory 举栗, 介绍语言模型 (LLM) 的微调 (LoRA SFT). 为了方便上手, 此处选择使用小模型 (qwen2…...

Java中parallelStream并行流使用指南

Java中parallelStream并行流使用指南 在 Java 中&#xff0c;parallelStream() 是 Java 8 引入的一个用于并行处理集合数据的工具&#xff0c;它基于 Fork/Join框架 实现&#xff0c;能够自动将任务拆分成子任务并利用多核处理器并行执行。以下是对 parallelStream的详细说明和…...