/// <summary> /// 得到权限数的数据 /// </summary> /// <returns></returns> public DataTable GetAuthorityTree() { RelaTable tab1 = new RelaTable("JAuthority"); tab1.InnerJoin("Jmodel", "JAuthority.modelid=jmodel.modelid"); tab1.InnerJoin("JAuthorityDetail", "JAuthorityDetail.AuthorityID=JAuthority.AuthorityID"); JQuery querey1 = new JQuery(tab1); querey1.OrderBy = "Jmodel.num,JAuthority.num,JAuthorityDetail.num"; String fields = "Jmodel.modelid,jmodel.modelname,JAuthority.authorityid,JAuthority.authorityName,JAuthorityDetail.remark,JAuthorityDetail.AuthorityUnitID"; DataTable dt1 = querey1.SearchData(fields, -1).Tables[0]; return(dt1); }
/// <summary> /// 根据组织的ID,得到其正常的用户Table /// </summary> /// <param name="orgid"></param> /// <returns></returns> public DataTable GetOrgUserID(String orgid) { DataTable dt1 = null; if (String.IsNullOrEmpty(orgid) == false) { List <SearchField> condition = new List <SearchField>(); condition.Add(new SearchField("JOrgUsers.orgid", orgid)); condition.Add(new SearchField("Juser.status", "1")); RelaTable r1 = new RelaTable("JOrgUsers"); r1.InnerJoin("JUser", "JOrgUsers.userid=Juser.userid"); JTable tab1 = new JTable(r1.TableName); dt1 = tab1.SearchData(condition, -1, "JOrgUsers.*,Juser.UserName").Tables[0]; } return(dt1); }
/// <summary> /// Relocates all relocations found in the DT_DYNAMIC segment. /// </summary> /// <param name="program"></param> /// <returns></returns> public List <ElfSymbol> RelocateDynamicSymbols(Program program) { var symbols = new List <ElfSymbol>(); foreach (var dynSeg in EnumerateDynamicSegments()) { DumpDynamicSegment(dynSeg); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_STRTAB, out var strtab); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_SYMTAB, out var symtab); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_RELA, out var rela); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_RELASZ, out var relasz); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_RELAENT, out var relaent); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_REL, out var rel); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_RELSZ, out var relsz); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_RELENT, out var relent); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_SYMENT, out var syment); if (symtab == null || (rela == null && rel == null)) { continue; } if (strtab == null) { throw new BadImageFormatException("ELF dynamic segment lacks a string table."); } if (syment == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of symbol table entries."); } RelocationTable relTable; if (rela != null) { if (relasz == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of the relocation table."); } if (relaent == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of relocation table entries."); } relTable = new RelaTable(this, rela.UValue, relasz.UValue); } else { Debug.Assert(rel != null); if (relsz == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of the relocation table."); } if (relent == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of relocation table entries."); } relTable = new RelTable(this, rel.UValue, relsz.UValue); } var offStrtab = Loader.AddressToFileOffset(strtab.UValue); var offSymtab = Loader.AddressToFileOffset(symtab.UValue); LoadSymbolsFromDynamicSegment(dynSeg, symtab, syment, offStrtab, offSymtab); // Generate a symbol for each relocation. ElfImageLoader.trace.Inform("Relocating entries in .dynamic:"); foreach (var(_, elfSym, _) in relTable.RelocateEntries(program, offStrtab, offSymtab, syment.UValue)) { symbols.Add(elfSym); var imgSym = Loader.CreateImageSymbol(elfSym, true); // Symbols need to refer to the loaded image, if their value is 0, // they are imported symbols. if (imgSym == null || imgSym.Address.ToLinear() == 0) { continue; } imageSymbols[imgSym.Address] = imgSym; } // Relocate the DT_JMPREL table. Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_JMPREL, out var jmprel); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_PLTRELSZ, out var pltrelsz); Loader.DynamicEntries.TryGetValue(ElfDynamicEntry.DT_PLTREL, out var pltrel); if (jmprel != null && pltrelsz != null && pltrel != null) { if (pltrel.SValue == ElfDynamicEntry.DT_RELA) // entries are in RELA format. { relTable = new RelaTable(this, jmprel.UValue, pltrelsz.UValue); } else if (pltrel.SValue == ElfDynamicEntry.DT_REL) // entries are in REL format { relTable = new RelTable(this, jmprel.UValue, pltrelsz.UValue); } else { //$REVIEW: bad elf format! continue; } ElfImageLoader.trace.Inform("Relocating entries in DT_JMPREL:"); foreach (var(addrImport, elfSym, extraSym) in relTable.RelocateEntries(program, offStrtab, offSymtab, syment.UValue)) { symbols.Add(elfSym); var imgSym = Loader.CreateImageSymbol(elfSym, true); if (imgSym != null && imgSym.Address.ToLinear() != 0) { imageSymbols[imgSym.Address] = imgSym; } if (extraSym != null) { symbols.Add(extraSym); var extraImgSym = Loader.CreateImageSymbol(extraSym, true); imageSymbols[extraImgSym.Address] = extraImgSym; } if (elfSym.SectionIndex == ElfSection.SHN_UNDEF) { program.ImportReferences[addrImport] = new NamedImportReference( addrImport, null, // ELF imports don't specify which module to take the import from imgSym.Name, imgSym.Type); } } } } return(symbols); }
/// <summary> /// Relocates all relocations found in the DT_DYNAMIC segment. /// </summary> /// <param name="program"></param> /// <returns></returns> public List <ElfSymbol> RelocateDynamicSymbols(Program program) { var symbols = new List <ElfSymbol>(); foreach (var dynSeg in EnumerateDynamicSegments()) { DumpDynamicSegment(dynSeg); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_STRTAB, out var strtab); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_SYMTAB, out var symtab); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_RELA, out var rela); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_RELASZ, out var relasz); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_RELAENT, out var relaent); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_REL, out var rel); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_RELSZ, out var relsz); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_RELENT, out var relent); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_SYMENT, out var syment); if (symtab == null || (rela == null && rel == null)) { continue; } if (strtab == null) { throw new BadImageFormatException("ELF dynamic segment lacks a string table."); } if (syment == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of symbol table entries."); } RelocationTable relTable; if (rela != null) { if (relasz == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of the relocation table."); } if (relaent == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of relocation table entries."); } relTable = new RelaTable(this, rela.UValue, relasz.UValue); } else { Debug.Assert(rel != null); if (relsz == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of the relocation table."); } if (relent == null) { throw new BadImageFormatException("ELF dynamic segment lacks the size of relocation table entries."); } relTable = new RelTable(this, rel.UValue, relsz.UValue); } var offStrtab = Loader.AddressToFileOffset(strtab.UValue); var offSymtab = Loader.AddressToFileOffset(symtab.UValue); LoadSymbolsFromDynamicSegment(dynSeg, symtab, syment, offStrtab, offSymtab); // Generate a symbol for each relocation. foreach (var elfSym in relTable.RelocateEntries(program, offStrtab, offSymtab, syment.UValue)) { symbols.Add(elfSym); var imgSym = Loader.CreateImageSymbol(elfSym, true); if (imgSym == null || imgSym.Address.ToLinear() == 0) { continue; } imageSymbols[imgSym.Address] = imgSym; } // Relocate the DT_JMPREL table. Loader.DynamicEntries.TryGetValue(ElfLoader.DT_JMPREL, out var jmprel); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_PLTRELSZ, out var pltrelsz); Loader.DynamicEntries.TryGetValue(ElfLoader.DT_PLTREL, out var pltrel); if (jmprel != null && pltrelsz != null && pltrel != null) { if (pltrel.SValue == 7) // entries are in RELA format. { relTable = new RelaTable(this, jmprel.UValue, pltrelsz.UValue); } else if (pltrel.SValue == 0x11) // entries are in REL format { relTable = new RelTable(this, jmprel.UValue, pltrelsz.UValue); } else { //$REVIEW: bad elf format! continue; } foreach (var elfSym in relTable.RelocateEntries(program, offStrtab, offSymtab, syment.UValue)) { symbols.Add(elfSym); var imgSym = Loader.CreateImageSymbol(elfSym, true); if (imgSym == null || imgSym.Address.ToLinear() == 0) { continue; } imageSymbols[imgSym.Address] = imgSym; program.ImportReferences[imgSym.Address] = new NamedImportReference( imgSym.Address, null, // ELF imports don't specify which modile to take the import from imgSym.Name); } } } return(symbols); }