//+---------------------------------------------------------------------------- // // File: rnawnd.cpp // // Module: CMDIAL32.DLL // // Synopsis: Win9x Rnaapp.exe workaround code. // // Copyright (c) 1998-1999 Microsoft Corporation // // Author: quintinb created Header 08/16/99 // //+---------------------------------------------------------------------------- #include "cmmaster.h" #include #define MAX_RNA_WND_TITLE_LEN 26 // Max chars for window title compare #define MAX_ZAPRNA_PAUSE 50 // milliseconds to pause between window enumerations typedef struct tagFRCTParam { HANDLE hEvent; LPSTR pszDun; } ZRCTParam, *PZRCTP; typedef struct tagFindParam { LPCSTR pszTitle; HWND hwndRNA; } FINDPARAM, *PFINDPARAM; //+--------------------------------------------------------------------------- // // Function: FindRnaWindow // // Synopsis: Callback for EnumWindows(). It receives the hwnd of all the // top-level windows. It's job is to look for the RNA status wnd. // // Arguments: hwndTop hwnd of the top-level window // lParam title of the rna wnd to be found. // // Returns: NONE // // History: henryt Created 8/19/97 //---------------------------------------------------------------------------- BOOL CALLBACK FindRnaWindow( HWND hwndTop, LPARAM lParam) { MYDBGASSERT(lParam); PFINDPARAM pFindParam = (PFINDPARAM) lParam; CHAR szTitle[MAX_RNA_WND_TITLE_LEN + 1]; if (NULL == pFindParam) { return TRUE; } // // We are looking for a top-level window with a title matching lParam // if (MAKEINTATOM(GetClassLongU(hwndTop, GCW_ATOM)) == WC_DIALOG) { GetWindowTextA(hwndTop, szTitle, MAX_RNA_WND_TITLE_LEN + 1); // // truncate the window title as we only check the first few chars // szTitle[MAX_RNA_WND_TITLE_LEN] = '\0'; if (lstrcmpA(szTitle, pFindParam->pszTitle) == 0) { // // Its a match, update the hwnd and bail // pFindParam->hwndRNA = hwndTop; return FALSE; } } return TRUE; } //+---------------------------------------------------------------------------- // // Function: fnZRCT // // Synopsis: Thread to terminate RNA "Connected To" dlg // // Arguments: void *pvParam - Thread parameters PZRCTP containing connectoid // name is expected // // Returns: unsigned long - Standard thread return code // // History: nickball Created 3/5/98 // //+---------------------------------------------------------------------------- static unsigned long __stdcall fnZRCT(void *pvParam) { PZRCTP pParam = (PZRCTP) pvParam; PFINDPARAM pFindParam = NULL; unsigned uRes = 1; HMODULE hLibrary = NULL; BOOL bRes; HLOCAL hRes; LPSTR pszFmt = NULL; CHAR szTmp[MAX_PATH]; DWORD dwIdx; DWORD dwWait; MYDBGASSERT(pParam->hEvent); MYDBGASSERT(pParam->pszDun); // // Load RNAAPP.EXE, so we can access its resources // hLibrary = LoadLibraryExA("rnaapp.exe", NULL, LOAD_LIBRARY_AS_DATAFILE); if (!hLibrary) { uRes = GetLastError(); CMTRACE1(TEXT("fnZRCT() LoadLibraryEx() failed, GLE=%u."), GetLastError()); goto done; } // // Extract string #204 from RNAAPP.EXE, then release. // if (!LoadStringA(hLibrary, 204, szTmp, sizeof(szTmp)/sizeof(CHAR)-1)) { uRes = GetLastError(); CMTRACE1(TEXT("fnZRCT() LoadString() failed, GLE=%u."), GetLastError()); goto done; } bRes = FreeLibrary(hLibrary); hLibrary = NULL; #ifdef DEBUG if (!bRes) { CMTRACE1(TEXT("fnZRCT() FreeLibrary() failed, GLE=%u."), GetLastError()); } #endif // // Format the string with our DUN name // pszFmt = (LPSTR)CmMalloc((lstrlenA(szTmp)+1)*sizeof(TCHAR)); if (!pszFmt) { uRes = GetLastError(); CMTRACE1(TEXT("fnZRCT() CmMalloc() failed, GLE=%u."), GetLastError()); goto done; } lstrcpyA(pszFmt, szTmp); wsprintfA(szTmp, pszFmt, pParam->pszDun); // // to work around a bug where a long connectoid/profile name can prevent // us to look for the RNA window(because the window title will be truncated) // we only read the first 26 chars. // szTmp[MAX_RNA_WND_TITLE_LEN] = '\0'; // // Setup param for FindRnaWindow callback used in EnumWindows // pFindParam = (PFINDPARAM)CmMalloc(sizeof(FINDPARAM)); if (!pFindParam) { CMTRACE1(TEXT("ZapRNAConnectedTo() CmMalloc() failed, GLE=%u."), GetLastError()); goto done; } pFindParam->pszTitle = szTmp; pFindParam->hwndRNA = NULL; // // Try to find the window every 50 milliseconds up to 200 times // CMTRACE1(TEXT("fnZRCT() is watching for a window named %s."), szTmp); for (dwIdx=0; dwIdx < 200; dwIdx++) { EnumWindows(FindRnaWindow, (LPARAM) pFindParam); //hwndRNA = FindWindow(TEXT("#32770"),szTmp); // // If hwnd has a value, its the RNA wind, hide it and bail // if (pFindParam->hwndRNA) { CMTRACE(TEXT("fnZRCT() is hiding the dialog.")); ShowWindowAsync(pFindParam->hwndRNA,SW_HIDE); uRes = 0; break; } // // Wait for MAX_ZAPRNA_PAUSE milliseconds, or until event is signaled // dwWait = WaitForSingleObject(pParam->hEvent, MAX_ZAPRNA_PAUSE); // // If not a timeout, we're done // if (WAIT_TIMEOUT != dwWait) { // // If not an event signal, report // if (WAIT_OBJECT_0 != dwWait) { CMTRACE1(TEXT("fnZRCT() WAIT_OBJECT_0 != dwWait, GLE=%u."), GetLastError()); } break; } } done: // // Cleanup // #ifdef DEBUG if (uRes) { CMTRACE(TEXT("fnZRCT() has exited without hiding the dialog.")); } #endif CmFree(pParam->pszDun); CmFree(pParam); CmFree(pFindParam); CmFree(pszFmt); #ifdef DEBUG if (uRes) { CMTRACE(TEXT("fnZRCT() could not free all of its alloc-ed memory")); } #endif if (hLibrary) { bRes = FreeLibrary(hLibrary); } CMTRACE1(TEXT("fnZRCT() is exiting with uRes=%u."), uRes); return (uRes); } //+---------------------------------------------------------------------------- // // Function: ZapRNAConnectedTo // // Synopsis: Fires off thread to hide the RNA "Connected To" dlg // // Arguments: LPCTSTR pszDUN - The name of the DUN entry that we are connecting // HANDLE hEvent - Handle to CM termination event // // Returns: HANDLE - Handle of created thread or NULL on failure // // History: nickball Created Header 3/5/98 // //+---------------------------------------------------------------------------- HANDLE ZapRNAConnectedTo(LPCTSTR pszDUN, HANDLE hEvent) { MYDBGASSERT(pszDUN); MYDBGASSERT(hEvent); PZRCTP pParam; unsigned long tidThread; HANDLE hThread = NULL; if (NULL == pszDUN || NULL == *pszDUN || NULL == hEvent) { return hThread; } pParam = (PZRCTP) CmMalloc(sizeof(ZRCTParam)); if (!pParam) { CMTRACE1(TEXT("ZapRNAConnectedTo() CmMalloc() failed, GLE=%u."), GetLastError()); return hThread; } pParam->pszDun = WzToSzWithAlloc(pszDUN); if (!pParam->pszDun) { CMTRACE1(TEXT("ZapRNAConnectedTo() CmMalloc() failed, GLE=%u."), GetLastError()); return hThread; } // // Setup params to be passed to thread // pParam->hEvent = hEvent; // // Create the Zap thread // hThread = (HANDLE) CreateThread(NULL, 0, fnZRCT, pParam, 0, &tidThread); if (!hThread) { // // Couldn't create thread, free params // CMTRACE1(TEXT("ZapRNAConnectedTo() CreateThread() failed, GLE=%u."), GetLastError()); CmFree(pParam); } // // Note: pParam is release inside thread // CMTRACE1(TEXT("fnZRCT() is exiting with hThread=%u."), hThread); return hThread; }