社区
进程/线程/DLL
帖子详情
获得文件句柄之后,如何获得它指向的文件的文件名?
wangunix
2005-06-27 02:32:48
假设
我枚举系统中的进程,并且取出进程中的句柄(假设为文件句柄),
我想用这些句柄得到,他们指向的文件的名字。
如何做?请告诉我。
...全文
183
6
打赏
收藏
获得文件句柄之后,如何获得它指向的文件的文件名?
假设 我枚举系统中的进程,并且取出进程中的句柄(假设为文件句柄), 我想用这些句柄得到,他们指向的文件的名字。 如何做?请告诉我。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
umbrella1984
2005-06-28
打赏
举报
回复
API里我也没看见有这样的函数,GetModuleFileName 函数是取进程的文件名,进程里究竟操作哪个文件这个函数是不可能的吧。
kuangjingbo
2005-06-27
打赏
举报
回复
To : bohut(●伯虎● /*等待小生命的降临*/)
你的方法不行
CFile类中是这样实现的:
CFile::GetFileName() 中调用GetStatus(status); 而status是个CFileStatus结构,如下:
struct CFileStatus
{
CTime m_ctime;
CTime m_mtime;
CTime m_atime;
LONG m_size;
BYTE m_attribute;
TCHAR m_szFullName[_MAX_PATH];
};
该结构的m_szFullName中用于存放文件名字信息。
而CFile::GetStatus函数中主要靠
lstrcpyn(rStatus.m_szFullName, m_strFileName, _countof(rStatus.m_szFullName));
来得到文件名,而m_strFileName是CFile中的成员
所以
CFile file(hFile);
CString strFile = file.GetFilePath();
是得不到文件名的
另外,我写了测试程序
#include "stdafx.h"
#include <windows.h>
int main(int argc, char* argv[])
{
HANDLE hf = CreateFile(TEXT("E:\\WMIProviders.exe"),GENERIC_READ,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hf == INVALID_HANDLE_VALUE) {
MessageBox(NULL,TEXT("open file error"),NULL,MB_OK);
return 0;
}
CFile cf((int)hf);
MessageBox(NULL,(LPCTSTR)cf.GetFileName(),TEXT("file name is"),MB_OK);
return 0;
}
显示的是空串。
lianglp
2005-06-27
打赏
举报
回复
常规API好象是得不到的。
Ozzman
2005-06-27
打赏
举报
回复
HANDLE hProcessSnap = NULL;
BOOL bRet = FALSE;
PROCESSENTRY32 pe32 = {0};
// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
return (FALSE);
// Fill in the size of the structure before using it.
pe32.dwSize = sizeof(PROCESSENTRY32);
// Walk the snapshot of the processes, and for each process,
// display information.
if (Process32First(hProcessSnap, &pe32))
{
DWORD dwPriorityClass;
BOOL bGotModule = FALSE;
MODULEENTRY32 me32 = {0};
m_ListApplication.DeleteAllItems();
do
{
char szPID[16] = {0};
sprintf(szPID, "%d", pe32.th32ProcessID);
int nItem = m_ListApplication.GetItemCount();
/********************************************/
/****pe32.szExeFile为进程名称******/
int nSubItem =m_ListApplication.InsertItem(nItem, pe32.szExeFile);
/********************************************/
m_ListApplication.SetItemText(nSubItem, 1, szPID);
m_ListApplication.SetItemData(nItem, pe32.th32ProcessID);
if (strcmp(pe32.szExeFile, "mc.ok.exe") == 0)
{
DWORD dwHaha = pe32.th32ProcessID;
}
bGotModule = GetProcessModule(pe32.th32ProcessID, pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
if (bGotModule)
{
HANDLE hProcess;
// Get the actual priority class.
hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
dwPriorityClass = GetPriorityClass (hProcess);
CloseHandle (hProcess);
// Print the process's information.
printf( "\nPriority Class Base\t%d\n", pe32.pcPriClassBase);
printf( "PID\t\t\t%d\n", pe32.th32ProcessID);
printf( "Thread Count\t\t%d\n", pe32.cntThreads);
printf( "Module Name\t\t%s\n", me32.szModule);
printf( "Full Path\t\t%s\n\n", me32.szExePath);
}
}
while (Process32Next(hProcessSnap, &pe32));
bRet = TRUE;
}
else
bRet = FALSE; // could not walk the list of processes
// Do not forget to clean up the snapshot object.
CloseHandle (hProcessSnap);
return (bRet);
bohut
2005-06-27
打赏
举报
回复
if(hFile == INVALID_HANDLE_VALUE)
AfxMessageBox(_T("invalid handle of file!"));
CFile file(hFile);
CString strFile = file.GetFilePath();
rick29
2005-06-27
打赏
举报
回复
纯文件的话:
CFile file(hFile);
CString sFile = file.GetFileName();
进程的话:
用GetModuleFileName / GetModuleFileNameEx函数。见MSDN。
VC++ 读取
文件
内容并输出到打印机
VC++ 读取
文件
内容并输出到打印机 VC++读取
文件
内容并输出到打印机,很实用的程序,部分代码释义: 定义实际上
指向
ADDJOB_INFO_1 // 结构的指针 LPBYTE pJob=0; //打印机
句柄
HANDLE m_hPrinter=NULL; //********函数定义**************** //
获得
打印作业的临时
文件
名
和ID号 //并保存在变量pJob所在的空间,成功返 //回true,失败返回false bool GetSpoolFileName( ); //通知系统数据准备就绪,可以输出, //同时释放函数运行中占用的内存 void EndPrint( ) ; //主函数演示怎样调用上面的函数来 //完成将一个
文件
完整的不变 //的传给外部设备 void Demo( );
Perl 实例精解(第三版).pdf
原书名: Perl by Example(Third Edition),原出版社: PH PTR,作者: Ellie Quigley,译者: 杜炜,出版社:清华大学出版社,出版日期:2002 年8月,PDF 格式,大小 19 Mb。 内容简介 本书以最新版本的Perl 5.6.1为范本,全面介绍了Perl语言,其内容包含Perl的所有主题。对每个主题都使用了范例说明,从Perl变量、正则表达式,到编写报表、CGI脚本和网络应用,并对范例程序进行了解释。读者可以很容易地通过这些范例掌握Perl语言的语法。附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有很大的参考价值。 目录 第1章 实用摘要和报表语言 1.1 什么是Perl 1.2 Perl用户 1.3 Perl的版本 1.4 如何
获得
Perl 1.5 什么是CPAN 1.6 Perl文档 第2章 Perl脚本 2.1 从命令行使用Perl 2.1.1 七开关 2.1.2 -n开关 2.1.3 -c开关 2.2 脚本设置 2.3 脚本 2.3.1 开始 2.3.2 注释 2.3.3 Perl语句 2.3.4 执行脚本 2.3.5 脚本范例(UNIX, Windows) 练习1 了解Perl的语法 .第3章
获得
打印
句柄
3.1
文件
句柄
3.2 字 3.2.1 引号 3.2.2 实量(常量) 3.3 print函数 3.3.1 打印实量 3.3.2 警告编译指示和-w开关 3.3.3 strict编译指示和字 3.4 printf函数 3.4.1 sprintf函数 3.4.2 无引号打印:here document 练习2 编写literals脚本 第4章 变量 4.1 关于Perl变量 4.1.1 类型 4.1.2 作用域和包 4.1.3 命名规范 4.1.4 赋值语句 4.1.5 引号规则 4.2 标量、数组和散列 4.2.1 标量变量 4.2.2 数组 4.2.3 散列 4.3 从STDIN读取 4.3.1 把输入赋值给标量变量 4.3.2 chop和chomp函数 4.3.3 read函数 4.3.4 getc函数 4.3.5 将输入赋值给数组 4.3.6 将输入赋值给散列 4.4 数组函数 4.4.1 chop和chomp函数(用于列表) 4.4.2 exists函数 4.4.3 delete函数 4.4.4 grep函数 4.4.5 join函数 4.4.6 map函数 4.4.7 pack和unpack函数 4.4.8 pop函数 4.4.9 push函数 4.4.10 shift函数 4.4.11 splice函数 4.4.12 split函数 4. 4.13 sort函数 4.4.14 reverse函数 4.4.15 unshift函数 4.5 散列(关联数组)函数 4.5.1 keys函数 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从
文件
加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从
文件
加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 6.3.4 foreach循环 6.3.5 循环控制 6.3.6 伪开关语句 练习5 条件是什么 第7章 正则表达式--模式匹配 7.1 什么是正则表达式 7.2 表达式修饰符和简语句 7.2.1 条件修饰符 7.2.2 DATA
文件
句柄
7.2.3 循环修饰符 7.3 正则表达式运算符 7.3.1 m运算符和匹配 7.3.2 s运算符和替换 7.3.3 模式绑定运算符 练习6 它是sed、awk或grep吗?尝试Perl 第8章
获得
控制:正则表达式元字符 8.1 正则表达式元字符 8.1.1 用于单字符的元字符 8.1.2 白空元字符 8.1.3 重复模式匹配的元字符 8.1.4 tr或y函数 8.2 统一字符编码(Unicode) 练习7 是sed、awk或grep吗?给出Perl的另外一个作用 第9章
获得
文件
句柄
9.1 用户定义
文件
句柄
9.1.1 打开
文件
:open函数 9.1.2 打开
文件
读 9.1.3 打开
文件
写 9.1.4 Win32
文件
9.1.5 打开
文件
添加 9.1.6 select函数 9.1.7 使用flock锁住
文件
9.1.8 seek和tell函数 9.1.9 打开
文件
读写 9.1.10 管道打开 9.2 传送参数 9.2.1 ARGV数组 9.2.2 ARGV和Null
文件
句柄
9.2.3 eof函数 9.2.4 -i开关:原位编辑
文件
9.3
文件
测试 练习8
获得
文件
句柄
第10章 子程序和函数 10.1 子程序/函数 10.1.1 定义和调用于程序 10.1.2 传送参数 10.1.3 原型 10.1.4 返回值 10.1.5 通过引用调用--别名和Typeglobs 10.1.6 通过指针传送 10.1.7 自动加载 10.1.8 BEGIN和END子程序(开始和结束) 10.1.9 subs函数 练习9 子程序不可缺少 第11章 模块化、打包并发送到库 11.1 包和模块 11.1.1 类比 11.1.2 定义 11.1.3 符号表 11.2 标准Perl库 11.2.1 @INC数组 11.2.2 包和.p1
文件
11.2.3 模块和.pm
文件
11.2.4 来自CPAN的模块 练习10 将所有的Perl都放入包中 练习11 压缩并放入库中 第12章 这个工作要求引用吗 12.1 什么是引用 12.1.1 符号引用与硬引用 12.1.2 硬引用 12.1.3 引用和匿名变量 12.1.4 嵌套数据结构 12.1.5 引用和子程序 12.1.6
文件
句柄
引用 12.1.7 ref函数 练习12
指向
地址 第13章 面向对象的Perl 13.1 OOP范型 13.1.1 回顾包和模块 13.1.2 一些面向对象的专用术语 13.2 类、对象和方法 13.2.1 类和专用性 13.2.2 对象 13.2.3 bless函数 13.2.4 方法 13.2.5 多态性和动态绑定 13.2.6 析构函数和无用存储单元收集 13.3 继承 13.3.1 @ISA数组和调用方法 13.3.2 $AUTOLOAD,sub AUTOLOAD和UNIVERSAL 13.3.3 派生类 13.3.4 多重继承 13.3.5 面向对象术语--父方法 13.4 公共用户接口:文档编制类 13.4.1 pod
文件
13.4.2 pod命令 13.4.3 如何使用pod解释程序 13.4.4 将pod文档翻译成文本 13.4.5 将pod文档翻译成HTML 13.5 使用Perl库中的对象 13.5.1 再看标准Perl库 13.5.2 标准Perl库中面向对象的模块 13.5.3 使用标准Perl库中的模块 练习13 这一课的对象是什么 练习14 函数Pod中的Perl 第14章 tie函数,DBM
文件
和数据库挂钩 14.1 连接变量与类 14.1.1 tie函数 14.1.2 预定义方法 14.1.3 连接标量 14.1.4 连接数组 14.1.5 连接散列 14.2 DBM
文件
14.2.1 创建并赋给DBM
文件
数据 14.2.2 从DBM
文件
检索数据 14.2.3 从DBM
文件
中删除项 第15章 Perl数据库编程 15.1 本章概述 15.2 Perl数据库编程 15.3 使用RDBMS的Perl编程 15.3.1 在Windows系统上安装Perl 15.3.2 使用PPM在Windows系统上安装Perl模块 15.3.3 安装RDBMS 15.3.4 为MMS范例创建DSN 15.4 使用ADO和DBI访问MSS 15.4.1 Microsoft SQL Server--范例15-1和15-3的查询 15.4.2 范例15-1:ex1.p1在MS SQL Server上的ADO简单查询,DSN 15.4.3 执行DDL和DML操作 15.4.4 范例15-2:ex2.p1 MSS上persons.sql的Perl ADO,无DSN 15.4.5 范例15-3:ex3.p1 MS SQL Server上的Perl DBI范例 15.4.6 范例15-4:ex4.p1 MSS上persons.sql的Perl DBl 15.5 使用ADO和DBI访问Oracle 15.5.1 Oracle--范例15-5(ADO)和15-7(DBI)的简单查询 15.5.2 为Oracle范例创建DSN 15.5.3 范例15-5:ex5.p1 Oracle上的ADO简单查询,DSN 15.5.4 在Oracle上执行DDL和DML操作 15.5.5 范例15-6:ex6.pl Oracle上persons.sql的Perl ADO,无DSN 15.5.6 范例15-7:ex7.pl Oracle上的Perl DBI简单查询 15.5.7 范例15-8:ex8.ploracle上persons.sql的Perl DBI 15.6 练习:非编程 练习15 使用MSS 练习16 在MSS中执行persons.p1 练习17 使用Oracle 练习18 在Oracle中执行persons.p1 15.7 参考文献 第16章 与系统接口 16.1 系统调用 16.1.1 目录和
文件
16.1.2 目录和
文件
属性 16.1.3 查找目录和
文件
16.1.4 创建目录--mkdir函数 16.1.5 删除目录--rmdir函数 16.1.6 更改目录--chdir函数 16.1.7 通过目录
文件
句柄
访问目录 16.1.8 许可和所有权 16.1.9 硬和软链接 16.1.10 更改
文件
名
16.1.11 更改访问和修改时间 16.12
文件
统计量 16.1.13 低级
文件
I/O 16.1.14 压缩和解压缩数据 16.2 进程 16.2.1 UNIX进程 16.2.2 Win32进程 16.2.3 环境(UNIX和Windows) 16.2.4 进程和
文件
句柄
16.2.5 进程优先权和Nice 16.2.6 口令信息 16.2.7 时间和进程 16.2.8 UNIX进程创建 16.2.9 Win32进程创建 16.3 其他与操作系统接口的途径 16.3.1 syscall函数和h2hp脚本 16.3.2 命令替换--备份引号 16.3.3 Shell.pm模块(Perl) 16.3.4 system函数 16.3.5 here documents 16.3.6 Globbing(
文件
名
扩展和通配符) 16.4 错误处理 16.4.1 die函数
MT5 非区间均线回归刷单EA教学
句柄
至数组(指标.
句柄
A,小均值,0,iBars(Symbol(),应用周期),true); 指标.
句柄
至数组(指标.
句柄
B,大均值,0,iBars(Symbol(),应用周期),true); //---非区间 double 区间最高价= 数据....
VB拦截windows删除
文件
(API HOOK)
VB拦截Windows Explorer删除进程,内含API HOOK,源代码:倒霉蛋儿,程序有时候也会窗口勾挂失败! 勾住了SHFileOperation等函数,DLL用Delphi写的C会的太少,查了半天才知道原来explorer是用SHFileOperation删除
文件
,经过测试很稳定,没有出现崩溃的情况,由于只勾住了SHFileOperation函数,所以别的程序要是调用DeleteFile删除
文件
,拦截不到,要是想拦截DeleteFile自己接着写吧。 mod_Inject.bas类的注释摘录: Dim MyAddr As Long ‘执行远程线程代码的起始地址。这里等于LoadLibraryA的地址 ‘dll
文件
路径 MyDllFileLength = LenB(StrConv(MyDllFileName, vbFromUnicode)) + 1 ‘这里把dll
文件
名
从Unicode转换成Ansi,否则英文字母是2个字节。 _ 顺便说一下,学过C的应该知道字符串要以/0标志结尾,所以dll
文件
名
长度要加上1个字节存放Chr(0) ‘得到进程的
句柄
在目标进程中申请分配一块空白内存区域。内存的起始地址保存在MyDllFileBuffer中。 _ 这块内存区域我们用来存放dll
文件
路径,并作为参数传递给LoadLibraryA。 在分配出来的内存区域中写入dll路径径。注意第二个参数传递的是MyDllFileBuffer的内容, _ 而不是MyDllFileBuffer的内存地址? If MyReturn = 0 Then Inject = False MyAddr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA") ‘得到LoadLibraryA函数的起始地址。他的参数就是我们刚才写入的dll路径。但是LoadLibraryA本身是不知道参数在哪里的。 _ 接下来我们就用CreateRemoteThread函数告诉他参数放在哪里了? If MyAddr = 0 Then Inject = False MyResult = CreateRemoteThread(ProcessHandle, 0, 0, MyAddr, MyDllFileBuffer, 0, 0) 好了,现在用CreateRemoteThread在目标进程创建一个线程,线程起始地址
指向
LoadLibraryA, _ 参数就是MyDllFileBuffer中保存的dll路径? If MyResult = 0 Then Inject = False Else Inject = True End If ‘接下来你可以使用WaitForSingleObject等待线程执行完毕。 _ 并用GetExitCodeThread得到线程的退出代码,用来判断时候正确执行了dll中的代码。 CloseHandle MyResult CloseHandle ProcessHandle ‘扫地工作 End Function
详解C语言中freopen()函数和fclose()函数的用法
C语言freopen()函数:打开
文件
函数,并
获得
文件
句柄
头
文件
: #include 定义函数: FILE * freopen(const char * path, const char * mode, FILE * stream); 函数说明: 参数 path 字符串包含欲打开的
文件
路径及
文件
名
。 参数mode 请参考fopen()说明.。 参数stream 为已打开的
文件
指针. Freopen()会将原stream 所打开的
文件
流关闭, 然后打开参数path 的
文件
。 返回值:
文件
顺利打开后,
指向
该流的
文件
指针就会被返回. 如果
文件
打开失败则返回NULL,
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章