初学ctypes:打开进程并返回相关信息

直接上代码:

1、

my_debugger_defines.py

定义相关结构体(在后面创建进程及返回信息时,传参可用到)

 1 from ctypes import *
 2 # Let‘s map the Microsoft types to ctypes for clarity
 3 WORD=c_ushort
 4 DWORD=c_ulong
 5 LPBYTE=POINTER(c_ubyte)
 6 LPTSTR=POINTER(c_char)
 7 HANDLE=c_void_p
 8 #constants
 9 DEBUG_PROCESS=0x00000001
10 CREATE_NEW_CONSOLE = 0x00000010
11 # Structures for CreateProcessA() function
12 class STARTUPINFO(Structure):
13     _fields_=[
14         ("cb",DWORD),
15         ("lpReserved",LPTSTR),
16         ("lpDesktop",LPTSTR),
17         ("lpTitle",LPTSTR),
18         ("dwX",DWORD),
19         ("dwY",DWORD),
20         ("dwXSize",DWORD),
21         ("dwYSize",DWORD),
22         ("dwXCountChars",DWORD),
23         ("dwYCountChars",DWORD),
24         ("dwFlags",DWORD),
25         ("wShowWindow",WORD),
26         ("bcReserved2",WORD),
27         ("lpReserved2",LPBYTE),
28         ("hStdInput", HANDLE),
29         ("hStdOutput", HANDLE),
30         ("hStdError", HANDLE),
31         ]
32
33 class PROCESS_INFORMATION(Structure):
34     _fields_=[
35         ("hProcess",HANDLE),
36         ("hThread", HANDLE),
37         ("dwProcessId", DWORD),
38         ("dwThreadId", DWORD),
39         ]

2、my_debugger.py

定义创建并跟踪进程的函数:

 1 from ctypes import *
 2 from my_debugger_defines import *
 3
 4 kernel32=windll.kernel32
 5
 6 class debugger():
 7     def _init_(self):
 8         pass
 9     def load(self,path_to_exe):
10         # dwCreation flag determines how to create the process
11         # set creation_flags = CREATE_NEW_CONSOLE if you want
12         # to see the calculator GUI
13         creation_flags = DEBUG_PROCESS
14
15         startupinfo=STARTUPINFO()
16         process_information=PROCESS_INFORMATION()
17
18         startupinfo.dwFlags=0x1
19         startupinfo.wShowWindow
20         startupinfo.cb=sizeof(startupinfo)
21
22         #win32api函数CreatProcess用来创建一个新的进程和他的主线程,
23         #这个新进程运行指定的可执行文件,由第一个参数指定
24         if kernel32.CreateProcessW(path_to_exe, #should be CreateProcessW ,not CreateProcessA ,it is UNICODE API
25                         None,
26                     None,
27                         None,
28                     None,
29                                         #指定附加的、用来控制优先类和进程的创建的标志。
30                     creation_flags,
31                     None,
32                     None,
33                                         #该参数指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
34                     byref(startupinfo), #byref() 按地址传递
35                                         #该参数指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
36                     byref(process_information)#这里有个问题:
37                                    #结构体之间的赋值是如何进行的?
38                                    #因为这里定义的process_information跟
39                                    #creatprocess中process_information的参数数量一致
40                                    #而startupinfo是不一致的
41                                    ):
42             print("We have sucessfully lunched the process")
43             print("PID:%d"%process_information.dwProcessId)
44
45         else:
46              print("Error:0x%08x."%kernel32.GetLastError())
47              

尝试,调用函数:

1 import my_debugger
2
3 debugger=my_debugger.debugger()
4
5 debugger.load("C:\Windows\System32\calc.exe")

问题:

#结构体之间的赋值是如何进行的?按顺序?
#这里自己定义的process_information结构体跟
#win32函数中creatprocess中process_information的成员数量、位置是必须一致的吗?

#好像也不是这样,因为我process_information是一致的,成功传参了,而我startupinfo不一致,也成功了。

关于win32函数中creatprocess中process_information、startupinfo见http://baike.baidu.com/view/2421585.htm

时间: 2024-08-02 10:58:15

初学ctypes:打开进程并返回相关信息的相关文章

获取进程列表及相关信息

闲着没事,看着任务管理器好玩,查资料先简单实现一下,代码中没有加入获取CPU占用率的代码,这个代码网上很多,只是不喜欢那种写法,这里就不写了.以后继续完善,对于System Process和System的信息还没法获得,那位兄弟知道可以提个醒. 代码如下 [delphi] view plaincopy unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form

处理挂掉的守护进程和其相关信息

在写守护进程的时候,会涉及一些启动锁文件,进程id文件等信息.而当程序一旦挂掉(有时候可能是程序不工作,多线程引起的资源死锁等.),要强制关闭进程并且删除相关的文件信息.手动来操作,比较麻烦.写个程序会比较好: import subprocess,re,sys pidReg = re.compile("root\s+(\d+)\s") def kill(process):     p = subprocess.Popen("ps axu | grep py",she

cpu相关信息(进程、线程、核...)

cpu的相关信息. 1.cpu 1.1 物理cpu 实际Server中插槽上的CPU个数.物理cpu数量,可以数不重复的 physical id 有几个 1.1.1 查看物理CPU的个数 cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 1.2 逻辑cpu Linux用户对 /proc/cpuinfo 这个文件肯定不陌生. 它是用来存储cpu硬件信息的.信息内容分别列出了processor 0 – n 的规格.这里需要注意,如

C# 获取进程或线程的相关信息

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; namespace ConsoleApp { class ProcessDo { /// <summary> /// 获取进程相关信息 /// </summary> public static void GetProcessInfomation() { Proc

利用paramiko模块批量查看远程机器上指定进程的相关信息

#! /usr/bin/env python #coding:utf-8 #通过paramiko模块,获得远程机器的指定进程相关信息:     import paramiko   host_lists=(             ('node1','172.16.41.151'),             ('node2','172.16.41.152'),             ('node3','172.16.41.153'),             ('node4','172.16.4

获取 窗口 进程 相关信息

GameHwnd:= FindWindow(nil,'对对碰角色版'); //得到进程ID GetWindowThreadProcessId(GameHwnd,GamePid); //得到进程句柄 GameProcess:= OpenProcess(PROCESS_VM_READ or PROCESS_VM_WRITE,False,GamePid); //读取进程内存 ReadProcessMemory(GameProcess,Pointer($0048F128),@sitnum,4,readb

Stat(),Lstat(),Fstat() 获取文件/目录的相关信息

stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat 的基本使用 stat:返回一个与此命 需要包含的头文件: <sys/types.h>,<sys/stat.h>,<unistd.h> 函数原型: int stat(const char *path, struct stat *buf);      int fstat(in

Linux进程及作业管理相关命令

作为初学者,Linux永远是那么神秘,高大上的内容我也不会,所以在这里只能整理一下与管理相关的命令了,如果有不对的或不准确的地方,请指正. 可参考:Linux内核--进程管理与调度http://www.linuxidc.com/Linux/2014-08/105366.htm pstree:显示进程状态树 作用:列出当前的进程,以及它们的树状结构 用法:pstree [选项] -a: 显示执行程序的命令与完整参数 ps:查看系统中进程的状态 在/proc/目录中包含了进程和内核模拟生成的伪文件,

Linux之进程管理(2)相关命令之三

Linux之进程管理(2)相关命令之三 (IPC)进程间通信及信号控制命令 kill  killall   kill 命令 kill - terminate a process,Inter Process Communication 进程通信工具,默认为发送终止信号 选项及用法: kill  -l  #显示所有信号CODE及名称 kill  [-SIGNAL]  pid...#指定发送信号给对应pid的进程,不指定信号代码默认为15信号 常见的信号:(注:可以使用man 7 signal打开帮助