//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//------------------------------------------------------------------------------
namespace System.Diagnostics {
using System.Diagnostics;
using System;
using System.Collections;
using System.IO;
using Microsoft.Win32;
using System.ComponentModel;
using System.Globalization;
using System.Security.Permissions;
// using System.Windows.Forms;
using System.Runtime.Versioning;
///
/// A process module component represents a DLL or EXE loaded into
/// a particular process. Using this component, you can determine
/// information about the module.
///
[Designer("System.Diagnostics.Design.ProcessModuleDesigner, " + AssemblyRef.SystemDesign)]
[PermissionSet(SecurityAction.LinkDemand, Name="FullTrust")]
[PermissionSet(SecurityAction.InheritanceDemand, Name="FullTrust")]
public class ProcessModule : Component {
internal ModuleInfo moduleInfo;
FileVersionInfo fileVersionInfo;
///
/// Initialize the module.
///
///
internal ProcessModule(ModuleInfo moduleInfo) {
this.moduleInfo = moduleInfo;
GC.SuppressFinalize(this);
}
///
/// Make sure we are running on NT.
///
///
internal void EnsureNtProcessInfo() {
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
throw new PlatformNotSupportedException(SR.GetString(SR.WinNTRequired));
}
///
/// Returns the name of the Module.
///
[MonitoringDescription(SR.ProcModModuleName)]
public string ModuleName {
get {
return moduleInfo.baseName;
}
}
///
/// Returns the full file path for the location of the module.
///
[MonitoringDescription(SR.ProcModFileName)]
public string FileName {
[ResourceExposure(ResourceScope.Machine)]
get {
return moduleInfo.fileName;
}
}
///
/// Returns the memory address that the module was loaded at.
///
[MonitoringDescription(SR.ProcModBaseAddress)]
public IntPtr BaseAddress {
[ResourceExposure(ResourceScope.Process)]
get {
return moduleInfo.baseOfDll;
}
}
///
/// Returns the amount of memory required to load the module. This does
/// not include any additional memory allocations made by the module once
/// it is running; it only includes the size of the static code and data
/// in the module file.
///
[MonitoringDescription(SR.ProcModModuleMemorySize)]
public int ModuleMemorySize {
get {
return moduleInfo.sizeOfImage;
}
}
///
/// Returns the memory address for function that runs when the module is
/// loaded and run.
///
[MonitoringDescription(SR.ProcModEntryPointAddress)]
public IntPtr EntryPointAddress {
get {
EnsureNtProcessInfo();
return moduleInfo.entryPoint;
}
}
///
/// Returns version information about the module.
///
[Browsable(false)]
public FileVersionInfo FileVersionInfo {
[ResourceExposure(ResourceScope.Machine)] // Let's review callers - why do they want this?
[ResourceConsumption(ResourceScope.Machine)]
get {
if (fileVersionInfo == null)
fileVersionInfo = FileVersionInfo.GetVersionInfo(FileName);
return fileVersionInfo;
}
}
public override string ToString() {
return String.Format(CultureInfo.CurrentCulture, "{0} ({1})", base.ToString(), this.ModuleName);
}
}
}