初学ctypes:打开进程并返回相关信息
直接上代码:
1、
my_debugger_defines.py
定义相关结构体(在后面创建进程及返回信息时,传参可用到)
from ctypes import *
# Let's map the Microsoft types to ctypes for clarity
WORD=c_ushort
DWORD=c_ulong
LPBYTE=POINTER(c_ubyte)
LPTSTR=POINTER(c_char)
HANDLE=c_void_p
#constants
DEBUG_PROCESS=0x00000001
CREATE_NEW_CONSOLE = 0x00000010
# Structures for CreateProcessA() function
class STARTUPINFO(Structure):
_fields_=[
("cb",DWORD),
("lpReserved",LPTSTR),
("lpDesktop",LPTSTR),
("lpTitle",LPTSTR),
("dwX",DWORD),
("dwY",DWORD),
("dwXSize",DWORD),
("dwYSize",DWORD),
("dwXCountChars",DWORD),
("dwYCountChars",DWORD),
("dwFlags",DWORD),
("wShowWindow",WORD),
("bcReserved2",WORD),
("lpReserved2",LPBYTE),
("hStdInput", HANDLE),
("hStdOutput", HANDLE),
("hStdError", HANDLE),
] class PROCESS_INFORMATION(Structure):
_fields_=[
("hProcess",HANDLE),
("hThread", HANDLE),
("dwProcessId", DWORD),
("dwThreadId", DWORD),
]
2、my_debugger.py
定义创建并跟踪进程的函数:
from ctypes import *
from my_debugger_defines import * kernel32=windll.kernel32 class debugger():
def _init_(self):
pass
def load(self,path_to_exe):
# dwCreation flag determines how to create the process
# set creation_flags = CREATE_NEW_CONSOLE if you want
# to see the calculator GUI
creation_flags = DEBUG_PROCESS startupinfo=STARTUPINFO()
process_information=PROCESS_INFORMATION() startupinfo.dwFlags=0x1
startupinfo.wShowWindow
startupinfo.cb=sizeof(startupinfo) #win32api函数CreatProcess用来创建一个新的进程和他的主线程,
#这个新进程运行指定的可执行文件,由第一个参数指定
if kernel32.CreateProcessW(path_to_exe, #should be CreateProcessW ,not CreateProcessA ,it is UNICODE API
None,
None,
None,
None,
#指定附加的、用来控制优先类和进程的创建的标志。
creation_flags,
None,
None,
#该参数指向一个用于决定新进程的主窗体如何显示的STARTUPINFO结构体。
byref(startupinfo), #byref() 按地址传递
#该参数指向一个用来接收新进程的识别信息的PROCESS_INFORMATION结构体。
byref(process_information)#这里有个问题:
#结构体之间的赋值是如何进行的?
#因为这里定义的process_information跟
#creatprocess中process_information的参数数量一致
#而startupinfo是不一致的
):
print("We have sucessfully lunched the process")
print("PID:%d"%process_information.dwProcessId) else:
print("Error:0x%08x."%kernel32.GetLastError())
尝试,调用函数:
import my_debugger debugger=my_debugger.debugger() 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
初学ctypes:打开进程并返回相关信息的更多相关文章
- C# 获取进程或线程的相关信息
信息来自: http://blog.163.com/kunkun0921@126/blog/static/169204332201293023432113/ using System; using S ...
- OpenProcess打开进程返回错误的问题
问题描述 项目中需要做一个小功能:能够查看系统中当前正在运行的进程的内存信息,如内存块类型.分配状态.访问权限等.如下图所示: 需要的信息和上图相差无几.说起来也不算太难,毕竟现成的API已经提供了. ...
- cpu相关信息(进程、线程、核...)
cpu的相关信息. 1.cpu 1.1 物理cpu 实际Server中插槽上的CPU个数.物理cpu数量,可以数不重复的 physical id 有几个 1.1.1 查看物理CPU的个数 cat /p ...
- Win32 OpenProcess打开进程失败,返回5无权限操作
Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ...
- php http头设置相关信息
HTTP 状态码 状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response. HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别 1XX 提示信 ...
- 获取系统进程信息和进程依赖的dll信息
body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...
- stat(),lstat(),fstat() 获取文件/目录的相关信息
stat 的使用 Linux有个命令,ls -l,效果如下: 这个命令能显示文件的类型.操作权限.硬链接数量.属主.所属组.大小.修改时间.文件名.它是怎么获得这些信息的呢,请看下面的讲解. stat ...
- 编程实战——电影管理器之利用MediaInfo获取高清视频文件的相关信息
随着高速(20M)宽带.HTPC.大容量硬盘(3T)的普及,下载高清片并利用大屏幕观看也成为普通的事情. 随着下载影片的增多,管理就有了问题,有时在茫茫文件夹下找寻一个影片也是一件费时费力的事. 于是 ...
- Linux netstat命令详解和使用例子(显示各种网络相关信息)
netstat命令用于显示与IP.TCP.UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP ...
随机推荐
- C# 异步编程,async与await的简单学习
前提声明:C# 5.0 .NET Framework 4.5 2012-08-15 异步和等待(async和await).调用方信息(Caller Information) (C#版本与.NET版本 ...
- Java中参数的引用传递和值传递
1.一些定义 值传递:把实际传入参数的值,在内存中赋值一份 引用传递:传入的是实际参数的地址 2.传递基本类型的参数 因为Java是值传递,那就不难理解下面的代码不交换任何值 swap(Type ar ...
- 1、安装Scrapy
一.网址:https://doc.scrapy.org/en/latest/intro/install.html 二.安装过程中出现"cl.exe"找不到的错误,解决方法:http ...
- kurento搭建以及运行kurento-hello-world
搭建环境的系统是ubuntu 1.kurento服务器搭建 运行如下脚本即可完成安装 #!/bin/bash echo "deb http://ubuntu.kurento.org trus ...
- sklearn—无监督最近邻
无监督最近邻 NearestNeighbors (最近邻)实现了 unsupervised nearest neighbors learning(无监督的最近邻学习). 它为三种不同的最近邻算法提供统 ...
- Win7下使用TortoiseGit设置保存密码
1. 打开 TortoiseGit 设置,编辑 .gitconfig 文件,如图: 2. 添加下面两行配置,如图: [credential] helper = store 3. 保存退出即可
- Linux_进程管理&计划任务
目录 目录 top打开Linux系统任务管理控制台 ps进程查询指令 kill进程关闭指令 一个小实验 一次性计划任务 周期性计划任务 top打开Linux系统任务管理控制台 快捷键: P M k q ...
- ES6中数组和对象的扩展运算符拷贝问题以及常用的深浅拷贝方法
在ES6中新增了扩展运算符可以对数组和对象进行操作.有时候会遇到数组和对象的拷贝,可能会用到扩展运算符.那么这个扩展运算符到底是深拷贝还是浅拷贝呢? 一..使用扩展运算符拷贝 首先是下面的代码. le ...
- 2d平台怪物逻辑
2d来回巡逻 遇到坑会自动转向 可配置单次方向行走的时间,转向等待时间等 using System; using System.Collections; using System.Collection ...
- Sql 把Xml字符串转换成一张表
分享一个Sql技巧,把xml字符串转换成一个表格 DECLARE @IdHandel INT EXEC sp_xml_preparedocument @IdHandel OUTPUT, @Bar_Ip ...