CDefView::_GetPIDL函數分析之ListView_GetItem函數的參數item的item.mask 為LVIF_PARAM

CDefView::_GetPIDL函數分析之ListView_GetItem函數的參數item的item.mask 為LVIF_PARAM


第一部分:

1: kd> t
SHELL32!CDefView::_GetPIDL:
001b:77308013 55????????????? push??? ebp
1: kd> dv
?????????? this = 0x00000015
????????????? i = 0n21
?????????? pidl = 0x00040056


// This function checks to see if we are in virtual mode or not.? If we are in
// virtual mode, we always need to ask our folder we are viewing for the item and
// not the listview.

LPCITEMIDLIST CDefView::_GetPIDL(int i)
{
??? if (_IsOwnerData())
??? {
??????? LPCITEMIDLIST pidl = NULL;
??????? CallCB(SFVM_GETITEMIDLIST, i, (LPARAM)&pidl);
??????? return pidl;
??? }

??? return (LPCITEMIDLIST)LVUtil_GetLParam(_hwndListview, i);
}

第二部分:

1: kd> t
SHELL32!LVUtil_GetLParam:
001b:772c7714 55????????????? push??? ebp
1: kd> kc 12
?#
00 SHELL32!LVUtil_GetLParam
01 SHELL32!CDefView::_GetPIDL
02 SHELL32!CDefView::_GetItemArray
03 SHELL32!CDefView::_GetItemObjects
04 SHELL32!CDefView::_CreateSelectionShellItemArray

//
// Note that it returns NULL, if iItem is -1.
//
LPARAM LVUtil_GetLParam(HWND hwndLV, int i)
{
??? LV_ITEM item;

??? item.mask = LVIF_PARAM;
??? item.iItem = i;
??? item.iSubItem = 0;
??? item.lParam = 0;
??? if (i != -1)
??? {
??????? ListView_GetItem(hwndLV, &item);
??? }

??? return item.lParam;
}


// ListView Item structure

#define LVIF_TEXT?????????? 0x0001? // LV_ITEM.mask flags (indicate valid fields in LV_ITEM)
#define LVIF_IMAGE????????? 0x0002
#define LVIF_PARAM????????? 0x0004
#define LVIF_STATE????????? 0x0008


#define ListView_GetItem(hwnd, pitem) \
??? (BOOL)SNDMSG((hwnd), LVM_GETITEM, 0, (LPARAM)(LV_ITEM *)(pitem))

#define LVM_GETITEMA??????????? (LVM_FIRST + 5)
#define LVM_GETITEMW??????????? (LVM_FIRST + 75)?? ??? ??? ?push??? 104Bh
#ifdef UNICODE
#define LVM_GETITEM???????????? LVM_GETITEMW
#else
#define LVM_GETITEM???????????? LVM_GETITEMA
#endif
#define LVM_FIRST?????? 0x1000????? // ListView messages

第三部分:

1: kd> dv
??????????? plv = 0x00108d88
?????????? plvi = 0x013bf8a4
???????????? nm = struct tagLVDISPINFOW

1: kd> dx -id 0,0,896d1020 -r1 ((comctl32!tagLVITEMW *)0x13bf8a4)
((comctl32!tagLVITEMW *)0x13bf8a4)???????????????? : 0x13bf8a4 [Type: tagLVITEMW *]
??? [+0x000] mask???????????? : 0x4 [Type: unsigned int]
??? [+0x004] iItem??????????? : 21 [Type: int]
??? [+0x008] iSubItem???????? : 0 [Type: int]
??? [+0x00c] state??????????? : 0x100c [Type: unsigned int]
??? [+0x010] stateMask??????? : 0xffffffff [Type: unsigned int]
??? [+0x014] pszText????????? : 0x772c74e9 : 0x10c2 [Type: unsigned short *]
??? [+0x018] cchTextMax?????? : 4108 [Type: int]
??? [+0x01c] iImage?????????? : 1083208 [Type: int]
??? [+0x020] lParam?????????? : 0 [Type: long]?? ??? ??? ?lParam?????????? : 0
??? [+0x024] iIndent????????? : 20707516 [Type: int]
??? [+0x028] iGroupId???????? : 524288 [Type: int]
??? [+0x02c] cColumns???????? : 0x13bfb20 [Type: unsigned int]
??? [+0x030] puColumns??????? : 0x77456e76 : 0x209c25ff [Type: unsigned int *]

BOOL ListView_OnGetItem(LV* plv, LV_ITEM* plvi)
{


??????? pitem = ListView_FastGetItemPtr(plv, plvi->iItem);

??????? if (mask & LVIF_PARAM)
??????? {
??????????? plvi->lParam = pitem->lParam;
??????? }


1: kd> dt LISTITEM 0010fe68
comctl32!LISTITEM
?? +0x000 pszText????????? : 0x00111770? -> 0x4e
?? +0x004 pt?????????????? : tagPOINT
?? +0x00c iImage?????????? : 0n115
?? +0x00e cxSingleLabel??? : 0n119
?? +0x010 cxMultiLabel???? : 0n70
?? +0x012 cyFoldedLabel??? : 0n28
?? +0x014 cyUnfoldedLabel? : 0n28
?? +0x016 iWorkArea??????? : 0n0
?? +0x018 state??????????? : 3
?? +0x01a iIndent????????? : 0n0
?? +0x01c lParam?????????? : 0n1168016?? ??? ??? ??? ?+0x01c lParam?????????? : 0n1168016
?? +0x020 hrgnIcon???????? : (null)
?? +0x024 ptRgn??????????? : tagPOINT
?? +0x02c rcTextRgn??????? : tagRECT
?? +0x03c pGroup?????????? : 0xffffffff tagLISTGROUP
?? +0x040 cColumns???????? : 0xffffffff
?? +0x044 puColumns??????? : (null)
?? +0x048 dwId???????????? : 0x1d

第四部分:
1: kd> g
Breakpoint 34 hit
SHELL32!LVUtil_GetLParam+0x32:
001b:772c7746 8b45ec????????? mov???? eax,dword ptr [ebp-14h]
1: kd> r
eax=00000001 ebx=00000015 ecx=772c74e9 edx=00000004 esi=00108748 edi=0000100c
eip=772c7746 esp=013bf8a4 ebp=013bf8d8 iopl=0???????? nv up ei pl zr na pe nc
cs=001b? ss=0023? ds=0023? es=0023? fs=003b? gs=0000???????????? efl=00000246
SHELL32!LVUtil_GetLParam+0x32:
001b:772c7746 8b45ec????????? mov???? eax,dword ptr [ebp-14h] ss:0023:013bf8c4=0011d290
1: kd> dv
???????? hwndLV = 0x00040056
????????????? i = 0n21
?????????? item = struct tagLVITEMW
1: kd> dx -id 0,0,896d1020 -r1 (*((SHELL32!tagLVITEMW *)0x13bf8a4))
(*((SHELL32!tagLVITEMW *)0x13bf8a4))???????????????? [Type: tagLVITEMW]
??? [+0x000] mask???????????? : 0x4 [Type: unsigned int]
??? [+0x004] iItem??????????? : 21 [Type: int]
??? [+0x008] iSubItem???????? : 0 [Type: int]
??? [+0x00c] state??????????? : 0x100c [Type: unsigned int]
??? [+0x010] stateMask??????? : 0xffffffff [Type: unsigned int]
??? [+0x014] pszText????????? : 0x772c74e9 : 0x10c2 [Type: unsigned short *]
??? [+0x018] cchTextMax?????? : 4108 [Type: int]
??? [+0x01c] iImage?????????? : 1083208 [Type: int]
??? [+0x020] lParam?????????? : 1168016 [Type: long]?? ??? ??? ??? ?lParam?????????? : 1168016
??? [+0x024] iIndent????????? : 20707516 [Type: int]
??? [+0x028] iGroupId???????? : 524288 [Type: int]
??? [+0x02c] cColumns???????? : 0x13bfb20 [Type: unsigned int]
??? [+0x030] puColumns??????? : 0x77456e76 : 0x209c25ff [Type: unsigned int *]


第五部分:
1: kd> dt _ITEMIDLIST 0011d290
Explorer!_ITEMIDLIST
?? +0x000 mkid???????????? : _SHITEMID
1: kd> dx -id 0,0,896d1020 -r1 (*((Explorer!_SHITEMID *)0x11d290))
(*((Explorer!_SHITEMID *)0x11d290))???????????????? [Type: _SHITEMID]
??? [+0x000] cb?????????????? : 0x5e [Type: unsigned short]
??? [+0x002] abID???????????? [Type: unsigned char [1]]
1: kd> db 0x11d290
0011d290? 5e 00 32 00 00 00 00 00-66 5a c8 78 20 00 4e 45? ^.2.....fZ.x .NE
0011d2a0? 57 54 45 58 7e 31 2e 54-58 54 00 00 42 00 03 00? WTEX~1.TXT..B...
0011d2b0? 04 00 ef be 66 5a c8 78-66 5a c8 78 14 00 00 00? ....fZ.xfZ.x....
0011d2c0? 4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00? N.e.w. .T.e.x.t.
0011d2d0? 20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00?? .D.o.c.u.m.e.n.
0011d2e0? 74 00 2e 00 74 00 78 00-74 00 00 00 1c 00 00 00? t...t.x.t.......

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72144.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MongoDB分頁實現方式對比:PageRequest vs Skip/Limit

MongoDB分頁實現方式對比:PageRequest vs Skip/Limit 一、基本概念1.1 PageRequest分頁1.2 Skip/Limit分頁 二、主要區別2.1 使用方式2.2 參數計算2.3 適用場景PageRequest適用場景:Skip/Limit適用場景: 三、性能考慮3.1 PageRequest的性能特…

Manus(一種AI代理或自動化工具)與DeepSeek(一種強大的語言模型或AI能力)結合使用任務自動化和智能決策

一、Manus與DeepSeek差異 十分好奇DeepSeek和Manus究竟誰更厲害些,DeepSeek是知識型大腦,Manus則是全能型執行者。即DeepSeek專注于語言處理、知識整合與專業文本生成。其核心優勢在于海量參數支持的深度學習和知識推理能力,例如撰寫論文、潤…

UI自動化:poium測試庫

以下是關于 poium 測試庫 的詳細介紹,涵蓋其核心功能、使用方法及與原生 Selenium 的對比,幫助快速掌握這一工具: 1. poium 簡介 定位:基于 Selenium 的 Page Object 模式增強庫,專注于簡化元素定位和頁面操作。 核心…

C#結構體(Struct)詳解

在 C# 中,?結構體(struct)? 是一種值類型數據類型,適用于封裝小型數據組。與類(class)不同,結構體在棧(Stack)上分配內存,且賦值時會發生值復制。以下是結構…

UVC攝像頭命令推流,推到rv1126里面去

ffmpeg命令查詢UVC設備 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上圖是查詢UVC設備的效果圖,畫紅框的部分是UVC設備的設備名稱"USB2.0 PC CAMERA"和設備號 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…

Linux中的基本指令(上)

目錄 ls指令 判斷linux中文件 pwd指令 認識路徑 ?編輯 絕對路徑/相對路徑 cd指令 簡要理解用戶 理解家目錄 echo指令和printf指令 touch指令 mkdir指令 cat指令 tree指令 rmdir指令和rm指令 man指令 cp指令 which指令 alias 指令 date指令 cal指令 理解…

多數元素——面試經典150題(力扣)

題目 給定一個大小為 n 的數組 nums ,返回其中的多數元素。多數元素是指在數組中出現次數 大于 ? n/2 ? 的元素。 你可以假設數組是非空的,并且給定的數組總是存在多數元素。 示例 1: 輸入:nums [3,2,3] 輸出:3 …

Qt 數據庫操作(Sqlite)

數據庫簡介 關于數據庫的基礎知識這里就不做介紹了,相關博客可以查看: SQL基礎知識 數據庫學霸筆記 上面博客都寫的比較詳細,本文主要介紹如何使用Qt進行數據庫相關操作,數據庫分為關系型數據庫和非關系型數據,關系…

網絡安全 api 網絡安全 ast技術

隨著應用或者API被攻擊利用已經越來越多,雖然來自開源組件的漏洞加劇了這一現象的發生,但是,其實主要還是在于應用程序或者API本身沒有做好防范,根源在于源代碼本身的質量沒有嚴格把控。AST是指Application Security Testing&…

Mac 配置 Maven JDK

不使用 Homebrew,創建指定版本 JDK 1、官網下載指定版本并安裝……省略 2、vi ~/.zshrc 同時要檢查 bash_profile 是否存在。 if [ -f ~/.bash_profile ] ; thensource ~/.bash_profile fiJAVA_HOME_11/Library/Java/JavaVirtualMachines/jdk-11.0.1…

【每日學點HarmonyOS Next知識】拖拽調整列表順序、tab回彈、自定義彈窗this、狀態變量修飾枚舉

1、HarmonyOS 功能實現(拖拽調整列表順序)? 可參考: import curves from ohos.curves; import Curves from ohos.curvesEntry Component struct ListItemExample {State private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]…

Django部署Filemanagement

Pycharm搭建項目安裝虛擬環境 mysqlclient對mysql的安裝,配置有要求 pymsql偽裝成mysqlclient,pymysql可以操縱mysql pip install pymysql操作sql5.7 mysql8.0會出現與pycharm不兼容問題,會報錯,所以降到5.7 # 進入mysql 需要…

【病毒分析】熊貓燒香病毒分析及其查殺修復

目錄 前言 一、樣本概況 1.1 樣本信息 1.2 測試環境及工具 1.3 分析目標 二、具體行為分析 2.1 主要行為 2.1.1 惡意程序對用戶造成的危害 2.2 惡意代碼分析 2.2.1 加固后的惡意代碼樹結構圖(是否有加固) 2.2.2 惡意程序的代碼分析片段 三、解決方案(或總結) 3.1 …

Spring Boot集成Spring Statemachine

Spring Statemachine 是 Spring 框架下的一個模塊,用于簡化狀態機的創建和管理,它允許開發者使用 Spring 的特性(如依賴注入、AOP 等)來構建復雜的狀態機應用。以下是關于 Spring Statemachine 的詳細介紹: 主要特性 …

數組總和 (leetcode 40

leetcode系列 文章目錄 一、核心操作二、外層配合操作三、核心模式代碼總結 去重方式和之前三數之和一樣,也可以用used數組去重,但本次嘗試使用set去重 一、核心操作 如果count為0了,則證明正好減到了0,就可以收獲,…

sqli-lab靶場學習(八)——Less26-28

前言 25關已經出現了初步的一些關鍵字過濾,通過雙寫可以繞過。后面的關卡,我們會遇到更多關鍵字過濾,需要各種技巧繞過。 Less26 第26關寫了會過濾空格和注釋符。有很多的答案,會用%a0替代空格,但據說這是sqli-labs部…

python:VOC格式數據集轉換為YOLO數據集格式

作者:CSDN _養樂多_ 本文將介紹如何將目標檢測中常用的VOC格式數據集轉換為YOLO數據集,并進行數據集比例劃分,從而方便的進行YOLO目標檢測。 如果不想分兩步,可以直接看第三節代碼。 文章目錄 一、將VOC格式數據集轉換為YOLO格…

Docker容器安裝軟件(完整版)

文章目錄 一、安裝Docker1.1 docker 相關的命令1.2 配置鏡像加速 二. 安裝es2.1 創建網絡2.2 拉取鏡像2.3 創建掛載點目錄2.4 部署單點es,創建es容器2.5 編寫elasticsearch.yml2.6 重啟es容器2.7 測試Elasticsearch是否安裝成功 三. 基于Docker安裝Kibana3.1 拉取鏡…

LINUX 指令大全

Linux服務器上有許多常用的命令,可以幫助你管理文件、目錄、進程、網絡和系統配置等。以下是一些常用的Linux命令: 文件和目錄管理 ls:列出當前目錄中的文件和子目錄 bash lspwd:顯示當前工作目錄的路徑 bash pwdcd:切…

燃氣對我們生活的重要性體現在哪里?

燃氣在我們的生活中有 多方面的重要性 ,以下是燃氣對我們生活的重要性的詳細說明: 烹飪和熱水供應 : 燃氣是家庭烹飪的主要能源,能夠快速、高效地加熱食物,使家庭聚餐更加便捷和愉快。 燃氣熱水器能夠在短時間內提供…