in MainWindow::OnCreate, the tree is populated with items from the root. in TreeHandler::OnItemExpanding, the tree item -> populate method is called. CINFO= { 00 : { name:acName, type:char4 } 04 : { name:disp, type:BYTE } 05 : { name:type, type:BYTE } 06 : { name:cMethods,type:WORD } 08 : { name:ppfnmethods, type:DWORD } 0c : { name:pdwSig, type:DWORD } 10 : { name:pServer, type:PROCESSPTR } } HDATA= { 00 : { name:fwd, type:DWORD } 04 : { name:back, type:DWORD } 08 : { name:hValue, type:DWORD } 0c : { name:lock, type:DWORD } 10 : { name:ref, type:DWORD } 14 : { name:pci, type:CINFOPTR } 18 : { name:pvObj, type:DWORD } 1c : { name:dwInfo, type:DWORD } } example tree: kdata | 0c +-hCurProc:aeed671a HANDLE | | | +-HDATA:8eed6718 HDATA | | | +-pvObj:8c2e80f0 PROCESS | | | | | +--oe:8c2e8140 openext_t | | | | | +-handle:aed31832 HANDLE | | +-NamePtr:8f0cce98 NamePtr | | | | | +--wPool:0004 WORD | | +--name:8f0cce9a WCHAR[260] | | | | | +-pci:8c082160 CINFO | 300 +-KINX_PROCARRAY:8c2e72e0 PROCESSARRAY | +-[0]:8c2e72e0 PROCESS | | | +----procfield1 | +-[1]:8c2e73d0 PROCESS | | | +----procfield1 summary_string() - gets filename for filehandle, or processname for process, etc. display_value() - gets memory contents for most, or struct/array offset for structs/arrays dereference_value()- gets HDATA for handles, ptrvalue for others. types may be variable, for instance pvObj from HDATA arrays need a way to get a variable size. the user should be able to create and edit types.