wildcatstar
驱动牛犊
驱动牛犊
  • 注册日期2006-06-23
  • 最后登录2010-05-20
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望31点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:1225回复:1

请问如何取当前进程的的全路径?

楼主#
更多 发布于:2008-04-20 23:39
我试了PEB的方法,不太好使,而且每个不同操作系统都不一样的。
有没有好使一点的办法?
我在论坛里找了一遍,又GOOGLE半天还是没找到啊

目前找的这种方法,取出来的全是
C

#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
#define W2003_BASE_PROCESS_PEB_OFFSET_SP1         0x01A0
#define VISTA_BASE_PROCESS_PEB_OFFSET               0x0188
PCWSTR GetProcessFullName()
{
  DWORD dwAddress;
  PCWSTR Temp=NULL;
  if(KeGetCurrentIrql() != PASSIVE_LEVEL)
  {
      return NULL;
  }

  __try
  {
      dwAddress = (DWORD)PsGetCurrentProcess();

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

      //Ŀǰֻ֧³ÖWin 2000/xp/2003/VISTA
      if( gGetDriverStruct()->MajorVersion < 5 ||
          gGetDriverStruct()->MinorVersion > 2 )
      {
          return NULL;
      }

      //&Egrave;&iexcl;&micro;&Atilde;PEB&pound;&not;&sup2;&raquo;&Iacute;&not;&AElig;&frac12;&Igrave;¨&micro;&Auml;&Icirc;&raquo;&Ouml;&Atilde;&Ecirc;&Ccedil;&sup2;&raquo;&Iacute;&not;&micro;&Auml;&iexcl;&pound;
      //
      //2000   0X0500       XP 0X0501
      //
      if( gGetDriverStruct()->MajorVersion == 5 && gGetDriverStruct()->MinorVersion < 2)
      {
  
          dwAddress += BASE_PROCESS_PEB_OFFSET;
      }
      //
      //2003   0X0502
      //
      if(gGetDriverStruct()->MajorVersion == 5 && gGetDriverStruct()->MinorVersion ==2)
      {
            dwAddress += W2003_BASE_PROCESS_PEB_OFFSET;
      }
      //
      //VISTA   0X0600
      //
      if(gGetDriverStruct()->MajorVersion == 6 && gGetDriverStruct()->MinorVersion ==0)
      {
            dwAddress += VISTA_BASE_PROCESS_PEB_OFFSET;
      }

      if((dwAddress = *(DWORD*)dwAddress) == 0)
      {
          return NULL;
      }

      //
      // &Iacute;¨&sup1;&yacute;peb&Egrave;&iexcl;&micro;&Atilde;RTL_USER_PROCESS_PARAMETERS
      //
      dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
      if((dwAddress = *(DWORD*)dwAddress) == 0)
      {
          return NULL;
      }
      //
      // &Ocirc;&Uacute;RTL_USER_PROCESS_PARAMETERS->ImagePathName±&pound;&acute;&aelig;&Aacute;&Euml;&Acirc;·&frac34;&para;&pound;&not;&AElig;&laquo;&Ograve;&AElig;&Icirc;&ordf;38,
      //
      dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
      if((dwAddress = *(DWORD*)dwAddress) == 0)
      {
          return NULL;
      }
  // [10/14/2006]
      Temp=(PCWSTR)dwAddress;
      if (wcslen(Temp)>4)
      {
              if (Temp[0]==L'\\'&&
                Temp[1]==L'?'&&
                Temp[2]==L'?'&&
                Temp[3]==L'\\')
          {
                dwAddress+=8;
          }
          if (Temp[0]==L'\\'&&
                Temp[1]==L'\\'&&
                Temp[2]==L'?'&&
                Temp[3]==L'\\')
          {
                dwAddress+=8;
          }
      }
  }
  __except (EXCEPTION_EXECUTE_HANDLER)
  {
        __try
        {
              if(gGetDriverStruct()->MajorVersion == 5 && gGetDriverStruct()->MinorVersion ==2)
              {dwAddress = (DWORD)PsGetCurrentProcess();
                  dwAddress += W2003_BASE_PROCESS_PEB_OFFSET_SP1;
                  if((dwAddress = *(DWORD*)dwAddress) == 0)
                  {
                    return NULL;
                  }

                  //
                  // &Iacute;¨&sup1;&yacute;peb&Egrave;&iexcl;&micro;&Atilde;RTL_USER_PROCESS_PARAMETERS
                  //
                  dwAddress += BASE_PEB_PROCESS_PARAMETER_OFFSET;
                  if((dwAddress = *(DWORD*)dwAddress) == 0)
                  {
                    return NULL;
                  }
                  //
                  // &Ocirc;&Uacute;RTL_USER_PROCESS_PARAMETERS->ImagePathName±&pound;&acute;&aelig;&Aacute;&Euml;&Acirc;·&frac34;&para;&pound;&not;&AElig;&laquo;&Ograve;&AElig;&Icirc;&ordf;38,
                  //
                  dwAddress += BASE_PROCESS_PARAMETER_FULL_IMAGE_NAME;
                  if((dwAddress = *(DWORD*)dwAddress) == 0)
                  {
                    return NULL;
                  }
                  // [10/14/2006]
                  Temp=(PCWSTR)dwAddress;
                  if (wcslen(Temp)>4)
                  {
                      if (Temp[0]==L'\\'&&
                        Temp[1]==L'?'&&
                        Temp[2]==L'?'&&
                        Temp[3]==L'\\')
                    {
                        dwAddress+=8;
                    }
                    if (Temp[0]==L'\\'&&
                        Temp[1]==L'\\'&&
                        Temp[2]==L'?'&&
                        Temp[3]==L'\\')
                    {
                        dwAddress+=8;
                    }
                  }
                  return (PCWSTR)dwAddress;
              }
        }
        __except (EXCEPTION_EXECUTE_HANDLER)
        {              
        }
    return 0;
  }
  return (PCWSTR)dwAddress;
}
wildcatstar
驱动牛犊
驱动牛犊
  • 注册日期2006-06-23
  • 最后登录2010-05-20
  • 粉丝0
  • 关注0
  • 积分191分
  • 威望31点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-04-22 12:51
好冷清啊
游客

返回顶部