macwang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2010-01-30
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
阅读:1864回复:5

新手问题: 怎样从processid 获得全路径?

楼主#
更多 发布于:2007-07-18 20:47
  filemon中有段代码,不过好象是获得进程名,长度只有16字节。

 if( ProcessNameOffset ) {      

        curproc = PsGetCurrentProcess();
        nameptr   = (PCHAR) curproc + ProcessNameOffset;        
        strncpy( ProcessName, nameptr, NT_PROCNAMELEN-1 );
        ProcessName[NT_PROCNAMELEN-1] = 0;
#if defined(_IA64_)
        sprintf( ProcessName + strlen(ProcessName), ":%I64d", PsGetCurrentProcessId());
#else
        sprintf( ProcessName + strlen(ProcessName), ":%d", PsGetCurrentProcessId());
#endif

    } else {

        strcpy( ProcessName, "???" );
    }
macwang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2010-01-30
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-07-19 17:58
弄了这段代码:

/////////////////////////////
#define BASE_PROCESS_PEB_OFFSET     0x01B0
#define BASE_PEB_PROCESS_PARAMETER_OFFSET  0x0010
#define BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME 0x003C
#define W2003_BASE_PROCESS_PEB_OFFSET   0x0190

PCWSTR FsdGetProcessFullName()
{
 ULONG dwAddress,uMajorVersion, uMinorVersion, uBuildNumber;

 if(KeGetCurrentIrql() != PASSIVE_LEVEL)
  return NULL;
 
 PsGetVersion(&uMajorVersion, &uMinorVersion, &uBuildNumber, NULL);

 dwAddress = (ULONG)PsGetCurrentProcess();

 if (dwAddress<10) return NULL;  


 if(dwAddress == 0 || dwAddress == 0xFFFFFFFF)
  return NULL;

 //目前只支持Win 2000/xp/2003
 if( (uMajorVersion < 5) || (uMinorVersion > 2 ) )
  return NULL;

 //取得PEB,不同平台的位置是不同的。
 if( (uMajorVersion == 5) && (uMinorVersion < 2) )
  dwAddress += BASE_PROCESS_PEB_OFFSET;
 else
  dwAddress += W2003_BASE_PROCESS_PEB_OFFSET;
 
 if((dwAddress = *(ULONG*)dwAddress) == 0) return NULL;
 // 通过peb取得RTL_USER_PROCESS_PARAMETERS
 dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
 if((dwAddress = *(ULONG*)dwAddress) == 0) return NULL;
 
 //在RTL_USER_PROCESS_PARAMETERS->ImagePathName保存了路径,偏移为38,
 dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
 if((dwAddress = *(ULONG*)dwAddress) == 0) return NULL;

 return (PCWSTR)dwAddress;
}


可以正常工作一会,可是为什么有的时候会蓝屏呢?
另外上面的是硬编码,兼容性差,有没有更好的方法?
sssslin
驱动牛犊
驱动牛犊
  • 注册日期2007-06-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分260分
  • 威望27点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-07-19 18:01
可以给我一份IFS DDK吗?
现在很着急要
ProPlayboy
驱动大牛
驱动大牛
  • 注册日期2005-07-07
  • 最后登录2022-02-15
  • 粉丝0
  • 关注0
  • 积分1016分
  • 威望811点
  • 贡献值0点
  • 好评度719点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-07-19 18:40
人不靓仔心灵美,版头不正红花仔!
macwang
驱动牛犊
驱动牛犊
  • 注册日期2007-06-24
  • 最后登录2010-01-30
  • 粉丝0
  • 关注0
  • 积分100分
  • 威望11点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-07-20 09:22
这么大怎么给你啊,电驴有down的
lovehhy
驱动小牛
驱动小牛
  • 注册日期2007-09-17
  • 最后登录2010-09-17
  • 粉丝0
  • 关注0
  • 积分1028分
  • 威望244点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-09-21 14:28
上面的是硬编码的,不同的系统是不同的
游客

返回顶部