#include #include #include "global.h" #include "..\DynamicLink\serverblock.h" #include "..\ClientChannel\channel.h" #include "DynamicLink.h" #include "utilities.h" BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad) { switch(fdwReason) { case DLL_PROCESS_ATTACH: hin = hinstDLL; EmptyCleanString = (CLEAN_STRING) rmalloc( sizeof(int) + 1); EmptyCleanString->length = 0; break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return(TRUE); } RESOURCEAPI CLEAN_BOOL PassCommandLine(CLEAN_STRING s) { HANDLE hLocalServerReady; HANDLE hGlobalServerReady; HANDLE hLocalClientReady; HANDLE hFileMapping; char *b; // 1. only to be called for non-first instance of dynamic linker. // 2. zero-terminated string. hLocalServerReady = CreateEvent( NULL, FALSE, FALSE, LOCAL_SERVER_READY_NAME); if( hLocalServerReady == NULL ) { error(); msg( "FirstInstanceOfServer: hLocalServerReady" ); ExitProcess(-1); } hGlobalServerReady = CreateEvent( NULL, FALSE, TRUE, GLOBAL_SERVER_READY_NAME); if( hGlobalServerReady == NULL ) { error(); msg( "FirstInstanceOfServer: hGlobalServerReady" ); ExitProcess(-1); } hLocalClientReady = CreateEvent( NULL, FALSE, FALSE, LOCAL_CLIENT_READY_NAME); if( hLocalClientReady == NULL ) { error(); msg( "FirstInstanceOfServer: hLocalClientReady" ); ExitProcess(-1); } // Open buffer hFileMapping = CreateFileMapping( (HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,MESSAGE_SIZE,GLOBAL_BUFFER_NAME); if( hFileMapping == NULL ) { error(); msg( "FirstInstanceOfServer: hFileMapping" ); ExitProcess(-1); } b = (char *) MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, MESSAGE_SIZE); if( b == NULL ) { error(); msg( "FirstInstanceOfServer: MapViewOfFile" ); ExitProcess(-1); } // Communicate with server WaitForSingleObject( hGlobalServerReady, INFINITE ); if( s->length + sizeof(DWORD) + GLOBAL_BUFFER_START > MESSAGE_SIZE ) { msg("PassCommandLine: command line too long"); ExitProcess(-1); } *((DWORD *) (b + GLOBAL_BUFFER_START)) = UNKNOWN_CLIENT_ID; // rsprintf( (b + sizeof(DWORD) + GLOBAL_BUFFER_START), "AddClient\n%s\n\n", GetCommandLine() ); rsprintf( (b + sizeof(DWORD) + GLOBAL_BUFFER_START), "MessageFromSecondOrLaterLinker\n%s\n\n", s->characters ); #ifdef DEBUG msg( (b + sizeof(DWORD) + GLOBAL_BUFFER_START) ); #endif // Send to server SetEvent( hLocalClientReady ); // Wait for server to process request WaitForSingleObject( hLocalServerReady, INFINITE ); // Quit instance, close all open handles UnmapViewOfFile( b ); CloseHandle( hFileMapping ); CloseHandle( hLocalClientReady ); CloseHandle( hGlobalServerReady ); CloseHandle( hLocalServerReady ); ExitProcess(-1); return( CLEAN_TRUE ); } RESOURCEAPI CLEAN_STRING DoReqS(CLEAN_STRING s) { msg( "DoReqS should not be called in Server" ); }