2012-12-24 24 views
2

如何在Windows上使用本地API獲取進程工作目錄(用於使用進程句柄或PID的另一個進程)?我看過Process and Thread FunctionsPSAPI Functions並沒有找到。也許WMI?如何在Windows上獲得工作目錄?

此外,關於這些話題,PSAPI如何與進程和線程功能?它過時了嗎?

+0

爲什麼我會感覺到「如何獲得流程工作目錄」這個詞需要插入一個「a」或「當前」以便從根本上澄清這個問題的意圖? – WhozCraig

+0

@WhozCraig你是對的,這是我的錯誤。英語不是我的母語(我是俄羅斯人,住在俄羅斯),所以我不太瞭解它。 – Yury

+0

一種方法是將DLL注入到代表您調用GetCurrentDirectory的進程中。 –

回答

5

爲此,您需要比PSAPI更重的火炮。以下是如何做到這一點(86假定,處理省略錯誤):

ProcessBasicInformation  pbi ; 
RTL_USER_PROCESS_PARAMETERS upp ; 
PEB peb ; 
DWORD len ; 

HANDLE handle = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid) ; 

NtQueryInformationProcess (handle, 0 /*ProcessBasicInformation*/, &pbi, 
    sizeof (ProcessBasicInformation), &len) ; 

ReadProcessMemory (handle, pbi.PebBaseAddress, &peb, sizeof (PEB), &len) ; 
ReadProcessMemory (handle, peb.ProcessParameters, &upp, sizeof (RTL_USER_PROCESS_PARAMETERS), &len) ; 

WCHAR path = new WCHAR[upp.CurrentDirectoryPath.Length/2 + 1] ; 

ReadProcessMemory (handle, upp.CurrentDirectoryPath.Buffer, path, upp.CurrentDirectoryPath.Length, &len) ; 

// null-terminate 
path[upp.CurrentDirectoryPath.Length/2] = 0 ; 

注意,這種方法包含種族,除非該進程被掛起。

+0

這是一部非常重的火炮。有沒有更簡單的方法來做到這一點? – Yury

+0

不是我的最佳知識。 –

0

"."始終是當前目錄。我認爲它會起作用。

+0

對不準確的問題,我的意思是「另一個過程」。 – Yury