public object GetField(int n) { object res; ImageFieldData fi = GetFieldInfo(n); int count = fi.Count; int offset = GetFieldOffset(n);; Object o; int len; SafePointer sp = m_pHeader + offset; if (fi.VarLen) { // this assumes we can not have varlen arrays of headers count = GetFieldSize(n) / fi.GetTypeLen(); } if (count == 1) { return(sp.SafePointerToType(fi)); } // if a negative count is provided we tread it as an offset of // the field where to find the real count if (count < 0) { count = Convert.ToInt32(GetField(n + count)); } res = new object[count]; for (int i = 0; i < count; i++) { o = sp.SafePointerToType(fi); ((object[])res)[i] = o; if (o is ImageHeader) { len = ((ImageHeader)o).Size; } else { len = fi.GetTypeLen(); } sp = sp + len; } return(res); }
public int GetFieldSize(int n) { ImageFieldData fi = GetFieldInfo(n); int count = fi.Count; int padding = fi.PadTo; int size; int len; if (fi.VarLen) { SafePointer field_start = m_pHeader + GetFieldOffset(n); SafePointer field_end = field_start; while ((byte)field_end != fi.TrailingByte) { field_end++; } // if we have a VarLen and a PadTo specified we will make sure // we only skip up to PadTo trailing bytes if (padding != 0) { padding = padding - (field_end.Address - m_pHeader.Address) % padding; } else { padding = -1; } while (((byte)field_end == fi.TrailingByte) && (padding-- != 0)) { field_end++; } return(field_end - field_start); } if (fi.Type == Type.HEADER) { object o = GetField(n); if (o is Array) { len = ((ImageHeader)((object[])o)[0]).Size; } else { len = ((ImageHeader)o).Size; } } else { len = fi.GetTypeLen(); } if (count == 1) { return(len); } // if a negative count is provided we tread it as an offset of // the field where to find the real count if (count < 0) { count = Convert.ToInt32(GetField(n + count)); } size = len * count; // We don't pad is the size is already a multiple of padding if ((padding != 0) && (size % padding != 0)) { size += padding - (size % padding); } return(size); }