首页
社区
课程
招聘
[求助]QueryFullProcessImageName无法获取进程路径
发表于: 2014-5-23 20:05 11160

[求助]QueryFullProcessImageName无法获取进程路径

2014-5-23 20:05
11160
用Tool Help函数遍历出进程后想获取进程路径。
但是通过OpenProcess()打开进程获得进程句柄后调用QueryFullProcessImageName()来获取进程路径却无法获取。
OpenProcess()给了进程权限PROCESS_QUERY_INFORMATION或者PROCESS_QUERY_LIMITED_INFORMATION
每次只能得到services.exe、conhost.exe、iFrmewrk.exe这三个进程。其他的都无法获取。这是怎么回事儿?
操作系统Win7X64

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
楼主,能否将 北风网 从C++起步到MFC实战VC++软件工程师高端培训 分享我一份,谢谢啦

这个帖子的: http://bbs.pediy.com/showthread.php?t=187109

我的QQ邮箱是: 2336741536@qq.com
2014-5-25 16:40
0
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
那套教程看了看也就删掉了我也没有转存。。。
不过我还是推荐你直接看 WIndow核心编程比较好。
2014-5-25 18:49
0
雪    币: 12
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢,再过段时间就开始学习啦,书已经买了,到时间一起看
2014-5-25 19:48
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
1.完整性级别够么?
2.换EnumProcesses试试
3.先用PROCESS_ALL_ACCESS权限看看行不行然后按MSDN减少权限
4.试下GetProcessImageFileName
5.权限是不是应该是PROCESS_QUERY_INFORMATION | PROCESS_VM_READ

可以参考下
http://www.svnchina.com/svn/taskkill/MainEngine/Win32Project1/Process_Operation.cpp
访问需在www.svnchina.com注册下
2014-5-25 20:16
0
雪    币: 44
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
你确定进程句柄已经打开,或者你当前的进程是否有足够权限
2014-5-25 20:43
0
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
1. 足够
2. 没试过
3. 刚开始使用的就是这个权限
4. 可以获取成功
5. 这样子我也试过了还是没法获取到进程路径。

不过已经4。的函数获取到了我也懒得管了。。。。
2014-5-25 20:57
0
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
两者都确定。
2014-5-25 20:58
0
雪    币: 52
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
分享一个我写的获取进程路径的函数

DWORD WINAPI PsGetImageFileNameW(DWORD dwPid, LPWSTR lpImageFileName, DWORD nSize)
{
    HANDLE hProc = NULL;
    DWORD dwCopied = 0;
    DWORD dwLastError = 0;

    do
    {
        static OSVERSIONINFOW osvi = {sizeof(OSVERSIONINFOW)};
        if (osvi.dwMajorVersion == 0)
        {
            GetVersionExW(&osvi);
        }

        //
        //NT6以上的系统优先使用此方法,32、64、低权限通杀
        //
        if (osvi.dwMajorVersion >= 6)
        {
            static lpfnNtQuerySystemInformation NtQuerySystemInformationX = NULL;
            if (NtQuerySystemInformationX == NULL)
            {
                NtQuerySystemInformationX = (lpfnNtQuerySystemInformation)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "NtQuerySystemInformation");
            }
            
            PVOID buffer = malloc(0x100);
            SYSTEM_PROCESS_IMAGE_NAME_INFORMATION info;
            info.ProcessId = (HANDLE)dwPid;
            info.ImageName.Length = 0;
            info.ImageName.MaximumLength = (USHORT)0x100;
            info.ImageName.Buffer = (PWSTR)buffer;

            NTSTATUS status = NtQuerySystemInformationX((SYSTEM_INFORMATION_CLASS)88, &info, sizeof(info), NULL);
            if (status == 0xC0000004L)
            {
                free(buffer);
                buffer = malloc(info.ImageName.MaximumLength);
                info.ImageName.Buffer = (PWSTR)buffer;
                status = NtQuerySystemInformationX((SYSTEM_INFORMATION_CLASS)88, &info, sizeof(info), NULL);
            }
            if (NT_SUCCESS(status))
            {
                wchar_t devPath[MAX_PATH] = {0};
                wcsncpy_s(devPath, MAX_PATH, info.ImageName.Buffer, info.ImageName.Length / 2);
                dwCopied = FsDevicePathToFilePathW(devPath, lpImageFileName, nSize);
            }

            free(buffer);

            if (dwCopied > 0)
            {
                break;
            }
        }
        //
        //如果是NT5或者NT6但上述代码执行失败,则用下面这种对权限有要求的方法
        //
        hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, FALSE, dwPid);
        if (hProc == NULL)
        {
            dwLastError = GetLastError();
            break;
        }

        dwCopied = GetModuleFileNameExW(hProc, NULL, lpImageFileName, nSize);
        if (dwCopied > 0)
        {
            dwLastError = GetLastError();
            break;
        }
        //兼容64 & 2k
        if (dwCopied == 0 && GetLastError() == 299)
        {
            wchar_t psapi[MAX_PATH];
            GetSystemDirectoryW(psapi, MAX_PATH);
            PathAppendW(psapi, L"psapi.dll");
            HMODULE hMod = LoadLibraryW(psapi);
            if (hMod == NULL)
            {   
                dwLastError = GetLastError();
                break;
            }

            typedef DWORD (WINAPI *PGetProcessImageFileNameW)(HANDLE, LPWSTR, DWORD);
            PGetProcessImageFileNameW pFun = (PGetProcessImageFileNameW)GetProcAddress(hMod, "GetProcessImageFileNameW");
            if (pFun == NULL)
            {
                dwLastError = GetLastError();
                FreeLibrary(hMod);
                break;
            }

            dwCopied = pFun(hProc, lpImageFileName, nSize);
            if (dwCopied > 0)
            {
                dwCopied = FsDevicePathToFilePathW(lpImageFileName, lpImageFileName, nSize);
                dwLastError = GetLastError();
            }
            FreeLibrary(hMod);
        }

    } while (FALSE);

    CloseHandle(hProc);
    SetLastError(dwLastError);

    return dwCopied;
}
2014-5-26 14:20
0
雪    币: 244
活跃值: (454)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
..你这个高端了点。用不到。。。
2014-5-26 15:46
0
游客
登录 | 注册 方可回帖
返回
//