获取进程全路径

VB 调用 WindowsAPI 函数GetModuleFileName、 GetProcessImageFileName 和QueryFullProcessImageName获取进程文件路径 Windows编程中,需要获取一个已打开窗口程序的完整路径,以便下次用ShellExecute 函数直接打开。 能实现这一目标的Windows API函数有3个: GetModuleFileName、GetProcessImageFileName 和QueryFullProcessImageName。网上的API函数手册大多只能查到第一个,后面两个只能百度查找调用方法,然而却都讲得不清不楚。... 阅读详情
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;
}

Windows内核下获取进程全路径的方法 阅读详情

相关推荐

通过进程PID获取可执行文件全路径,提取路径中的文件名,提取文件名后缀、提取全路径中的目录、枚举进程加载模块dll

需要用到如下API 32位的程序调用此API同样能获取到64位进程的可执行文件路径。下面是微软在文档中的说明,由于该API很简单就不再复述了hProcess [in]A handle to the process. This handle must be created with the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right. For more information, see Proces

Think88666的博客 2582

wcscat_s、_tcscat_s异常

errno_t strcat_s( char *strDestination, size_t sizeInBytes, const char *strSource ); errno_t wcscat_s( wchar_t *strDestination, size_t sizeInWords, const wchar_t *strSource ); -...

u013218636的博客 2221

获取应用程序全路径(进程全路径)

qt代码,可以获取运行的程序的全路径。一般人搜索关键字不对,搜进程全路径才能百度到相关的代码。资源分不多,感谢支持。

C++字符串--窄字节宽字节--Cstring

a=b 返回值0a>b 返回值>0a

phenixyf的专栏 1640

内核中获取进程全路径

#include<ntifs.h> #include<ntddk.h> #include <ntstrsafe.h> #define MAX_PATH 260 NTSTATUS NTAPI ZwQueryInformationProcess( __in HANDLE ProcessHandle, __in PROCESSINFOCLASS ProcessInformationClass, __out_bcount(ProcessInformationLength) P

qq_41490873的博客 653

linux 内核获取进程全路径,linux内核获取进程全路径3种方法

本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性。/*----------------------------------------------------------------------------------------------------------------------------*/在linux内核获取进程全路径方式类似Windows内核...

weixin_36229423的博客 399

C++ 获取进程所在目录(全路径

定位某个进程(比如 QQMusic.exe)所在的全路径,下面是代码: string GetProcessInfo(HANDLE hProcess,char* processName) { PROCESSENTRY32* pinfo = new PROCESSENTRY32; //进程信息 (pinfo->dwSize = sizeof(PROCESSENTRY32);) MODULEE...

LYSM 5992

linux 内核获取进程全路径,linux内核获取进程全路径3种方法【转】

本文档的CopyRight归jonathan所有,可自由转载,转载时请保持文档的完整性。/*----------------------------------------------------------------------------------------------------------------------------*/在linux内核获取进程全路径方式类似Windows内核...

weixin_42511714的博客 462

驱动获取进程全路径分析

用于指向一个结构体中关于进程参数的字段。在 Windows 内核中,每个进程都有一个。这些偏移量的定义允许开发者在内核驱动程序中灵活地定位并操作这些重要信息。结构体,它包含了与进程相关的各种信息。结构体中与进程映像路径(即进程可执行文件的路径)相关的字段。结构体中的特定成员。在内核模式中,如果你需要获取一个进程的。通常,通过结构体的偏移量来访问进程的参数和映像路径。结构体中获取进程的启动参数(如命令行参数)相关的数据。可以用来获取进程加载的可执行文件的路径。或其他相关结构体中,结构体中的相关字段。

lydstory123的专栏 429

如何获取进程/目标对象的全路径

PID->eprocess->KeStackAttachProcess->ZwQueryInformationProcess->ProcessImageFileName->ZwCreateFile ->ObReferenceObjectByHandle->RtlVolumeDeviceToDosName ->ZwQueryInformationFile 如何获取目标对象的全路径

zhuhuibeishadiao 2048

在驱动中获取进程全路径

在驱动中获取进程全路径 系统具备: WinDbg, Windows Symbol Packages (http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx下载) 取得EPROCESS(PsGetCurrentProcess();) 通过偏移量取得PEB, (Address + BASE_PROCESS_P

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 717

_tcscat_s遇到的问题

在改BUG的时候,使用了_tcscat_s,而工程竟然跑不起来了,当时使用如下: _tcscat_s(log_name.GetBuffer(), MAX_PATH, _T("log\\import.log")); 问题就出在了log_name.GetBuffer(), 把内存的长度定了,在连接就写出内存了,然后的情况就清楚了。。。

jjchao的专栏 3980

_tcscat_s函数的头文件

_tcscat_s函数的头文件:#include

Shmily_ap的专栏 4725

_tcscat

用 _tcscat替代 strcat或 lstrcat

eickandy的专栏 6450

C++安全函数之strcat_s

1.必须包含的头文件:<string.h> 2.函数申明: errno_t strcat_s( char *strDestination, size_t numberOfElements, const char *strSource ); 3.参数介绍 strDestination Null 终止的目标字符串缓冲区。 numberOfElements 目标字符串缓冲...

majalis_C的博客 2817

关于XP没有QueryFullProcessImageName的问题(in ProcessInfo)

解决了windows核心编程源代码中ProcessInfo里面的一个关于XP没有QueryFullProcessImageName的问题,:)

RFC2008的专栏 8937
上一篇: 使用UpdateResource让一个exe在退出时修改自己的资源
下一篇: WCHAR转CHAR
fengkuangfj
博客等级 码龄18年 11粉丝 87原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值