// // Create a memory-mapping to the Freetrack data. // It contains the tracking data, a handle to the main-window and the program-name of the Game! // // FT_EXPORT(bool) FTCreateMapping(void) { // // Memory-mapping already exists! // if ( pMemData != NULL ) { return true; } dbg_report("FTCreateMapping request (pMemData == NULL).\n"); // // A FileMapping is used to create 'shared memory' between the FTClient and the FTServer. // // Try to create a FileMapping to the Shared Memory. This is done to check if it's already there (what // may mean the face-tracker program is already running). // // If one already exists: close it and open the file-mapping to the existing one. // hFTMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 , sizeof( FTMemMap ), (LPCSTR) FT_MM_DATA ); if (hFTMemMap == NULL) { pMemData = NULL; return false; } pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_WRITE, 0, 0, sizeof( FTMemMap ) ); hFTMutex = CreateMutexA(NULL, false, FREETRACK_MUTEX); return true; }
// // Create a memory-mapping to the Freetrack data. // It contains the tracking data, a handle to the main-window and the program-name of the Game! // // bool FTCreateMapping() { bool bMappingExists = false; // // Memory-mapping already exists! // if ( pMemData != NULL ) { return true; } dbg_report("FTCreateMapping request (pMemData == NULL).\n"); // // A FileMapping is used to create 'shared memory' between the FTClient and the FTServer. // // Try to create a FileMapping to the Shared Memory. This is done to check if it's already there (what // may mean the face-tracker program is already running). // // If one already exists: close it and open the file-mapping to the existing one. // hFTMemMap = CreateFileMappingA( INVALID_HANDLE_VALUE , 00 , PAGE_READWRITE , 0 , sizeof( FTMemMap ), (LPCSTR) FT_MM_DATA ); if ( ( hFTMemMap != 0 ) && ( GetLastError() == ERROR_ALREADY_EXISTS ) ) { dbg_report("FTCreateMapping: Mapping already exists.\n"); bMappingExists = true; // So the server was (probably) already started! CloseHandle( hFTMemMap ); hFTMemMap = 0; } // // Create a new FileMapping, Read/Write access // hFTMemMap = OpenFileMappingA( FILE_MAP_WRITE , false , (LPCSTR) FT_MM_DATA ); if ( ( hFTMemMap != 0 ) ) { dbg_report("FTCreateMapping: Mapping opened.\n"); pMemData = (FTMemMap *) MapViewOfFile(hFTMemMap, FILE_MAP_WRITE, 0, 0, sizeof( FTMemMap ) ); hFTMutex = CreateMutexA(NULL, false, FREETRACK_MUTEX); } else { return false; } return true; }
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); switch (fdwReason) { case DLL_WINE_PREATTACH: return TRUE; case DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hinstDLL); dbg_flag = get_dbg_flag('w'); dbg_report("Attach request\n"); break; case DLL_PROCESS_DETACH: linuxtrack_shutdown(); break; } return TRUE; }
// // DllMain gets called, when the DLL is (un)loaded or a process attaches. // BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: #ifdef WIN64 dbg_report("\n= WIN64 =========================================================================================\n"); #else dbg_report("\n= WIN32 =========================================================================================\n"); #endif dbg_report("DllMain: (0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); dbg_report("DllMain: Attach request\n"); DisableThreadLibraryCalls(hinstDLL); break; case DLL_PROCESS_DETACH: dbg_report("DllMain: Detach\n"); dbg_report("DllMain: (0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved); dbg_report("==========================================================================================\n"); break; } return TRUE; }
extern "C" __declspec( dllexport ) char* FTProvider(void) { dbg_report("FTProvider request.\n"); return dllProvider; }
extern "C" __declspec( dllexport ) char* FTGetDllVersion(void) { dbg_report("FTGetDllVersion request.\n"); return dllVersion; }
// // For some mysterious reason, the previously existing function FTReportID has been changed to FTReportName, but with an integer as argument. // The Delphi-code from the FreeTrack repo suggest a char * as argument, so it cost me an afternoon to figure it out (and keep ArmA2 from crashing). // Thanks guys! // FT_EXPORT(void) FTReportName( int name ) { dbg_report("FTReportName request (ID = %d).\n", name); gameid = name; // They might have really passed the name here... but they didn't! return; }
FT_EXPORT(const char*) FTProvider(void) { dbg_report("FTProvider request.\n"); return dllProvider; }
FT_EXPORT(const char*) FTGetDllVersion(void) { dbg_report("FTGetDllVersion request.\n"); return dllVersion; }
// // For some mysterious reason, the previously existing function FTReportID has been changed to FTReportName, but with an integer as argument. // The Delphi-code from the FreeTrack repo suggest a char * as argument, so it cost me an afternoon to figure it out (and keep ArmA2 from crashing). // Thanks guys! // FT_EXPORT(void) FTReportName( int name ) { dbg_report("FTReportName request (ID = %d).\n", name); }