int Simulator::Read(unsigned int offset, unsigned int size, void* destination) { //Add read call to queue. DWORD result; FSUIPC_Read(static_cast<DWORD>(offset), static_cast<DWORD>(size), destination, &result); return static_cast<int>(result); }
JNIEXPORT void JNICALL Java_com_flightSim_wrapper_FSWrapper_ReadData(JNIEnv * env, jclass, jint aOffset, jint aCount, jbyteArray aData) { jbyte* data = env->GetByteArrayElements(aData, 0); FSUIPC_Read(aOffset, aCount, (void*)data, &iResult); FSUIPC_Process(&iResult); env->ReleaseByteArrayElements(aData, data, 0); }
bool Fsuipc::read( WORD id, unsigned size, void *data ) { DWORD res; return FSUIPC_Read( id, size, data, &res )==TRUE; }
// Start the client // return: TRUE if successful, FALSE otherwise BOOL FSUIPC_Open(DWORD dwFSReq, DWORD *pdwResult) { char szName[MAX_PATH]; static int nTry = 0; BOOL fWideFS = FALSE; int i = 0; // abort if already started if (m_pView) { *pdwResult = FSUIPC_ERR_OPEN; return FALSE; } // Clear version information, so know when connected FSUIPC_Version = FSUIPC_FS_Version = 0; // Connect via FSUIPC, which is known to be FSUIPC's own // and isn't subject to user modificiation m_hWnd = FindWindowEx(NULL, NULL, "UIPCMAIN", NULL); if (!m_hWnd) { // If there's no UIPCMAIN, we may be using WideClient // which only simulates FS98 m_hWnd = FindWindowEx(NULL, NULL, "FS98MAIN", NULL); fWideFS = TRUE; if (!m_hWnd) { *pdwResult = FSUIPC_ERR_NOFS; return FALSE; } } // register the window message m_msg = RegisterWindowMessage(FS6IPC_MSGNAME1); if (m_msg == 0) { *pdwResult = FSUIPC_ERR_REGMSG; return FALSE; } // create the name of our file-mapping object nTry++; // Ensures a unique string is used in case user closes and reopens wsprintf(szName, FS6IPC_MSGNAME1 ":%X:%X", GetCurrentProcessId(), nTry); // stuff the name into a global atom m_atom = GlobalAddAtom(szName); if (m_atom == 0) { *pdwResult = FSUIPC_ERR_ATOM; FSUIPC_Close(); return FALSE; } // create the file-mapping object m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName); // name if ((m_hMap == 0) || (GetLastError() == ERROR_ALREADY_EXISTS)) { *pdwResult = FSUIPC_ERR_MAP; FSUIPC_Close(); return FALSE; } // get a view of the file-mapping object m_pView = (BYTE*)MapViewOfFile(m_hMap, FILE_MAP_WRITE, 0, 0, 0); if (m_pView == NULL) { *pdwResult = FSUIPC_ERR_VIEW; FSUIPC_Close(); return FALSE; } // Okay, now determine FSUIPC version AND FS type m_pNext = m_pView; // Try up to 5 times with a 100mSec rest between each // Note that WideClient returns zeroes initially, whilst waiting // for the Server to get the data while ((i++ < 5) && ((FSUIPC_Version == 0) || (FSUIPC_FS_Version == 0))) { // Read FSUIPC version if (!FSUIPC_Read(0x3304, 4, &FSUIPC_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } // and FS version and validity check pattern if (!FSUIPC_Read(0x3308, 4, &FSUIPC_FS_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } // Write our Library version number to a special read-only offset // This is to assist diagnosis from FSUIPC logging // But only do this on first try if ((i < 2) && !FSUIPC_Write(0x330a, 2, &FSUIPC_Lib_Version, pdwResult)) { FSUIPC_Close(); return FALSE; } // Actually send the requests and get the responses ("process") if (!FSUIPC_Process(pdwResult)) { FSUIPC_Close(); return FALSE; } // Maybe running on WideClient, and need another try Sleep(100); // Give it a chance } // Only allow running on FSUIPC 1.998e or later // with correct check pattern 0xFADE if ((FSUIPC_Version < 0x19980005) || ((FSUIPC_FS_Version & 0xFFFF0000L) != 0xFADE0000)) { *pdwResult = fWideFS ? FSUIPC_ERR_RUNNING : FSUIPC_ERR_VERSION; FSUIPC_Close(); return FALSE; } FSUIPC_FS_Version &= 0xffff; // Isolates the FS version number if (dwFSReq && (dwFSReq != FSUIPC_FS_Version)) // Optional user specific FS request { *pdwResult = FSUIPC_ERR_WRONGFS; FSUIPC_Close(); return FALSE; } *pdwResult = FSUIPC_ERR_OK; return TRUE; }