VC++.进程路径

#include <Psapi.h>
CString DosPathToNt(IN TCHAR *szDosPath)
{
	CString ret;
	try
	{
		TCHAR szDriver[MAX_PATH] = { 0 };
		TCHAR szTemp[3] = { 0 };
		TCHAR szDevName[MAX_PATH] = { 0 };
		INT iTemp = 0;
		if (!szDosPath)
		{
			return ret;
		}
		if (GetLogicalDriveStrings(MAX_PATH * sizeof(TCHAR), szDriver))
		{
			//c : \ \0
			//d : \ \0
			//...
			//\0 \0 \0 \0
			for (DWORD i = 0; szDriver[i]; i += 4)
			{
				//跳过盘符A:  B: 
				if (!lstrcmpi(&(szDriver[i]), _T("A:\\")) || !lstrcmpi(&(szDriver[i]), _T("B:\\")))
					continue;
				szTemp[0] = szDriver[i];
				szTemp[1] = szDriver[i + 1];
				szTemp[2] = _T('\0');
				if (QueryDosDevice(szTemp, szDevName, MAX_PATH * sizeof(TCHAR))) //查询 Dos 设备名
				{
					iTemp = lstrlen(szDevName);
					if (0 == _tcsnicmp(szDosPath, szDevName, lstrlen(szDevName))) //命中
					{
						ret = szTemp; //复制驱动器
						ret += (szDosPath + iTemp); //复制路径
					}
				}
			}
		}
		else
		{
			ret = szDosPath;  
		}
	}
	catch (...)
	{
		OutputDebugStringA(__FUNCTION__);
	}
	return ret;
}
CString GetProcessPath(IN DWORD dwPid)
{
	CString ret;
	try
	{
		TCHAR szImagePath[MAX_PATH] = { 0 };
		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPid);
		if (hProcess)
		{
			if (GetProcessImageFileName(hProcess, szImagePath, MAX_PATH * sizeof(TCHAR)))
			{
				ret = DosPathToNt(szImagePath);
			}
			CloseHandle(hProcess);
		}
	}
	catch (...)
	{
		OutputDebugStringA(__FUNCTION__);
	}
	return ret;
}

int main()
{
	CString str = GetProcessPath(GetCurrentProcessId());

	return 0;
}
posted @ 2020-03-11 06:38  N.everever  阅读(186)  评论(0)    收藏  举报