2013-05-13 2 views
0

좋아, 여기에 100 만 달러에 약간의 질문이 있습니다. 어떤 브라우저가 현재 Flash 응용 프로그램을 실행 중인지 확인하는 응용 프로그램을 개발 중입니다.Internet Explorer 프로세스가 실행 중인지 검색

// Using CreateToolhelp32Snapshot allows to list all the modules loaded by a specific process. 
internal static Boolean ProcessContainsModule(Process process, String moduleMask) 
{ 
    IntPtr snapshotHandle; 

    if (Environment.Is64BitProcess) 
     snapshotHandle = CreateToolhelp32Snapshot((SnapshotFlags.Module | SnapshotFlags.Module32), (UInt32)process.Id); 
    else 
     snapshotHandle = CreateToolhelp32Snapshot(SnapshotFlags.Module, (UInt32)process.Id); 

    if (snapshotHandle == IntPtr.Zero) 
     return false; 

    Boolean result = false; 

    ModuleEntry entry = new ModuleEntry(); 
    entry.Size = ModuleEntry.SizeOf; 

    if (Module32First(snapshotHandle, ref entry)) 
    { 
     do 
     { 
      if (entry.ModuleName.FitsMask(moduleMask)) 
      { 
       result = true; 
       break; 
      } 

      entry = new ModuleEntry(); 
      entry.Size = ModuleEntry.SizeOf; 
     } 
     while (Module32Next(snapshotHandle, ref entry)); 
    } 

    CloseHandle(snapshotHandle); 

    return result; 
} 

// This is a simple wildcard matching implementation. 
public static Boolean FitsMask(this String value, String mask) 
{ 
    Regex regex; 

    if (!s_MaskRegexes.TryGetValue(mask, out regex)) 
     s_MaskRegexes[mask] = regex = new Regex(String.Concat('^', Regex.Escape(mask.Replace(".", "__DOT__").Replace("*", "__STAR__").Replace("?", "__QM__")).Replace("__DOT__", "[.]").Replace("__STAR__", ".*").Replace("__QM__", "."), '$'), RegexOptions.IgnoreCase); 

    return regex.IsMatch(value); 
} 

지금, Process Explorer 내 프로세스 탐사시 매우 유용 : 여기 내 핵심 기본 구현입니다. 크롬으로이 감지

매우 간단합니다 : 파이어 폭스와 함께이 Detecthing

if ((process.ProcessName == "chrome") && NativeMethods.ProcessContainsModule(process, "PepFlashPlayer.dll")) 

도 매우 간단합니다 : 당신은 인터넷 익스플로러에서 볼 때

언제나처럼
if ((process.ProcessName.StartsWith("FlashPlayerPlugin")) && NativeMethods.ProcessContainsModule(process, "NPSWF32*")) 

이 모든 것이 변경합니다. 마이크로 소프트의 브라우저로 이것을 어떻게 감지 할 수 있는지에 대한 단서가 있습니까?

답변

0

OK 내가 그것을 발견 :

내가 Zarathos하여 코드를 수정 한
if ((process.ProcessName == "iexplore") && NativeMethods.ProcessContainsModule(process, "Flash32*")) 
+0

야, ProcessContainsModule의 코드는 첫 번째 게시물에 있습니다. –

+0

오, 내 실수. 네임 스페이스 이름에 대한 흥미로운 선택 – MickyD

0

가 실제로 컴파일 가능한 만들뿐만 아니라, 개인적인 접촉을 추가 할 수 있습니다.

TL; DR :

using System; 
using System.Linq; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

#region pinvoke.net boilerplate 

[Flags] 
private enum SnapshotFlags : uint 
{ 
    HeapList = 0x00000001, 
    Process = 0x00000002, 
    Thread = 0x00000004, 
    Module = 0x00000008, 
    Module32 = 0x00000010, 
    Inherit = 0x80000000, 
    All = 0x0000001F, 
    NoHeaps = 0x40000000 
} 

private struct MODULEENTRY32 
{ 
    private const int MAX_PATH = 255; 
    internal uint dwSize; 
    internal uint th32ModuleID; 
    internal uint th32ProcessID; 
    internal uint GlblcntUsage; 
    internal uint ProccntUsage; 
    internal IntPtr modBaseAddr; 
    internal uint modBaseSize; 
    internal IntPtr hModule; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 1)] 
    internal string szModule; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH + 5)] 
    internal string szExePath; 
} 

[DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)] 
static extern IntPtr CreateToolhelp32Snapshot([In]UInt32 dwFlags, [In]UInt32 th32ProcessID); 

[DllImport("kernel32", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
private static extern bool CloseHandle([In] IntPtr hObject); 

[DllImport("kernel32.dll")] 
static extern bool Module32First(IntPtr hSnapshot, ref MODULEENTRY32 lpme); 

[DllImport("kernel32.dll")] 
static extern bool Module32Next(IntPtr hSnapshot, ref MODULEENTRY32 lpme); 

#endregion 

static bool ProcessContainsModule(Process process, string searchTerm) 
{ 
    bool result = false; 

    //get handle to process 
    IntPtr snapshotHandle = Environment.Is64BitProcess ? 
     CreateToolhelp32Snapshot((UInt32)(SnapshotFlags.Module | SnapshotFlags.Module32), (UInt32)process.Id) : 
     CreateToolhelp32Snapshot((UInt32)SnapshotFlags.Module, (UInt32)process.Id); 
    if (snapshotHandle == IntPtr.Zero) 
    { 
     return result; 
    } 

    //walk the module list 
    try 
    { 
     MODULEENTRY32 entry = new MODULEENTRY32() { dwSize = (uint)Marshal.SizeOf(typeof(MODULEENTRY32)) }; 

     if (Module32First(snapshotHandle, ref entry)) 
     { 
      do 
      { 
       if (entry.szModule.IndexOf(searchTerm, StringComparison.OrdinalIgnoreCase) >= 0) 
       { 
        result = true; 
        break; 
       } 

       entry = new MODULEENTRY32() { dwSize = (uint)Marshal.SizeOf(typeof(MODULEENTRY32)) }; 
      } 
      while (Module32Next(snapshotHandle, ref entry)); 
     } 

     return result; 
    } 
    finally 
    { 
     CloseHandle(snapshotHandle); 
    } 
} 

당신은과 같이 사용할 수 있습니다 : 이것은 크롬 때로는, 파이어 폭스 작동은 전혀 IE

에 대한

우선, 여기에 기본 코드입니다 :

static bool IsFlashLoadedInFirefox() 
{ 
    return Process.GetProcessesByName("plugin-container").Any(x => ProcessContainsModule(x, "NPSWF")); 
} 

static bool IsFlashLoadedInInternetExplorer() 
{ 
    //This doesn't work. For some reason can't get modules from child processes 
    return Process.GetProcessesByName("iexplore").Any(x => ProcessContainsModule(x, "Flash32")); 
} 

static bool IsFlashLoadedInChrome() 
{ 
    //Doesn't work reliably. See description. 
    return Process.GetProcessesByName("chrome").Any(x => ProcessContainsModule(x, "pepflashplayer")); 
} 

댓글에서 언급했듯이 Firefox 만 안정적으로 작동하는 것 같습니다. IE (IE11)의 ​​경우 Module32First()이 어떤 이유로 실패합니다. 크롬의 경우에는 상황이 좀 더 흥미있어 : 새 탭이 youtube.com 또는 YouTube 동영상을 탐색하는 경우

  • 코드는
  • 를 작동하는 새 탭이 플레이리스트를 탐색하는 경우 하지만 YouTube에서는 pepFlashPlayer.dll이 프로세스의 모듈 목록에 없으므로 코드가 실패합니다 (ProcessExplorer로 확인). 또한 재생 목록이 아닌 다른 YouTube 동영상으로 계속 이동해도 여전히 표시되지 않습니다.

프로세스의로드 된 DLL을 검사하는이 방법은 매우 약하며로드하는 DLL이나로드되는 방법을 변경하려는 브라우저가있는 경우 코드가 손상된다는 점에 유의하십시오.

참고 :

  1. http://pinvoke.net/default.aspx/kernel32.createtoolhelp32snapshot
  2. http://pinvoke.net/default.aspx/kernel32/Module32First.html
  3. http://pinvoke.net/default.aspx/kernel32/Module32Next.html
관련 문제