/**************************************************************
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 *************************************************************/

#include "macros.h"
#ifdef _MSC_VER
#pragma warning(push,1) // disable warnings within system headers
#endif
#include <psapi.h>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
#include <tlhelp32.h>

IMPLEMENT_THUNK( psapi, WINDOWS, DWORD, WINAPI, GetModuleFileNameExA, (HANDLE hProcess, HMODULE hModule, LPSTR lpFileName, DWORD nSize ) )
{
	DWORD	dwProcessId = 0;
	DWORD	dwResult = 0;

	if ( !hProcess || hProcess == GetCurrentProcess() || GetCurrentProcessId() == (dwProcessId = GetProcessId( hProcess )) )
		return GetModuleFileNameA( hModule, lpFileName, nSize );

	HANDLE	hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );

	if ( IsValidHandle( hSnapshot ) )
	{
		MODULEENTRY32	me;

		me.dwSize = sizeof(me);
		if ( Module32First( hSnapshot, &me ) )
		{
			BOOL	fFound = FALSE;

			if ( NULL == hModule )
				fFound = TRUE;
			else do
			{
				fFound = (me.hModule == hModule);
			} while ( !fFound && Module32Next( hSnapshot, &me ) );

			if ( fFound )
			{
				dwResult = _tcslen( me.szExePath );

				if ( dwResult > nSize && nSize > 0 )
					lpFileName[nSize -1] = 0;

				_tcsncpy( lpFileName, me.szExePath, nSize );
			}
		}

		CloseHandle( hSnapshot );
	}

	return dwResult;
}
