第一部分:
BOOL ListView_SetSubItem(LV* plv, const LV_ITEM* plvi)
{
??? LISTSUBITEM lsi;
??? BOOL fChanged = FALSE;
??? int i;
??? int idpa;
??? HDPA hdpa;
??? if (plvi->mask & ~(LVIF_DI_SETITEM | LVIF_TEXT | LVIF_IMAGE | LVIF_STATE))
??? {
??????? RIPMSG(0, "ListView: Invalid mask: %04x", plvi->mask);
??????? return FALSE;
??? }
??? if (!(plvi->mask & (LVIF_TEXT | LVIF_IMAGE | LVIF_STATE)))
??????? return TRUE;
??? i = plvi->iItem;
??? if (!ListView_IsValidItemNumber(plv, i))
??? {
??????? RIPMSG(0, "LVM_SETITEM: Invalid iItem: %d", plvi->iItem);
??????? return FALSE;
??? }
??? // sub item indices are 1-based...
??? //
??? idpa = plvi->iSubItem - 1;
??? if (idpa < 0 || idpa >= plv->cCol - 1)
??? {
??????? RIPMSG(0, "LVM_SETITEM: Invalid iSubItem: %d", plvi->iSubItem);
??????? return FALSE;
??? }
??? hdpa = ListView_GetSubItemDPA(plv, idpa);
??? if (!hdpa)
??? {
??????? hdpa = DPA_CreateEx(LV_HDPA_GROW, plv->hheap);
??????? if (!hdpa)
??????????? return FALSE;
??????? DPA_SetPtr(plv->hdpaSubItems, idpa, (void*)hdpa);
??? }
??? ListView_GetSubItem(plv, i, plvi->iSubItem, &lsi);
??? if (plvi->mask & LVIF_TEXT) {
??????? if (lsi.pszText != plvi->pszText) {
??????????? Str_Set(&lsi.pszText, plvi->pszText);
??????????? fChanged = TRUE;
??????? }
??? }
??? if (plvi->mask & LVIF_IMAGE) {
??????? if (plvi->iImage != lsi.iImage) {
??????????? lsi.iImage = (short) plvi->iImage;
??????????? fChanged = TRUE;
??????? }
??? }
??? if (plvi->mask & LVIF_STATE) {
??????? DWORD dwChange;
??????? dwChange = (lsi.state ^ plvi->state ) & plvi->stateMask;
??????? if (dwChange) {
??????????? lsi.state ^= dwChange;
??????????? fChanged = TRUE;
??????? }
??? }
??? if (fChanged) {
??????? PLISTSUBITEM plsiReal = DPA_GetPtr(hdpa, i);
??????? if (!plsiReal) {
??????????? plsiReal = LocalAlloc(LPTR, sizeof(LISTSUBITEM));
??????????? if (!plsiReal) {
??????????????? // fail!? bail out
??????????????? return FALSE;
??????????? }
??????? }
??????? *plsiReal = lsi;
??????? if (!DPA_SetPtr(hdpa, i, (void*)plsiReal)) {
??????????? ListView_FreeSubItem(plsiReal);
??????????? return FALSE;
??????? }
??? }
??? // all's well... let's invalidate this
??? if (ListView_IsReportView(plv)) {
??????? RECT rc;
??????? ListView_RGetRectsEx(plv, plvi->iItem, plvi->iSubItem, NULL, &rc);
??????? RedrawWindow(plv->ci.hwnd, &rc, NULL, RDW_ERASE | RDW_INVALIDATE);
??? }
??? else if (ListView_IsTileView(plv))
??? {
??????? LISTITEM *pitem = ListView_GetItemPtr(plv, i);
??????? if (pitem)
??????? {
??????????? ListView_SetSRecompute(pitem);
??????????? // For tile view, we need to recompute the item
??????????? plv->rcView.left = RECOMPUTE;
?????? ?
??????????? if (plv->iItemDrawing != i)
??????????????? ListView_InvalidateItemEx(plv, i, FALSE, RDW_ERASE | RDW_INVALIDATE, LVIF_TEXT);
??????? }
??? }
??? return TRUE;
}
// 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
第二部分:
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_LV *)0x108d88)
((comctl32!_LV *)0x108d88)???????????????? : 0x108d88 [Type: _LV *]
??? [+0x000] ci?????????????? [Type: tagControlInfo]
??? [+0x024 ( 0: 0)] fNoDismissEdit?? : 0x0 [Type: unsigned long]
??? [+0x024 ( 1: 1)] fButtonDown????? : 0x1 [Type: unsigned long]
??? [+0x024 ( 2: 2)] fOneClickOK????? : 0x1 [Type: unsigned long]
??? [+0x024 ( 3: 3)] fOneClickHappened : 0x0 [Type: unsigned long]
??? [+0x024 ( 4: 4)] fPlaceTooltip??? : 0x0 [Type: unsigned long]
??? [+0x024 ( 5: 5)] fImgCtxComplete? : 0x0 [Type: unsigned long]
??? [+0x024 ( 6: 6)] fNoEmptyText???? : 0x0 [Type: unsigned long]
??? [+0x024 ( 7: 7)] fGroupView?????? : 0x0 [Type: unsigned long]
??? [+0x024 ( 8: 8)] fIconsPositioned : 0x1 [Type: unsigned long]
??? [+0x024 ( 9: 9)] fInsertAfter???? : 0x0 [Type: unsigned long]
??? [+0x024 (10:10)] fListviewAlphaSelect : 0x0 [Type: unsigned long]
??? [+0x024 (11:11)] fListviewShadowText : 0x0 [Type: unsigned long]
??? [+0x024 (12:12)] fListviewWatermarkBackgroundImages : 0x0 [Type: unsigned long]
??? [+0x024 (13:13)] fListviewEnableWatermark : 0x0 [Type: unsigned long]
??? [+0x024 (14:14)] fInFixIScrollPositions : 0x0 [Type: unsigned long]
??? [+0x028] wView??????????? : 0x0 [Type: unsigned short]
??? [+0x02c] hdpa???????????? : 0x1086d8 [Type: _DPA *]?? ??? ??? ?[+0x02c] hdpa???????????? : 0x1086d8 [Type: _DPA *]
? ......
??? [+0x2fc] iLastId????????? : 0x0 [Type: unsigned long]
??? [+0x300] iIncrement?????? : 0xffffffff [Type: unsigned long]
0: kd> dx -id 0,0,896d1020 -r1 ((comctl32!_DPA *)0x1086d8)
((comctl32!_DPA *)0x1086d8)???????????????? : 0x1086d8 [Type: _DPA *]
??? [+0x000] cp?????????????? : 22 [Type: int]
??? [+0x004] pp?????????????? : 0x10b900 [Type: void * *]
??? [+0x008] hheap??????????? : 0x80000 [Type: void *]
??? [+0x00c] cpAlloc????????? : 32 [Type: int]
??? [+0x010] cpGrow?????????? : 64 [Type: int]
??? [+0x014] magic??????????? : 0x4150 [Type: unsigned int]
0: kd> dd 0x10b900
0010b900? 0010b590 0010b7f8 0010b850 0010b2f0
0010b910? 0010ba10 0010ba68 0010bac0 000d64b8
0010b920? 0010b380 0010b3d8 0010b430 0010b488
0010b930? 0010b4e0 0010b538 0010b5e8 0010b640
0010b940? 0010b698 0010b6f0 0010b748 0010b7a0
0010b950? 0010b8a8 00118718 00000000 00000000
0010b960? 00000000 00000000 00000000 00000000
第三部分:
一共兩列:iImage表示位置,從左到右的相對位置
第二列:
0: kd> dt LISTSUBITEM 00118718
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x000d3818? -> 0x4e
?? +0x004 iImage?????????? : 0n621
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> dx -id 0,0,896d1020 -r1 (*((comctl32!tagSIZE *)0x118720))
(*((comctl32!tagSIZE *)0x118720))???????????????? [Type: tagSIZE]
??? [+0x000] cx?????????????? : 77 [Type: long]
??? [+0x004] cy?????????????? : 7864319 [Type: long]
0: kd> db 0x000d3818
000d3818? 4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00? N.e.w. .T.e.x.t.
000d3828? 20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00?? .D.o.c.u.m.e.n.
000d3838? 74 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00? t...t.x.t.......
0: kd> dt LISTSUBITEM 0010b8a8
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001098c8? -> 0x53
?? +0x004 iImage?????????? : 0n546
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001098c8
001098c8? 53 00 49 00 50 00 4f 00-42 00 4a 00 2e 00 44 00? S.I.P.O.B.J...D.
001098d8? 42 00 47 00 00 00 52 00-05 00 04 00 49 01 0c 00? B.G...R.....I...
0: kd> dt LISTSUBITEM 0010b7a0
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001098a0? -> 0x70
?? +0x004 iImage?????????? : 0n471
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001098a0
001098a0? 70 00 61 00 67 00 65 00-66 00 69 00 6c 00 65 00? p.a.g.e.f.i.l.e.
001098b0? 2e 00 73 00 79 00 73 00-00 00 00 00 00 00 00 00? ..s.y.s.........
0: kd> dt LISTSUBITEM 0010b748
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109888? -> 0x6e
?? +0x004 iImage?????????? : 0n396
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109888
00109888? 6e 00 74 00 6c 00 64 00-72 00 00 00 00 00 00 00? n.t.l.d.r.......
00109898? 05 00 03 00 46 01 0e 00-70 00 61 00 67 00 65 00? ....F...p.a.g.e.
0: kd> dt LISTSUBITEM 0010b6f0
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109860? -> 0x4e
?? +0x004 iImage?????????? : 0n321
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109860
00109860? 4e 00 54 00 44 00 45 00-54 00 45 00 43 00 54 00? N.T.D.E.T.E.C.T.
00109870? 2e 00 43 00 4f 00 4d 00-00 00 00 00 00 00 00 00? ..C.O.M.........
0: kd> dt LISTSUBITEM 0010b698
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109840? -> 0x4d
?? +0x004 iImage?????????? : 0n246
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109840
00109840? 4d 00 53 00 44 00 4f 00-53 00 2e 00 53 00 59 00? M.S.D.O.S...S.Y.
00109850? 53 00 00 00 00 00 00 00-05 00 04 00 5e 01 0e 00? S...........^...
0: kd> dt LISTSUBITEM 0010b640
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109828? -> 0x49
?? +0x004 iImage?????????? : 0n171
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109828
00109828? 49 00 4f 00 2e 00 53 00-59 00 53 00 00 00 0d 77? I.O...S.Y.S....w
0: kd>? dt LISTSUBITEM 0010b5e8
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109808? -> 0x65
?? +0x004 iImage?????????? : 0n96
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109808
00109808? 65 00 76 00 65 00 6e 00-74 00 2e 00 74 00 78 00? e.v.e.n.t...t.x.
00109818? 74 00 00 00 00 00 00 00-03 00 04 00 51 01 0a 00? t...........Q...
0: kd>? dt LISTSUBITEM 0010b538
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001097e8? -> 0x43
?? +0x004 iImage?????????? : 0n21
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001097e8
001097e8? 43 00 4f 00 4e 00 46 00-49 00 47 00 2e 00 53 00? C.O.N.F.I.G...S.
001097f8? 59 00 53 00 00 00 00 00-04 00 04 00 55 01 0c 00? Y.S.........U...
第二列:
0: kd> dt LISTSUBITEM 0010b4e0
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001097c8? -> 0x62
?? +0x004 iImage?????????? : 0n921
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001097c8
001097c8? 62 00 6f 00 6f 00 74 00-2e 00 69 00 6e 00 69 00? b.o.o.t...i.n.i.
0: kd>? dt LISTSUBITEM 0010b488
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001097a0? -> 0x41
?? +0x004 iImage?????????? : 0n846
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001097a0
001097a0? 41 00 55 00 54 00 4f 00-45 00 58 00 45 00 43 00? A.U.T.O.E.X.E.C.
001097b0? 2e 00 42 00 41 00 54 00-00 00 00 00 00 00 00 00? ..B.A.T.........
0: kd>? dt LISTSUBITEM 0010b430
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109788? -> 0x36
?? +0x004 iImage?????????? : 0n771
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109788
00109788? 36 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00? 6...t.x.t.......
0: kd>? dt LISTSUBITEM 0010b3d8
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109770? -> 0x34
?? +0x004 iImage?????????? : 0n696
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109770
00109770? 34 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00? 4...t.x.t.......
0: kd>? dt LISTSUBITEM 0010b380
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109758? -> 0x32
?? +0x004 iImage?????????? : 0n621
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109758
00109758? 32 00 2e 00 74 00 78 00-74 00 00 00 2a 97 2e 77? 2...t.x.t...*..w
00109768? 03 00 03 00 b8 01 0c 00-34 00 2e 00 74 00 78 00? ........4...t.x.
0: kd>? dt LISTSUBITEM 000d64b8
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109740? -> 0x31
?? +0x004 iImage?????????? : 0n546
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109740
00109740? 31 00 2e 00 74 00 78 00-74 00 00 00 00 00 00 00? 1...t.x.t.......
00109750? 03 00 03 00 bf 01 0c 00-32 00 2e 00 74 00 78 00? ........2...t.x.
0: kd>? dt LISTSUBITEM 0010bac0
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109728? -> 0x77
?? +0x004 iImage?????????? : 0n471
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109728
00109728? 77 00 6d 00 70 00 75 00-62 00 00 00 ac 87 2a 77? w.m.p.u.b.....*w
00109738? 03 00 03 00 b2 01 0c 00-31 00 2e 00 74 00 78 00? ........1...t.x.
0: kd>? dt LISTSUBITEM 0010ba68
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x000f4280? -> 0x57
?? +0x004 iImage?????????? : 0n396
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x000f4280
000f4280? 57 00 49 00 4e 00 44 00-4f 00 57 00 53 00 00 00? W.I.N.D.O.W.S...
0: kd>? dt LISTSUBITEM 0010ba10
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x0010b158? -> 0x74
?? +0x004 iImage?????????? : 0n321
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x0010b158
0010b158? 74 00 66 00 74 00 70 00-64 00 72 00 6f 00 6f 00? t.f.t.p.d.r.o.o.
0010b168? 74 00 00 00 00 00 00 00-b8 56 10 00 78 8d 10 00? t........V..x...
0: kd>? dt LISTSUBITEM 0010b2f0
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001096e8? -> 0x53
?? +0x004 iImage?????????? : 0n246
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001096e8
001096e8? 53 00 79 00 73 00 74 00-65 00 6d 00 20 00 56 00? S.y.s.t.e.m. .V.
001096f8? 6f 00 6c 00 75 00 6d 00-65 00 20 00 49 00 6e 00? o.l.u.m.e. .I.n.
00109708? 66 00 6f 00 72 00 6d 00-61 00 74 00 69 00 6f 00? f.o.r.m.a.t.i.o.
00109718? 6e 00 00 00 00 02 00 00-03 00 08 00 b1 01 0c 00? n...............
0: kd>? dt LISTSUBITEM 0010b850
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x00109b58? -> 0x52
?? +0x004 iImage?????????? : 0n171
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x00109b58
00109b58? 52 00 45 00 43 00 59 00-43 00 4c 00 45 00 52 00? R.E.C.Y.C.L.E.R.
00109b68? 00 00 00 00 00 00 00 00-08 00 04 00 3b 01 08 00? ............;...
0: kd>? dt LISTSUBITEM 0010b7f8
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x001056a0? -> 0x50
?? +0x004 iImage?????????? : 0n96
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x001056a0
001056a0? 50 00 72 00 6f 00 67 00-72 00 61 00 6d 00 20 00? P.r.o.g.r.a.m. .
001056b0? 46 00 69 00 6c 00 65 00-73 00 00 00 78 8d 10 00? F.i.l.e.s...x...
0: kd>? dt LISTSUBITEM 0010b590
comctl32!LISTSUBITEM
?? +0x000 pszText????????? : 0x0010b348? -> 0x44
?? +0x004 iImage?????????? : 0n21
?? +0x006 state??????????? : 0
?? +0x008 sizeText???????? : tagSIZE
0: kd> db 0x0010b348
0010b348? 44 00 6f 00 63 00 75 00-6d 00 65 00 6e 00 74 00? D.o.c.u.m.e.n.t.
0010b358? 73 00 20 00 61 00 6e 00-64 00 20 00 53 00 65 00? s. .a.n.d. .S.e.
0010b368? 74 00 74 00 69 00 6e 00-67 00 73 00 00 00 00 00? t.t.i.n.g.s.....