VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 2462|回复: 8

如何获取当前进程打开的文件名?

[复制链接]
10_avatar_middle
最佳答案
0 
donate_vip 发表于 2016-3-17 09:46:49 | 显示全部楼层 |阅读模式
如何获取当前进程打开的文件名?就是说如何才能获取到当前进程所打开文件的文件名,不是获取当前进程名。请知道的朋友指导一下,最好能贴出源代码。谢谢




上一篇:远控重复上线怎么解决?互斥之类的 不行
下一篇:继承IDropSource和IDataObject的文件拖拽,为何无法成功将文件发送到指定窗口??
51_avatar_middle
最佳答案
82 
online_admins 发表于 2016-3-17 10:39:39 | 显示全部楼层
如果当前进程打开了多个文件呢?
也要一起获取?
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-3-17 21:32:52 | 显示全部楼层
hook CreateFileA和CreateFileW
53_avatar_middle
最佳答案
0 
在线会员 发表于 2016-3-17 22:22:45 | 显示全部楼层
本代码用于HOOK自己代码里的CreateFileA 和 CreateFileW。
如果你想HOOK别的进程,需要另外写DLL,比较复杂了。

#include "imageHlp.h"
#pragma comment(lib,"imagehlp.lib")

const char * dllName = "Kernel32.dll";
const char * functionName[2] = {"CreateFileA","CreateFileW"};
PROC        lpOldFun[2] = {0};
PROC        lpNewFun[2] = {0};
typedef HANDLE (WINAPI * lpCreateFileA)(LPCSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);
typedef HANDLE (WINAPI * lpCreateFileW)(LPCWSTR,DWORD,DWORD,LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE);


HANDLE        WINAPI MyCreateFileA(LPCSTR lpFileName,
                                                   DWORD dwDesiredAccess,
                                                   DWORD dwShareMode,
                                                   LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                   DWORD dwCreationDisposition,
                                                   DWORD dwFlagsAndAttributes,
                                                   HANDLE hTemplateFile);

HANDLE        WINAPI MyCreateFileW(LPCWSTR lpFileName,
                                                   DWORD dwDesiredAccess,
                                                   DWORD dwShareMode,
                                                   LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                   DWORD dwCreationDisposition,
                                                   DWORD dwFlagsAndAttributes,
                                                   HANDLE hTemplateFile);

HANDLE        WINAPI MyCreateFileA(LPCSTR lpFileName,
                                                         DWORD dwDesiredAccess,
                                                         DWORD dwShareMode,
                                                         LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                         DWORD dwCreationDisposition,
                                                         DWORD dwFlagsAndAttributes,
                                                         HANDLE hTemplateFile)
{
        HANDLE hFile = INVALID_HANDLE_VALUE;
       
        //获得打开文件名
        MessageBox(NULL,lpFileName,"the open file name",MB_OK);

        if(lpOldFun[0] != NULL)
        {
                //调用系统的CreateFileA
                hFile = ((lpCreateFileA)lpOldFun[0])(lpFileName,
                                                                                        dwDesiredAccess,
                                                                                        dwShareMode,
                                                                                        lpSecurityAttributes,
                                                                                        dwCreationDisposition,
                                                                                        dwFlagsAndAttributes,
                                                                                        hTemplateFile);
        }
        return hFile;
}

HANDLE        WINAPI MyCreateFileW(LPCWSTR lpFileName,
                                                         DWORD dwDesiredAccess,
                                                         DWORD dwShareMode,
                                                         LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                                                         DWORD dwCreationDisposition,
                                                         DWORD dwFlagsAndAttributes,
                                                         HANDLE hTemplateFile)
{
        HANDLE hFile = INVALID_HANDLE_VALUE;
       
        if(lpOldFun[1] != NULL)
        {
                hFile = ((lpCreateFileW)lpOldFun[1])(lpFileName,
                                                                                        dwDesiredAccess,
                                                                                        dwShareMode,
                                                                                        lpSecurityAttributes,
                                                                                        dwCreationDisposition,
                                                                                        dwFlagsAndAttributes,
                                                                                        hTemplateFile);
        }

        return hFile;
}

void GetFunctionAddress()
{
        HMODULE kernel32 = LoadLibrary(dllName);

        for(int i = 0 ; i < 2 ; i ++)
        {
                lpOldFun[i] = GetProcAddress(kernel32,functionName[i]);
        }
       
        lpNewFun[0] = (PROC)MyCreateFileA;
        lpNewFun[1] = (PROC)MyCreateFileW;
}

void HookApi()
{
        HINSTANCE hInst = AfxGetInstanceHandle();
        ULONG ulSize;
       
        PIMAGE_IMPORT_DESCRIPTOR lpImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)
                ImageDirectoryEntryToData(hInst,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&ulSize);
       
        if(lpImportDesc == NULL)
                return;
       
        for(; lpImportDesc->Name; lpImportDesc ++)
        {
                LPSTR        szModName = (char *)hInst + lpImportDesc->Name;

                if(_stricmp(szModName,dllName) == 0)
                {
                        break;
                }
        }
       
        if(lpImportDesc->Name == 0)
                return;
       
        PIMAGE_THUNK_DATA lpThunk = (PIMAGE_THUNK_DATA)((char *)hInst + lpImportDesc->FirstThunk);
       
        for(; lpThunk->u1.Function ; lpThunk ++)
        {
                PROC * lppFun = (PROC *) &lpThunk->u1.Function;
                if(* lppFun == lpOldFun[0])
                {
                        HANDLE hProcess = GetCurrentProcess();
                        BOOL blnRet = WriteProcessMemory(hProcess,lppFun,&lpNewFun[0],sizeof(PROC),NULL);
                }

                if(* lppFun == lpOldFun[1])
                {
                        HANDLE hProcess = GetCurrentProcess();
                        BOOL blnRet = WriteProcessMemory(hProcess,lppFun,&lpNewFun[1],sizeof(PROC),NULL);
                }
        }
}

使用方法及测试代码:

        GetFunctionAddress();
        HookApi();

        CFileDialog  dlg(TRUE);
        dlg.DoModal();
        CString fileName = dlg.GetPathName();
        HANDLE hFile = CreateFile(fileName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);
        if(hFile != INVALID_HANDLE_VALUE)
        {
                CloseHandle(hFile);
                ::MessageBoxA(NULL,"succeed to open file!","",MB_OK);
        }
10_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-3-18 09:49:06 | 显示全部楼层
当前进程只打开一个文件名,我想获取这个文件名

10_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-3-18 09:53:25 | 显示全部楼层
感谢热心的朋友。很给力,也谢谢老大的回贴。更希望得到老大的指导 。如何获取当前进程打开的文件名?
10_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2016-3-18 10:00:19 | 显示全部楼层
强烈关注并支持本站。
51_avatar_middle
最佳答案
82 
online_admins 发表于 2017-7-4 09:40:07 | 显示全部楼层
这个应该是楼主想要的,还有源码哦:
Listing Used Files
https://www.codeproject.com/KB/s ... &select=2277170
Application.jpg
65_avatar_middle
最佳答案
0 
在线会员 发表于 2017-8-16 18:37:12 | 显示全部楼层
4楼的太夸张了吧。
SYC 那个方案倒是可以。但是不是可靠的方案。WAIT_TIMEOUT == WaitForSingleObject( ThreadHandle, 1000 )  这套代码使用网上的通用代码,基本上能解决问题。但是对于一个健壮的商业程序来讲,还不及格(要知道,我公司的客户可是百万级的,而且大多运行在恶劣的硬件环境)。
这段代码让我超级无奈了,凭什么是1秒?操作系统的线程调度你说了算吗?我最近恰好也在找这样的DEMO。 可是就是没有满意的。基本都是差不多的代码。默哀啊。。也许只能通过驱动的方法来解决了。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-21 18:20

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表