1樓:
以 Windows 為例,程序執行期間,會有乙個 PEB 結構,PEB structure (Windows) 微軟給出的 PEB 並沒有更多的細節,檢視 ReactOS 原始碼 reactos/winternl.h at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub
可以看到 PEB 更多的細節。
在 ReactOS 原始碼中,reactos/path.c at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub 可以看到如何取得當前程序目錄。
設定當前目錄是:
reactos/path.c at ebe75f395e0d94a034010dda946d95f84a6af4f5 · reactos/reactos · GitHub
實際上設定目錄,也就是將 PEB 對應的 CurrentDirectory 重新 Copy 乙份。
RtlCopyMemory
(CurDir
->DosPath
.Buffer
,FullPath
.Buffer
,FullPath
.Length
+sizeof
(WCHAR
));CurDir
->DosPath
.Length
=FullPath
.Length
;#define NtCurrentPeb() (NtCurrentTeb()->Peb)
上面的 PEB 結構中有 ProcessParameters 指標,型別為 RTL_USER_PROCESS_PARAMETERS , MSDN 介紹: RTL_USER_PROCESS_PARAMETERS structure (Windows)
typedef
struct
_RTL_USER_PROCESS_PARAMETERS
RTL_USER_PROCESS_PARAMETERS,*
PRTL_USER_PROCESS_PARAMETERS
;實際上,在 ReactOS 原始碼中, 此結構體有這個簡化版,也有詳細版。reactos/rtltypes.h at eb9115e533db9bbfd1dd7efc4cc9f82f454e2a21 · reactos/reactos · GitHub
typedef
struct
_RTL_USER_PROCESS_PARAMETERS
RTL_USER_PROCESS_PARAMETERS,*
PRTL_USER_PROCESS_PARAMETERS
;二者轉換一下:
typedef struct _RTL_USER_PROCESS_PARAMETERS RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
RTL_USER_PROCESS_PARAMETERS
要修改的就是 CurrentDirectoryName, 只要拿到對應程序的 PID, 並取得 PEB, 然後寫入到對應的 PEB 即可修改程序的當前目錄。
修改指定程序的當前目錄可以使用 WriteProcessMemory 寫到指定的程序,我這裡只有個讀取指定程序 CommandLine 的例子,指定程序的指令架構必須和當前程序一致。
svnsrv/daemonize_win.inl at master · fcharlie/svnsrv · GitHub
這樣搞了以後,還得用 py 封裝, 在 Windows 上 python x86 和 x64 都得有。
如果是 linux, 修改 /proc/pid/cwd 這個不知道可行不。
2樓:
簡單說,cd是shell內建的。
Unux Shell:> type catcat is /bin/cat
> type ls
ls is /bin/ls
> type
cdcd is a shell builtinWindows PS:
PS C:\> cd -?
Name
Set-Location
順便,Windows下好多內建命令,CMD和PS下的實現都不一樣。
所以要用Python指令碼實現cd,就需要做一些hack。首先得獲取父程序PID(os.getppid,Windows下大概要打乙份程序列表?),然後注入進去呼叫chdir。
Linux中父程序呼叫pid fork ,建立的子程序是不是也呼叫了上述語句並返回pid 0
shuyong.chen 這個問題有點意思。如果你了解了轉殖 clone 的概念,對於 建立的子程序是不是也呼叫了上述語句並返回pid 0?這個問題,就會有不同的理解。這個轉殖和我們常說的轉殖生物很類似。我們可以用乙個科幻一點的例子做比喻。對於應用來說,系統呼叫就是進入了乙個小黑屋,有進就有出,但是...
python 多程序如何終止或重啟子程序
Brian BIRK loveProLife 來自這個博主 1.主程序和子程序的程序組ID是一樣的,通過殺死程序組ID使主程序和子程序都退出 import os,signal print term current pid is s,group id is s os.getpid os.getpgrp...
C 父類物件中能否存放子類物件指標 父類物件中能否呼叫派生類物件函式?
張強 這是可以的哦,不過必須借助前向宣告和強制轉換或者多型。SalesMan salesMan SalesMan SalesManager salesManager SalesManager salesMan.salesManager void salesManager SalesManager s...