USER32!GetPropW函数分析之获取窗口属性


第一部分:
#ifdef UNICODE
FUNCLOG2(LOG_GENERAL, HANDLE, APIENTRY, GetPropW, HWND, hwnd, LPCTSTR, pString)
#else
FUNCLOG2(LOG_GENERAL, HANDLE, APIENTRY, GetPropA, HWND, hwnd, LPCTSTR, pString)
#endif // UNICODE
HANDLE APIENTRY GetProp(HWND hwnd, LPCTSTR pString)
{
    PWND pwnd;
    int iString;

    if (IS_PTR(pString)) {
        iString = (int)GlobalFindAtom(pString);
        if (iString == 0)
            return NULL;
    } else
        iString = PTR_TO_ID(pString);

    pwnd = ValidateHwnd(hwnd);

    if (pwnd == NULL)
        return NULL;

    return _GetProp(pwnd, (LPWSTR)UIntToPtr( iString ), FALSE);
}

第二部分:
1: kd> p
USER32!GetPropW+0xc:
001b:77cc7f19 ff750c          push    dword ptr [ebp+0Ch]
1: kd> p
USER32!GetPropW+0xf:
001b:77cc7f1c ff152413ca77    call    dword ptr [USER32!_imp__GlobalFindAtomW (77ca1324)]
1: kd> p
USER32!GetPropW+0x15:
001b:77cc7f22 0fb7f0          movzx   esi,ax
1: kd> r
eax=0000c01a


1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000+8*1a
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : 0xe19a33f9 Void
   +0x000 ObAttributes     : 0xe19a33f9
   +0x000 InfoTable        : 0xe19a33f9 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xe19a33f9
   +0x004 GrantedAccess    : 0
   +0x004 GrantedAccessIndex : 0
   +0x006 CreatorBackTraceIndex : 0
   +0x004 NextFreeTableEntry : 0n0

1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe19a3405))
(*((ntdll!unsigned short (*)[1])0xe19a3405))                 [Type: unsigned short [1]]
    [0]              : 0x4100 [Type: unsigned short]
1: kd> dt ntdll!_RTL_ATOM_TABLE_ENTRY  0xe19a33f8
   +0x000 HashLink         : (null)
   +0x004 HandleIndex      : 0x1a
   +0x006 Atom             : 0xc01a
   +0x008 ReferenceCount   : 2
   +0x00a Flags            : 0 ''
   +0x00b NameLength       : 0x11 ''
   +0x00c Name             : [1] 0x43
1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe19a3404))
(*((ntdll!unsigned short (*)[1])0xe19a3404))                 [Type: unsigned short [1]]
    [0]              : 0x43 [Type: unsigned short]
1: kd> db 0xe19a3404
e19a3404  43 00 41 00 64 00 64 00-72 00 65 00 73 00 73 00  C.A.d.d.r.e.s.s.
e19a3414  42 00 61 00 6e 00 64 00-5f 00 54 00 68 00 69 00  B.a.n.d._.T.h.i.
e19a3424  73 00 00 00 08 08 05 0c-55 73 74 6b 88 76 8a bf  s.......Ustk.v..


#define UIntToPtr( ui )  ((VOID *)(UINT_PTR)((unsigned int)ui))


第三部分:
HANDLE _GetProp(
    PWND pwnd,
    PCWSTR pszKey,
    BOOL fInternal)
{
    PPROP pprop;

    /*
     * A quick little optimization for that case where the window has no
     * properties at all.
     */
    if (pwnd->ppropList == NULL)
        return NULL;

    /*
     * FindProp does all the work, including converting pszKey to an atom
     * (if necessary) for property lookup.
     */
    pprop = _FindProp(pwnd, pszKey, fInternal);
    if (pprop == NULL)
        return NULL;

    return KHANDLE_TO_HANDLE(pprop->hData);
}


第四部分:
1: kd> dv
           pwnd = 0x005fe3e4
         pszKey = 0x0000c01a
      fInternal = 0n0
1: kd> dx -id 0,0,896d1020 -r1 ((USER32!tagWND *)0x5fe3e4)
((USER32!tagWND *)0x5fe3e4)                 : 0x5fe3e4 [Type: tagWND *]
 
    [+0x06c] ppropList        : 0xbc67f494 [Type: tagPROPLIST *]            //ppropList        : 0xbc67f494


1: kd> dx -id 0,0,896d1020 -r1 ((USER32!tagPROPLIST *)0xbc67f494)
((USER32!tagPROPLIST *)0xbc67f494)                 : 0xbc67f494 [Type: tagPROPLIST *]
    [+0x000] cEntries         : 0x4 [Type: unsigned int]
    [+0x004] iFirstFree       : 0x4 [Type: unsigned int]
    [+0x008] aprop            [Type: tagPROP [1]]
1: kd> dx -id 0,0,896d1020 -r1 (*((USER32!tagPROP (*)[1])0xbc67f49c))
(*((USER32!tagPROP (*)[1])0xbc67f49c))                 [Type: tagPROP [1]]
    [0]              [Type: tagPROP]
1: kd> dx -id 0,0,896d1020 -r1 (*((USER32!tagPROP *)0xbc67f49c))
(*((USER32!tagPROP *)0xbc67f49c))                 [Type: tagPROP]
    [+0x000] hData            : 0xfd5a0 [Type: void *]
    [+0x004] atomKey          : 0xc021 [Type: unsigned short]
    [+0x006] fs               : 0x2 [Type: unsigned short]
1: kd> dt USER32!tagPROP 0xbc67f49c+8*1
   +0x000 hData            : 0x0000c00c Void
   +0x004 atomKey          : 0xa911
   +0x006 fs               : 0
1: kd> dd 0xbc67f49c
bc67f49c  000fd5a0 0002c021 0000c00c 0000a911
bc67f4ac  000fcc48 0002c01a 000fd5f0 0002c017
bc67f4bc  545f4855 004c4941 abababab abababab

1: kd> dt USER32!tagPROP 0xbc67f49c+8*2
   +0x000 hData            : 0x000fcc48 Void
   +0x004 atomKey          : 0xc01a
   +0x006 fs               : 2
1: kd> dt USER32!tagPROP 0xbc67f49c+8*3
   +0x000 hData            : 0x000fd5f0 Void
   +0x004 atomKey          : 0xc017
   +0x006 fs               : 2
1: kd> dt USER32!tagPROP 0xbc67f49c+8*4
   +0x000 hData            : 0x545f4855 Void
   +0x004 atomKey          : 0x4941
   +0x006 fs               : 0x4c


    pprop = _FindProp(pwnd, pszKey, fInternal);
    if (pprop == NULL)
        return NULL;

1: kd> p
USER32!_GetProp+0x13:
001b:77cc7f60 e826000000      call    USER32!_FindProp (77cc7f8b)
1: kd> p
USER32!_GetProp+0x18:
001b:77cc7f65 85c0            test    eax,eax
1: kd> r
eax=005ff4ac ebx=77ca68a4 ecx=0000c01a edx=00000201 esi=0000c01a edi=0000060d
eip=77cc7f65 esp=013be0b8 ebp=013be0b8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
USER32!_GetProp+0x18:
001b:77cc7f65 85c0            test    eax,eax
1: kd> dd 005ff4ac
005ff4ac  000fcc48

第五部分:


1: kd> dx -id 0,0,896d1020 -r1 (*((USER32!tagPROP *)0xbc67f49c))
(*((USER32!tagPROP *)0xbc67f49c))                 [Type: tagPROP]
    [+0x000] hData            : 0xfd5a0 [Type: void *]
    [+0x004] atomKey          : 0xc021 [Type: unsigned short]
    [+0x006] fs               : 0x2 [Type: unsigned short]

1: kd> dt USER32!tagPROP 0xbc67f49c+8*1
   +0x000 hData            : 0x0000c00c Void
   +0x004 atomKey          : 0xa911
   +0x006 fs               : 0

1: kd> dt USER32!tagPROP 0xbc67f49c+8*2
   +0x000 hData            : 0x000fcc48 Void
   +0x004 atomKey          : 0xc01a
   +0x006 fs               : 2

1: kd> dt USER32!tagPROP 0xbc67f49c+8*3
   +0x000 hData            : 0x000fd5f0 Void
   +0x004 atomKey          : 0xc017
   +0x006 fs               : 2

1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000+8*17
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : 0xe1865109 Void
   +0x000 ObAttributes     : 0xe1865109
   +0x000 InfoTable        : 0xe1865109 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xe1865109
   +0x004 GrantedAccess    : 0
   +0x004 GrantedAccessIndex : 0
   +0x006 CreatorBackTraceIndex : 0
   +0x004 NextFreeTableEntry : 0n0
1: kd> dt ntdll!_RTL_ATOM_TABLE_ENTRY 0xe1865108
   +0x000 HashLink         : (null)
   +0x004 HandleIndex      : 0x17
   +0x006 Atom             : 0xc017
   +0x008 ReferenceCount   : 2
   +0x00a Flags            : 0 ''
   +0x00b NameLength       : 0x12 ''
   +0x00c Name             : [1] 0x43
1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe1865114))
(*((ntdll!unsigned short (*)[1])0xe1865114))                 [Type: unsigned short [1]]
    [0]              : 0x43 [Type: unsigned short]
1: kd> db 0xe1865114
e1865114  43 00 41 00 64 00 64 00-72 00 65 00 73 00 73 00  C.A.d.d.r.e.s.s.
e1865124  43 00 6f 00 6d 00 62 00-6f 00 5f 00 54 00 68 00  C.o.m.b.o._.T.h.
e1865134  69 00 73 00 00 00 35 30-46 7d b2 b2 09 08 0b 0c  i.s...50F}......

CAddressCombo_This

1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000+8*21
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : 0xe18379d9 Void
   +0x000 ObAttributes     : 0xe18379d9
   +0x000 InfoTable        : 0xe18379d9 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xe18379d9
   +0x004 GrantedAccess    : 0
   +0x004 GrantedAccessIndex : 0
   +0x006 CreatorBackTraceIndex : 0
   +0x004 NextFreeTableEntry : 0n0
1: kd> dt ntdll!_RTL_ATOM_TABLE_ENTRY 0xe18379d8
   +0x000 HashLink         : 0xe1825758 _RTL_ATOM_TABLE_ENTRY
   +0x004 HandleIndex      : 0x21
   +0x006 Atom             : 0xc021
   +0x008 ReferenceCount   : 0x14
   +0x00a Flags            : 0 ''
   +0x00b NameLength       : 0xe ''
   +0x00c Name             : [1] 0x55
1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe18379e4))
(*((ntdll!unsigned short (*)[1])0xe18379e4))                 [Type: unsigned short [1]]
    [0]              : 0x55 [Type: unsigned short]
1: kd> db 0xe18379e4
e18379e4  55 00 78 00 53 00 75 00-62 00 63 00 6c 00 61 00  U.x.S.u.b.c.l.a.
e18379f4  73 00 73 00 49 00 6e 00-66 00 6f 00 00 00 00 00  s.s.I.n.f.o.....
e1837a04  00 00 00 00 08 08 01 00-55 73 71 75 01 08 06 0c  ........Usqu....


UxSubclassInfo


1: kd> dt HANDLE_TABLE_ENTRY 0xe140d000+8*1a
ntdll!HANDLE_TABLE_ENTRY
   +0x000 Object           : 0xe19a33f9 Void
   +0x000 ObAttributes     : 0xe19a33f9
   +0x000 InfoTable        : 0xe19a33f9 _HANDLE_TABLE_ENTRY_INFO
   +0x000 Value            : 0xe19a33f9
   +0x004 GrantedAccess    : 0
   +0x004 GrantedAccessIndex : 0
   +0x006 CreatorBackTraceIndex : 0
   +0x004 NextFreeTableEntry : 0n0
1: kd> dt ntdll!_RTL_ATOM_TABLE_ENTRY 0xe19a33f8
   +0x000 HashLink         : (null)
   +0x004 HandleIndex      : 0x1a
   +0x006 Atom             : 0xc01a
   +0x008 ReferenceCount   : 2
   +0x00a Flags            : 0 ''
   +0x00b NameLength       : 0x11 ''
   +0x00c Name             : [1] 0x43
1: kd> dx -id 0,0,896d1020 -r1 (*((ntdll!unsigned short (*)[1])0xe19a3404))
(*((ntdll!unsigned short (*)[1])0xe19a3404))                 [Type: unsigned short [1]]
    [0]              : 0x43 [Type: unsigned short]
1: kd> db 0xe19a3404
e19a3404  43 00 41 00 64 00 64 00-72 00 65 00 73 00 73 00  C.A.d.d.r.e.s.s.
e19a3414  42 00 61 00 6e 00 64 00-5f 00 54 00 68 00 69 00  B.a.n.d._.T.h.i.
e19a3424  73 00 00 00 08 08 05 0c-55 73 74 6b 88 76 8a bf  s.......Ustk.v..

CAddressBand_This

内容概要:文章介绍了DeepSeek在国内智能问数(smart querying over data)领域的实战应用。DeepSeek是一款国内研发的开源大语言模型(LLM),具备强大的中文理解、推理和生成能力,尤其适用于企业中文环境下的智能问答、知识检索等。它具有数据可控性强的特点,可以自部署、私有化,支持结合企业内部数据打造定制化智能问数系统。智能问数是指用户通过自然语言提问,系统基于结构化或非结构化数据自动生成精准答案。DeepSeek在此过程中负责问题理解、查询生成、多轮对话和答案解释等核心环节。文章还详细展示了从问题理解、查询生成到答案生成的具体步骤,并介绍了关键技术如RAG、Schema-aware prompt等的应用。最后,文章通过多个行业案例说明了DeepSeek的实际应用效果,显著降低了数据使用的门槛。 适合人群:从事数据分析、企业信息化建设的相关从业人员,尤其是对智能化数据处理感兴趣的业务和技术人员。 使用场景及目标:①帮助业务人员通过自然语言直接获取数据洞察;②降低传统BI工具的操作难度,提高数据分析效率;③为技术团队提供智能问数系统的架构设计和技术实现参考。 阅读建议:此资源不仅涵盖了DeepSeek的技术细节,还提供了丰富的实战案例,建议读者结合自身业务场景,重点关注DeepSeek在不同行业的应用方式及其带来的价值。对于希望深入了解技术实现的读者,可以进一步探索Prompt工程、RAG接入等方面的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值