能力值:
( LV2,RANK:10 )
|
-
-
2 楼
挂了 这么久,怎么连一个回帖的都没有,给点意见也好啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
你应该是想取取每个程序的启动目录吧。
工作目录 不明白具体是指什么。
如果是取启动目录,可以用下面的代码.
这个是Vegeta 发的。链接我找不着了。
#include <stdio.h>
#include <windows.h>
#include "PSAPI.H"
#pragma comment( lib, "PSAPI.LIB" )
int main(void)
{
DWORD processid[1024],needed,processcount,i;
HANDLE hProcess;
HMODULE hModule;
char path[MAX_PATH] = "",temp[256];
printf("ShowProcessPath with [Process Status API]\n\n");
EnumProcesses(processid, sizeof(processid), &needed);
processcount=needed/sizeof(DWORD);
for (i=0;i<processcount;i++)
{
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]);
if (hProcess)
{
EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
GetModuleFileNameEx(hProcess, hModule, path, sizeof(path));
GetShortPathName(path,path,256);
itoa(processid[i],temp,10);
printf("%s --- %s\n",path,temp);
}
else
printf("Failed!!!\n");
}
CloseHandle(hProcess);
CloseHandle(hModule);
itoa(processcount,temp,10);
printf("\nProcess Count:%s\n\n",temp);
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你所取得的是模块文件的目录名,不是进程的当前目录,不过还是要谢谢你。
找一快捷方式,看一下它的属性,可以看到一个叫“目标”,就是你的代码所取的路径;还有一个叫“起始位置”,就是进程刚刚运行时的当前目录,不过进程在运行过程中是可以进入到其它目录的,也就是就当前目录是可以改变的。
我又分析了一下Process Explorer,发现它在打开了\Device\PROCEXP111这个设备。
Process Explorer只有一个可执行文件,不知道它是怎么注册的这个驱动。好像是动态生成了一个叫PROCEXP111.SYS的驱动文件,不过我没找到它在那。
有没有人帮我分析分析啊!!
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
在DELPHI中有个paramstr(0)可以返回当前目录....
|
能力值:
( LV6,RANK:90 )
|
-
-
6 楼
以前总结的了,看对你有什么帮助.:
/***********************************************/
枚举当前进程的几种方法(总结)2007-09-11 00:51///1获取当前进程
#include "stdafx.h"
#include "windows.h"
#include "psapi.h"
#pragma comment(lib,"psapi.lib")
void main()
{
DWORD ProcessArray[256];
DWORD need;
DWORD proCount;
HMODULE ModArray[512];
DWORD modCount;
HANDLE hProcess;
WCHAR path[MAX_PATH];
memset(ProcessArray,0,sizeof(ProcessArray));
memset(ModArray,0,sizeof(ModArray));
memset(path,0,sizeof(path));
if(!EnumProcesses(ProcessArray,sizeof(ProcessArray),&need))
{
wprintf(_T("EnumProcess is falied!\r\n"));
return;
}
proCount=need/sizeof(DWORD);
for(DWORD i=0;i<proCount;i++)
{
hProcess=::OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,ProcessArray[i]);
if(hProcess)
{
EnumProcessModules(hProcess,ModArray,sizeof(ModArray),&need);
modCount=need/sizeof(DWORD);
for(DWORD j=0;j<modCount;j++)
{
GetModuleFileNameEx(hProcess,ModArray[j],path,sizeof(path));
wprintf(_T("pid=0x%XH Name=%s\r\n"),hProcess,path);
}
}
}
}
///2获取当前进程
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include "psapi.h"
#include "Tlhelp32.h"
#pragma comment(lib,"psapi.lib")
bool GetProcess();
int main()
{
if(!GetProcess())
{
wprintf(_T("GetProcess is falied!\r\n"));
}
getchar();
return 0;
}
bool GetProcess()
{
PROCESSENTRY32 proSnap;
MODULEENTRY32 modSnap;
proSnap.dwSize=sizeof(proSnap);
modSnap.dwSize=sizeof(modSnap);
bool probool=false;
bool modbool=false;
HANDLE proHandle=NULL;
HANDLE modHandle=NULL;
proHandle=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
probool=::Process32First(proHandle,&proSnap);
while(probool)
{
modHandle=::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,proSnap.th32ProcessID);
modbool=::Module32First(modHandle,&modSnap);
while(modbool)
{
wprintf(_T("PID=0x%XH ModID=0x%XH ModName=%s ModPath=%s\r\n"),proSnap.th32ProcessID,\
modSnap.th32ModuleID,modSnap.szModule,modSnap.szExePath);
modbool=::Module32Next(modHandle,&modSnap);
}
probool=::Process32Next(proHandle,&proSnap);
}
return true;
}
//枚举当前进程3
#include "stdafx.h"
#include "stdio.h"
#include "windows.h"
typedef struct _WTS_PROCESS_INFO {
DWORD SessionId;
DWORD ProcessId;
LPTSTR pProcessName;
PSID pUserSid;
} WTS_PROCESS_INFO, *PWTS_PROCESS_INFO;
typedef HANDLE (WINAPI* WTSOPENSERVER)(LPTSTR pServerName);
typedef BOOL (WINAPI* WTSENUMERATEPROCESSES)(HANDLE hServer,DWORD Reserved,DWORD Version,\
PWTS_PROCESS_INFO* ppProcessInfo,DWORD* pCount);
void main()
{
HMODULE hWtsApi32=LoadLibrary(_T("WTSAPI32.DLL"));
WTSOPENSERVER pWtsOpenServer=(WTSOPENSERVER)GetProcAddress(hWtsApi32,"WTSOpenServerA");
WTSENUMERATEPROCESSES wtsEnumProc=(WTSENUMERATEPROCESSES)GetProcAddress(hWtsApi32,"WTSEnumerateProcessesA");
WCHAR *szServerName=_T("YOURPCNAME");
HANDLE hServer=pWtsOpenServer((LPTSTR)szServerName);
PWTS_PROCESS_INFO pProcInfo;
DWORD dwCount=0;
if(!wtsEnumProc(hServer,0,1,&pProcInfo,&dwCount))
return;
for(DWORD i=0;i<dwCount;i++)
{
wprintf(_T("ProcID=0x%XH ProName=%S\r\n"),pProcInfo[i].ProcessId,pProcInfo[i].pProcessName);
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
非常感谢你列举了这么多种方法!可是这些方法所得到的路径还都是进程模块文件的目录名。都不是进程当前运行目录!
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
再顶一下
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
其实我也遇到了相同的问题,我也没有解决。而且我的情况是这个进程是我自己CreateProcess的,然后我有它的一个句柄,然后这个子进程会写一些文件,我想记录它写文件的工作目录,然后我也解决不了这个问题。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这个信息是保存在环境变量中罢?
|