获取进程全路径

BOOL
	GetProcPath(
	__in	BOOL	bCurrentProc,
	__in	ULONG	ulPid,
	__inout LPTSTR	lpProcPath,
	__in	ULONG	ulProcPathBufLen
	)
{
	BOOL	bRet						= FALSE;

	HMODULE hModule						= NULL;
	HANDLE	hProc						= NULL;
	DWORD	dwProcPathLen				= 0;
	TCHAR	tchProcPathDev[MAX_PATH]	= {0};
	TCHAR	tchVolNameDev[MAX_PATH]		= {0};
	TCHAR	tchVolName[MAX_PATH]		= {0};


	__try
	{
		if (!lpProcPath || !ulProcPathBufLen || (!bCurrentProc && !ulPid))
		{
			printf("[GetProcPath] : input parameter error \n");
			__leave;
		}

		if (bCurrentProc)
		{
			if (!GetModuleFileName(NULL, lpProcPath, ulProcPathBufLen / sizeof(TCHAR)))
			{
				printf("[GetProcPath] : GetModuleFileName failed. (%d) \n", GetLastError());
				__leave;
			}

			bRet = TRUE;
			__leave;
		}

		hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ulPid);
		if (!hProc)
		{
			printf("[GetProcPath] : OpenProcess failed. (%d) \n", GetLastError());
			__leave;
		}

		hModule = LoadLibrary(_T("Kernel32.dll"));
		if (!hModule)
		{
			printf("[GetProcPath] : LoadLibrary failed. (%d) \n", GetLastError());
			__leave;
		}

		if (GetProcAddress(hModule, "QueryFullProcessImageNameA"))
		{
			dwProcPathLen = ulProcPathBufLen / sizeof(TCHAR);
			if (!QueryFullProcessImageName(hProc, 0, lpProcPath, &dwProcPathLen))
			{
				printf("[GetProcPath] : QueryFullProcessImageName failed. (%d) \n", GetLastError());
				__leave;
			}

			bRet = TRUE;
			__leave;
		}

		if (!GetProcessImageFileName(hProc, tchProcPathDev, MAX_PATH))
		{
			printf("[GetProcPath] : GetProcessImageFileName failed. (%d) \n", GetLastError());
			__leave;
		}

		_tcscat_s(tchVolName, MAX_PATH, _T("A:"));
		for (; *tchVolName <= _T('Z'); (*tchVolName)++)
		{
			memset(tchVolNameDev, 0, MAX_PATH * sizeof(TCHAR));
			if (!QueryDosDevice(tchVolName, tchVolNameDev, MAX_PATH))
			{
				if (GetLastError() == 2)
					continue;
				else
				{
					printf("[GetProcPath] : QueryDosDevice failed. (%d) \n", GetLastError());
					__leave;
				}
			}

			if (_tcsncmp(tchProcPathDev, tchVolNameDev, _tcslen(tchVolNameDev)) == 0)
			{
				bRet = TRUE;
				break;
			}
		}

		if (bRet)
		{
			_tcscat_s(lpProcPath, ulProcPathBufLen / sizeof(TCHAR), tchVolName);
			_tcscat_s(lpProcPath, ulProcPathBufLen / sizeof(TCHAR), tchProcPathDev + _tcslen(tchVolNameDev));
		}
	}
	__finally
	{
		if (hModule)
			FreeLibrary(hModule);

		if (hProc)
			CloseHandle(hProc);
	}

	return bRet;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值