Пример #1
0
		/// <inheritdoc/>
		public override RidList GetPropertyRidList(uint propertyMapRid) {
			var list = GetRidList(tablesStream.PropertyMapTable, propertyMapRid, 1, tablesStream.PropertyTable);
			if (list.Length == 0 || (!hasPropertyPtr && !hasDeletedRows))
				return list;

			var destTable = tablesStream.PropertyTable;
			var newList = new RandomRidList((int)list.Length);
			for (uint i = 0; i < list.Length; i++) {
				var rid = ToPropertyRid(list[i]);
				if (destTable.IsInvalidRID(rid))
					continue;
				if (hasDeletedRows) {
					// It's a deleted row if RTSpecialName is set and name is "_Deleted"
					var row = tablesStream.ReadPropertyRow(rid);
					if (row == null)
						continue;	// Should never happen since rid is valid
					if ((row.PropFlags & (uint)PropertyAttributes.RTSpecialName) != 0) {
						if (stringsStream.ReadNoNull(row.Name) == DeletedName)
							continue;	// ignore this deleted row
					}
				}
				// It's a valid non-deleted rid so add it
				newList.Add(rid);
			}
			return newList;
		}
Пример #2
0
            /// <summary>
            /// Find all rids that contain <paramref name="key"/>
            /// </summary>
            /// <param name="key">The key</param>
            /// <returns>A new <see cref="RidList"/> instance</returns>
            public RidList FindAllRows(uint key)
            {
                int startIndex = BinarySearch(key);

                if (startIndex == 0)
                {
                    return(RidList.Empty);
                }
                int endIndex = startIndex + 1;

                for (; startIndex > 1; startIndex--)
                {
                    if (key != rows[startIndex - 1].key)
                    {
                        break;
                    }
                }
                for (; endIndex < rows.Length; endIndex++)
                {
                    if (key != rows[endIndex].key)
                    {
                        break;
                    }
                }
                var list = new RandomRidList(endIndex - startIndex);

                for (int i = startIndex; i < endIndex; i++)
                {
                    list.Add(rows[i].rid);
                }
                return(list);
            }
Пример #3
0
        /// <inheritdoc/>
        public override RidList GetExportedTypeRidList()
        {
            if (!hasDeletedRows)
            {
                return(base.GetExportedTypeRidList());
            }
            uint rows = tablesStream.ExportedTypeTable.Rows;
            var  list = new RandomRidList((int)rows);

            for (uint rid = 1; rid <= rows; rid++)
            {
                var row = tablesStream.ReadExportedTypeRow(rid);
                if (row == null)
                {
                    continue;                           // Should never happen since rid is valid
                }
                // RTSpecialName is ignored by the CLR. It's only the name that indicates
                // whether it's been deleted.
                if (stringsStream.ReadNoNull(row.TypeName) == DeletedName)
                {
                    continue;                           // ignore this deleted row
                }
                list.Add(rid);
            }
            return(list);
        }
Пример #4
0
		/// <inheritdoc/>
		public override RidList GetParamRidList(uint methodRid) {
			var list = GetRidList(tablesStream.MethodTable, methodRid, 5, tablesStream.ParamTable);
			if (list.Length == 0 || !hasParamPtr)
				return list;

			var destTable = tablesStream.ParamTable;
			var newList = new RandomRidList((int)list.Length);
			for (uint i = 0; i < list.Length; i++) {
				var rid = ToParamRid(list[i]);
				if (destTable.IsInvalidRID(rid))
					continue;
				newList.Add(rid);
			}
			return newList;
		}
Пример #5
0
			/// <summary>
			/// Find all rids that contain <paramref name="key"/>
			/// </summary>
			/// <param name="key">The key</param>
			/// <returns>A new <see cref="RidList"/> instance</returns>
			public RidList FindAllRows(uint key) {
				int startIndex = BinarySearch(key);
				if (startIndex == 0)
					return ContiguousRidList.Empty;
				int endIndex = startIndex + 1;
				for (; startIndex > 1; startIndex--) {
					if (key != rows[startIndex - 1].key)
						break;
				}
				for (; endIndex < rows.Length; endIndex++) {
					if (key != rows[endIndex].key)
						break;
				}
				var list = new RandomRidList(endIndex - startIndex);
				for (int i = startIndex; i < endIndex; i++)
					list.Add(rows[i].rid);
				return list;
			}
Пример #6
0
        /// <inheritdoc/>
        public override RidList GetEventRidList(uint eventMapRid)
        {
            var list = GetRidList(tablesStream.EventMapTable, eventMapRid, 1, tablesStream.EventTable);

            if (list.Length == 0 || (!hasEventPtr && !hasDeletedRows))
            {
                return(list);
            }

            var destTable = tablesStream.EventTable;
            var newList   = new RandomRidList((int)list.Length);

            for (uint i = 0; i < list.Length; i++)
            {
                var rid = ToEventRid(list[i]);
                if (destTable.IsInvalidRID(rid))
                {
                    continue;
                }
                if (hasDeletedRows)
                {
                    // It's a deleted row if RTSpecialName is set and name is "_Deleted"
                    var row = tablesStream.ReadEventRow(rid);
                    if (row == null)
                    {
                        continue;                               // Should never happen since rid is valid
                    }
                    if ((row.EventFlags & (uint)EventAttributes.RTSpecialName) != 0)
                    {
                        if (stringsStream.ReadNoNull(row.Name) == DeletedName)
                        {
                            continue;                                   // ignore this deleted row
                        }
                    }
                }
                // It's a valid non-deleted rid so add it
                newList.Add(rid);
            }
            return(newList);
        }
Пример #7
0
        /// <inheritdoc/>
        public override RidList GetMethodRidList(uint typeDefRid)
        {
            var list = GetRidList(tablesStream.TypeDefTable, typeDefRid, 5, tablesStream.MethodTable);

            if (list.Length == 0 || (!hasMethodPtr && !hasDeletedRows))
            {
                return(list);
            }

            var destTable = tablesStream.MethodTable;
            var newList   = new RandomRidList((int)list.Length);

            for (uint i = 0; i < list.Length; i++)
            {
                var rid = ToMethodRid(list[i]);
                if (destTable.IsInvalidRID(rid))
                {
                    continue;
                }
                if (hasDeletedRows)
                {
                    // It's a deleted row if RTSpecialName is set and name is "_Deleted"
                    var row = tablesStream.ReadMethodRow(rid);
                    if (row == null)
                    {
                        continue;   // Should never happen since rid is valid
                    }
                    if ((row.Flags & (uint)MethodAttributes.RTSpecialName) != 0)
                    {
                        if (stringsStream.ReadNoNull(row.Name).StartsWith(DeletedName))
                        {
                            continue;   // ignore this deleted row
                        }
                    }
                }
                // It's a valid non-deleted rid so add it
                newList.Add(rid);
            }
            return(newList);
        }
Пример #8
0
        void InitializeNestedClassesDictionary()
        {
            var table     = tablesStream.NestedClassTable;
            var destTable = tablesStream.TypeDefTable;

            Dictionary <uint, bool> validTypeDefRids = null;
            var typeDefRidList = GetTypeDefRidList();

            if (typeDefRidList.Length != destTable.Rows)
            {
                validTypeDefRids = new Dictionary <uint, bool>((int)typeDefRidList.Length);
                for (uint i = 0; i < typeDefRidList.Length; i++)
                {
                    validTypeDefRids[typeDefRidList[i]] = true;
                }
            }

            var nestedRidsDict = new Dictionary <uint, bool>((int)table.Rows);
            var nestedRids     = new List <uint>((int)table.Rows);              // Need it so we add the rids in correct order

            for (uint rid = 1; rid <= table.Rows; rid++)
            {
                if (validTypeDefRids != null && !validTypeDefRids.ContainsKey(rid))
                {
                    continue;
                }
                var row = tablesStream.ReadNestedClassRow(rid);
                if (row == null)
                {
                    continue;                           // Should never happen since rid is valid
                }
                if (!destTable.IsValidRID(row.NestedClass) || !destTable.IsValidRID(row.EnclosingClass))
                {
                    continue;
                }
                if (nestedRidsDict.ContainsKey(row.NestedClass))
                {
                    continue;
                }
                nestedRidsDict[row.NestedClass] = true;
                nestedRids.Add(row.NestedClass);
            }

            var newTypeDefRidToNestedClasses = new Dictionary <uint, RandomRidList>();

            foreach (var nestedRid in nestedRids)
            {
                var row = tablesStream.ReadNestedClassRow(GetNestedClassRid(nestedRid));
                if (row == null)
                {
                    continue;
                }
                RandomRidList ridList;
                if (!newTypeDefRidToNestedClasses.TryGetValue(row.EnclosingClass, out ridList))
                {
                    newTypeDefRidToNestedClasses[row.EnclosingClass] = ridList = new RandomRidList();
                }
                ridList.Add(nestedRid);
            }

            var newNonNestedTypes = new RandomRidList((int)(destTable.Rows - nestedRidsDict.Count));

            for (uint rid = 1; rid <= destTable.Rows; rid++)
            {
                if (validTypeDefRids != null && !validTypeDefRids.ContainsKey(rid))
                {
                    continue;
                }
                if (nestedRidsDict.ContainsKey(rid))
                {
                    continue;
                }
                newNonNestedTypes.Add(rid);
            }

            Interlocked.CompareExchange(ref nonNestedTypes, newNonNestedTypes, null);

            // Initialize this one last since it's tested by the callers of this method
            Interlocked.CompareExchange(ref typeDefRidToNestedClasses, newTypeDefRidToNestedClasses, null);
        }
Пример #9
0
        void InitializeModuleList()
        {
            if (moduleRidList != null)
                return;
            uint rows = TablesStream.FileTable.Rows;
            var newModuleRidList = new RandomRidList((int)rows);

            var baseDir = GetBaseDirectoryOfImage();
            for (uint fileRid = 1; fileRid <= rows; fileRid++) {
                var fileDef = ResolveFile(fileRid);
                if (fileDef == null)
                    continue;	// Should never happen
                if (!fileDef.ContainsMetaData)
                    continue;
                var pathName = GetValidFilename(baseDir, UTF8String.ToSystemString(fileDef.Name));
                if (pathName != null)
                    newModuleRidList.Add(fileRid);
            }
            Interlocked.CompareExchange(ref moduleRidList, newModuleRidList, null);
        }
Пример #10
0
        void InitializeNestedClassesDictionary()
        {
            var table = tablesStream.NestedClassTable;
            var destTable = tablesStream.TypeDefTable;

            Dictionary<uint, bool> validTypeDefRids = null;
            var typeDefRidList = GetTypeDefRidList();
            if (typeDefRidList.Length != destTable.Rows) {
                validTypeDefRids = new Dictionary<uint, bool>((int)typeDefRidList.Length);
                for (uint i = 0; i < typeDefRidList.Length; i++)
                    validTypeDefRids[typeDefRidList[i]] = true;
            }

            var nestedRidsDict = new Dictionary<uint, bool>((int)table.Rows);
            var nestedRids = new List<uint>((int)table.Rows);	// Need it so we add the rids in correct order
            for (uint rid = 1; rid <= table.Rows; rid++) {
                if (validTypeDefRids != null && !validTypeDefRids.ContainsKey(rid))
                    continue;
                var row = tablesStream.ReadNestedClassRow(rid);
                if (row == null)
                    continue;	// Should never happen since rid is valid
                if (!destTable.IsValidRID(row.NestedClass) || !destTable.IsValidRID(row.EnclosingClass))
                    continue;
                if (nestedRidsDict.ContainsKey(row.NestedClass))
                    continue;
                nestedRidsDict[row.NestedClass] = true;
                nestedRids.Add(row.NestedClass);
            }

            var newTypeDefRidToNestedClasses = new Dictionary<uint, RandomRidList>();
            foreach (var nestedRid in nestedRids) {
                var row = tablesStream.ReadNestedClassRow(GetNestedClassRid(nestedRid));
                if (row == null)
                    continue;
                RandomRidList ridList;
                if (!newTypeDefRidToNestedClasses.TryGetValue(row.EnclosingClass, out ridList))
                    newTypeDefRidToNestedClasses[row.EnclosingClass] = ridList = new RandomRidList();
                ridList.Add(nestedRid);
            }

            var newNonNestedTypes = new RandomRidList((int)(destTable.Rows - nestedRidsDict.Count));
            for (uint rid = 1; rid <= destTable.Rows; rid++) {
                if (validTypeDefRids != null && !validTypeDefRids.ContainsKey(rid))
                    continue;
                if (nestedRidsDict.ContainsKey(rid))
                    continue;
                newNonNestedTypes.Add(rid);
            }

            Interlocked.CompareExchange(ref nonNestedTypes, newNonNestedTypes, null);

            // Initialize this one last since it's tested by the callers of this method
            Interlocked.CompareExchange(ref typeDefRidToNestedClasses, newTypeDefRidToNestedClasses, null);
        }
Пример #11
0
		/// <inheritdoc/>
		public override RidList GetPropertyRidList(uint propertyMapRid) {
			var list = GetRidList(tablesStream.PropertyMapTable, propertyMapRid, 1, tablesStream.PropertyTable);
			if (list.Length == 0 || (!hasPropertyPtr && !hasDeletedRows))
				return list;

			var destTable = tablesStream.PropertyTable;
			var newList = new RandomRidList((int)list.Length);
			for (uint i = 0; i < list.Length; i++) {
				var rid = ToPropertyRid(list[i]);
				if (destTable.IsInvalidRID(rid))
					continue;
				if (hasDeletedRows) {
					// It's a deleted row if RTSpecialName is set and name is "_Deleted"
					var row = tablesStream.ReadPropertyRow(rid);
					if (row == null)
						continue;	// Should never happen since rid is valid
					if ((row.PropFlags & (uint)PropertyAttributes.RTSpecialName) != 0) {
						if (stringsStream.ReadNoNull(row.Name).StartsWith(DeletedName))
							continue;	// ignore this deleted row
					}
				}
				// It's a valid non-deleted rid so add it
				newList.Add(rid);
			}
			return newList;
		}
Пример #12
0
		/// <inheritdoc/>
		public override RidList GetParamRidList(uint methodRid) {
			var list = GetRidList(tablesStream.MethodTable, methodRid, 5, tablesStream.ParamTable);
			if (list.Length == 0 || !hasParamPtr)
				return list;

			var destTable = tablesStream.ParamTable;
			var newList = new RandomRidList((int)list.Length);
			for (uint i = 0; i < list.Length; i++) {
				var rid = ToParamRid(list[i]);
				if (destTable.IsInvalidRID(rid))
					continue;
				newList.Add(rid);
			}
			return newList;
		}
Пример #13
0
		/// <inheritdoc/>
		public override RidList GetExportedTypeRidList() {
			if (!hasDeletedRows)
				return base.GetExportedTypeRidList();
			uint rows = tablesStream.ExportedTypeTable.Rows;
			var list = new RandomRidList((int)rows);
			for (uint rid = 1; rid <= rows; rid++) {
				var row = tablesStream.ReadExportedTypeRow(rid);
				if (row == null)
					continue;	// Should never happen since rid is valid

				// RTSpecialName is ignored by the CLR. It's only the name that indicates
				// whether it's been deleted.
				if (stringsStream.ReadNoNull(row.TypeName).StartsWith(DeletedName))
					continue;	// ignore this deleted row
				list.Add(rid);
			}
			return list;
		}