0

最初のいくつかの簡単なコード スニペット:

m_hProcessHandle = ::OpenProcess((PROCESS_QUERY_INFORMATION | PROCESS_CREATE_THREAD | PROCESS_DUP_HANDLE | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION), FALSE, m_dwProcessIdentifier);
if (NULL != m_hProcessHandle)
{
    if (FALSE != ::OpenProcessToken(m_hProcessHandle, (TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_DUPLICATE), &m_hImpersonizationToken))
    {
        wchar_t wszFullExecutableFileName[MAX_PATH];
        if (0 == ::GetModuleBaseName(m_hProcessHandle, NULL, wszFullExecutableFileName, (sizeof(wszFullExecutableFileName)/sizeof(wchar_t))))
        {
            __DebugMessage(L"GetModuleBaseName() failed with GetLastError() = %d", ::GetLastError());
        }
        else
        {
            if (0 == ::GetModuleFileNameEx(m_hProcessHandle, NULL, wszFullExecutableFileName, (sizeof(wszFullExecutableFileName)/sizeof(wchar_t))))
            {
                __DebugMessage(L"GetModuleFileNameEx() failed with GetLastError() = %d", ::GetLastError());
            }
            else
            {
                m_strFullFileName = wszFullExecutableFileName;
            }
        }
    }
}

OpenProcess()OpenProcessToken ()と同様に有効なハンドルを返しますが、後続のGetModuleBaseName()およびGetModuleFileNameEx()関数を呼び出すと、 GetLastError() = 6 が返されます (ハンドルが無効です)。そのコードを Windows 7 で管理者として実行しています。

乾杯、ガンビーザボーグ

4

1 に答える 1