【问题标题】:Does python's ctypes c_char work for windows 64?python的ctypes c_char是否适用于Windows 64?
【发布时间】:2012-03-18 03:30:03
【问题描述】:

我正在尝试加载进程列表,它在 32 位 python 上正常运行。但是,在 64 位上,我无法列出要列出的进程名称。代码如下。如果我将 szExeFile 的结构从 c_char 更改为 c_int 或 long,进程列表会枚举,但我无法查看哪个 pid 属于哪个 exe。我怎样才能让它在 x64 上运行?

from ctypes import *
from ctypes.wintypes import *
import sys


# const variable
# Establish rights and basic options needed for all process declartion / iteration
TH32CS_SNAPPROCESS = 2
STANDARD_RIGHTS_REQUIRED = 0x000F0000
SYNCHRONIZE = 0x00100000
PROCESS_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFF)
TH32CS_SNAPMODULE = 0x00000008
TH32CS_SNAPTHREAD = 0x00000004

##  Create object definitions to story information in
class PROCESSENTRY32(Structure):
    _fields_ = [ ( 'dwSize' , c_uint ) , 
                 ( 'cntUsage' , c_uint) ,
                 ( 'th32ProcessID' , c_uint) ,
                 ( 'th32DefaultHeapID' , c_uint) ,
                 ( 'th32ModuleID' , c_uint) ,
                 ( 'cntThreads' , c_uint) ,
                 ( 'th32ParentProcessID' , c_uint) ,
                 ( 'pcPriClassBase' , c_long) ,
                 ( 'dwFlags' , c_uint) ,
                 ( 'szExeFile' , c_char * 260 ) ]

CreateToolhelp32Snapshot= windll.kernel32.CreateToolhelp32Snapshot
Process32First = windll.kernel32.Process32First
Process32Next = windll.kernel32.Process32Next
GetLastError = windll.kernel32.GetLastError
OpenProcess = windll.kernel32.OpenProcess
GetPriorityClass = windll.kernel32.GetPriorityClass
CloseHandle = windll.kernel32.CloseHandle

try:
    hProcessSnap = c_void_p(0)
    hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS , 0 )
    pe32 = PROCESSENTRY32()
    pe32.dwSize = sizeof( PROCESSENTRY32 )
    ret = Process32First( hProcessSnap , pointer( pe32 ) )
    global PROGPid
    PROGPid=False
    while ret:
        print pe32.dwSize,pe32.cntUsage,pe32.th32ProcessID,pe32.th32DefaultHeapID,pe32.th32ModuleID,pe32.cntThreads,pe32.th32ParentProcessID,pe32.pcPriClassBase,pe32.dwFlags,pe32.szExeFile
        hProcess = OpenProcess( PROCESS_ALL_ACCESS , 0 , pe32.th32ProcessID )
        dwPriorityClass = GetPriorityClass( hProcess )
        if dwPriorityClass == 0 :
            CloseHandle( hProcess )
        PROGPid=pe32.th32ProcessID
        ret = Process32Next( hProcessSnap, pointer(pe32) )
        print PROGPid
    CloseHandle ( hProcessSnap )

except:
    print "Error in ListProcessPid"

【问题讨论】:

  • [p for p in psutil.process_iter()] 创建一个进程列表。 psutil 目前支持 Linux、Windows、OSX 和 FreeBSD,包括 32 位和 64 位,使用单一代码库的 Python 版本从 2.4 到 3.3。 Pypy 也可以工作。
  • 这个环境下的发行版没有psutils,无法部署。
  • EnumProcesses 在 x64 上工作吗?
  • 确实如此,wmi 索引也是如此。使用 kernel32 与 paspi 的原因是还要找到程序 dll 的基本内存偏移量。 Char 也用于“firstmodule”/“lastmodule”函数并产生相同的问题。

标签: python ctypes


【解决方案1】:

您的PROCESSENTRY32 structure 错误。这对我有用:

class PROCESSENTRY32(Structure):
    _fields_ = [ ( 'dwSize' , DWORD ) ,
                 ( 'cntUsage' , DWORD) ,
                 ( 'th32ProcessID' , DWORD) ,
                 ( 'th32DefaultHeapID' , POINTER(ULONG)) ,
                 ( 'th32ModuleID' , DWORD) ,
                 ( 'cntThreads' , DWORD) ,
                 ( 'th32ParentProcessID' , DWORD) ,
                 ( 'pcPriClassBase' , LONG) ,
                 ( 'dwFlags' , DWORD) ,
                 ( 'szExeFile' , c_char * 260 ) ]

【讨论】:

猜你喜欢
  • 2019-08-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多