昨天发了个贴,竟然没分重发过!!!!!!
RT,我们可以通过一系列的API获取进程的路径,但是如果是像记事本,WORD文档,EXECL文档,WINDOWS图片浏览器等程序,我们得到的只是系统目录下的程序
如:NODEPAD。EXE ,返回来的结果是 c:\windows\notepad.exe,那有没有一种办法可以得知这个记事本到底是哪个目录下的哪个文件?
比如我打开的是e:\a.txt,通过枚举得来的却是 c:\windows\notepad.exe 这个路径,能不能得到 e:\a.txt这个路径? function GetPathFileofModule(ModuleName:String):String;
var hProcSnap: THandle;
pProcess: THandle;
pe32: TProcessEntry32;
s: string;
buf:array[0..MAX_PATH] of char;
hMod:HMODULE;
cbNeeded:DWORD;
begin
hProcSnap:=CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
if hProcSnap=INVALID_HANDLE_VALUE then Exit;
pe32.dwSize:=SizeOf(ProcessEntry32);
if Process32First(hProcSnap,pe32)=True then
while Process32Next(hProcSnap,pe32)=True do
begin
if uppercase(pe32.szExeFile)=uppercase(ModuleName) then
begin
pProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE, pe32.th32ProcessID);
if pProcess <>0 then
begin
if EnumProcessModules( pProcess,@hMod,sizeof(hMod),cbNeeded) then
begin
ZeroMemory(@buf,MAX_PATH+1);
GetModuleFileNameEx(pProcess, hMod,buf,MAX_PATH+1);
Result:=strpas(buf);
end;
end;
end;
end;
CloseHandle(hProcSnap);
end;
这个函数返回的无法实现我的要求!!!
RT,我们可以通过一系列的API获取进程的路径,但是如果是像记事本,WORD文档,EXECL文档,WINDOWS图片浏览器等程序,我们得到的只是系统目录下的程序
如:NODEPAD。EXE ,返回来的结果是 c:\windows\notepad.exe,那有没有一种办法可以得知这个记事本到底是哪个目录下的哪个文件?
比如我打开的是e:\a.txt,通过枚举得来的却是 c:\windows\notepad.exe 这个路径,能不能得到 e:\a.txt这个路径? function GetPathFileofModule(ModuleName:String):String;
var hProcSnap: THandle;
pProcess: THandle;
pe32: TProcessEntry32;
s: string;
buf:array[0..MAX_PATH] of char;
hMod:HMODULE;
cbNeeded:DWORD;
begin
hProcSnap:=CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
if hProcSnap=INVALID_HANDLE_VALUE then Exit;
pe32.dwSize:=SizeOf(ProcessEntry32);
if Process32First(hProcSnap,pe32)=True then
while Process32Next(hProcSnap,pe32)=True do
begin
if uppercase(pe32.szExeFile)=uppercase(ModuleName) then
begin
pProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,FALSE, pe32.th32ProcessID);
if pProcess <>0 then
begin
if EnumProcessModules( pProcess,@hMod,sizeof(hMod),cbNeeded) then
begin
ZeroMemory(@buf,MAX_PATH+1);
GetModuleFileNameEx(pProcess, hMod,buf,MAX_PATH+1);
Result:=strpas(buf);
end;
end;
end;
end;
CloseHandle(hProcSnap);
end;
这个函数返回的无法实现我的要求!!!
解决方案 »
- 奇怪问题:我编译运行的程序图标变成其它图标 怎么重设都回不来了? 急
- 谁能提供一个delphi实现的画图程序?
- 日期输入问题
- clientSocket和serverSocket写的客户端服务器在5分钟内不发送任何信息连接就会中断,怎么办?
- 大量delphi商业源码,编程资料,免费下载,欢迎拍砖!
- 如何在DLL中为窗体创建控件并且为该控件增加事件和代码,以BUTTON为例。
- 怎么设置主从表呀
- 谁用过Delphi的打包工具,怎么可以把程序放如程序菜单里中,和桌面上生成快捷方式??
- 老鱼,老千,偶怎么感到 事务 这个功能用不上,在post之前,即便是执行了的sql也不会写入数据库,但偶不敢说 事务 无用,只是不知道常用在哪里??//牛虻
- 想说爱你不容易呀,为什么win2k的Explorer老出错?
- delphi曲线中相邻两个点怎么比较
- 顺利辞职了,散分
给你一段参考代码,获得进程及模块的树形结构,放到TV控件中,可以显示文件名uses Tlhelp32; procedure ProcessEnum(TV:TTreeView);
var
ProcessList :Thandle;
pe :TPROCESSENTRY32;
node :TTreenode;
processnumber :integer;
procedure ModuleEnum(processid:Dword);
var
ModuleList :Thandle;
pm :TMODULEENTRY32;
begin
ModuleList:=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processID);
pm.dwSize:=sizeof(TMODULEENTRY32);
if module32first(ModuleList,pm) then
begin
TV.Items.addchild(node,pm.szexepath);
while module32next(ModuleList,pm) do
TV.items.addchild(node,pm.szexepath);
end;
CloseHandle(ModuleList);
end; // ModuleEnumbegin // ProcessEnum
processnumber:=0;
TV.Items.Clear;
ProcessList:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=sizeof(TPROCESSENTRY32);
if process32first(ProcessList,pe) then
begin
node:=TV.Items.Add(nil,pe.szexefile);
ModuleEnum(pe.th32ProcessID);
inc(processnumber);
while process32next(ProcessList,pe) do
begin
node:=TV.Items.Add(nil,pe.szexefile);
ModuleEnum(pe.th32ProcessID);
inc(processnumber);
end;
end;
//edit1.text:=’系统进程:’+inttostr(processnumber);
CloseHandle(ProcessList);
end;
对exe所加载的文件 所在路径 ,无法取得。从目前 系统提供的 进程信息,是无法知道 其加载的文件路径的。可以通过取得进程的 工作路径 ,来得知 其所加载的文件路径。
是要获取固定一个进程所打开的文件路径还是进程本身路径,如果是前者,只能HOOK openfile or createfile 等API来提取.
是前者....
通过API HOOK 来实现,.应该可以,不过估计难底挺大,我还不知道如何让其它程序挂载自己的DLL进行API HOOK 呢.....
就是说就算用 API HOOK,也起不到作用?
1、通过双击 a.txt 打开,此时可以看到他的命令行 "C:\WINDOWS\notepad.exe" F:\a.txt,直接分析可得。
2、对于通过记事本通过打开菜单打开的文件,其命令行是不可见的,此时有两个办法:
2.1 有些软件有最近打开的文件类别,直接读取最近的一个。
2.2 可以从最近打开的文档中获取最近的文件。以上办法对于多个进程,打开多次文件的操作 会有问题
(__)
/oo\\________
\ / \---\
\/ / \ \
\\_|___\\_|/ *
|| YY|
|| ||
function GetINIDir: string ;
function GetDir(str: string): string ;
var m, n: Integer ;
tmp: string[1];
begin
m := Length(str);
for n:=m downto 1 do
begin
tmp := Copy(str, n, n);
if tmp = '\' then Break ;
end;
Result := Copy(str, 1, n);
end;
//--------------------------------
var
pid:integer;
phd:thandle;
handle: HWND;
filename:array [0..1024] of char;
begin
handle := FindWindow('TxFmain', nil); //目标程序的窗口标题.
GetWindowThreadProcessId(handle,@pid); //这里,HANDLE为你的窗口句柄
phd:=OpenProcess(PROCESS_ALL_ACCESS ,true,pid);
GetModuleFileNameExA(phd, 0, filename, 1024); //需要声明.
Result := GetDir(filename);
CloseHandle(phd);
end;
1最简单, 在c盘1.txt右键选择打开方式的时候选择用notepad打开.
种情况,可以取得带参数的映象路径,该参数就是c:\1.txt.2 比较复杂,打开Notepad,在用notepad打开c:\1.txt.
取得映象路径里面不带参数,只有notepad的路径.
这种情况不知道怎么解决.3更复杂的情况,程序支持多页面浏览,比如word,notepad++等,一次可以打开n个文档,但进程只有一个.
程序可能用了自己的数据结构保存了已经打开文件的列表,这种程序基本没法写出通用的解法取得路径.基本没法实现.上面有人说用hook,我觉得不如去实现一个filemon,检测任何文件变动.但这样也有缺点,
就是被打开的文件不变就没法检测了.
大家都讨论都很多,个人认为API HOOK 无法达到要求,像各位所说的,即时性的东西,打开后就跟进程没任何关联了,再去找也找不到任何珠丝马迹...