
#define ALLOC_INTERFACEH
#include "interface.h"

#include "global.h"
#include "utilities.h"
		
void MakeNonUnique(int val, int *fst, int *snd)
{
	*fst = val;
	*snd = val;
}

HINSTANCE Mouse = NULL;

void SetCurrentLibrary(
	CLEAN_STRING clstring, 
	CLEAN_BOOL *result, 
	DWORD *lib) {

	HINSTANCE library = NULL;

	//library = LoadLibraryEx( cstring(clstring), NULL, DONT_RESOLVE_DLL_REFERENCES );

	library = LoadLibrary( cstring(clstring) );
	if( library == NULL) {
		error(); 
		msg( cstring(clstring) );
		msg("SetCurrentLibrary: library not loaded");
		ExitProcess(-1);
	}

	*result = CLEAN_TRUE;
	*lib = (DWORD) library;

	Mouse = library;
}

int CloseLibrary(DWORD lib)
{
	return 1;
}

void GetFuncAddress (CLEAN_STRING clstring, 
					 DWORD base_of_client_dll, 
					 DWORD lib0, 
					 
					 DWORD *address, 
					 DWORD *lib1) {
	
	FARPROC p = NULL;
	static i = 0;

//	if( lib0 == NULL ) {
//		msg("GetFuncAddress: library not loaded");
//		ExitProcess(-1);
//	}

	/*
	** Compute the client address of the DLL-object  
	*/
//	*address = ((int) GetProcAddress( lib0, cstring(clstring)) );

//	msg( cstring(clstring) );

	if( GetProcAddress( (HMODULE) lib0, cstring(clstring) ) == NULL ) {
		msg( "GetFuncAddress: foutje" );
 		error();
	}

// voor nt:
	(*address)  = ((int) GetProcAddress( lib0, cstring(clstring) )
				- lib0) + base_of_client_dll;

//	*address = GetProcAddress(  /*(HMODULE) lib0 */ Mouse , cstring(clstring) );

//	if( i == 0) {
//		sprintf(s, "%0x", *address);
//		msg( s );
//
//		i = i + 1;
//	}

	*lib1 = lib0;
}

CLEAN_BOOL GenerateObjectFileOld(CLEAN_STRING cg, CLEAN_STRING CmdLine)
{
	PROCESS_INFORMATION pi;
	DWORD dwExitCode;

	STARTUPINFO si;
	
	BOOL fSuccess;					// Process information

	// 
	char *cmdline;
	CLEAN_BOOL result;

	int i;

	// Set once a path to the codegenerator (cg)
	char *cg_path = (char *) NULL;

	result = CLEAN_FALSE;

/*
	cg_path = (char *) rmalloc ((cg->length) + 1);
	rsncopy (cg_path,cg->characters, cg->length);
	cg_path[cg->length] = 0;


    // convert commandline
	cmdline = (char *) rmalloc ((CmdLine->length) + 1);
	rsncopy (cmdline,CmdLine->characters, CmdLine->length);
	cmdline[CmdLine->length] = 0;
*/

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);

	/*
	si.lpTitle = NULL; //dir;
	si.wShowWindow = SW_SHOWNORMAL;
	si.dwFlags = STARTF_USESHOWWINDOW;
	*/

//	while(1);

	// Create new process
	fSuccess = CreateProcess( cg->characters, //cg_path,	// Executable
							  CmdLine->characters, //cmdline,	// Commandline
							  NULL,					// Standard security (Proces)
						      NULL,					// Standard security (Thread)
							  FALSE,				// No handle inherited by child
							  0,					// Plain process
							  NULL,					// Environment of parent
							  NULL, //dir,					// Current directory
							   &si,					// Startup information
								&pi);				// Process information

	if (fSuccess) {
		CloseHandle(pi.hThread);

		WaitForSingleObject(pi.hProcess, INFINITE);

		GetExitCodeProcess(pi.hProcess, &dwExitCode);

		CloseHandle(pi.hProcess);


		result = (dwExitCode == 0) ? CLEAN_TRUE : CLEAN_FALSE;
	} // if
	else 
		error();

//	rfree(cg_path);
//	rfree(cmdline);

	return( result );
}
