星期日, 7月 08, 2007

取得其他Process的command line arguments

錯誤(失敗)的作法:
  • 在DotNET中使用Process class來取得ProcessStartInfo: 會得到一個空字串
  • 使用Windows API (如GetStartupInfo): 只能夠抓到目前Process的command line arguments
正確的作法:
  • 在DotNET中reference System.Management, 使用WMI
    ManagementObjectSearcher query = new ManagementObjectSearcher
    ("SELECT * FROM Win32_Process WHERE ProcessID=2860");
    ManagementObjectCollection queryCollection = query.Get();
    foreach (ManagementObject mo in queryCollection)
    {
    Console.WriteLine("PID [ {0} ] started With commandline - '{1}'",
    mo["ProcessID"].ToString(), mo["CommandLine"].ToString());
    }

    WMI介紹: http://www.csharphelp.com/archives2/archive334.html

  • 利用CreateRemoteThread來完成: http://win32.mvps.org/processes/remthread.html

    • 開啟目標process
    • 在目標process中分配兩塊記憶體。一塊存放程式碼,一塊存放資料。
    bullet
    • 複製程式碼到目標process
    bullet
    • 初始化目標process的資料記憶體區塊
    bullet
    • 呼叫CreateRemoteThread()執行先前複製到目標process的程式碼
    bullet
    • 等待remote thread結束
    bullet
    • 將執行結果從目標process的資料區塊複製回來