我只是在野外資助這個代碼
def _scan_for_self(self):
win32api.Sleep(2000) # sleep to give time for process to be seen in system table.
basename = self.cmdline.split()[0]
pids = win32process.EnumProcesses()
if not pids:
UserLog.warn("WindowsProcess", "no pids", pids)
for pid in pids:
try:
handle = win32api.OpenProcess(
win32con.PROCESS_QUERY_INFORMATION | win32con.PROCESS_VM_READ,
pywintypes.FALSE, pid)
except pywintypes.error, err:
UserLog.warn("WindowsProcess", str(err))
continue
try:
modlist = win32process.EnumProcessModules(handle)
except pywintypes.error,err:
UserLog.warn("WindowsProcess",str(err))
continue
線
win32api.Sleep(2000) # sleep to give time for process to be seen in system table.
引起了我的注意,它表明如果您在啟動后呼叫 EnumProcesses() 太快,您將看不到自己,這有什么道理嗎?
uj5u.com熱心網友回復:
EnumProcesses
(WIn32 API - EnumProcesses 函式)的檔案沒有提到任何關于在它回傳的串列中查看當前行程所需的延遲。Microsoft 的示例如何使用
EnumProcess
列舉所有正在運行的行程(Enumerating All Processes),在呼叫之前也不包含任何延遲EnumProcesses
。我在 C 中創建的一個小型測驗應用程式(見下文)總是報告當前行程在串列中(在 Windows 10 上測驗):
#include <Windows.h>
#include <Psapi.h>
#include <iostream>
#include <vector>
const DWORD MAX_NUM_PROCESSES = 4096;
DWORD aProcesses[MAX_NUM_PROCESSES];
int main(void)
{
// Get the list of running process Ids:
DWORD cbNeeded;
if (!EnumProcesses(aProcesses, MAX_NUM_PROCESSES * sizeof(DWORD), &cbNeeded))
{
return 1;
}
// Check if current process is in the list:
DWORD curProcId = GetCurrentProcessId();
bool bFoundCurProcId{ false };
DWORD numProcesses = cbNeeded / sizeof(DWORD);
for (DWORD i=0; i<numProcesses; i)
{
if (aProcesses[i] == curProcId)
{
bFoundCurProcId = true;
}
}
std::cout << "bFoundCurProcId: " << bFoundCurProcId << std::endl;
return 0;
}
注意:我知道程式報告了預期結果并不意味著沒有比賽。也許我只是無法捕捉到它的表現。但是嘗試運行這樣的代碼有時會給你一個提示(特別是如果結果是有一場比賽)。
我在運行這個測驗時從來沒有遇到過問題(做了很多次),再加上沒有提到需要延遲 Microsoft 的檔案,這讓我相信這不是必需的。
我的結論是:
- 從 python 使用它時有一個獨特的問題(懷疑)。
或者: - 您找到的代碼正在做一些不必要的事情。
uj5u.com熱心網友回復:
有一場比賽,但這不是代碼試圖保護的比賽。
CreateProcess
只有在代表行程的內核物件被創建并排入內核行程串列后,才能成功呼叫回傳。隨后呼叫EnumProcesses
訪問相同的串列,并將立即觀察新創建的行程物件。
也就是說,除非行程物件已經被銷毀。這并不完全不尋常,因為 Windows中的行程是in-process 初始化的。檔案甚至注意到了這一點:
請注意,該函式在行程完成初始化之前回傳。如果找不到所需的 DLL 或無法初始化,則終止該行程。
這意味著如果在EnumProcesses
成功呼叫之后立即呼叫 toCreateProcess
沒有觀察到新創建的行程,它之所以這樣做是因為它遲到了而不是早了。如果您已經遲到了,那么添加延遲只會讓您遲到。
這很快導致了這里的實際競爭:行程 ID 僅在有限的時間間隔內唯一標識行程。一旦一個行程物件消失了,它的 ID 就可以獲取了,系統會在某個時候重用它。識別行程的唯一可靠方法是握住它的句柄。
現在任何人都在猜測作者_scan_for_self
試圖完成什么。正如所寫的那樣,代碼需要更多時間來做一些可能完全錯誤的事情1無論如何。
1 原來我的直覺是正確的。這只是你的普通 POSIX 開發人員,在了解 POSIX 不足的程序中,寧愿叫微軟,也不愿實際使用全能的高級 API。
uj5u.com熱心網友回復:
沒有種族。
EnumProcesses
呼叫一個切換到內核模式的 NT API 函式來遍歷行程的鏈表。您自己的行程在開始運行之前已添加到串列中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/470001.html