Using ::CreateToolhelp32Snapshot
I think you don't need to check for errors twice, and that will make your code cleaner.

bool MyClass::IsCorrectPath (const DWORD dwPid, const std::string &amp;strPath) const
{
    DWORD dwError = 0 ;
    NormalHandle hModSnap ; // RAII wrapper for HANDLE
    ::SetLastError (0) ;

    do {   
        // repeat while the expected error occurs
        hModSnap = ::CreateToolhelp32Snapshot (TH32CS_SNAPMODULE, dwPid) ;
        dwError == ::GetLastError () ;
    } while ((hModSnap == INVALID_HANDLE_VALUE) &amp;&amp; (dwError == ERROR_BAD_LENGTH)) ;

    if (dwError == ERROR_PARTIAL_COPY) {
         // This occurs when trying to read a 64 bit process from a 32 bit process.
         return false ;
    }

    if (hModSnap == INVALID_HANDLE_VALUE) {
        ThrowFunctionFailure ("MyClass::IsCorrectPath ()", 
            "::CreateToolhelp32Snapshot ()", ::GetLastError ()) ;
    }

    MODULEENTRY32 me ;
    me.dwSize = sizeof (me) ;
    if (::Module32First (hModSnap.Get (), &amp;me) == FALSE) {
        ThrowFunctionFailure ("MyClass::IsCorrectPath ()", "::Module32First ()", ::GetLastError ()) ;
    }

    return (::_stricmp (strPath.data (), me.szExePath) == 0) ;
}


So, instead of checking for all errors in every step of the loop, only check for the expected error. 

Once you're out of the loop, it means you received a different error or you have a valid handle. Check if success and continue.

Does that make sense to you?

edit: Changed dwError == ERROR_SUCCESS to dModSnap == INVALID_HANDLE_VALUE.