zea
-
Posts
4 -
Joined
-
Last visited
Content Type
Profiles
Forums
Events
Gallery
Downloads
Posts posted by zea
-
-
Hmm. System Error 6 is "Invalid Handle". The only handle there is the special one, 0xFFFFFFFF, which is specifically needed for a system paging file. Here's what the CreateFileMapping documentation says:
"If hFile is INVALID_HANDLE_VALUE, the calling process must also specify a size for the file mapping object in the dwMaximumSizeHigh and dwMaximumSizeLow parameters. In this scenario,CreateFileMapping creates a file mapping object of a specified size that is backed by the system paging file instead of by a file in the file system."
INVALID_HANDLE_VALUE is actually defined as -1. Are you trying to compile in 64-bit mode? Try -1 instead. Maybe 0xFFFFFFFF is coming out as 0x00000000FFFFFFFF instead of 0xFFFFFFFFFFFFFFFF.
Pete
Thank you Pete.
I am sorry for my late reply, I've been away from my computer for several days.
Yes, I am trying to compile in 64-bit mode, and the same code runs pretty good in 32-bit mode.
I just tried 0xFFFFFFFFFFFFFFFF, and m_hMap gets 64, while in 32-bit mode it should be 96.
And after several lines, the program goes wrong again .
The error message is "Unhanled exception at 0x5168b3d9(msvcr100d.dll) in test.exe: 0xC0000005: Access violation writing location 0x0000000139800004."
here are part of the codes, and I have added comments.
// create the file-mapping object m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFFFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName); // name //============m_hMap get 64, diffrent from 96 in 32-bit mode.============ 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); // m_pView is different every time I run it. an example value is 1638400 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; } //========================= the code goes wrong below ====================== // 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 }
The error is in the function BOOL FSUIPC_Process(DWORD *pdwResult).
part of the code are below.
BOOL FSUIPC_Process(DWORD *pdwResult) { DWORD dwError; DWORD *pdw; FS6IPC_READSTATEDATA_HDR *pHdrR; FS6IPC_WRITESTATEDATA_HDR *pHdrW; int i = 0; if (!m_pView) { *pdwResult = FSUIPC_ERR_NOTOPEN; return FALSE; } if (m_pView == m_pNext) { *pdwResult = FSUIPC_ERR_NODATA; return FALSE; } ZeroMemory(m_pNext, 4); // Terminator m_pNext = m_pView; // send the request (allow up to 9 tries) while ((++i < 10) && !SendMessageTimeout( m_hWnd, // FS6 window handle m_msg, // our registered message id m_atom, // wParam: name of file-mapping object 0, // lParam: offset of request into file-mapping obj SMTO_BLOCK, // halt this thread until we get a response 2000, // time out interval &dwError)) // return value { Sleep(100); // Allow for things to happen } if (i >= 10) // Failed all tries? { *pdwResult = GetLastError() == 0 ? FSUIPC_ERR_TIMEOUT : FSUIPC_ERR_SENDMSG; return FALSE; } if (dwError != FS6IPC_MESSAGE_SUCCESS) { *pdwResult = FSUIPC_ERR_DATA; // FSUIPC didn't like something in the data! return FALSE; } // Decode and store results of Read requests pdw = (DWORD *) m_pView; while (*pdw) { switch (*pdw) { case FS6IPC_READSTATEDATA_ID: pHdrR = (FS6IPC_READSTATEDATA_HDR *) pdw; m_pNext += sizeof(FS6IPC_READSTATEDATA_HDR); if (pHdrR->pDest && pHdrR->nBytes) CopyMemory(pHdrR->pDest, m_pNext, pHdrR->nBytes); //=========== Visual Studio breaks in the next line.==================== m_pNext += pHdrR->nBytes; break; case FS6IPC_WRITESTATEDATA_ID: // This is a write, so there's no returned data to store pHdrW = (FS6IPC_WRITESTATEDATA_HDR *) pdw; m_pNext += sizeof(FS6IPC_WRITESTATEDATA_HDR) + pHdrW->nBytes; break; default: // Error! So terminate the scan *pdw = 0; break; } ...
Thanks!
zea
-
Sorry, you only show the one line, and I don't know what your szName parameter is. A return of 0 means a failure, so use GetLastError() to get the error number to see why it failed.
Pete
Thank you for your reply.
I use printf() to display the value of szName and GetLastError().
szName is "FsasmLib:IPC:1AC0:1" . Note that "1AC0" changes every time I run the plugin.
GetLastError() returns 6.
I am not sure whether related code is helpful because it is just part of the FSUIPC demo. I put it below and I have added comment where my program failed.
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 //=====================The function above returns 0, as a result the connection fail.=============== if ((m_hMap == 0) || (GetLastError() == ERROR_ALREADY_EXISTS)) { *pdwResult = FSUIPC_ERR_MAP; FSUIPC_Close(); return FALSE; } ... }
Best regards,
zea
-
Dear Pete,
I am now on a project that automantically switch channel in TeamSpeak3(TS3) according to the COM1 frequncy in FS2004.
TS3 offers a SDK that can easily build a plugin(DLL file) for it.
Based on the TS3 SDK demo, I added FSUIPC related files , but I failed to connect to the FSUIPC: FSUIPC_Open() returned False.
I debuged it, and found that in FSUIPC_Open(),
m_hMap = CreateFileMapping( (HANDLE)0xFFFFFFFF, // use system paging file NULL, // security PAGE_READWRITE, // protection 0, MAX_SIZE+256, // size szName);
m_hMap got 0. But in FSUIPC demo, it should be 96.
I am wondering what kind of modificatiosn should be done to my code so it can connect to FSUIPC .
kind regards,
zea
Failed to connect in TeamSpeak3 SDK
in FSUIPC Support Pete Dowson Modules
Posted
Thank you so much, Pete.
Then I will only compile 32-bit apps.
zea