在Python中使用文件获取所有进程

2023-12-12

我想找到一种有效的方法来使用特定文件获取所有进程。

我知道我能做到psutil.process_iter()然后搜索process.open_files每个进程的文件。这是非常低效的,因为搜索每个进程以及每个进程打开的每个文件都需要花费大量时间(在我的机器上为 10 秒)。

有更快的方法吗?是否可以使用文件直接获取所有进程,而不是搜索每个进程?


是的,在Windows中,您可以通过以下方式完成:

import ctypes
from ctypes import wintypes

path = r"C:\temp\test.txt"

# -----------------------------------------------------------------------------
# generic strings and constants
# -----------------------------------------------------------------------------

ntdll = ctypes.WinDLL('ntdll')
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

NTSTATUS = wintypes.LONG

INVALID_HANDLE_VALUE = wintypes.HANDLE(-1).value
FILE_READ_ATTRIBUTES = 0x80
FILE_SHARE_READ = 1
OPEN_EXISTING = 3
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000

FILE_INFORMATION_CLASS = wintypes.ULONG
FileProcessIdsUsingFileInformation = 47

LPSECURITY_ATTRIBUTES = wintypes.LPVOID
ULONG_PTR = wintypes.WPARAM


# -----------------------------------------------------------------------------
# create handle on concerned file with dwDesiredAccess == FILE_READ_ATTRIBUTES
# -----------------------------------------------------------------------------

kernel32.CreateFileW.restype = wintypes.HANDLE
kernel32.CreateFileW.argtypes = (
    wintypes.LPCWSTR,      # In     lpFileName
    wintypes.DWORD,        # In     dwDesiredAccess
    wintypes.DWORD,        # In     dwShareMode
    LPSECURITY_ATTRIBUTES,  # In_opt lpSecurityAttributes
    wintypes.DWORD,        # In     dwCreationDisposition
    wintypes.DWORD,        # In     dwFlagsAndAttributes
    wintypes.HANDLE)       # In_opt hTemplateFile
hFile = kernel32.CreateFileW(
    path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, None, OPEN_EXISTING,
    FILE_FLAG_BACKUP_SEMANTICS, None)
if hFile == INVALID_HANDLE_VALUE:
    raise ctypes.WinError(ctypes.get_last_error())


# -----------------------------------------------------------------------------
# prepare data types for system call
# -----------------------------------------------------------------------------

class IO_STATUS_BLOCK(ctypes.Structure):
    class _STATUS(ctypes.Union):
        _fields_ = (('Status', NTSTATUS),
                    ('Pointer', wintypes.LPVOID))
    _anonymous_ = '_Status',
    _fields_ = (('_Status', _STATUS),
                ('Information', ULONG_PTR))


iosb = IO_STATUS_BLOCK()


class FILE_PROCESS_IDS_USING_FILE_INFORMATION(ctypes.Structure):
    _fields_ = (('NumberOfProcessIdsInList', wintypes.LARGE_INTEGER),
                ('ProcessIdList', wintypes.LARGE_INTEGER * 64))


info = FILE_PROCESS_IDS_USING_FILE_INFORMATION()

PIO_STATUS_BLOCK = ctypes.POINTER(IO_STATUS_BLOCK)
ntdll.NtQueryInformationFile.restype = NTSTATUS
ntdll.NtQueryInformationFile.argtypes = (
    wintypes.HANDLE,        # In  FileHandle
    PIO_STATUS_BLOCK,       # Out IoStatusBlock
    wintypes.LPVOID,        # Out FileInformation
    wintypes.ULONG,         # In  Length
    FILE_INFORMATION_CLASS)  # In  FileInformationClass

# -----------------------------------------------------------------------------
# system call to retrieve list of PIDs currently using the file
# -----------------------------------------------------------------------------
status = ntdll.NtQueryInformationFile(hFile, ctypes.byref(iosb),
                                      ctypes.byref(info),
                                      ctypes.sizeof(info),
                                      FileProcessIdsUsingFileInformation)
pidList = info.ProcessIdList[0:info.NumberOfProcessIdsInList]
print(pidList)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Python中使用文件获取所有进程 的相关文章

随机推荐

  • scanf 和 strcmp 与 c 字符串

    我找到了一个不错的example如何使用 strcmp 但它只能与 fgets 一起使用 并且我需要使其与 scanf 一起使用 所以 这是代码 int main void char fruit apple n char ans 80 do
  • Linq to XML Noob 问题 - 属性上的不同和排序

    我刚刚开始使用 Linq to XML 我有一个简单的文档 其中包含如下记录
  • java.io.File 的 TreePath

    有没有什么简单的方法可以获得File or java nio file Path 就此而言 从TreePath 例如 您有一个JTree像这样 Green Blue Red Yellow Purple jpg Brown jpg Black
  • 我正在阅读《C 编程语言》(第 2 版),但我不明白一个概念:

    我正在阅读 C 编程语言 第 2 版 但我不明白一个概念 有这段代码可以将输入复制到输出 include
  • NodeJS 无法从 req.params.token 获取令牌值

    app post reset token function req res async waterfall function done User findOne local resetPasswordToken req params tok
  • R 正则表达式中的转义句点

    除非我遗漏了什么 否则这个正则表达式看起来非常简单 grepl Processor 0 9 Processor Time names web02 然而 它不喜欢逃避时期 我的目的是成为一个字面上的时期 Error is an unrecog
  • Python:创建n个列表的最快方法

    所以我想知道如何最好地创建空白列表列表 由于 Python 处理内存中列表的方式 这不起作用 n 这确实创建了 但每个元素都是相同的列表 d n d 0 append 1 1 1 像列表理解这样的东西是有效的 d for x in xran
  • 使用 npm 安装包时无法读取未定义的属性“resolve”

    我无法使用 npm 在 Windows 10 计算机上执行任何操作 我总是得到 npm ERR 无法读取未定义的属性 解析 我正在使用 VSCode npm install npm g 给我与 npm i 相同的消息 我已经卸载了 Node
  • 使用投影查询时的 NDB 缓存

    尚未找到之前提出的这个具体问题 使用投影查询与完整实体查询时 App Engine 的 NDB 如何处理缓存 例如 如果我首先执行预计查询 MyModel query get projected name 然后接下来进行常规查询 MyMod
  • Swift AVAudioEngine 崩溃:播放器在断开连接状态下启动

    因此 我下面的代码应该以更高的音调一遍又一遍地重播 chimes wav 文件 但由于底部的错误而崩溃 谁能找到导致此错误的原因吗 import UIKit import AVFoundation class aboutViewContro
  • 将内部样式表转换为内联 CSS

    如何在不使用任何在线源的情况下将内部样式表转换为页面的内联 CSS 我的风格定义为
  • 如何为 Netbeans 配置 Grails?

    我正在尝试在 Netbeans 中配置 Grails Grails 版本 3 2 网豆 8 2 JDK 1 8 操作系统 Windows 10 我已经安装并配置了环境路径和其他东西 我可以从命令提示符创建并运行项目 但我无法从 netbea
  • 从浏览器运行 cmd - 通过 JS

    我想从我的网页 HTML 打开cmd窗口 我正在使用 JS 但有些事情不对劲 因为当我按下时 该函数没有被调用
  • sqlalchemy 过滤查询中的子项,但不过滤父项

    我有一个查询返回一个User目的 Users 有多个Post他们所做的 当我执行查询时 我想过滤在以下位置找到的帖子User post根据具体时间 例如 仅返回给定时间戳 1 天内的帖子 class User base tablename
  • 发电机输出的长度[重复]

    这个问题在这里已经有答案了 Python 提供了一个很好的方法来获取渴望迭代的长度 len x 那是 但我找不到任何类似的由生成器理解和函数表示的惰性迭代 当然 写这样的东西并不难 def iterlen x n 0 try while T
  • Rails 4:在没有命名空间模型的情况下在子路径中组织 Rails 模型?

    可能有这样的东西吗 app models app models users user rb app models users education rb 目标是组织 应用程序 模型文件夹更好 但不必为模型命名空间 Rails 3 的一个未解答
  • 如何在Python中使用zeep设置默认xmlns?

    我想使用 zeep 进行一些 API 调用 预期输出是
  • RMI响应速度很慢

    我正在使用 Java 远程方法调用 RMI 测试 Web 应用程序 当我通过加密狗 宽带连接到互联网时 RMI 需要很长时间才能响应请求 完成方法调用大约需要 10 秒 当我进行方法调用时 我还可以看到互联网连接中的数据传输速率不断上升 因
  • 用coredata导入初始数据的方法

    当我在 iOS 应用程序中导入数据时遇到问题 数据与 coredata 一起存储 我试图用按钮导入数据 点击后 首先以JSON格式存储在txt文件中的数据将存储在sqllite文件中 我的问题是 导入这么大量的数据非常慢 并且用户点击按钮或
  • 在Python中使用文件获取所有进程

    我想找到一种有效的方法来使用特定文件获取所有进程 我知道我能做到psutil process iter 然后搜索process open files每个进程的文件 这是非常低效的 因为搜索每个进程以及每个进程打开的每个文件都需要花费大量时间