| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 | 
							- #include "main.h"
 
- #include "gen.h"
 
- #include <vector>
 
- #include "../nu/AutoWide.h"
 
- #include "..\WAT\wa_logger.h"
 
- std::vector<winampGeneralPurposePlugin*> gen_plugins;
 
- extern LARGE_INTEGER freq;
 
- int got_ml = 0;
 
- typedef struct _PLUGINORDER
 
- {
 
- 	LPCWSTR	name;
 
- 	bool	found;
 
- } PLUGINORDER;
 
- static PLUGINORDER preload[] =
 
- {
 
- 	{ L"gen_crasher.dll", false },  //
 
- 	{ L"gen_ff.dll",      false },  //
 
- 	{ L"gen_hotkeys.dll", false },  //
 
- 	{ L"gen_tray.dll",    false },  //
 
- 	{ L"gen_ml.dll",      false },  //
 
- 	{ L"gen_jumpex.dll",  false },
 
- };
 
- void LoadGenPlugin(const wchar_t* filename)
 
- {
 
- 	wchar_t file[MAX_PATH] = { 0 };
 
- 	PathCombineW(file, PLUGINDIR, filename);
 
- 	if (!wa::files::file_exists(file))
 
- 	{
 
- 		wsprintfW( _log_message_w, L"The plugin '%s' is not found in the \"Plugins\" folder!", filename );
 
- 		LOG_ERROR( _log_message_w );
 
- 		return;
 
- 	}
 
- 	HMODULE hLib = LoadLibraryW(file);
 
- 	if (hLib == NULL)
 
- 	{
 
- 		DWORD l_error_code = ::GetLastError();
 
- 		wsprintfW( _log_message_w, L"Error when loading the plugin '%s'! Error code : %d!", filename, l_error_code );
 
- 		LOG_ERROR( _log_message_w );
 
- 		return;
 
- 	}
 
- 	winampGeneralPurposePlugin* (*pr)();
 
- 	pr = (winampGeneralPurposePlugin * (__cdecl*)(void)) GetProcAddress(hLib, "winampGetGeneralPurposePlugin");
 
- 	if ( pr == NULL )
 
- 	{
 
- 		wsprintfW( _log_message_w, L"No entry point found for the plugin '%s'!", filename );
 
- 		LOG_ERROR( _log_message_w );
 
- 		FreeModule(hLib);
 
- 		return;
 
- 	}
 
- 	winampGeneralPurposePlugin* plugin = pr();
 
- 	if ( plugin && (plugin->version == GPPHDR_VER || plugin->version == GPPHDR_VER_U) )
 
- 	{
 
- 		wsprintfW( _log_message_w, L"The plugin '%s' is correctly loaded!", filename );
 
- 		LOG_DEBUG( _log_message_w );
 
- 		if ( g_safeMode )
 
- 		{
 
- 			char desc[128] = { 0 };
 
- 			lstrcpynA(desc, plugin->description, sizeof(desc));
 
- 			if ( desc[0] && !memcmp(desc, "nullsoft(", 9) )
 
- 			{
 
- 				char* p = strrchr(desc, ')');
 
- 				if ( p )
 
- 				{
 
- 					*p = 0;
 
- 					if ( _wcsicmp(filename, AutoWide(desc + 9)) )
 
- 					{
 
- 						FreeModule(hLib);
 
- 						return;
 
- 					}
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				// TODO need to look into making this into a controlled
 
- 				//		list or something like that without the need for
 
- 				//		a client update so it's possible for user to fix
 
- 				//
 
- 				// for some plug-ins, we sadly need to leave them loaded
 
- 				// otherwise they'll just cause Winamp to keep crashing!
 
- 				if ( _wcsicmp(PathFindFileNameW(filename), L"gen_Wake_up_call.dll") )
 
- 				{
 
- 					FreeModule(hLib);
 
- 				}
 
- 				return;
 
- 			}
 
- 		}
 
- 		plugin->hwndParent   = hMainWindow;
 
- 		plugin->hDllInstance = hLib;
 
- 		if ( plugin->init() == GEN_INIT_SUCCESS )
 
- 		{
 
- 			wsprintfW( _log_message_w, L"The plugin '%s' is initialized!", filename );
 
- 			LOG_DEBUG( _log_message_w );
 
- 			if ( !_wcsicmp(filename, L"gen_ml.dll") )
 
- 				got_ml = 1;
 
- 			gen_plugins.push_back(plugin);
 
- 		}
 
- 		else
 
- 		{
 
- 			wsprintfW( _log_message_w, L"An error occurs when initializing the plugin '%s'!", filename );
 
- 			LOG_ERROR( _log_message_w );
 
- 			
 
- 			
 
- 			FreeModule( hLib );
 
- 		}
 
- 	}
 
- 	else
 
- 	{
 
- 		wsprintfW( _log_message_w, L"Either the plugin '%s' can't be loaded, either its version is incorrect!", filename );
 
- 		LOG_ERROR( _log_message_w );
 
- 		FreeModule( hLib );
 
- 	}
 
- }
 
- void load_genplugins()
 
- {
 
- 	int i = 0, count = sizeof(preload) / sizeof(PLUGINORDER);
 
- 	for ( ; i < count; i++ )
 
- 		LoadGenPlugin(preload[i].name);
 
- 	wchar_t dirstr[MAX_PATH] = { 0 };
 
- 	WIN32_FIND_DATAW d = { 0 };
 
- 	PathCombineW(dirstr, PLUGINDIR, L"GEN_*.DLL");
 
- 	HANDLE h = FindFirstFileW(dirstr, &d);
 
- 	if ( h != INVALID_HANDLE_VALUE )
 
- 	{
 
- 		do
 
- 		{
 
- 			for ( i = 0; i < count && (preload[i].found || lstrcmpiW(preload[i].name, d.cFileName)); i++ );
 
- 			if ( i == count )
 
- 				LoadGenPlugin(d.cFileName);
 
- 			else
 
- 				preload[i].found = true;
 
- 		} while ( FindNextFileW(h, &d) );
 
- 		FindClose(h);
 
- 	}
 
- }
 
- void unload_genplugins()
 
- {
 
- 	size_t x = gen_plugins.size();
 
- 	while ( x-- )
 
- 	{
 
- 		if ( gen_plugins[x] )
 
- 		{
 
- 			wchar_t filename[MAX_PATH] = { 0 };
 
- 			if ( !(config_no_visseh & 4) )
 
- 			{
 
- 				try
 
- 				{
 
- 					if ( gen_plugins[x]->quit )
 
- 						gen_plugins[x]->quit();
 
- 				}
 
- 				catch ( ... )
 
- 				{
 
- 				}
 
- 			}
 
- 			else
 
- 			{
 
- 				if ( gen_plugins[x]->quit )
 
- 					gen_plugins[x]->quit();
 
- 			}
 
- 			gen_plugins[x] = 0;
 
- 		}
 
- 	}
 
- 	try
 
- 	{
 
- 		gen_plugins.clear();
 
- 	}
 
- 	catch ( ... )
 
- 	{
 
- 	}
 
- }
 
 
  |