2010-08-26 33 views
1

我得到的第二個是由第一個使用以下API創建了兩個控制檯進程:如何讓另一個進程創建的進程使用創建進程的一部分內存?

BOOL WINAPI CreateProcess(
    __in_opt  LPCTSTR lpApplicationName, 
    __inout_opt LPTSTR lpCommandLine, 
    __in_opt  LPSECURITY_ATTRIBUTES lpProcessAttributes, 
    __in_opt  LPSECURITY_ATTRIBUTES lpThreadAttributes, 
    __in   BOOL bInheritHandles, 
    __in   DWORD dwCreationFlags, 
    __in_opt  LPVOID lpEnvironment, 
    __in_opt  LPCTSTR lpCurrentDirectory, 
    __in   LPSTARTUPINFO lpStartupInfo, 
    __out  LPPROCESS_INFORMATION lpProcessInformation 
); 

現在我不知道,如果我將指針傳遞到所述第一進程的存儲器的一部分,經由IpCommandLine到由第一個進程調用的第二個進程,將通過第二個進程讀取該指針所指向的內存肯定會導致訪問衝突錯誤或受到該API某些參數的值? 如果我不能單獨使用這個API來達到我的目的,您提出什麼方法來訪問?

回答

2

您可以使用ReadProcessMemory/WriteProcessMemory API訪問此內存。另一個進程需要知道進程的內存地址和句柄以訪問其內存。

-1

我相信使用volatile將允許其他進程訪問內存。當然,這需要一個指向它

+0

不,volatile不允許跳過地址空間。 – janm 2010-08-26 08:38:17

+0

嗯......不。 volatile - 當天返回 - 表示編譯器不應該通過在寄存器中「私下」保留一個變化的變量來進行優化,而是將更改寫回到其他線程/中斷處理程序等期望當前值的實際內存位置現在 - 在所有多級內存緩存和內核中,volatile不足以確保刷新到某個通常可見的級別。通常使用互斥鎖,儘管在存儲級別上可以使用各種存儲屏障指令。 – 2010-08-26 08:39:58

+0

啊。我有點期待volatile會仍然神奇地允許在proccesses中使用內存。 – Raynos 2010-08-26 08:48:49

0

這裏是我的無知的意見(沒有做太多的這個東西在Windows上):

單獨的進程(按定義幾乎)通常沒有訪問到對方的內存空間直接。因此,您應該使用進程間通信(提示:這是您的谷歌的東西)的方法之一。

在這方面,我對windows並不瞭解,但是插座,管道,內存映射文件和各種形式的RPC之類的東西讓人想起。它當然取決於你的實際使用情況。

0

Alex Farber的回答是正確的;您可以使用Win32 API調用來讀取另一個進程的內存。但是,這可能是一個壞主意。如果有數據要移動,可以將它作爲參數傳遞給命令行,也可以將句柄傳遞給另一個進程,並使用管道連接這兩個進程。

0

我以前用#pragma的做過。目前我沒有實際的代碼,但我認爲類似這樣的東西可能適用於Visual Studio 2008 C++:

//put this code in a dll that both processes link to 
#pragma section("shared",read,write,shared) 

__declspec(allocate("shared")) 
int i = 0; // in theory, both processes should be able to access and modify i 
+0

DLL共享內存段是從傳統的16位dos日中保留下來的,並且有許多缺點(主要是安全漏洞) - 所以通常最好避免它們。爲了實現這種功能,最好使用共享內存或內存映射文件的操作系統API。 – 2010-08-27 16:28:07