Delphi - 获取应用程序打开了哪些文件

2024-03-31

如何使用 Delphi 获取应用程序打开的文件的列表? 例如 winword.exe 打开哪些文件


使用原生API函数NtQuery系统信息 http://msdn.microsoft.com/en-us/library/ms724509%28VS.85%29.aspx您可以列出所有进程的所有打开句柄。

试试这个例子

program ListAllHandles;

{$APPTYPE CONSOLE}

uses
  PSApi,
  Windows,
  SysUtils;

const
SystemHandleInformation       = $10;
STATUS_SUCCESS               = $00000000;
STATUS_BUFFER_OVERFLOW        = $80000005;
STATUS_INFO_LENGTH_MISMATCH   = $C0000004;
DefaulBUFFERSIZE              = $100000;


type
 OBJECT_INFORMATION_CLASS = (ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformation,ObjectAllTypesInformation,ObjectHandleInformation );

 SYSTEM_HANDLE=packed record
 uIdProcess:ULONG;
 ObjectType:UCHAR;
 Flags     :UCHAR;
 Handle    :Word;
 pObject   :Pointer;
 GrantedAccess:ACCESS_MASK;
 end;

 PSYSTEM_HANDLE      = ^SYSTEM_HANDLE;
 SYSTEM_HANDLE_ARRAY = Array[0..0] of SYSTEM_HANDLE;
 PSYSTEM_HANDLE_ARRAY= ^SYSTEM_HANDLE_ARRAY;

  SYSTEM_HANDLE_INFORMATION=packed record
 uCount:ULONG;
 Handles:SYSTEM_HANDLE_ARRAY;
 end;
 PSYSTEM_HANDLE_INFORMATION=^SYSTEM_HANDLE_INFORMATION;

 TNtQuerySystemInformation=function (SystemInformationClass:DWORD; SystemInformation:pointer; SystemInformationLength:DWORD;  ReturnLength:PDWORD):THandle; stdcall;
 TNtQueryObject           =function (ObjectHandle:cardinal; ObjectInformationClass:OBJECT_INFORMATION_CLASS; ObjectInformation:pointer; Length:ULONG;ResultLength:PDWORD):THandle;stdcall;

 UNICODE_STRING=packed record
    Length       :Word;
    MaximumLength:Word;
    Buffer       :PWideChar;
 end;

 OBJECT_NAME_INFORMATION=UNICODE_STRING;
 POBJECT_NAME_INFORMATION=^OBJECT_NAME_INFORMATION;

Var
 NTQueryObject           :TNtQueryObject;
 NTQuerySystemInformation:TNTQuerySystemInformation;


function GetObjectInfo(hObject:cardinal; objInfoClass:OBJECT_INFORMATION_CLASS):LPWSTR;
var
 pObjectInfo:POBJECT_NAME_INFORMATION;
 HDummy     :THandle;
 dwSize     :DWORD;
begin
  Result:=nil;
  dwSize      := sizeof(OBJECT_NAME_INFORMATION);
  pObjectInfo := AllocMem(dwSize);
  HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);

  if((HDummy = STATUS_BUFFER_OVERFLOW) or (HDummy = STATUS_INFO_LENGTH_MISMATCH)) then
    begin
   FreeMem(pObjectInfo);
   pObjectInfo := AllocMem(dwSize);
   HDummy      := NTQueryObject(hObject, objInfoClass, pObjectInfo,dwSize, @dwSize);
  end;

  if((HDummy >= STATUS_SUCCESS) and (pObjectInfo.Buffer <> nil)) then
  begin
   Result := AllocMem(pObjectInfo.Length + sizeof(WCHAR));
   CopyMemory(result, pObjectInfo.Buffer, pObjectInfo.Length);
  end;
  FreeMem(pObjectInfo);
end;

Procedure EnumerateOpenFiles();
var
 sDummy      : string;
 hProcess    : THandle;
 hObject     : THandle;
 ResultLength: DWORD;
 aBufferSize : DWORD;
 aIndex      : Integer;
 pHandleInfo : PSYSTEM_HANDLE_INFORMATION;
 HDummy      : THandle;
 lpwsName    : PWideChar;
 lpwsType    : PWideChar;
 lpszProcess : PAnsiChar;
begin
    AbufferSize      := DefaulBUFFERSIZE;
  pHandleInfo      := AllocMem(AbufferSize);
  HDummy           := NTQuerySystemInformation(DWORD(SystemHandleInformation), pHandleInfo,AbufferSize, @ResultLength);  //Get the list of handles

  if(HDummy = STATUS_SUCCESS) then  //If no error continue
    begin

      for aIndex:=0 to pHandleInfo^.uCount-1 do   //iterate the list
      begin
    hProcess := OpenProcess(PROCESS_DUP_HANDLE or PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pHandleInfo.Handles[aIndex].uIdProcess);  //open the process to get aditional info
    if(hProcess <> INVALID_HANDLE_VALUE) then  //Check valid handle
        begin
     hObject := 0;
     if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle,GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED,FALSE, 0) then  //Get  a copy of the original handle
          begin
      lpwsName := GetObjectInfo(hObject, ObjectNameInformation); //Get the filename linked to the handle
      if (lpwsName <> nil)  then
            begin
       lpwsType    := GetObjectInfo(hObject, ObjectTypeInformation);
       lpszProcess := AllocMem(MAX_PATH);

       if GetModuleFileNameEx(hProcess, 0,lpszProcess, MAX_PATH)<>0 then  //get the name of the process
               sDummy:=ExtractFileName(lpszProcess)
              else
               sDummy:= 'System Process';

              Writeln('PID      ',pHandleInfo.Handles[aIndex].uIdProcess);
              Writeln('Handle   ',pHandleInfo.Handles[aIndex].Handle);
              Writeln('Process  ',sDummy);
              Writeln('FileName ',string(lpwsName));
              Writeln;

              FreeMem(lpwsName);
              FreeMem(lpwsType);
              FreeMem(lpszProcess);
      end;
      CloseHandle(hObject);
     end;
     CloseHandle(hProcess);
    end;
   end;
  end;
  FreeMem(pHandleInfo);

end;

begin
  try
    NTQueryObject            := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQueryObject');
    NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
   if (@NTQuerySystemInformation<>nil) and (@NTQuerySystemInformation<>nil) then
    EnumerateOpenFiles();
    Readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi - 获取应用程序打开了哪些文件 的相关文章

  • Zip 文件是使用 Windows 路径分隔符创建的

    我使用下面的代码创建一个 zip 文件 Zip 已正确创建 然后在我的程序中 我尝试从此文件中获取 zip 条目 如果我打印一个 zip 条目名称 我会得到 Windows 路径分隔符 例如 a b c 但我需要这样a b c 我还没有发布
  • 如何使用 Retrofit 2 下载 pdf 文件

    我在下载带改造的 pdf 文件时遇到困难 我的代码生成了一个文件 但它的大小错误 并且当 pdf 打开时它是空白的 这就是我的 php web 服务返回 pdf 文件的方式 param Slim Slim app param String
  • Crystal lang 进程是否可以更改其用户(euid/uid)?

    如果 Crystal 语言进程以 root 身份运行 是否可以将其 euid uid 更改为其他内容 例如 old euid old ui Process euid Process uid Process euid someone else
  • 当加载图标且 tk.mainloop 位于线程中时,Tkinter 会锁定 Python

    这是测试用例 import Tkinter as tk import thread from time import sleep if name main t tk Tk thread start new thread t mainloop
  • Windows 消息

    我需要发送带有自定义 ID 的自定义 Windows 消息 其他应用程序将侦听该消息 Windows 是否为内部消息保留任何预定义的消息 ID 范围 如 SQL Server 那样 内部消息最多为 50 000 The 文档 https m
  • File.Delete 进程无法访问该文件,因为该文件正在被另一个进程使用

    public bool DownloadMp3File DownloadedMp3 mp3 WebClient client new WebClient string filePath bool wasDownload false try
  • 如何防止用户杀死C#应用程序[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果您使用 ESET Smart S
  • 奇怪的 0x0D 被添加到我的二进制文件中

    我有这个奇怪的问题 我将 16 个字符写入一个二进制文件 然后写入 3 个整数 但是当我使用某些二进制文件查看器打开文件时 我看到添加了一个额外的字节 等于0x0D 这是我的代码 for i 0 i lt 16 i if i lt strl
  • 将 TPopupMenu 与窗体的右侧对齐?

    TPopupMenu 如何与窗体的右侧对齐 问题是 在调用之前似乎没有办法获取弹出菜单的宽度Popup X Y Integer 我正在尝试获得与 Chrome 中的系统菜单类似的行为 你也可以只设置Alignment http docwik
  • 我需要为我的应用程序制作和加载多大尺寸的 ImageList 图标(考虑更高的 DPI)?

    我有一个CListCtrl http msdn microsoft com en us library hfshke78 aspx控制 或ListView http msdn microsoft com en us library wind
  • 德尔福:idHttp+SSL

    请解释一下如何使用 SSL https 从服务器下载文件 我在互联网上没有找到合适的答案 每个人都说 TIdSSLIOHandlerSocket 但我只有 TIdSSLIOHandlerSocketOpenSSL 如果我使用 TIdSSLI
  • Firemonkey 移动应用程序和远程 MySQL

    我正在使用 Delphi XE5 并且我已经创建了基本的 Firemonkey 移动应用程序 Delphi 我想连接到远程 MySQL 数据库 我应该使用哪一个数据库管道 FireDAC DBExpress 等 您可以使用标准 TSQLQu
  • Android 如何检查文件是否存在并创建一个?

    我有以下问题 我想将一个名为 data xml 的文件放入 sdcard appname 文件夹中 并使用它来读取和写入应用程序数据 因此 当我的主要活动创建时 我需要检查该文件是否存在 public class appname exten
  • 在 Pascal 中将文本文件中的字符串读入数组

    使用这个程序 我试图读取一个文件并将其随机打印到控制台 我想知道是否必须使用数组 例如 我可以将字符串分配到一个数组中 然后从数组中随机打印 但是 我不确定如何解决这个问题 另一个问题是 我当前的程序没有从我的文件中读取第一行 我有一个文本
  • c 中的分叉和管道过程

    所以我有一个项目要做 但我完全被难住了 我花了十个小时却一无所获 我并不是特别想要答案的代码 但是一些伪代码和正确方向的良好提示将有帮助 它分叉多个进程 k 命令行参数 通过管道连接 每个进程都连接到下一个进程 最后一个进程连接到第一个进程
  • Windows XP 风格:为什么我们在静态文本小部件上得到深灰色背景?

    我们正在使用 C 和 Win32 编写 Windows 桌面应用程序 我们的对话框具有 Windows XP 风格 的丑陋外观 静态文本的背景是灰色的 如果对话框背景也是灰色 这不是问题 但在背景为白色的选项卡控件内 文本的灰色背景非常明显
  • Delphi LZMA减压样本

    我发现在this https stackoverflow com questions 4344976 lzma or 7zip in delphi的线程链接delphi压缩包 https github com ccy delphi zip具
  • 进程终止时释放资源

    当进程被任务管理器等进程终止时 如何释放资源 有没有办法在进程关闭之前调用函数 如果您的进程被终止 您实际上无能为力 根据定义 杀死一个进程就是杀死它 该进程没有机会运行任何代码 这很大程度上是 设计使然 想象一下 您可以注册一个例程 当您
  • 在 C++\Win32 中编辑控件文本更改消息

    与 NET for C Win32 中的 TextChanged 属性匹配的消息是什么 假设你正在谈论编辑控件 http msdn microsoft com en us library bb775458 VS 85 aspx EN CHA
  • C++ win32设置光标位置

    我知道要使用哪个功能 但我无法让它正常工作 我用了SetCursorPos 唯一的问题是它将光标设置为屏幕坐标而不是窗口坐标 我也尝试过ScreenToClient 但它并没有起作用 这是我的代码 pt x 113 pt y 280 Scr

随机推荐

  • python 中的大 O 表示法

    有谁知道有什么学习大符号的好资源吗 特别是学习如何遍历一些代码并能够看到它会是 O N 2 或 O logN 最好能告诉我为什么这样的代码等于 O N log N def complex numbers N len numbers resu
  • jQuery:在 3 个类之间切换(最初)

    我在这里看过几篇关于 SO 的帖子 但它们在功能和结构上过于具体 而我正在寻找的是更通用的东西 我或任何人都可以在任何地方使用 我所需要的只是有一个按钮 单击该按钮可以在之间循环3类 但如果出现必须循环 4 个 5 个或更多类的情况 则可以
  • 有什么办法可以查看标准输入缓冲区吗?

    我们知道stdin默认情况下是缓冲输入 证明这一点的证据是使用任何 留下数据 的机制stdin 例如scanf int main char c 10 0 scanf 9s c printf s and left is d n c getch
  • CreateProcess 执行 Windows 命令

    我正在尝试使用 CreateProcess 函数执行 dos 命令 LPWSTR cmd LPWSTR QString C windows system32 cmd exe subst DLetter mountPath utf16 STA
  • 如何在 R 中解决简单的优化问题

    我试图使用 R 中的 optim 函数来解决一个简单的问题 但我在如何实现它方面面临一些问题 e tot obs sum Var1 sum Var2 sum Var3 sum Var4 output Var1 Var2 Var3 Var4
  • 如何查看 git repo 的接收历史记录?

    我们有一个 中央 存储库 用于部署到我们的开发服务器 我知道git log将向我显示提交及其提交的日期 时间 但我想查看提交何时被推送到存储库 由存储库接收 有办法做到这一点吗 Git s reflogs https git scm com
  • IOS视图变换修改框架?

    我有一个视图 在其中我正在绘制矩形中进行一些特定的绘图 这些绘图是动态的 并且基于视图的宽度和高度 然后 包含它的视图对其应用旋转变换 然而 这种转换似乎调整了我的视图框架的值 这会影响我在drawRect中的绘图 NSLog 之前 f f
  • Windows XP、Vista 和 7 上安装了哪个版本的 .NET Framework?

    我有一个使用 NET Framework 3 5 的应用程序 我正在为一所大学构建这个应用程序来帮助学生学习 大多数学生通常使用Windows XP SP2 Windows Vista或Windows 7 对不起Mac用户 Mac版本将在大
  • 从代码更新 LinearDoubleKeyFrame KeyTime 值

    我有一些像这样的xaml
  • 集群中的用户(会话)计数

    有没有一种好方法可以获取集群中运行的 Java Web 应用程序的登录用户数 我写了一个简单的HttpSessionListener具有静态字段 但我认为这在集群中不起作用 我可以看到有一个 Spring Security 解决方案 但我在
  • 等待完成流的读取请求

    我在用着pngjs https github com niegowski node pngjs读取和写入一些 PNG 我定期收到此错误 Error There are some read requests waiting on finish
  • 节点号 X (RESHAPE) 准备失败。使用 tflite v2.2 调整张量大小

    这是重现错误的简单代码 import os os environ CUDA VISIBLE DEVICES 1 import numpy as np from keras models import Sequential from kera
  • android中JNI调用的命名约定是什么

    例如 在android Java代码中 它调用一个native方法 private native final String native getParameters 我应该在哪里 如何 grep C 方法在哪里定义native getPar
  • 使用子位置在 XSLT 中创建网格

    我正在尝试创建一个如下指定的网格
  • Google Colab 中的检查点

    如何在 Google Colab 上存储经过训练的模型并在本地磁盘上进一步检索 检查站会起作用吗 我如何存储它们并在一段时间后检索它们 您能否提及相关代码 这会很棒 Google Colab 实例是在您打开笔记本时创建的 稍后会被删除 因此
  • 排序组合框 VBA

    我一直在考虑如何对组合框中的值进行排序 我在初始化表单时将项目添加到组合框中 因为工作表上的值数量不断增加 我使用下一个代码来添加项目 With ComboBox1 lastcell ThisWorkbook Sheets 1 Range
  • Angular PrimeNG 表使用 cols 数组每列设置管道

    我正在尝试使用 PrimeNG 学习角度 链接在这里https primefaces org primeng table https primefaces org primeng table 是否还可以使用管道数组包含每列的管道 在 col
  • 从 iTunes 搜索 API(Apple 音乐)获取 ISRC 代码

    Apple 有一个搜索 API 可让您在 iTunes Store 中查询音乐 https affiliate itunes apple com resources documentation itunes store web servic
  • 获取多维访问的线性索引

    我正在尝试实现一个多维 std array 它保存大小为 Dim n 1 Dim n 2 Dim 1 的连续内存数组 为此 我使用 std array 的私有继承 constexpr std size t factorise std siz
  • Delphi - 获取应用程序打开了哪些文件

    如何使用 Delphi 获取应用程序打开的文件的列表 例如 winword exe 打开哪些文件 使用原生API函数NtQuery系统信息 http msdn microsoft com en us library ms724509 28V