GetWindowLongPtr函数分析
第一部分:
#ifdef UNICODE
FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrW, HWND, hwnd, int, nIndex)
#else
FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrA, HWND, hwnd, int, nIndex)
#endif // UNICODE
LONG_PTR APIENTRY GetWindowLongPtr(
HWND hwnd,
int nIndex)
{
PWND pwnd;
pwnd = ValidateHwnd(hwnd);
if (pwnd == NULL) {
return 0;
}
try {
return _GetWindowLongPtr(pwnd, nIndex, IS_ANSI);
} except (W32ExceptionHandler(FALSE, RIP_WARNING)) {
RIPERR1(ERROR_INVALID_WINDOW_HANDLE,
RIP_WARNING,
"Window %x no longer valid",
hwnd);
return 0;
}
}
#define __GetWindowLong(pwnd, index) ((LONG)(*(DWORD UNALIGNED *)((BYTE *)((pwnd) + 1) + (index))))
第二部分:
1: kd> r
eax=c0000000 ebx=00000000 ecx=40000000 edx=00086144 esi=6f64fcb4 edi=77cc444f
eip=6f64fcc9 esp=013bc99c ebp=013bc9c4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
comctl32!Edit_WndProc+0x15:
001b:6f64fcc9 ffd7 call edi {USER32!GetWindowLongW (77cc444f)}
1: kd> t
USER32!GetWindowLongW:
001b:77cc444f 6a08 push 8
1: kd> dv
hwnd = 0x0004003c
nIndex = 0n0
1: kd> dt win32k!wnd 0xbc67e3e4
+0x000 head : _THRDESKHEAD
+0x014 state : 0x20000
+0x018 state2 : 0x80000300
+0x01c ExStyle : 0x800
+0x020 style : 0x54000080
+0x024 hModule : 0x6f610000 Void
+0x028 hMod16 : 0
+0x02a fnid : 0
+0x02c spwndNext : (null)
+0x030 spwndPrev : (null)
+0x034 spwndParent : 0xbc67de3c tagWND
+0x038 spwndChild : (null)
+0x03c spwndOwner : (null)
+0x040 rcWindow : tagRECT
+0x050 rcClient : tagRECT
+0x060 lpfnWndProc : 0x758ed4d5 long BROWSEUI!CAddressEditBox::_EditSubclassWndProc+0
+0x064 pcls : 0xbc67e2c4 tagCLS
+0x068 hrgnUpdate : 0x00000001 HRGN__
+0x06c ppropList : 0xbc67f494 tagPROPLIST
+0x070 pSBInfo : (null)
+0x074 spmenuSys : (null)
+0x078 spmenu : 0x0000a205 tagMENU
+0x07c hrgnClip : (null)
+0x080 strName : _LARGE_UNICODE_STRING
+0x08c cbwndExtra : 0n4
+0x090 spwndLastActive : (null)
+0x094 hImc : (null)
+0x098 dwUserData : 0
+0x09c pActCtx : 0x00086144 _ACTIVATION_CONTEXT
1: kd> dd 0xbc67e3e4+0x09c
bc67e480 00086144 000fd470 //窗口结构紧接着的一个长型指针000fd470
eax=000fd470
1: kd> dt comctl32!tagED 000fd470
+0x000 hText : 0x014a0004 Void
+0x004 cchAlloc : 0x20
+0x008 cchTextMax : 0x7ff
+0x00c cch : 3
+0x010 cLines : 1
+0x014 ichMinSel : 0
+0x018 ichMaxSel : 0
+0x01c ichCaret : 0
+0x020 iCaretLine : 0
+0x024 ichScreenStart : 0
+0x028 ichLinesOnScreen : 0
+0x02c xOffset : 0
+0x030 charPasswordChar : 0
+0x034 cPasswordCharWidth : 0n0
+0x038 hwnd : 0x0004003c HWND__
+0x03c pwnd : (null)
+0x040 rcFmt : tagRECT
+0x050 hwndParent : 0x0004003e HWND__
+0x054 ptPrevMouse : tagPOINT
+0x05c prevKeys : 0
+0x060 fSingle : 0y1
+0x060 fNoRedraw : 0y0
+0x060 fMouseDown : 0y0
+0x060 fFocus : 0y0
+0x060 fDirty : 0y0
+0x060 fDisabled : 0y0
+0x060 fNonPropFont : 0y0
+0x060 fNonPropDBCS : 0y0
+0x060 fBorder : 0y0
+0x060 fAutoVScroll : 0y0
+0x060 fAutoHScroll : 0y1
+0x060 fNoHideSel : 0y0
+0x060 fDBCS : 0y0
+0x060 fFmtLines : 0y0
+0x060 fWrap : 0y0
+0x060 fCalcLines : 0y0
+0x060 fEatNextChar : 0y0
+0x060 fStripCRCRLF : 0y0
+0x060 fInDialogBox : 0y0
+0x060 fReadOnly : 0y0
+0x060 fCaretHidden : 0y0
+0x060 fTrueType : 0y1
+0x060 fAnsi : 0y0
+0x060 fWin31Compat : 0y1
+0x060 f40Compat : 0y1
+0x060 fFlatBorder : 0y0
+0x060 fSawRButtonDown : 0y0
+0x060 fInitialized : 0y0
+0x060 fSwapRoOnUp : 0y0
+0x060 fAllowRTL : 0y0
+0x060 fDisplayCtrl : 0y0
+0x060 fRtoLReading : 0y0
+0x064 fInsertCompChr : 0y0
+0x064 fReplaceCompChr : 0y0
+0x064 fNoMoveCaret : 0y0
+0x064 fResultProcess : 0y0
+0x064 fKorea : 0y0
+0x064 fInReconversion : 0y0
+0x064 fLShift : 0y0
+0x068 wImeStatus : 0
+0x06a cbChar : 2
+0x06c chLines : (null)
+0x070 format : 0
+0x074 lpfnNextWord : 0x758e0bfa int BROWSEUI!CAutoComplete::EditWordBreakProcW+0
+0x078 maxPixelWidth : 0n0
+0x07c undoType : 0
+0x080 hDeletedText : (null)
+0x084 ichDeleted : 0
+0x088 cchDeleted : 0
+0x08c ichInsStart : 0
+0x090 ichInsEnd : 0
+0x094 hFont : 0x0a0a016a Void
+0x098 aveCharWidth : 0n6
+0x09c lineHeight : 0n13
+0x0a0 charOverhang : 0n0
+0x0a4 cxSysCharWidth : 0n8
+0x0a8 cySysCharHeight : 0n16
+0x0ac listboxHwnd : (null)
+0x0b0 pTabStops : (null)
+0x0b4 charWidthBuffer : (null)
+0x0b8 charSet : 0 ''
+0x0bc wMaxNegA : 7
+0x0c0 wMaxNegAcharPos : 0xb
+0x0c4 wMaxNegC : 8
+0x0c8 wMaxNegCcharPos : 0xb
+0x0cc wLeftMargin : 0
+0x0d0 wRightMargin : 0
+0x0d4 ichStartMinSel : 0
+0x0d8 ichStartMaxSel : 0
+0x0dc pLpkEditCallout : (null)
+0x0e0 hCaretBitmap : (null)
+0x0e4 iCaretOffset : 0n0
+0x0e8 hInstance : 0x6f610000 Void
+0x0ec seed : 0 ''
+0x0ed fEncoded : 0 ''
+0x0f0 iLockLevel : 0n0
+0x0f4 DBCSVector : [12] ""
+0x100 hImcPrev : (null)
+0x104 ptScreenBounding : tagPOINT
+0x10c hTheme : (null)
+0x110 pww : 0x005fe3f8 tagWW
+0x114 hFontSave : (null)
+0x118 pszCueBannerText : (null)
+0x11c fHot : 0y0
+0x120 hwndBalloon : (null)
+0x124 hFontPassword : (null)
1: kd> u 758e0bfa
BROWSEUI!CAutoComplete::EditWordBreakProcW [d:\srv03rtm\shell\browseui\autocomp.cpp @ 1259]:
相关文章:
GetWindowLongPtr函数分析
第一部分: #ifdef UNICODE FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrW, HWND, hwnd, int, nIndex) #else FUNCLOG2(LOG_GENERAL, LONG_PTR, APIENTRY, GetWindowLongPtrA, HWND, hwnd, int, nIndex) #endif // UNICODE LONG_PTR APIENTRY GetWin…...
大语言模型(LLM)和嵌入模型的统一调用接口
ChatModelFactory、EmbeddingModelFactory 讲解代码:import os from dotenv import load_dotenv, find_dotenv_ load_dotenv(find_dotenv())from langchain_openai import ChatOpenAI, OpenAIEmbeddings, AzureChatOpenAI, AzureOpenAIEmbeddingsclass ChatModelF…...
大白话html语义化标签优势与应用场景
大白话html语义化标签优势与应用场景 大白话解释 语义化标签就是那些名字能让人一看就大概知道它是用来做什么的标签。以前我们经常用<div>来做各种布局,但是<div>本身没有什么实际的含义,就像一个没有名字的盒子。而语义化标签就像是有名…...
Scala:在哪里写类的属性?类的属性必须私有吗?类的必须初始化吗?
哪里写类的属性 直接在类体中定义属性 class Circle {private var _radius: Double 0.0def radius: Double _radiusdef radius_(newRadius: Double): Unit {_radius newRadius}def area: Double scala.math.Pi * _radius * _radius } 可以在类体内部直接定义属性。例如&am…...
Android源码编译命令详解
一、引言 先看下面几条指令,相信编译过Android源码的人都再熟悉不过的。 source setenv.sh lunch make -j8记得最初刚接触Android时,同事告诉我用上面的指令就可以编译Android源码,指令虽短但过几天就记不全或者忘记顺序,每次编…...
任务11:路由器配置与静态路由配置
目录 一、概念 二、路由器配置 三、配置静态路由CSDN 原创主页:不羁https://blog.csdn.net/2303_76492156?typeblog 一、概念 1、路由器的作用:通过路由表进行数据的转发。 2、交换机的作用:通过学习和识别 MAC 地址,依据 M…...
Unity之如何实现哔哩哔哩直播弹幕游戏
前言 什么是直播间互动? 当我们使用哔哩哔哩进行直播或者观看视频时,我们可以通过接入哔哩哔哩提供的 直播&互动玩法SDK,让直播和视频可以与Unity3D游戏客户端或者游戏服务器进行互动。 环境要求 Unity 2020.x或更高版本 依赖库:Newtonsoft Json Unity Package 在P…...
Python实例:PyMuPDF实现PDF翻译,英文翻译为中文,并按段落创建中文PDF
基于PyMuPDF与百度翻译的PDF翻译处理系统开发:中文乱码解决方案与自动化排版实践 一 、功能预览:将英文翻译为中文后创建的PDF 二、完整代码 from reportlab.lib.pagesizes import letter from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle...
LeeCode题库第四十六题
46.全排列 项目场景: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&am…...
LangChain4j开发RAG入门示例
本文将详细介绍如何基于Java语言,使用Langchain4j开源框架、Milvus向量数据、阿里Qwen大模型,开发一个RAG入门级简单示例。本示例虽然简单,但涉及到多个知识点,包括:Milvus初始化、Embedding模型、文档切片、Springboo…...
快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C过度,我们首先要掌握的一些基础知识,以便于我们快速进入C的学习,为后面的学习打下基础。 这篇文章的主要内容有: 1&#x…...
课程《Deep Learning Specialization》
在coursera上,Deep Learning Specialization 课程内容如下图所示:...
微服务与消息队列RabbitMQ
简介 同步模式 异步模式 内容 解决方案RabbitMQ 同步调用的优缺点 同步调用的优势是什么? 时效性强,等待到结果后才返回。 同步调用的问题是什么? 拓展性差性能下降级联失败问题...
苹果 M3 Ultra 芯片深度解析:AI 时代的性能革命
2025 年 3 月 5 日,苹果正式发布了其史上最强 PC 芯片 ——M3 Ultra。这款基于 UltraFusion 封装技术的旗舰级 SoC,不仅延续了苹果芯片在能效比上的传统优势,更通过架构创新与硬件升级,将 AI 计算能力推向了新高度。本文将从性能突…...
通义千问:Qwen2.5-0.5B模型架构解释
通义千问:Qwen2.5-0.5B模型架构解释 1. 模型权重文件 .mdl、.msc:存储模型核心参数,是模型训练后学习到的知识载体,包含神经网络各层权重,加载后模型才能执行推理、生成等任务。 .mdl文件:通常是模型的核心权重数据文件,存储神经网络各层的权重参数、张量等关键数据,是…...
安装完flash-attn,使用时报错undefined symbol
去flash attention官网下载安装包, 注意需要根据自己的torch版本,cuda版本(可以选择低于自己cuda版本的) 和python版本进行选择。 如果whl文件名上包含参数abiTRUE,则会报错。需要安装包含abiFALSE的whl文件。 卸载:卸载原先报错的flash-attn pip uni…...
【Linux】冯诺依曼体系与操作系统理解
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充:理解系统调用…...
玩转ChatGPT:GPT 深入研究功能
一、写在前面 民间总结: 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么,ChatGPT呢? 看Deep Research(深入研究)功能。 对于科研狗来说,在这个文章爆炸的时代,如何利用AI准确、高效地收…...
虚函数和虚表的原理是什么?
虚函数是一个使用virtual关键字声明的成员函数,在基类中声明虚函数,在子类中可以使用override重写该函数。虚函数根据指针或引用指向的实际对象调用,实现运行时的多态。 虚函数表(虚表)是一个用于存储虚函数地址的数组…...
laravel es 相关代码 ElasticSearch
来源: github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…...
字节跳动C++客户端开发实习生内推-抖音基础技术
智能手机爱好者和使用者,追求良好的用户体验; 具有良好的编程习惯,代码结构清晰,命名规范; 熟练掌握数据结构与算法、计算机网络、操作系统、编译原理等课程; 熟练掌握C/C/OC/Swift一种或多种语言ÿ…...
C语言_数据结构总结6:链式栈
纯c语言代码,不涉及C 顺序栈的实现,欢迎查看这篇文章:C语言_数据结构总结5:顺序栈-CSDN博客 0. 结构单元 #include<stdio.h> #include<stdlib.h> typedef int ElemType; typedef struct Linknode { ElemType…...
DQN(Deep Q - Network)原理举例说明
DQN(Deep Q - Network)原理举例说明 1. 基本概念回顾 DQN 结合了深度学习和 Q - learning 算法,用深度神经网络来近似 Q 值函数,解决传统 Q - learning 在处理高维状态空间时的局限性。Q 值表示在某个状态下采取某个动作所能获得的期望累积奖励。 以下是DQN和A3C的原理对…...
物联网-IoTivity:开源的物联网框架
IoTivity 是一个开源的物联网(IoT)框架,旨在为物联网设备提供互操作性、安全性和可扩展性。它由 Open Connectivity Foundation (OCF) 主导开发,遵循 OCF 的标准,致力于实现设备之间的无缝连接和通信。IoTivity 提供了一个统一的框架,支持设备发现、数据交换、设备管理和…...
基于DeepSeek的智慧医药系统(源码+部署教程)
运行环境 智慧医药系统运行环境如下: 前端: HTMLCSS后端:Java AIGCDeepseekIDE工具:IDEA技术栈:Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…...
基于Linux系统的边缘智能终端(RK3568+EtherCAT+PCIe+4G+5G)
背景 现有产品基本都是传统的产品,比如之前写的RTU还有基于Linux系统的物联网采集终端都是传统意义的产品,大家做的都差不多,能拼的除了价格之外就是软硬件的基本功了,好的产品肯定是要经过时间的磨合的。没有任何人可以写出来没有…...
Java 线程池内部任务出异常后,如何知道是哪个线程出了异常?
你的回答(口语化,面试场景) 好的,这个问题需要结合线程池的异常处理机制来回答。 Java线程池内部任务抛出的异常默认会被“吞掉”,但可以通过以下方法定位具体线程的异常: 方法1:在任务代码中捕…...
热图回归(Heatmap Regression)
热图回归(Heatmap Regression)是一种常用于关键点估计任务的方法,特别是在人体姿态估计中。它的基本思想是通过生成热图来表示某个关键点在图像中出现的概率或强度。以下是热图回归的主要特点和工作原理: 主要特点 热图表示: 每个关键点对应一个热图,热图中的每个像素值…...
信奥赛CSP-J复赛集训(模拟算法专题)(6):P6352 [COCI 2007/2008 #3] CETIRI
信奥赛CSP-J复赛集训(模拟算法专题)(6):P6352 [COCI 2007/2008 #3] CETIRI 题目描述 你原本有 4 4 4 个数,它们从小到大排序后构成了等差数列。 但是现在丢失了一个数,并且其余的三个数的顺序…...
2025-03-09 学习记录--C/C++-PTA 习题11-1 输出月份英文名
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 裁判测试程序样例: #include <stdio.h>char *getmonth( int n );int main() {int n;char …...
