使用哪个API枚举进程所打开的句柄

copzyz123 2010-10-25 02:50:30
各路大虾,小弟有一个问题卡住了,求助啊~
我现在需要写个程序,查看某一个文件夹下面的文件有没有被进程占用(具体效果就像Unlocker那个工具一样,能列举出正在使用U盘文件的进程……)

我的思路如下:
首先枚举系统中的进程信息
之后对于每一个进程枚举它所打开的所有句柄
获得这些句柄的信息,之后查看是不是在相应的路径下(或者满足filter的要求)
显示这些句柄的路径,名字,以及调用他们的进程名字。


小弟对于这些步骤所应该使用的api茫然不知啊,求各位相助~
...全文
354 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
truelove7283159 2010-10-28
  • 打赏
  • 举报
回复
呵呵,win7, 64位,很老早的我没测试.
等你啥时候结帖率到了95%以上了,没准我帮你看看,哈哈. 还可以贡献代码给你.
牧牛童子 2010-10-28
  • 打赏
  • 举报
回复
参与一下,留个脚印
lhy 2010-10-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 truelove7283159 的回复:]
恩,只要还是XP,vista 我这个程序是vc6 vs2003 2008 都没有问题, 这个我完全确信. 客户端我就没什么限制,要是出问题,早有人找我了。

网络上有帖子介绍在DELPHI, C++builder如何使用的, 你搜索一下就有.我没在BCB底下做过. 而且最近也不用BCB.呵呵.
[/Quote]
我是说操作系统,不同版本的操作系统所支持的函数不一样。
truelove7283159 2010-10-28
  • 打赏
  • 举报
回复
恩,只要还是XP,vista 我这个程序是vc6 vs2003 2008 都没有问题, 这个我完全确信. 客户端我就没什么限制,要是出问题,早有人找我了。

网络上有帖子介绍在DELPHI, C++builder如何使用的, 你搜索一下就有.我没在BCB底下做过. 而且最近也不用BCB.呵呵.
truelove7283159 2010-10-27
  • 打赏
  • 举报
回复
#define ObjectNameInformation 1
#define SystemHandleInformation 0x10 // Information Class 16
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)
#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L)



//3 get func NtQuerySystemInformation
PROCNTQSI NtQuerySystemInformation = (PROCNTQSI)GetProcAddress(NtdllDll,"NtQuerySystemInformation");
if (NtQuerySystemInformation == NULL)
{
return 0;
}

//4 get system handle list
DWORD dwSize = sizeof(SYSTEM_HANDLE_INFORMATION);
PSYSTEM_HANDLE_INFORMATION pHandleInfo = (PSYSTEM_HANDLE_INFORMATION) new BYTE[dwSize];
NTSTATUS ntReturn = NtQuerySystemInformation(SystemHandleInformation, pHandleInfo, dwSize, &dwSize);


使用一个未公开函数吧, NtQuerySystemInformation, GOOGLE一下很多你能用到BCB中就可以了。我VS2003下调试通过,而且使用在产品中3年了啦.
lhy 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 truelove7283159 的回复:]
#define ObjectNameInformation 1
#define SystemHandleInformation 0x10 // Information Class 16
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004……
[/Quote]
在不同版本中测试过了吗?
copzyz123 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ccrun 的回复:]
骚瑞哈,我只是一时兴起,热情的回复了一下。

对于每一个进程枚举它所打开的所有句柄

这一步很难,没有API提供这样的功能。
以前我见过有人用一种山寨的方法,遍历句柄值(大意就是从1一直到某个数字),然后判断是否某个进程所打开。效率低并且不太准确。
[/Quote]

我那希望的火苗被无情的熄灭了,唉……
ccrun.com 2010-10-25
  • 打赏
  • 举报
回复
骚瑞哈,我只是一时兴起,热情的回复了一下。

对于每一个进程枚举它所打开的所有句柄

这一步很难,没有API提供这样的功能。
以前我见过有人用一种山寨的方法,遍历句柄值(大意就是从1一直到某个数字),然后判断是否某个进程所打开。效率低并且不太准确。
copzyz123 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzbinfo 的回复:]
你没有见过版主灌水么

引用 4 楼 copzyz123 的回复:
引用 3 楼 ccrun 的回复:
哈哈哈哈。

为什么哈哈啊……
[/Quote]

现在见识了~囧~
zzbinfo 2010-10-25
  • 打赏
  • 举报
回复
你没有见过版主灌水么[Quote=引用 4 楼 copzyz123 的回复:]
引用 3 楼 ccrun 的回复:
哈哈哈哈。

为什么哈哈啊……
[/Quote]
copzyz123 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ccrun 的回复:]
哈哈哈哈。
[/Quote]
为什么哈哈啊……
ccrun.com 2010-10-25
  • 打赏
  • 举报
回复
哈哈哈哈。
copzyz123 2010-10-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhouzhangkui 的回复:]
C/C++ code

#include <tlhelp32.h>

void __fastcall TfrmGather::Button15Click(TObject *Sender)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE SnapshotHandle = Crea……
[/Quote]


感谢楼上的回答,不过你的代码是取个系统里面进程的快照,然后显示的只是这个进程的exe的文件名啊~
我要的效果是,假如一个notepad打开了另一个txt,能显示出这个txt的位置……
周药师 2010-10-25
  • 打赏
  • 举报
回复

#include <tlhelp32.h>

void __fastcall TfrmGather::Button15Click(TObject *Sender)
{
PROCESSENTRY32 pe32;
pe32.dwSize = sizeof(PROCESSENTRY32);
HANDLE SnapshotHandle = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, TH32CS_SNAPALL );
if ( SnapshotHandle != INVALID_HANDLE_VALUE )
{
if ( Process32First( SnapshotHandle, &pe32 ) )
{
do
{
String Str = String(pe32.szExeFile) +": "+FloatToStr(pe32.th32ProcessID) ;
Memo1->Lines->Add(Str) ;
}
while( Process32Next( SnapshotHandle, &pe32 ) );
}
}
CloseHandle( SnapshotHandle );
}

1,222

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧