Author: akhaldi
Date: Fri Jul  8 11:16:26 2011
New Revision: 52571

URL: http://svn.reactos.org/svn/reactos?rev=52571&view=rev
Log:
[CMAKE]
* Add yet another awesome rossym/kdbg feature: struct printing using the 
command "dt". Brought to you by the Arty.

Modified:
    trunk/reactos/include/reactos/rossym.h
    trunk/reactos/lib/rossym_new/compat.h
    trunk/reactos/lib/rossym_new/dwarf.h
    trunk/reactos/lib/rossym_new/dwarfabbrev.c
    trunk/reactos/lib/rossym_new/dwarfinfo.c
    trunk/reactos/lib/rossym_new/dwarfopen.c
    trunk/reactos/lib/rossym_new/find.c
    trunk/reactos/lib/rossym_new/fromfile.c
    trunk/reactos/lib/rossym_new/pe.c
    trunk/reactos/lib/rossym_new/pe.h
    trunk/reactos/ntoskrnl/kdbg/kdb_cli.c
    trunk/reactos/ntoskrnl/kdbg/kdb_symbols.cmake.c

Modified: trunk/reactos/include/reactos/rossym.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/rossym.h?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/include/reactos/rossym.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/rossym.h [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -11,6 +11,10 @@
 #define REACTOS_ROSSYM_H_INCLUDED
 
 #define ROSSYM_SECTION_NAME ".rossym"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
 
 typedef struct _ROSSYM_HEADER {
   unsigned long SymbolsOffset;
@@ -86,6 +90,18 @@
   ROSSYM_PARAMETER Parameters[16];
 } ROSSYM_LINEINFO, *PROSSYM_LINEINFO;
 
+typedef struct _ROSSYM_AGGREGATE_MEMBER {
+    PCHAR Name, Type;
+    ULONG BaseOffset, Size;
+    ULONG FirstBit, Bits;
+    ULONG TypeId;
+} ROSSYM_AGGREGATE_MEMBER, *PROSSYM_AGGREGATE_MEMBER;
+
+typedef struct _ROSSYM_AGGREGATE {
+    ULONG NumElements;
+    PROSSYM_AGGREGATE_MEMBER Elements;
+} ROSSYM_AGGREGATE, *PROSSYM_AGGREGATE;
+
 typedef struct _ROSSYM_CALLBACKS {
   PVOID (*AllocMemProc)(ULONG_PTR Size);
   VOID (*FreeMemProc)(PVOID Area);
@@ -132,6 +148,13 @@
 #endif
 VOID RosSymFreeInfo(PROSSYM_LINEINFO RosSymLineInfo);
 VOID RosSymDelete(PROSSYM_INFO RosSymInfo);
+BOOLEAN
+RosSymAggregate(PROSSYM_INFO RosSymInfo, PCHAR Type, PROSSYM_AGGREGATE 
Aggregate);
+VOID RosSymFreeAggregate(PROSSYM_AGGREGATE Aggregate);
+
+#ifdef __cplusplus
+}
+#endif
 
 #endif /* REACTOS_ROSSYM_H_INCLUDED */
 

Modified: trunk/reactos/lib/rossym_new/compat.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/compat.h?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/compat.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/compat.h [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -19,6 +19,19 @@
 typedef ulong size_t;
 #endif
 
+DECLSPEC_NORETURN
+NTSYSAPI
+VOID
+NTAPI
+RtlRaiseStatus(IN NTSTATUS Status);
+
+#undef assert
+#define assert(x) do { \
+    if (!(x)) { \
+        werrstr("(%s:%d) assertion " #x " failed\n", __FILE__, __LINE__); \
+        RtlRaiseStatus(STATUS_ASSERTION_FAILURE); \
+    } \
+    } while (0)
 #define offsetof(x,y) FIELD_OFFSET(x,y)
 #define nil (0)
 
@@ -32,7 +45,13 @@
 void xfree(void *v);
 
 #define werrstr(str, ...) DPRINT(str "\n" ,##__VA_ARGS__)
-//#define werrstr(x, ...) printf("(%s:%d) " x 
"\n",__FILE__,__LINE__,##__VA_ARGS__)
+#if 0
+#ifdef NDEBUG
+#define werrstr(x, ...)
+#else
+#define werrstr(x, ...) printf("(%s:%d) " x 
"\n",__FILE__,__LINE__,##__VA_ARGS__)
+#endif
+#endif
 
 #define malloc(x) RosSymAllocMem(x)
 #define mallocz(x,y) RosSymAllocMemZero(x,y)

Modified: trunk/reactos/lib/rossym_new/dwarf.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/dwarf.h?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/dwarf.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/dwarf.h [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -483,5 +483,6 @@
 DwarfAbbrev *dwarfgetabbrev(Dwarf*, ulong, ulong);
 
 int dwarfgetinfounit(Dwarf*, ulong, DwarfBlock*);
+void dwarfdumpsym(Dwarf *d, DwarfSym *s);
 
 #define MAXIMUM_DWARF_NAME_SIZE 64

Modified: trunk/reactos/lib/rossym_new/dwarfabbrev.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/dwarfabbrev.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/dwarfabbrev.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/dwarfabbrev.c [iso-8859-1] Fri Jul  8 11:16:26 
2011
@@ -83,7 +83,7 @@
         if(num == 0)
             break;
         tag = dwarfget128(&b);
-        DPRINT("num %d tag %x @ %x", num, tag, b.p - d->abbrev.data);
+        werrstr("abbrev: num %d tag %x @ %x", num, tag, b.p - d->abbrev.data);
         haskids = dwarfget1(&b);
         for(i=0;; i++){
             name = dwarfget128(&b);
@@ -120,11 +120,12 @@
 {
     int i;
 
-    for(i=0; i<na; i++)
-        if(a[i].num == num)
+    for(i=0; i<na; i++) {
+        if(a[i].num == num) {
             return &a[i];
-    assert(0);
-    werrstr("abbrev not found");
+        }
+    }
+    werrstr("abbrev not found (%x)", na);
     return nil;
 }
 
@@ -133,7 +134,7 @@
 {
     DwarfAbbrev *a;
     int na;
-
+    werrstr("want num %d\n", num);
     if((na = loadabbrevs(d, off, &a)) < 0){
         werrstr("loadabbrevs: %r");
         return nil;

Modified: trunk/reactos/lib/rossym_new/dwarfinfo.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/dwarfinfo.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/dwarfinfo.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/dwarfinfo.c [iso-8859-1] Fri Jul  8 11:16:26 
2011
@@ -128,9 +128,11 @@
     DwarfSym compunit = { };
     if(dwarfenumunit(d, unit, &compunit) < 0)
         return -1;
-    while(dwarfnextsymat(d, &compunit, s) == 1)
+    while(dwarfnextsymat(d, &compunit, s) == 0) {
+        werrstr("got %s looking for %s\n", s->attrs.name, name);
         if(s->attrs.name && strcmp(s->attrs.name, name) == 0)
             return 0;
+    }
     werrstr("symbol '%s' not found", name);
     return -1;
 }
@@ -188,7 +190,10 @@
     DwarfSym compunit = { };
     if(dwarfenumunit(d, unit, &compunit) < 0)
         return -1;
+    werrstr("dwarfseeksym: unit %x off %x\n", unit, off);
+    s->b.d = d;
     s->b.p = d->info.data + unit + off;
+    s->b.ep = compunit.b.ep;
     if(dwarfnextsymat(d, &compunit, s) == -1)
         return -1;
     werrstr("dwarfseeksym: unit %x off %x, tag %x", unit, off, s->attrs.tag);
@@ -238,7 +243,7 @@
         return -1;
     }
     s->b.ep = s->b.p+len;
-    if((i=dwarfget2(&s->b)) != 2)
+    if((i=dwarfget2(&s->b)) > 4)
         goto badheader;
     aoff = dwarfget4(&s->b);
     s->b.addrsize = dwarfget1(&s->b);
@@ -258,15 +263,19 @@
     ulong num;
     DwarfAbbrev *a;
 
+    werrstr("sym at %x (left %x)\n", s->b.p - d->info.data, s->b.ep - s->b.p);
+
     num = dwarfget128(&s->b);
+    werrstr("abbrev num %x\n", num);
     s->num = num;
     if(num == 0){
         return -1;
     }
 
     a = dwarfgetabbrev(d, s->aoff, num);
+    werrstr("a %p\n", a);
     if(a == nil){
-        werrstr("getabbrev %ud %ud for %ud,%ud", s->aoff, num, s->unit);
+        werrstr("getabbrev %x %x for %x", s->aoff, num, s->unit);
         return -1;
     }
 
@@ -277,6 +286,7 @@
     if (s->attrs.haskids) {
         DwarfSym childSkip = { };
         s->childoff = s->b.p - d->info.data;
+        werrstr("Set childoff at %x\n", s->childoff);
         int r = dwarfnextsymat(d, s, &childSkip);
         while (r == 0) {
             r = dwarfnextsym(d, &childSkip);
@@ -316,6 +326,7 @@
     if (!child->b.d) {
         child->b = parent->b;
         child->b.p = parent->childoff + parent->b.d->info.data;
+        werrstr("Rewound to childoff %x\n", parent->childoff);
     }
 
     return dwarfnextsym(d, child);
@@ -323,76 +334,78 @@
 
 typedef struct Parse Parse;
 struct Parse {
+    const char *namestr;
     int name;
     int off;
     int haveoff;
     int type;
 };
 
+#define ATTR(x) (#x)+9, x
 #define OFFSET(x) offsetof(DwarfAttrs, x), offsetof(DwarfAttrs, have.x)
 
 static Parse plist[] = {       /* Font Tab 4 */
-    { DwarfAttrAbstractOrigin, OFFSET(abstractorigin),         TReference },
-    { DwarfAttrAccessibility,  OFFSET(accessibility),          TConstant },
-    { DwarfAttrAddrClass,              OFFSET(addrclass),                      
TConstant },
-    { DwarfAttrArtificial,             OFFSET(isartificial),           TFlag },
-    { DwarfAttrBaseTypes,              OFFSET(basetypes),                      
TReference },
-    { DwarfAttrBitOffset,              OFFSET(bitoffset),                      
TConstant },
-    { DwarfAttrBitSize,                OFFSET(bitsize),                        
TConstant },
-    { DwarfAttrByteSize,               OFFSET(bytesize),                       
TConstant },
-    { DwarfAttrCalling,                OFFSET(calling),                        
TConstant },
-    { DwarfAttrCommonRef,              OFFSET(commonref),                      
TReference },
-    { DwarfAttrCompDir,                OFFSET(compdir),                        
TString },
-    { DwarfAttrConstValue,             OFFSET(constvalue),                     
TString|TConstant|TBlock },
-    { DwarfAttrContainingType, OFFSET(containingtype),         TReference },
-    { DwarfAttrCount,                  OFFSET(count),                          
TConstant|TReference },
-    { DwarfAttrDataMemberLoc,  OFFSET(datamemberloc),          
TBlock|TConstant|TReference },
-    { DwarfAttrDeclColumn,             OFFSET(declcolumn),                     
TConstant },
-    { DwarfAttrDeclFile,               OFFSET(declfile),                       
TConstant },
-    { DwarfAttrDeclLine,               OFFSET(declline),                       
TConstant },
-    { DwarfAttrDeclaration,    OFFSET(isdeclaration),          TFlag },
-    { DwarfAttrDefaultValue,   OFFSET(defaultvalue),           TReference },
-    { DwarfAttrDiscr,                  OFFSET(discr),                          
TReference },
-    { DwarfAttrDiscrList,              OFFSET(discrlist),                      
TBlock },
-    { DwarfAttrDiscrValue,             OFFSET(discrvalue),                     
TConstant },
-    { DwarfAttrEncoding,               OFFSET(encoding),                       
TConstant },
-    { DwarfAttrExternal,               OFFSET(isexternal),                     
TFlag },
-    { DwarfAttrFrameBase,              OFFSET(framebase),                      
TBlock|TConstant },
-    { DwarfAttrFriend,                 OFFSET(friend),                         
TReference },
-    { DwarfAttrHighpc,                 OFFSET(highpc),                         
TAddress },
-    { DwarfAttrEntrypc,         OFFSET(entrypc),            TAddress },
-    { DwarfAttrIdentifierCase, OFFSET(identifiercase),         TConstant },
-    { DwarfAttrImport,                 OFFSET(import),                         
TReference },
-    { DwarfAttrInline,                 OFFSET(inlined),                        
TConstant },
-    { DwarfAttrIsOptional,             OFFSET(isoptional),                     
TFlag },
-    { DwarfAttrLanguage,               OFFSET(language),                       
TConstant },
-    { DwarfAttrLocation,               OFFSET(location),                       
TReference|TBlock },
-    { DwarfAttrLowerBound,             OFFSET(lowerbound),                     
TConstant|TReference },
-    { DwarfAttrLowpc,                  OFFSET(lowpc),                          
TAddress },
-    { DwarfAttrMacroInfo,              OFFSET(macroinfo),                      
TConstant },
-    { DwarfAttrName,                   OFFSET(name),                           
TString },
-    { DwarfAttrNamelistItem,   OFFSET(namelistitem),           TBlock },
-    { DwarfAttrOrdering,               OFFSET(ordering),                       
TConstant },
-    { DwarfAttrPriority,               OFFSET(priority),                       
TReference },
-    { DwarfAttrProducer,               OFFSET(producer),                       
TString },
-    { DwarfAttrPrototyped,             OFFSET(isprototyped),           TFlag },
-    { DwarfAttrRanges,                 OFFSET(ranges),                         
TReference },
-    { DwarfAttrReturnAddr,             OFFSET(returnaddr),                     
TBlock|TConstant },
-    { DwarfAttrSegment,                OFFSET(segment),                        
TBlock|TConstant },
-    { DwarfAttrSibling,                OFFSET(sibling),                        
TReference },
-    { DwarfAttrSpecification,  OFFSET(specification),          TReference },
-    { DwarfAttrStartScope,             OFFSET(startscope),                     
TConstant },
-    { DwarfAttrStaticLink,             OFFSET(staticlink),                     
TBlock|TConstant },
-    { DwarfAttrStmtList,               OFFSET(stmtlist),                       
TConstant },
-    { DwarfAttrStrideSize,             OFFSET(stridesize),                     
TConstant },
-    { DwarfAttrStringLength,   OFFSET(stringlength),           
TBlock|TConstant },
-    { DwarfAttrType,                   OFFSET(type),                           
TReference },
-    { DwarfAttrUpperBound,             OFFSET(upperbound),                     
TConstant|TReference },
-    { DwarfAttrUseLocation,    OFFSET(uselocation),            
TBlock|TConstant },
-    { DwarfAttrVarParam,               OFFSET(isvarparam),                     
TFlag },
-    { DwarfAttrVirtuality,             OFFSET(virtuality),                     
TConstant },
-    { DwarfAttrVisibility,             OFFSET(visibility),                     
TConstant },
-    { DwarfAttrVtableElemLoc,  OFFSET(vtableelemloc),          
TBlock|TReference },
+    { ATTR(DwarfAttrAbstractOrigin),   OFFSET(abstractorigin),         
TReference },
+    { ATTR(DwarfAttrAccessibility),    OFFSET(accessibility),          
TConstant },
+    { ATTR(DwarfAttrAddrClass),                OFFSET(addrclass),              
        TConstant },
+    { ATTR(DwarfAttrBaseTypes),                OFFSET(basetypes),              
        TReference },
+    { ATTR(DwarfAttrBitOffset),                OFFSET(bitoffset),              
        TConstant },
+    { ATTR(DwarfAttrBitSize),          OFFSET(bitsize),                        
TConstant },
+    { ATTR(DwarfAttrByteSize),         OFFSET(bytesize),                       
TConstant },
+    { ATTR(DwarfAttrCalling),          OFFSET(calling),                        
TConstant },
+    { ATTR(DwarfAttrCommonRef),                OFFSET(commonref),              
        TReference },
+    { ATTR(DwarfAttrCompDir),          OFFSET(compdir),                        
TString },
+    { ATTR(DwarfAttrConstValue),               OFFSET(constvalue),             
        TString|TConstant|TBlock },
+    { ATTR(DwarfAttrContainingType),   OFFSET(containingtype),         
TReference },
+    { ATTR(DwarfAttrCount),                    OFFSET(count),                  
        TConstant|TReference },
+    { ATTR(DwarfAttrDataMemberLoc),    OFFSET(datamemberloc),          
TBlock|TConstant|TReference },
+    { ATTR(DwarfAttrDeclColumn),               OFFSET(declcolumn),             
        TConstant },
+    { ATTR(DwarfAttrDeclFile),         OFFSET(declfile),                       
TConstant },
+    { ATTR(DwarfAttrDeclLine),         OFFSET(declline),                       
TConstant },
+    { ATTR(DwarfAttrDefaultValue),     OFFSET(defaultvalue),           
TReference },
+    { ATTR(DwarfAttrDiscr),                    OFFSET(discr),                  
        TReference },
+    { ATTR(DwarfAttrDiscrList),                OFFSET(discrlist),              
        TBlock },
+    { ATTR(DwarfAttrDiscrValue),               OFFSET(discrvalue),             
        TConstant },
+    { ATTR(DwarfAttrEncoding),         OFFSET(encoding),                       
TConstant },
+    { ATTR(DwarfAttrFrameBase),                OFFSET(framebase),              
        TBlock|TConstant },
+    { ATTR(DwarfAttrFriend),                   OFFSET(friend),                 
        TReference },
+    { ATTR(DwarfAttrHighpc),                   OFFSET(highpc),                 
        TAddress },
+    { ATTR(DwarfAttrEntrypc),         OFFSET(entrypc),            TAddress },
+    { ATTR(DwarfAttrIdentifierCase),   OFFSET(identifiercase),         
TConstant },
+    { ATTR(DwarfAttrImport),                   OFFSET(import),                 
        TReference },
+    { ATTR(DwarfAttrInline),                   OFFSET(inlined),                
        TConstant },
+    { ATTR(DwarfAttrArtificial),               OFFSET(isartificial),           
TFlag },
+    { ATTR(DwarfAttrDeclaration),          OFFSET(isdeclaration),              
TFlag },
+    { ATTR(DwarfAttrExternal),         OFFSET(isexternal),                     
TFlag },
+    { ATTR(DwarfAttrIsOptional),               OFFSET(isoptional),             
        TFlag },
+    { ATTR(DwarfAttrPrototyped),               OFFSET(isprototyped),           
TFlag },
+    { ATTR(DwarfAttrVarParam),         OFFSET(isvarparam),                     
TFlag },
+    { ATTR(DwarfAttrLanguage),         OFFSET(language),                       
TConstant },
+    { ATTR(DwarfAttrLocation),         OFFSET(location),                       
TReference|TBlock },
+    { ATTR(DwarfAttrLowerBound),               OFFSET(lowerbound),             
        TConstant|TReference },
+    { ATTR(DwarfAttrLowpc),                    OFFSET(lowpc),                  
        TAddress },
+    { ATTR(DwarfAttrMacroInfo),                OFFSET(macroinfo),              
        TConstant },
+    { ATTR(DwarfAttrName),                     OFFSET(name),                   
        TString },
+    { ATTR(DwarfAttrNamelistItem),     OFFSET(namelistitem),           TBlock 
},
+    { ATTR(DwarfAttrOrdering),                 OFFSET(ordering),               
        TConstant },
+    { ATTR(DwarfAttrPriority),         OFFSET(priority),                       
TReference },
+    { ATTR(DwarfAttrProducer),         OFFSET(producer),                       
TString },
+    { ATTR(DwarfAttrRanges),                   OFFSET(ranges),                 
        TReference },
+    { ATTR(DwarfAttrReturnAddr),               OFFSET(returnaddr),             
        TBlock|TConstant },
+    { ATTR(DwarfAttrSegment),          OFFSET(segment),                        
TBlock|TConstant },
+    { ATTR(DwarfAttrSibling),          OFFSET(sibling),                        
TReference },
+    { ATTR(DwarfAttrSpecification),    OFFSET(specification),          
TReference },
+    { ATTR(DwarfAttrStartScope),               OFFSET(startscope),             
        TConstant },
+    { ATTR(DwarfAttrStaticLink),               OFFSET(staticlink),             
        TBlock|TConstant },
+    { ATTR(DwarfAttrStmtList),         OFFSET(stmtlist),                       
TConstant },
+    { ATTR(DwarfAttrStrideSize),               OFFSET(stridesize),             
        TConstant },
+    { ATTR(DwarfAttrStringLength),     OFFSET(stringlength),           
TBlock|TConstant },
+    { ATTR(DwarfAttrType),                     OFFSET(type),                   
        TReference },
+    { ATTR(DwarfAttrUpperBound),               OFFSET(upperbound),             
        TConstant|TReference },
+    { ATTR(DwarfAttrUseLocation),      OFFSET(uselocation),            
TBlock|TConstant },
+    { ATTR(DwarfAttrVirtuality),               OFFSET(virtuality),             
        TConstant },
+    { ATTR(DwarfAttrVisibility),               OFFSET(visibility),             
        TConstant },
+    { ATTR(DwarfAttrVtableElemLoc),    OFFSET(vtableelemloc),          
TBlock|TReference },
     { }
 };
 
@@ -417,6 +430,7 @@
     for(i=0; i<a->nattr; i++){
         n = a->attr[i].name;
         f = a->attr[i].form;
+        werrstr("struct: (@%x) n %x f %x (%d %d)\n", b->p - d->info.data, n, 
f, ptab[n].haveoff, ptab[n].off);
         if(n < 0 || n >= DwarfAttrMax || ptab[n].name==0) {
             if (skipform(d, b, f) < 0) {
                 if(++nbad == 1)
@@ -436,11 +450,12 @@
             got = TFlag;
         else if((ptab[n].type&TString) && getstring(d, b, f, v) >= 0)
             got = TString;
-        else if((ptab[n].type&TBlock) && getblock(b, f, v) >= 0)
+        else if((ptab[n].type&TBlock) && getblock(b, f, v) >= 0) {
             got = TBlock;
-        else {
+        } else {
+            werrstr("Skipping form %x\n", f);
             if(skipform(d, b, f) < 0){
-                if(++nbad == 1)
+                //if(++nbad == 1)
                     werrstr("dwarf parse attrs: cannot skip form %d", f);
                 return -1;
             }
@@ -451,6 +466,10 @@
 #endif
         *((uchar*)attrs+ptab[n].haveoff) = got;
     }
+
+    if (attrs->have.name)
+        werrstr("%s: tag %x kids %d (last %x)\n", attrs->name, attrs->tag, 
attrs->haskids, b->p - b->d->info.data);
+
     return 0;
 }
 
@@ -651,6 +670,7 @@
     int ret = 0;
     DwarfStack stack = { };
     stackinit(&stack);
+    stackpush(&stack, cfa);
     while (buf->p < buf->ep) {
         int opcode = dwarfget1(buf);
         werrstr("opcode %x", opcode);
@@ -951,6 +971,25 @@
     return 0;
 }
 
+void
+dwarfdumpsym(Dwarf *d, DwarfSym *s)
+{
+    int i, j;
+    werrstr("tag %x\n", s->attrs.tag);
+    for (j = 0; plist[j].name; j++) {
+        char *have = ((char*)&s->attrs) + plist[j].haveoff;
+        char *attr = ((char*)&s->attrs) + plist[j].off;
+        if (*have == TString) {
+            char *str = *((char **)attr);
+            werrstr("%s: %s\n", plist[j].namestr, str);
+        } else if (*have == TReference) {
+            DwarfVal *val = ((DwarfVal*)attr);
+            werrstr("%s: %x:%x\n", plist[j].namestr, val->b.data, val->b.len);
+        } else if (*have)
+            werrstr("%s: (%x)\n", plist[j].namestr, *have);
+    }
+}
+
 int
 dwarfgetparams(Dwarf *d, DwarfSym *s, ulong pc, int pnum, DwarfParam 
*paramblocks)
 {

Modified: trunk/reactos/lib/rossym_new/dwarfopen.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/dwarfopen.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/dwarfopen.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/dwarfopen.c [iso-8859-1] Fri Jul  8 11:16:26 
2011
@@ -30,10 +30,10 @@
        if(pe->loadsection(pe, ".debug_abbrev", &d->abbrev) < 0
        || pe->loadsection(pe, ".debug_aranges", &d->aranges) < 0
        || pe->loadsection(pe, ".debug_line", &d->line) < 0
-       || pe->loadsection(pe, ".debug_pubnames", &d->pubnames) < 0
        || pe->loadsection(pe, ".debug_info", &d->info) < 0
     || pe->loadsection(pe, ".debug_loc", &d->loc) < 0)
                goto err;
+       pe->loadsection(pe, ".debug_pubnames", &d->pubnames);
        pe->loadsection(pe, ".debug_frame", &d->frame);
        pe->loadsection(pe, ".debug_ranges", &d->ranges);
        pe->loadsection(pe, ".debug_str", &d->str);

Modified: trunk/reactos/lib/rossym_new/find.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/find.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/find.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/find.c [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -128,4 +128,136 @@
     return TRUE;
 }
 
+VOID
+RosSymFreeAggregate(PROSSYM_AGGREGATE Aggregate)
+{
+    int i;
+    for (i = 0; i < Aggregate->NumElements; i++) {
+        free(Aggregate->Elements[i].Name);
+        free(Aggregate->Elements[i].Type);
+    }
+    free(Aggregate->Elements);
+}
+
+BOOLEAN
+RosSymAggregate(PROSSYM_INFO RosSymInfo, PCHAR Type, PROSSYM_AGGREGATE 
Aggregate)
+{
+    char *tchar;
+    ulong unit, typeoff = 0;
+    DwarfSym type = { };
+    // Get the first unit
+    if (dwarfaddrtounit(RosSymInfo, RosSymInfo->pe->codestart + 
RosSymInfo->pe->imagebase, &unit) == -1)
+        return FALSE;
+
+    if (Type[0] == '#') {
+        for (tchar = Type + 1; *tchar; tchar++) {
+            typeoff *= 10;
+            typeoff += *tchar - '0';
+        }
+        if (dwarfseeksym(RosSymInfo, unit, typeoff, &type) == -1)
+            return FALSE;
+    } else if (dwarflookupnameinunit(RosSymInfo, unit, Type, &type) != 0 ||
+        (type.attrs.tag != TagStructType && type.attrs.tag != TagUnionType))
+        return FALSE;
+    
+    DwarfSym element = { }, inner = { };
+    int count = 0;
+    
+    werrstr("type %s (want %s) type %x\n", type.attrs.name, Type, 
type.attrs.type);
+    
+    if (type.attrs.have.type) {
+        if (dwarfseeksym(RosSymInfo, unit, type.attrs.type, &inner) == -1)
+            return FALSE;
+        type = inner;
+    }
+    
+    werrstr("finding members %d\n", type.attrs.haskids);
+    while (dwarfnextsymat(RosSymInfo, &type, &element) != -1) {
+        if (element.attrs.have.name)
+            werrstr("%x %s\n", element.attrs.tag, element.attrs.name);
+        if (element.attrs.tag == TagMember) count++;
+    }
+    
+    werrstr("%d members\n", count);
+    
+    if (!count) return FALSE;
+    memset(&element, 0, sizeof(element));
+    Aggregate->NumElements = count;
+    Aggregate->Elements = malloc(sizeof(ROSSYM_AGGREGATE_MEMBER) * count);
+    count = 0;
+    werrstr("Enumerating %s\n", Type);
+    while (dwarfnextsymat(RosSymInfo, &type, &element) != -1) {
+        memset(&Aggregate->Elements[count], 0, sizeof(*Aggregate->Elements));
+        if (element.attrs.tag == TagMember) {
+            if (element.attrs.have.name) {
+                Aggregate->Elements[count].Name = 
malloc(strlen(element.attrs.name) + 1);
+                strcpy(Aggregate->Elements[count].Name, element.attrs.name);
+            }
+            Aggregate->Elements[count].TypeId = element.attrs.type;
+            // Seek our range in loc
+            DwarfBuf locbuf;
+            DwarfBuf instream = { };
+            
+            locbuf.d = RosSymInfo;
+            locbuf.addrsize = RosSymInfo->addrsize;
+
+            if (element.attrs.have.datamemberloc) {
+                instream = locbuf;
+                instream.p = element.attrs.datamemberloc.b.data;
+                instream.ep = element.attrs.datamemberloc.b.data + 
element.attrs.datamemberloc.b.len;
+                werrstr("datamemberloc type %x %p:%x\n", 
+                        element.attrs.have.datamemberloc,
+                        element.attrs.datamemberloc.b.data, 
element.attrs.datamemberloc.b.len);
+            }
+
+            if (dwarfgetarg(RosSymInfo, element.attrs.name, &instream, 0, 
NULL, &Aggregate->Elements[count].BaseOffset) == -1)
+                Aggregate->Elements[count].BaseOffset = -1;
+            werrstr("tag %x name %s base %x type %x\n", 
+                    element.attrs.tag, element.attrs.name, 
+                    Aggregate->Elements[count].BaseOffset,
+                    Aggregate->Elements[count].TypeId);
+            count++;
+        }
+    }
+    for (count = 0; count < Aggregate->NumElements; count++) {
+        memset(&type, 0, sizeof(type));
+        memset(&inner, 0, sizeof(inner));
+        werrstr("seeking type %x (%s) from %s\n", 
+                Aggregate->Elements[count].TypeId,
+                Aggregate->Elements[count].Type,
+                Aggregate->Elements[count].Name);
+        dwarfseeksym(RosSymInfo, unit, Aggregate->Elements[count].TypeId, 
&type);
+        while (type.attrs.have.type && type.attrs.tag != TagPointerType) {
+            if (dwarfseeksym(RosSymInfo, unit, type.attrs.type, &inner) == -1)
+                return FALSE;
+            type = inner;
+        }
+        //dwarfdumpsym(RosSymInfo, &type);
+        if (type.attrs.have.name) {
+            Aggregate->Elements[count].Type = malloc(strlen(type.attrs.name) + 
1);
+            strcpy(Aggregate->Elements[count].Type, type.attrs.name);
+        } else {
+            char strbuf[128] = {'#'}, *bufptr = strbuf + 1;
+            ulong idcopy = Aggregate->Elements[count].TypeId;
+            ulong mult = 1;
+            while (mult * 10 < idcopy) mult *= 10;
+            while (mult > 0) {
+                *bufptr++ = '0' + ((idcopy / mult) % 10);
+                mult /= 10;
+            }
+            Aggregate->Elements[count].Type = malloc(strlen(strbuf) + 1);
+            strcpy(Aggregate->Elements[count].Type, strbuf);
+        }
+        if (type.attrs.tag == TagPointerType)
+            Aggregate->Elements[count].Size = RosSymInfo->addrsize;
+        else
+            Aggregate->Elements[count].Size = type.attrs.bytesize;
+        if (type.attrs.have.bitsize)
+            Aggregate->Elements[count].Bits = type.attrs.bitsize;
+        if (type.attrs.have.bitoffset)
+            Aggregate->Elements[count].FirstBit = type.attrs.bitoffset;
+    }
+    return TRUE;
+}
+
 /* EOF */

Modified: trunk/reactos/lib/rossym_new/fromfile.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/fromfile.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/fromfile.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/fromfile.c [iso-8859-1] Fri Jul  8 11:16:26 
2011
@@ -146,6 +146,8 @@
     pe->sect = SectionHeaders;
     pe->imagebase = pe->loadbase = NtHeaders.OptionalHeader.ImageBase;
     pe->imagesize = NtHeaders.OptionalHeader.SizeOfImage;
+    pe->codestart = NtHeaders.OptionalHeader.BaseOfCode;
+    pe->datastart = NtHeaders.OptionalHeader.BaseOfData;
     pe->loadsection = loaddisksection;
     *RosSymInfo = dwarfopen(pe);
 

Modified: trunk/reactos/lib/rossym_new/pe.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/pe.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/pe.c [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/pe.c [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -17,18 +17,18 @@
        int i;
        ANSI_STRING WantName;
        RtlInitAnsiString(&WantName, name);
-       DPRINT("Searching for section %s\n", name);
+       werrstr("Searching for section %s\n", name);
        for (i = 0; i < pe->nsections; i++) {
                PANSI_STRING AnsiString = ANSI_NAME_STRING(&pe->sect[i]);
                if (WantName.Length == AnsiString->Length &&
                        !memcmp(AnsiString->Buffer, name, WantName.Length)) {
-                       DPRINT("Found %s (%d) @ %x (%x)\n", name, i, 
+                       werrstr("Found %s (%d) @ %x (%x)\n", name, i, 
                                   
((PCHAR)pe->imagebase)+pe->sect[i].VirtualAddress,
                                   pe->sect[i].SizeOfRawData);
                        return &pe->sect[i];
                }
        }
-       DPRINT("%s not found\n", name);
+       werrstr("%s not found\n", name);
        return nil;
 }
 
@@ -84,11 +84,11 @@
 
        if((s = pesection(pe, name)) == nil)
                return -1;
-       DPRINT("Loading section %s (ImageBase %x RVA %x)\n", name, pe->fd, 
s->VirtualAddress);
+       werrstr("Loading section %s (ImageBase %x RVA %x)\n", name, pe->fd, 
s->VirtualAddress);
        b->data = RosSymAllocMem(s->SizeOfRawData);
        b->len = s->SizeOfRawData;
        PCHAR DataSource = ((char *)pe->fd) + s->VirtualAddress;
-       DPRINT("Copying to %x from %x (%x)\n", DataSource, b->data, b->len);
+       werrstr("Copying to %x from %x (%x)\n", DataSource, b->data, b->len);
        RtlCopyMemory(b->data, DataSource, s->SizeOfRawData);
        
        return s->SizeOfRawData;
@@ -121,16 +121,16 @@
 
 ulong pefindrva(struct _IMAGE_SECTION_HEADER *SectionHeaders, int 
NumberOfSections, ulong TargetPhysical) {
        int i;
-       DPRINT("Finding RVA for Physical %x\n", TargetPhysical);
+       werrstr("Finding RVA for Physical %x\n", TargetPhysical);
        for (i = 0; i < NumberOfSections; i++) {
-               DPRINT("Section %d name %s Raw %x Virt %x\n",
+               werrstr("Section %d name %s Raw %x Virt %x\n",
                           i, 
                           ANSI_NAME_STRING(&SectionHeaders[i])->Buffer, 
                           SectionHeaders[i].PointerToRawData,
                           SectionHeaders[i].VirtualAddress);
                if (TargetPhysical >= SectionHeaders[i].PointerToRawData && 
                        TargetPhysical < SectionHeaders[i].PointerToRawData + 
SectionHeaders[i].SizeOfRawData) {
-                       DPRINT("RVA %x\n", TargetPhysical - 
SectionHeaders[i].PointerToRawData + SectionHeaders[i].VirtualAddress);
+                       werrstr("RVA %x\n", TargetPhysical - 
SectionHeaders[i].PointerToRawData + SectionHeaders[i].VirtualAddress);
                        return TargetPhysical - 
SectionHeaders[i].PointerToRawData + SectionHeaders[i].VirtualAddress;
                }
        }

Modified: trunk/reactos/lib/rossym_new/pe.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/rossym_new/pe.h?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/lib/rossym_new/pe.h [iso-8859-1] (original)
+++ trunk/reactos/lib/rossym_new/pe.h [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -12,6 +12,7 @@
        u32int (*e4)(const unsigned char *data);
        u64int (*e8)(const unsigned char *data);
        ulong imagebase, imagesize, loadbase;
+    ulong codestart, datastart;
        int (*loadsection)(struct _Pe *pe, char *name, struct DwarfBlock *b);
        int nsections;
        struct _IMAGE_SECTION_HEADER *sect;

Modified: trunk/reactos/ntoskrnl/kdbg/kdb_cli.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb_cli.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb_cli.c [iso-8859-1] Fri Jul  8 11:16:26 2011
@@ -90,6 +90,10 @@
 static BOOLEAN KdbpCmdHelp(ULONG Argc, PCHAR Argv[]);
 static BOOLEAN KdbpCmdDmesg(ULONG Argc, PCHAR Argv[]);
 
+#ifdef __ROS_CMAKE__
+static BOOLEAN KdbpCmdPrintStruct(ULONG Argc, PCHAR Argv[]);
+#endif
+
 /* GLOBALS *******************************************************************/
 
 static BOOLEAN KdbUseIntelSyntax = FALSE; /* Set to TRUE for intel syntax */
@@ -135,6 +139,9 @@
     { "sregs", "sregs", "Display status registers.", KdbpCmdRegs },
     { "dregs", "dregs", "Display debug registers.", KdbpCmdRegs },
     { "bt", "bt [*frameaddr|thread id]", "Prints current backtrace or from 
given frame addr", KdbpCmdBackTrace },
+#ifdef __ROS_CMAKE__
+    { "dt", "dt [mod] [type] [addr]", "Print a struct.  Addr is optional.", 
KdbpCmdPrintStruct },
+#endif
 
     /* Flow control */
     { NULL, NULL, "Flow control", NULL },
@@ -453,6 +460,142 @@
     return TRUE;
 }
 
+#ifdef __ROS_CMAKE__
+
+/*!\brief Print a struct
+ */
+static VOID
+KdbpPrintStructInternal
+(PROSSYM_INFO Info, 
+ PCHAR Indent, 
+ BOOLEAN DoRead, 
+ PVOID BaseAddress, 
+ PROSSYM_AGGREGATE Aggregate)
+{
+    ULONG i;
+    ULONGLONG Result;
+    PROSSYM_AGGREGATE_MEMBER Member;
+    ULONG IndentLen = strlen(Indent);
+    ROSSYM_AGGREGATE MemberAggregate = { };
+
+    for (i = 0; i < Aggregate->NumElements; i++) {
+        Member = &Aggregate->Elements[i];
+        KdbpPrint("%s%p+%x: %s", Indent, ((PCHAR)BaseAddress) + 
Member->BaseOffset, Member->Size, Member->Name ? Member->Name : "<anoymous>");
+        if (DoRead) {
+            if (!strcmp(Member->Type, "_UNICODE_STRING")) {
+                KdbpPrint("\"%wZ\"\n", ((PCHAR)BaseAddress) + 
Member->BaseOffset);
+                continue;
+            } else if (!strcmp(Member->Type, "PUNICODE_STRING")) {
+                KdbpPrint("\"%wZ\"\n", 
*(((PUNICODE_STRING*)((PCHAR)BaseAddress) + Member->BaseOffset)));
+                continue;
+            }
+            switch (Member->Size) {
+            case 1:
+            case 2:
+            case 4:
+            case 8: {
+                Result = 0;
+                if (NT_SUCCESS(KdbpSafeReadMemory(&Result, 
((PCHAR)BaseAddress) + Member->BaseOffset, Member->Size))) {
+                    if (Member->Bits) {
+                        Result >>= Member->FirstBit;
+                        Result &= ((1 << Member->Bits) - 1);
+                    }
+                    KdbpPrint(" %lx\n", Result);
+                }
+                else goto readfail;
+                break;
+            }
+            default: {
+                if (Member->Size < 8) {
+                    if (NT_SUCCESS(KdbpSafeReadMemory(&Result, 
((PCHAR)BaseAddress) + Member->BaseOffset, Member->Size))) {
+                        int j;
+                        for (j = 0; j < Member->Size; j++) {
+                            KdbpPrint(" %02x", (int)(Result & 0xff));
+                            Result >>= 8;
+                        }
+                    } else goto readfail;
+                } else {
+                    KdbpPrint(" %s @ %p {\n", Member->Type, 
((PCHAR)BaseAddress) + Member->BaseOffset);
+                    Indent[IndentLen] = ' ';
+                    if (RosSymAggregate(Info, Member->Type, &MemberAggregate)) 
{
+                        KdbpPrintStructInternal(Info, Indent, DoRead, 
((PCHAR)BaseAddress) + Member->BaseOffset, &MemberAggregate);
+                        RosSymFreeAggregate(&MemberAggregate);
+                    }
+                    Indent[IndentLen] = 0;
+                    KdbpPrint("%s}\n", Indent);
+                } break;
+            }
+            }
+        } else {
+        readfail:
+            if (Member->Size <= 8) {
+                KdbpPrint(" ??\n");
+            } else {
+                KdbpPrint(" %s @ %x {\n", Member->Type, Member->BaseOffset);
+                Indent[IndentLen] = ' ';
+                if (RosSymAggregate(Info, Member->Type, &MemberAggregate)) {
+                    KdbpPrintStructInternal(Info, Indent, DoRead, BaseAddress, 
&MemberAggregate);
+                    RosSymFreeAggregate(&MemberAggregate);
+                }
+                Indent[IndentLen] = 0;
+                KdbpPrint("%s}\n", Indent);
+            }
+        }
+    }
+}
+
+PROSSYM_INFO KdbpSymFindCachedFile(PUNICODE_STRING ModName);
+
+static BOOLEAN
+KdbpCmdPrintStruct(
+    ULONG Argc,
+    PCHAR Argv[])
+{
+    int i;
+    ULONGLONG Result = 0;
+    PVOID BaseAddress = 0;
+    ROSSYM_AGGREGATE Aggregate = { };
+    UNICODE_STRING ModName = { };
+    ANSI_STRING AnsiName = { };
+    CHAR Indent[100] = { };
+    if (Argc < 3) goto end;
+    AnsiName.Length = AnsiName.MaximumLength = strlen(Argv[1]);
+    AnsiName.Buffer = Argv[1];
+    RtlAnsiStringToUnicodeString(&ModName, &AnsiName, TRUE);
+    PROSSYM_INFO Info = KdbpSymFindCachedFile(&ModName);
+
+    if (!Info || !RosSymAggregate(Info, Argv[2], &Aggregate)) {
+        DPRINT1("Could not get aggregate\n");
+        goto end;
+    }
+    
+    // Get an argument for location if it was given
+    if (Argc > 3) {
+        ULONG len;
+        PCHAR ArgStart = Argv[3];
+        DPRINT1("Trying to get expression\n");
+        for (i = 3; i < Argc - 1; i++)
+        {
+            len = strlen(Argv[i]);
+            Argv[i][len] = ' ';
+        }
+        
+        /* Evaluate the expression */
+        DPRINT1("Arg: %s\n", ArgStart);
+        if (KdbpEvaluateExpression(ArgStart, strlen(ArgStart), &Result)) {
+            BaseAddress = (PVOID)(ULONG_PTR)Result;
+            DPRINT1("BaseAddress: %p\n", BaseAddress);
+        }
+    }
+    DPRINT1("BaseAddress %p\n", BaseAddress);
+    KdbpPrintStructInternal(Info, Indent, !!BaseAddress, BaseAddress, 
&Aggregate);
+end:
+    RosSymFreeAggregate(&Aggregate);
+    RtlFreeUnicodeString(&ModName);
+    return TRUE;
+}
+#endif
+
 /*!\brief Display list of active debug channels
  */
 static BOOLEAN

Modified: trunk/reactos/ntoskrnl/kdbg/kdb_symbols.cmake.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/kdbg/kdb_symbols.cmake.c?rev=52571&r1=52570&r2=52571&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/kdbg/kdb_symbols.cmake.c [iso-8859-1] (original)
+++ trunk/reactos/ntoskrnl/kdbg/kdb_symbols.cmake.c [iso-8859-1] Fri Jul  8 
11:16:26 2011
@@ -359,7 +359,7 @@
  *
  * \sa KdbpSymAddCachedFile
  */
-static PROSSYM_INFO
+PROSSYM_INFO
 KdbpSymFindCachedFile(
     IN PUNICODE_STRING FileName)
 {
@@ -405,7 +405,7 @@
 {
     PIMAGE_SYMBOL_INFO_CACHE CacheEntry;
 
-    DPRINT("Adding symbol file: RosSymInfo = %p\n", RosSymInfo);
+    DPRINT("Adding symbol file: %wZ RosSymInfo = %p\n", FileName, RosSymInfo);
 
     /* allocate entry */
     CacheEntry = ExAllocatePoolWithTag(NonPagedPool, sizeof 
(IMAGE_SYMBOL_INFO_CACHE), TAG_KDBS);
@@ -416,6 +416,7 @@
     CacheEntry->FileName.Buffer = ExAllocatePoolWithTag(NonPagedPool,
                                                         FileName->Length,
                                                         TAG_KDBS);
+    CacheEntry->FileName.MaximumLength = FileName->Length;
     RtlCopyUnicodeString(&CacheEntry->FileName, FileName);
     ASSERT(CacheEntry->FileName.Buffer);
     CacheEntry->RefCount = 1;
@@ -476,7 +477,7 @@
  *
  * \sa KdbpSymUnloadModuleSymbols
  */
-static VOID
+VOID
 KdbpSymLoadModuleSymbols(
     IN PUNICODE_STRING FileName,
     OUT PROSSYM_INFO *RosSymInfo)
@@ -508,7 +509,7 @@
     /*  Open the file  */
     InitializeObjectAttributes(&ObjectAttributes,
                                FileName,
-                               OBJ_CASE_INSENSITIVE,
+                               OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE,
                                NULL,
                                NULL);
 
@@ -519,10 +520,10 @@
                         &ObjectAttributes,
                         &IoStatusBlock,
                         FILE_SHARE_READ|FILE_SHARE_WRITE,
-                        FILE_SYNCHRONOUS_IO_NONALERT);
+                        FILE_NON_DIRECTORY_FILE|FILE_SYNCHRONOUS_IO_NONALERT);
     if (!NT_SUCCESS(Status))
     {
-        DPRINT("Could not open image file: %wZ\n", FileName);
+        DPRINT("Could not open image file(%x): %wZ\n", Status, FileName);
         return;
     }
 
@@ -548,8 +549,17 @@
         if (RosSymCreateFromFile(FileContext, RosSymInfo))
         {
             /* add file to cache */
-            KdbpSymAddCachedFile(FileName, *RosSymInfo);
-            DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo);
+            int i;
+            UNICODE_STRING TruncatedName = *FileName;
+            for (i = (TruncatedName.Length / sizeof(WCHAR)) - 1; i >= 0; i--)
+                if (TruncatedName.Buffer[i] == '\\') {
+                    TruncatedName.Buffer += i+1;
+                    TruncatedName.Length -= (i+1)*sizeof(WCHAR);
+                    TruncatedName.MaximumLength -= (i+1)*sizeof(WCHAR);
+                    break;
+                }
+            KdbpSymAddCachedFile(&TruncatedName, *RosSymInfo);
+            DPRINT("Installed symbols: %wZ %p\n", &TruncatedName, *RosSymInfo);
         }
         KdbpReleaseFileForSymbols(FileContext);
     }
@@ -569,12 +579,44 @@
     }
 
     /* Remove symbol info if it already exists */
-    if (LdrEntry->PatchInformation)
+    if (LdrEntry->PatchInformation) {
         KdbpSymRemoveCachedFile(LdrEntry->PatchInformation);
+    }
 
        /* Error loading symbol info, try to load it from file */
        KdbpSymLoadModuleSymbols(&LdrEntry->FullDllName,
             (PROSSYM_INFO*)&LdrEntry->PatchInformation);
+
+    if (!LdrEntry->PatchInformation) {
+        // HACK: module dll names don't identify the real files
+        UNICODE_STRING SystemRoot;
+        UNICODE_STRING ModuleNameCopy;
+        RtlInitUnicodeString(&SystemRoot, 
L"\\SystemRoot\\system32\\Drivers\\");
+        ModuleNameCopy.Length = 0;
+        ModuleNameCopy.MaximumLength = 
+            LdrEntry->BaseDllName.MaximumLength + SystemRoot.MaximumLength;
+        ModuleNameCopy.Buffer = ExAllocatePool(NonPagedPool, 
SystemRoot.MaximumLength + LdrEntry->BaseDllName.MaximumLength);
+        RtlCopyUnicodeString(&ModuleNameCopy, &SystemRoot);
+        RtlCopyMemory
+            (ModuleNameCopy.Buffer + ModuleNameCopy.Length / sizeof(WCHAR),
+             LdrEntry->BaseDllName.Buffer,
+             LdrEntry->BaseDllName.Length);
+        ModuleNameCopy.Length += LdrEntry->BaseDllName.Length;
+        KdbpSymLoadModuleSymbols(&ModuleNameCopy,
+                                 (PROSSYM_INFO*)&LdrEntry->PatchInformation);
+        if (!LdrEntry->PatchInformation) {
+            SystemRoot.Length -= strlen("Drivers\\") * sizeof(WCHAR);
+            RtlCopyUnicodeString(&ModuleNameCopy, &SystemRoot);
+            RtlCopyMemory
+                (ModuleNameCopy.Buffer + ModuleNameCopy.Length / sizeof(WCHAR),
+                 LdrEntry->BaseDllName.Buffer,
+                 LdrEntry->BaseDllName.Length);
+            ModuleNameCopy.Length += LdrEntry->BaseDllName.Length;
+            KdbpSymLoadModuleSymbols(&ModuleNameCopy,
+                                     
(PROSSYM_INFO*)&LdrEntry->PatchInformation);
+        }
+        RtlFreeUnicodeString(&ModuleNameCopy);
+    }
 
        /* It already added symbols to cache */
     DPRINT("Installed symbols: %wZ@%p-%p %p\n",


Reply via email to