- 題名: WindowsAPIで異プロセス間のやりとり(64bitOS)
- 日時: 2013/02/27 15:56:50
- ID: 31365
- この記事の返信元:
- (なし)
- この記事への返信:
- [31366] Re[1]: WindowsAPIで異プロセス間のやりとり(64bitOS)2013/02/27 15:59:22
- ツリーを表示
using System; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; namespace VaultPanelControl { public class VaultPNCTL { [StructLayout(LayoutKind.Sequential)] public struct TVITEM { public uint mask; public IntPtr hItem; public uint state; public uint stateMask; public IntPtr pszText; public int cchTextMax; public int iImage; public int iSelectedImage; public int cChildren; public IntPtr lParam; public int iIntegral; public uint uStateEx; public IntPtr hwnd; public int iExpandedImage; public int iReserved; } [DllImport("User32.dll", CharSet = CharSet.Unicode)] static extern IntPtr FindWindow(string lpszClass, string lpszWindow); [DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); [DllImport("User32.dll", CharSet = CharSet.Unicode)] public static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); [DllImport("kernel32.dll")] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll")] public static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint dwFreeType); [DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint lpNumberOfBytesRead); [DllImport("kernel32.dll")] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, IntPtr lpBuffer, int nSize, ref uint lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); [DllImport("kernel32.dll", SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll")] static extern void MoveMemory(IntPtr dst, IntPtr src, int size); private static uint PROCESS_VM_OPERATION = 0x00000008; private static uint PROCESS_VM_READ = 0x00000010; private static uint PROCESS_VM_WRITE = 0x00000020; private static uint MEM_RESERVE = 0x2000; private static uint MEM_COMMIT = 0x1000; private static uint MEM_RELEASE = 0x8000; private static uint PAGE_READWRITE = 0x0040; //TreeViewのメッセージコード public static int TVM_EXPAND = 0x1102; //アイテムを開く・閉じる public static int TV_FIRST = 0x1100; public static int TVM_GETITEM = TV_FIRST + 62; public static int TVM_GETNEXTITEM = 0x110A; //指定されたアイテムを取得 //TVM_GETNEXTITEM に指定する wParam = flag public static int TVGN_ROOT = 0x0000; //ツリービューのルート(最も上の階層)のアイテムを取得します。 public static int TVGN_NEXT = 0x0001; //指定されたアイテムの同じグループ内の次のアイテムを取得します。 public static int TVGN_CARET = 0x0009; //現在選択されているアイテムを取得します。 //TVM_EXPANDに指定するwParam = flag public static int TVE_EXPAND = 0x1102; //子アイテムのツリーを開きます //TVITEMEXのmask public static uint TVIF_TEXT = 0x0001; //pszText, cchTextMax static void Main(string[] args) { uint pid = 0x1234; // 相手アプリケーションのプロセスID(直接指定) IntPtr treewindow = (IntPtr)0x20834; // ツリーウィンドウのハンドル(直接指定) IntPtr hwindow = (IntPtr)0x106E6; //親ウィンドウハンドル直接指定 uint result = GetWindowThreadProcessId(hwindow, out pid); Process p = Process.GetProcessById((int)pid); //カレントのハンドル IntPtr lItemWnd = SendMessage(treewindow, TVM_GETNEXTITEM, (IntPtr)TVGN_CARET, IntPtr.Zero); //ツリーを開く SendMessage(treewindow, TVM_EXPAND, (IntPtr)TVE_EXPAND, lItemWnd); //ノードの名称を取得****************************************** //相手プロセスのオープン IntPtr pProcessH = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, pid); if (pProcessH.Equals(IntPtr.Zero)) { return; } try { //pszText設定用の文字列領域確保 int MAX_STR = 260; //TVITEM構造体を宣言 初期化 TVITEM tvitem = new TVITEM(); int tvitemSize = Marshal.SizeOf(tvitem); int dwSize = tvitemSize + MAX_STR; //自プロセスの共有メモリ確保 //TVITEM格納分 IntPtr pLocalShared = Marshal.AllocHGlobal(tvitemSize); try { //タイトルバッファ格納分 IntPtr pLocalShared_Buf = Marshal.AllocCoTaskMem(MAX_STR); try { //相手側プロセスの共有メモリ確保 //TVITEM格納分 IntPtr pSysShared = VirtualAllocEx(pProcessH, IntPtr.Zero, (uint)tvitemSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (pSysShared.Equals(IntPtr.Zero)) { return; } try { //タイトルバッファ格納分 IntPtr pSysShared_Buf = VirtualAllocEx(pProcessH, IntPtr.Zero, (uint)MAX_STR, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (pSysShared_Buf.Equals(IntPtr.Zero)) { return; } try { //構造体の初期化 tvitem.mask = TVIF_TEXT; tvitem.hItem = lItemWnd; tvitem.pszText = pSysShared_Buf; tvitem.cchTextMax = MAX_STR; //構造体のポインタを確保したアドレスに移動 Marshal.StructureToPtr(tvitem, pLocalShared, false); //相手プロセス内にTVITEM構造体をコピー uint retWrite = 0; bool bRet = false; bRet = WriteProcessMemory(pProcessH, pSysShared, pLocalShared, tvitemSize, ref retWrite); if (bRet == false) { return; } //SendMessage発行 IntPtr pRet; pRet = SendMessage(treewindow, TVM_GETITEM, IntPtr.Zero, pSysShared); if (pRet == IntPtr.Zero) { return; } //共有メモリから情報取得 uint retRead = 0; bRet = ReadProcessMemory(pProcessH, pSysShared_Buf, pLocalShared_Buf, MAX_STR, ref retRead); if (bRet == false) { return; } MessageBox.Show(Marshal.PtrToStringUni(pLocalShared_Buf)); } finally { //相手プロセス内の共有メモリを解放する VirtualFreeEx(pProcessH, pSysShared_Buf, (uint)dwSize, MEM_RELEASE); } } finally { //相手プロセス内の共有メモリを解放する VirtualFreeEx(pProcessH, pSysShared, (uint)dwSize, MEM_RELEASE); } } finally { //自プロセス内共有メモリを解放する Marshal.FreeHGlobal(pLocalShared_Buf); } } finally { //自プロセス内共有メモリを解放する Marshal.FreeHGlobal(pLocalShared); } } finally { //相手プロセスのクローズ CloseHandle(pProcessH); } } } }
分類:[ASP.NET]