/*----------------------------------------------------------------------------- dialerr.cpp This file implements the Could Not Connect dialog Copyright (C) 1996 Microsoft Corporation All rights reserved Authors: ChrisK Chris Kauffman Histroy: 7/22/96 ChrisK Cleaned and formatted 8/19/96 ValdonB Added ability to edit phone number Fixed some memory leaks -----------------------------------------------------------------------------*/ #include "pch.hpp" #include "globals.h" #if defined(WIN16) #include #include #endif TCHAR szBuf256[256]; TCHAR szValidPhoneCharacters[] = {TEXT("0123456789AaBbCcDdPpTtWw!@$ -.()+*#,&\0")}; #ifdef WIN16 #define g_iMyMaxPhone 36 #else int g_iMyMaxPhone = 0; #define MAXPHONE_NT 80 #define MAXPHONE_95 36 #endif PDIALERR g_pcDialErr = NULL; ////////////////////////////////////////////////////////////////////////// // Keyboard hook static HHOOK hKeyHook = NULL; // our key hook static HOOKPROC hpKey = NULL; // hook proc //+--------------------------------------------------------------------------- // // Function: ProcessDBCS // // Synopsis: Converts control to use DBCS compatible font // Use this at the beginning of the dialog procedure // // Note that this is required due to a bug in Win95-J that prevents // it from properly mapping MS Shell Dlg. This hack is not needed // under winNT. // // Arguments: hwnd - Window handle of the dialog // cltID - ID of the control you want changed. // // Returns: ERROR_SUCCESS // // History: 4/31/97 a-frankh Created // 5/13/97 jmazner Stole from CM to use here //---------------------------------------------------------------------------- void ProcessDBCS(HWND hDlg, int ctlID) { #if defined(WIN16) return; #else HFONT hFont = NULL; if( IsNT() ) { return; } hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT); if (hFont == NULL) hFont = (HFONT) GetStockObject(SYSTEM_FONT); if (hFont != NULL) SendMessage(GetDlgItem(hDlg,ctlID), WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0)); #endif } HRESULT ShowDialErrDialog(PGATHEREDINFO pGI, HRESULT hrErr, LPTSTR pszConnectoid, HINSTANCE hInst, HWND hwnd) { int iRC; // CDialErrDlg *pcDED = NULL; g_pcDialErr = (PDIALERR)GlobalAlloc(GPTR,sizeof(DIALERR)); if (!g_pcDialErr) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); iRC = ERROR_NOT_ENOUGH_MEMORY; goto ShowDialErrDialogExit; } g_pcDialErr->m_pszConnectoid = (LPTSTR)GlobalAlloc(GPTR,RAS_MaxEntryName+1); if (!g_pcDialErr->m_pszConnectoid) { iRC = ERROR_NOT_ENOUGH_MEMORY; goto ShowDialErrDialogExit; } lstrcpy(g_pcDialErr->m_pszConnectoid,pszConnectoid); g_pcDialErr->m_pGI = pGI; g_pcDialErr->m_hrError = hrErr; g_pcDialErr->m_hInst = hInst; #if defined(WIN16) #define DLGPROC16 DLGPROC // Identify as only cast for Win16 DLGPROC dlgprc; dlgprc = (DLGPROC16) MakeProcInstance((FARPROC)DialErrDlgProc, g_pcDialErr->m_hInst); iRC = DialogBoxParam(g_pcDialErr->m_hInst, MAKEINTRESOURCE(IDD_DIALERR), hwnd, dlgprc, (LPARAM)g_pcDialErr); FreeProcInstance((FARPROC) dlgprc); #else iRC = (HRESULT)DialogBoxParam(g_pcDialErr->m_hInst,MAKEINTRESOURCE(IDD_DIALERR), hwnd, DialErrDlgProc, (LPARAM)g_pcDialErr); #endif ShowDialErrDialogExit: if (g_pcDialErr->m_pszConnectoid) GlobalFree(g_pcDialErr->m_pszConnectoid); if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable); if (g_pcDialErr->m_lprasdevinfo) GlobalFree(g_pcDialErr->m_lprasdevinfo); g_pcDialErr->m_lprasdevinfo = NULL; if (g_pcDialErr) GlobalFree(g_pcDialErr); g_pcDialErr = NULL; return iRC; } //+---------------------------------------------------------------------------- // // Function LclSetEntryScriptPatch // // Synopsis Softlink to RasSetEntryPropertiesScriptPatch // // Arguments see RasSetEntryPropertiesScriptPatch // // Returns see RasSetEntryPropertiesScriptPatch // // Histroy 10/3/96 ChrisK Created // //----------------------------------------------------------------------------- BOOL LclSetEntryScriptPatch(LPTSTR lpszScript,LPTSTR lpszEntry) { HINSTANCE hinst = NULL; LCLSETENTRYSCRIPTPATCH fp = NULL; BOOL bRC = FALSE; hinst = LoadLibrary(TEXT("ICWDIAL.DLL")); if (hinst) { fp = (LCLSETENTRYSCRIPTPATCH)GetProcAddress(hinst,"RasSetEntryPropertiesScriptPatch"); if (fp) bRC = (fp)(lpszScript,lpszEntry); FreeLibrary(hinst); hinst = NULL; fp = NULL; } return bRC; } // ############################################################################ // HelpKybdHookProc // // Keyboard hook proc - check for F1, and if detected, fake a Help button // hit to the main dialog. // // Paramters: // iCode Windows message code // wParam Windows wParam (contains virtual key code) // lParam Windows lParam // // History: // 8/26/96 ValdonB Adapted from IEDIAL.C // // ############################################################################ #if defined(WIN16) LRESULT CALLBACK _export HelpKybdHookProc #else LRESULT WINAPI HelpKybdHookProc #endif ( int iCode, WPARAM wParam, LPARAM lParam ) { LRESULT lRet = 0; Assert(g_pcDialErr->m_hwnd); if ((iCode != HC_NOREMOVE && iCode >= 0) && (GetActiveWindow() == g_pcDialErr->m_hwnd)) { // HC_NOREMOVE indicates that message is being // retrieved using PM_NOREMOVE from peek message, // if iCode < 0, then we should not process... dont // know why, but sdk says so. if (wParam == VK_F1 && !(lParam & 0x80000000L)) { // bit 32 == 1 if key is being release, else 0 if // key is being pressed PostMessage(g_pcDialErr->m_hwnd, WM_COMMAND, (WPARAM)IDC_CMDHELP, 0); } } if (hKeyHook) { lRet = CallNextHookEx(hKeyHook, iCode, wParam, lParam); } return(lRet); } // ############################################################################ // HelpInit // // Install a windows hook proc to launch help on F1 // // History: // 8/26/96 ValdonB Adapted from IEDIAL.C // // ############################################################################ static void HelpInit() { // now install the hook for the keyboard filter hpKey = (HOOKPROC)MakeProcInstance((FARPROC)HelpKybdHookProc, g_pcDialErr->m_hInst); if (hpKey) { hKeyHook = SetWindowsHookEx(WH_KEYBOARD, hpKey, g_pcDialErr->m_hInst, #if defined(WIN16) GetCurrentTask()); #else GetCurrentThreadId()); #endif } } // ############################################################################ // HelpShutdown // // Shutdown the keyboard hook // // History: // 8/26/96 ValdonB Adapted from IEDIAL.C // // ############################################################################ static void HelpShutdown() { // remove the hook if (hKeyHook) { UnhookWindowsHookEx(hKeyHook); } // dump the thunk if (hpKey) { FreeProcInstance((FARPROC)hpKey); } } extern "C" INT_PTR CALLBACK FAR PASCAL DialErrDlgProc(HWND hwnd, UINT uMsg, WPARAM wparam, LPARAM lparam) { BOOL bRes = TRUE; HRESULT hr; //LPLINEEXTENSIONID lpExtensionID; #if !defined(WIN16) DWORD dwNumDev; #endif //RNAAPI *pcRNA = NULL; WORD wIDS; LRESULT idx; LPRASENTRY lpRasEntry = NULL; LPRASDEVINFO lpRasDevInfo = NULL; DWORD dwRasEntrySize; DWORD dwRasDevInfoSize; HINSTANCE hRasDll = NULL; FARPROC fp = NULL; LPTSTR lpszDialNumber = NULL; static BOOL bCheckDisplayable = FALSE; static BOOL bInitComplete = FALSE; // if we initialize the dialog - MKarki static BOOL bDlgPropEnabled = TRUE; //this flags holds state of Dialing Properties PushButton MKarki - (5/3/97/) Fix for Bug#3393 #if defined(WIN16) RECT MyRect; RECT DTRect; #endif RNAAPI *pRnaapi = NULL; static BOOL fUserEditedNumber = FALSE; switch(uMsg) { case WM_INITDIALOG: g_pcDialErr->m_hwnd = hwnd; #if defined(WIN16) // // Move the window to the center of the screen // GetWindowRect(hwnd, &MyRect); GetWindowRect(GetDesktopWindow(), &DTRect); MoveWindow(hwnd, (DTRect.right - MyRect.right) / 2, (DTRect.bottom - MyRect.bottom) /2, MyRect.right, MyRect.bottom, FALSE); SetNonBoldDlg(hwnd); #endif // Set limit on phone number length // Note: this should really be RAS_MaxPhoneNumber (128), but RAS is choking on // anything longer than 100 bytes, so we'll have to limit it to that. // // 6/3/97 jmazner Olympus #4851 // RAS has different limits on w95 and NT // #ifndef WIN16 if( IsNT() ) { g_iMyMaxPhone = MAXPHONE_NT; } else { g_iMyMaxPhone = MAXPHONE_95; } #endif AssertSz( (sizeof(g_pcDialErr->m_szPhoneNumber) >= g_iMyMaxPhone), "Maximum phone number is greater than m_szPhoneNumber" ); SendDlgItemMessage(hwnd,IDC_TEXTNUMBER,EM_SETLIMITTEXT,g_iMyMaxPhone,0); // Show the phone number // hr = DialErrGetDisplayableNumber(); if (hr != ERROR_SUCCESS) { bCheckDisplayable = FALSE; SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_szPhoneNumber); } else { bCheckDisplayable = TRUE; SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_pszDisplayable); } MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD); // Fill in error message // wIDS = (WORD)RasErrorToIDS(g_pcDialErr->m_hrError); AssertSz(wIDS != -1,"RasErrorToIDS got an error message it did not understand"); if (wIDS != -1 && wIDS !=0) SetDlgItemText(hwnd,IDC_LBLERRMSG,GetSz(wIDS)); ProcessDBCS(hwnd,IDC_CMBMODEMS); ProcessDBCS(hwnd,IDC_TEXTNUMBER); FillModems(); // Set the focus to the Modems selection list // SetFocus(GetDlgItem(hwnd,IDC_CMBMODEMS)); // hook the keyboard for F1 help HelpInit(); bRes = FALSE; // // we should disable the Dialing Properites PushButton // if we have changed the phone number once // MKarki (5/3/97) - Fix for Bug#3393 // if (FALSE == bDlgPropEnabled) { EnableWindow ( GetDlgItem (hwnd, IDC_CMDDIALPROP), FALSE ); } // // This shows the INIT for the error dialog is complete // and we can start processing changes to Ph No. TEXTBOX // MKarki (4/24/97) - Fix for Bug#3511 // bInitComplete = TRUE; break; #if defined(WIN16) case WM_SYSCOLORCHANGE: Ctl3dColorChange(); break; #endif case WM_DESTROY: ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE)); #ifdef WIN16 DeleteDlgFont(hwnd); #endif // Shutdown the keyboard hook HelpShutdown(); bRes = FALSE; break; case WM_CLOSE: //if (MessageBox(hwnd,GetSz(IDS_WANTTOEXIT),GetSz(IDS_TITLE), // MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDYES) // EndDialog(hwnd,ERROR_USERCANCEL); EndDialog(hwnd,ERROR_USERCANCEL); break; #if !defined(WIN16) case WM_HELP: // // Chrisk Olympus 5130 5/27/97 // Added support for F1 Help Key // WinHelp(hwnd,TEXT("connect.hlp>proc4"),HELP_CONTEXT,(DWORD)ICW_TRB); #endif case WM_COMMAND: switch(LOWORD(wparam)) { // // We now processes changes to ph no. EDIT BOX // If there is anychange in the phone number we // disable to Dialing Properties Push Button // MKarki (3/22/97) - Fix for Bug #3511 // case IDC_TEXTNUMBER: TCHAR lpszTempNumber[RAS_MaxPhoneNumber +1]; if ((HIWORD (wparam) == EN_CHANGE) && (bInitComplete == TRUE)) { if ((GetDlgItemText ( hwnd, IDC_TEXTNUMBER, lpszTempNumber, RAS_MaxPhoneNumber )) && (0 != lstrcmp( lpszTempNumber, bCheckDisplayable ? g_pcDialErr->m_pszDisplayable :g_pcDialErr->m_szPhoneNumber))) { // // number has been modified by the user // hide the Dialing Properties Push Button // EnableWindow ( GetDlgItem (hwnd, IDC_CMDDIALPROP), FALSE ); // // save the state of the Dialing Properties PushButton // MKarki (5/3/97) - Fix for Bug#3393 // bDlgPropEnabled = FALSE; // // 7/17/97 jmazner Olympus #8234 // fUserEditedNumber = TRUE; } } break; case IDC_CMBMODEMS: if (HIWORD(wparam) == CBN_SELCHANGE) { idx = SendDlgItemMessage(hwnd,IDC_CMBMODEMS,CB_GETCURSEL,0,0); // // ChrisK Olympus 245 5/25/97 // Get index of modem // idx = SendDlgItemMessage(hwnd,IDC_CMBMODEMS,CB_GETITEMDATA,idx,0); if (idx == CB_ERR) break; // Get the connectoid // /***** this code is made obsolete by the call to MyRasGetEntryProperties below #if defined(WIN16) // // Allocate extra 256 bytes to workaround memory overrun bug in RAS // lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)+256); #else lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)); #endif if (!lpRasEntry) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); break; } lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO)); if (!lpRasDevInfo) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); break; } dwRasEntrySize = sizeof(RASENTRY); dwRasDevInfoSize = sizeof(RASDEVINFO); lpRasEntry->dwSize = dwRasEntrySize; lpRasDevInfo->dwSize = dwRasDevInfoSize; *******/ /* hRasDll = LoadLibrary(RASAPI_LIBRARY); if (!hRasDll) { hr = GetLastError(); break; } fp =GetProcAddress(hRasDll,"RasGetEntryPropertiesA"); if (!fp) { FreeLibrary(hRasDll); hRasDll = LoadLibrary(TEXT("RNAPH.DLL")); if (!hRasDll) { hr = GetLastError(); break; } fp = GetProcAddress(hRasDll,"RasGetEntryPropertiesA"); if (!fp) { hr = GetLastError(); break; } } */ /****** this call has been replaced with MyRasGetEntryProperties hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid, #if defined(WIN16) (LPBYTE) #endif lpRasEntry, &dwRasEntrySize, (LPBYTE)lpRasDevInfo, &dwRasDevInfoSize); ****/ // these two pointers should not have memory allocated to them // See MyRasGetEntryProperties function comment for details. if( lpRasEntry ) { GlobalFree( lpRasEntry ); lpRasEntry = NULL; } if( lpRasDevInfo ) { GlobalFree( lpRasDevInfo ); lpRasDevInfo = NULL; } hr = MyRasGetEntryProperties( NULL, g_pcDialErr->m_pszConnectoid, &lpRasEntry, &dwRasEntrySize, &lpRasDevInfo, &dwRasDevInfoSize); if (hr != ERROR_SUCCESS) { break; } // // Replace the device with a new one // lstrcpyn(lpRasEntry->szDeviceType,g_pcDialErr->m_lprasdevinfo[idx].szDeviceType,RAS_MaxDeviceType+1); lstrcpyn(lpRasEntry->szDeviceName,g_pcDialErr->m_lprasdevinfo[idx].szDeviceName,RAS_MaxDeviceName+1); if (lpRasDevInfo) GlobalFree(lpRasDevInfo); lpRasDevInfo = NULL; // DANGER!! Don't call GlobalFree on lpRasDevInfo after we set it below!!!!!!! --jmazner lpRasDevInfo = &g_pcDialErr->m_lprasdevinfo[idx]; dwRasDevInfoSize = sizeof(RASDEVINFO); //hr = pcRNA->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,(LPBYTE)lpRasEntry,dwRasEntrySize,(LPBYTE)lpRasDevInfo,dwRasDevInfoSize); /*fp = GetProcAddress(hRasDll,"RasSetEntryPropertiesA"); if (!fp) { hr = GetLastError(); break; }*/ // softlink to RasSetEntryProperties for simultaneous Win95/NT compatability if( !pRnaapi ) { pRnaapi = new RNAAPI; if( !pRnaapi ) { hr = ERROR_NOT_ENOUGH_MEMORY; break; } } hr = pRnaapi->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid, (LPBYTE)lpRasEntry, dwRasEntrySize, (LPBYTE)lpRasDevInfo, dwRasDevInfoSize); #if !defined(WIN16) LclSetEntryScriptPatch(lpRasEntry->szScript,g_pcDialErr->m_pszConnectoid); #endif // !win16 // Now that we're done with lpRasDevInfo, set it to NULL, but DON'T free it, // because it points to memory owned by g_pcDialErr->m_lprasdevinfo lpRasDevInfo = NULL; if (hr != ERROR_SUCCESS) { MessageBox(hwnd,GetSz(IDS_CANTSAVEKEY),GetSz(IDS_TITLE),MB_MYERROR); break; } /*FreeLibrary(hRasDll); hRasDll = NULL; fp = NULL;*/ } break; case IDC_CMDHELP: #if defined(WIN16) WinHelp(hwnd,"connect.hlp",HELP_CONTEXT,(DWORD)1001); #else WinHelp(hwnd,TEXT("connect.hlp>proc4"),HELP_CONTEXT,(DWORD)1001); #endif break; case IDC_CMDNEXT: // NOTE: This button is actually labeled "Redial" // lpszDialNumber = (LPTSTR)GlobalAlloc(GPTR, (RAS_MaxPhoneNumber + 1) * sizeof(TCHAR)); if (NULL == lpszDialNumber) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR); break; } // If the user has altered the phone number, make sure it can be used // if (fUserEditedNumber && (GetDlgItemText(hwnd, IDC_TEXTNUMBER, lpszDialNumber, RAS_MaxPhoneNumber)) && (0 != lstrcmp(lpszDialNumber, bCheckDisplayable ? g_pcDialErr->m_pszDisplayable : g_pcDialErr->m_szPhoneNumber))) { // Check that the phone number only contains valid characters // LPTSTR lpNum, lpValid; for (lpNum = lpszDialNumber;*lpNum;lpNum++) { for(lpValid = szValidPhoneCharacters;*lpValid;lpValid++) { if (*lpNum == *lpValid) break; // p2 for loop } if (!*lpValid) break; // p for loop } if (*lpNum) { MessageBox(hwnd,GetSz(IDS_INVALIDPHONE),GetSz(IDS_TITLE),MB_MYERROR); // // Set the focus back to the phone number field // SetFocus(GetDlgItem(hwnd,IDC_TEXTNUMBER)); break; // switch statement } /**** replaced by call to MyRasGetEntryProperties below #if defined(WIN16) // // Allocate extra 256 bytes to workaround memory overrun bug in RAS // lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)+256); #else lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)); #endif if (!lpRasEntry) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR); break; } lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO)); if (!lpRasDevInfo) { MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR); break; } dwRasEntrySize = sizeof(RASENTRY); dwRasDevInfoSize = sizeof(RASDEVINFO); lpRasEntry->dwSize = dwRasEntrySize; lpRasDevInfo->dwSize = dwRasDevInfoSize; hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid, #if defined(WIN16) (LPBYTE) #endif lpRasEntry, &dwRasEntrySize, (LPBYTE)lpRasDevInfo, &dwRasDevInfoSize); ****/ // these two pointers should not have memory allocated to them // See MyRasGetEntryProperties function comment for details. if( lpRasEntry ) { GlobalFree( lpRasEntry ); lpRasEntry = NULL; } if( lpRasDevInfo ) { GlobalFree( lpRasDevInfo ); lpRasDevInfo = NULL; } dwRasEntrySize = dwRasDevInfoSize = 0; hr = MyRasGetEntryProperties( NULL, g_pcDialErr->m_pszConnectoid, &lpRasEntry, &dwRasEntrySize, &lpRasDevInfo, &dwRasDevInfoSize); if (hr != ERROR_SUCCESS) { break; } // Replace the phone number with the new one // lstrcpy(lpRasEntry->szLocalPhoneNumber, lpszDialNumber); lpRasEntry->dwCountryID = 0; lpRasEntry->dwCountryCode = 0; lpRasEntry->szAreaCode[0] = '\0'; // Set to dial as is // lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes; // softlink to RasSetEntryProperties for simultaneous Win95/NT compatability if( !pRnaapi ) { pRnaapi = new RNAAPI; if( !pRnaapi ) { hr = ERROR_NOT_ENOUGH_MEMORY; break; } } hr = pRnaapi->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid, (LPBYTE)lpRasEntry, dwRasEntrySize, (LPBYTE)lpRasDevInfo, dwRasDevInfoSize); #if !defined(WIN16) LclSetEntryScriptPatch(lpRasEntry->szScript,g_pcDialErr->m_pszConnectoid); #endif // !win16 if (hr != ERROR_SUCCESS) { MessageBox(hwnd,GetSz(IDS_CANTSAVEKEY),GetSz(IDS_TITLE),MB_MYERROR); break; } } EndDialog(hwnd,ERROR_USERNEXT); break; case IDC_CMDCANCEL: //if (MessageBox(hwnd,GetSz(IDS_WANTTOEXIT),GetSz(IDS_TITLE), // MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDYES) // EndDialog(hwnd,ERROR_USERCANCEL); EndDialog(hwnd,ERROR_USERCANCEL); break; case IDC_CMDDIALPROP: // 12/4/96 jmazner Normandy #10294 //ShowWindow(hwnd,SW_HIDE); EnableWindow(hwnd, FALSE); #if defined(WIN16) hr = IETapiTranslateDialog(hwnd, g_pcDialErr->m_szPhoneNumber, NULL); #else // 10/24/96 jmazner Normandy #10185/7019 if (g_pdevice->dwTapiDev == 0xFFFFFFFF) g_pdevice->dwTapiDev = 0; hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst, LineCallback,NULL,&dwNumDev); if (hr == ERROR_SUCCESS) { hr = lineTranslateDialog(g_pcDialErr->m_hLineApp, g_pdevice->dwTapiDev, g_pcDialErr->m_dwAPIVersion, hwnd,g_pcDialErr->m_szPhoneNumber); #endif hr = DialErrGetDisplayableNumber(); if (hr != ERROR_SUCCESS) { bCheckDisplayable = FALSE; SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_szPhoneNumber); } else { bCheckDisplayable = TRUE; SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_pszDisplayable); } #if !defined(WIN16) lineShutdown(g_pcDialErr->m_hLineApp); g_pcDialErr->m_hLineApp = NULL; } #endif // 12/4/96 jmazner Normandy #10294 //ShowWindow(hwnd,SW_SHOW); EnableWindow(hwnd, TRUE); // // 6/6/97 jmazner Olympus #4759 // SetFocus(GetDlgItem(hwnd,IDC_CMDNEXT)); break; } break; default: bRes = FALSE; break; } if (lpRasEntry) GlobalFree(lpRasEntry); if (lpRasDevInfo) GlobalFree(lpRasDevInfo); if (lpszDialNumber) GlobalFree(lpszDialNumber); if (pRnaapi) delete pRnaapi; return bRes; } HRESULT FillModems() { //RNAAPI *pcRNA = NULL; HRESULT hr = ERROR_SUCCESS; //LPRASDEVINFO lprasdevinfo; DWORD dwSize; DWORD dwNumDev; DWORD idx; DWORD dwTempNumEntries; //HINSTANCE hRasDll=NULL; //FARPROC fp=NULL; LPRASENTRY lpRasEntry=NULL; LPRASDEVINFO lpRasDevInfo=NULL; DWORD dwRasEntrySize = 0; DWORD dwRasDevInfoSize = 0; LRESULT lLast = 0; RNAAPI *pRnaapi = NULL; // Get the connectoid // /******* This code has been obsoleted by the call to MyRasGetEntryProperties below #if defined(WIN16) // // Allocate extra 256 bytes to workaround memory overrun bug in RAS // lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)+256); #else lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)); #endif if (!lpRasEntry) { MessageBox(g_pcDialErr->m_hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); goto FillModemExit; } lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO)); if (!lpRasDevInfo) { MessageBox(g_pcDialErr->m_hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR); goto FillModemExit; } dwRasEntrySize = sizeof(RASENTRY); dwRasDevInfoSize = sizeof(RASDEVINFO); lpRasEntry->dwSize = dwRasEntrySize; lpRasDevInfo->dwSize = dwRasDevInfoSize; *********/ /* fp = NULL; hRasDll = LoadLibrary(RASAPI_LIBRARY); if (hRasDll) { fp = GetProcAddress(hRasDll,RASAPI_RASGETENTRY); if (!fp) { FreeLibrary(hRasDll); hRasDll = LoadLibrary(RNAPH_LIBRARY); if (hRasDll) { fp = GetProcAddress(hRasDll,RASAPI_RASGETENTRY); } } } if (!fp) { hr = GetLastError(); goto FillModemExit; } */ /****** This call has been replaced by MyRasGetEntryProperties below hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid, #if defined(WIN16) (LPBYTE) #endif lpRasEntry, &dwRasEntrySize,(LPBYTE)lpRasDevInfo, &dwRasDevInfoSize); ********/ // these two pointers should not have memory allocated to them // See MyRasGetEntryProperties function comment for details. if( lpRasEntry ) { GlobalFree( lpRasEntry ); lpRasEntry = NULL; } if( lpRasDevInfo ) { GlobalFree( lpRasDevInfo ); lpRasDevInfo = NULL; } hr = MyRasGetEntryProperties( NULL, g_pcDialErr->m_pszConnectoid, &lpRasEntry, &dwRasEntrySize, &lpRasDevInfo, &dwRasDevInfoSize); if( ERROR_SUCCESS != hr ) { goto FillModemExit; } /*FreeLibrary(hRasDll); hRasDll = NULL; fp = NULL; */ // Get devices from RAS/RNA // if (!g_pcDialErr->m_lprasdevinfo) g_pcDialErr->m_lprasdevinfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO)); if (!g_pcDialErr->m_lprasdevinfo) { hr = ERROR_NOT_ENOUGH_MEMORY; goto FillModemExit; } g_pcDialErr->m_lprasdevinfo->dwSize = sizeof(RASDEVINFO); dwSize = sizeof(RASDEVINFO); dwNumDev = 0; /*hRasDll = LoadLibrary(RASAPI_LIBRARY); if (!hRasDll) { hr = GetLastError(); goto FillModemExit; } fp =GetProcAddress(hRasDll,"RasEnumDevicesA"); if (!fp) { FreeLibrary(hRasDll); hRasDll = LoadLibrary(TEXT("RNAPH.DLL")); if (!hRasDll) { hr = GetLastError(); goto FillModemExit; } fp = GetProcAddress(hRasDll,"RasEnumDevicesA"); if (!fp) { hr = GetLastError(); goto FillModemExit; } }*/ // soft link to RasEnumDevices to allow for simultaneous Win95/NT compatability pRnaapi = new RNAAPI; if( !pRnaapi ) { hr = ERROR_NOT_ENOUGH_MEMORY; goto FillModemExit; } hr = pRnaapi->RasEnumDevices(g_pcDialErr->m_lprasdevinfo,&dwSize,&dwNumDev); if (hr == ERROR_BUFFER_TOO_SMALL) { GlobalFree(g_pcDialErr->m_lprasdevinfo); g_pcDialErr->m_lprasdevinfo = (LPRASDEVINFO)GlobalAlloc(GPTR, (size_t)dwSize); if (!g_pcDialErr->m_lprasdevinfo) { hr = ERROR_NOT_ENOUGH_MEMORY; goto FillModemExit; } g_pcDialErr->m_lprasdevinfo->dwSize = sizeof(RASDEVINFO); hr = pRnaapi->RasEnumDevices(g_pcDialErr->m_lprasdevinfo,&dwSize,&dwNumDev); } /*FreeLibrary(hRasDll); hRasDll = NULL; fp = NULL;*/ if (hr != ERROR_SUCCESS) goto FillModemExit; // Fill in combo box // dwTempNumEntries = dwNumDev; if (dwNumDev != 0) { for (idx=0;idxm_lprasdevinfo[idx].szDeviceType)) && (0 == lstrcmpi(TEXT("ISDN"),g_pcDialErr->m_lprasdevinfo[idx].szDeviceType))) { lLast = SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_ADDSTRING,0,(LPARAM)&g_pcDialErr->m_lprasdevinfo[idx].szDeviceName[0]); // // ChrisK Olympus 245 5/25/97 // Save index of modem // SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETITEMDATA,(WPARAM)lLast,(LPARAM)idx); if (lstrcmp(g_pcDialErr->m_lprasdevinfo[idx].szDeviceName,lpRasEntry->szDeviceName) == 0) SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETCURSEL,(WPARAM)lLast,0); } else { dwNumDev--; } } } if (dwNumDev == 1) SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETCURSEL,0,0); // UNDONE: select default device FillModemExit: //if (g_pcDialErr->m_lprasdevinfo) GlobalFree(g_pcDialErr->m_lprasdevinfo); //if (pcRNA) delete pcRNA; if (lpRasEntry) GlobalFree(lpRasEntry); if (lpRasDevInfo) GlobalFree(lpRasDevInfo); if( pRnaapi ) delete pRnaapi; return hr; } HRESULT DialErrGetDisplayableNumber() { #if !defined(WIN16) DWORD dwNumDev; LPLINETRANSLATEOUTPUT lpOutput2; LPLINEEXTENSIONID lpExtensionID = NULL; #endif HRESULT hr; LPRASENTRY lpRasEntry = NULL; LPRASDEVINFO lpRasDevInfo = NULL; DWORD dwRasEntrySize = 0; DWORD dwRasDevInfoSize = 0; LPLINETRANSLATEOUTPUT lpOutput1 = NULL; HINSTANCE hRasDll = NULL; FARPROC fp = NULL; #if !defined(WIN16) // Normandy 13024 - ChrisK 12/31/96 // In all cases we have to get the TAPI version number, because the dialing properies // button will not work on NT if the version is 0. // // Initialize TAPIness // dwNumDev = 0; hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst,LineCallback,NULL,&dwNumDev); if (hr != ERROR_SUCCESS) goto GetDisplayableNumberExit; if (g_pdevice->dwTapiDev == 0xFFFFFFFF) g_pdevice->dwTapiDev = 0; // Get TAPI version number lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID)); if (!lpExtensionID) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } do { hr = lineNegotiateAPIVersion(g_pcDialErr->m_hLineApp, g_pdevice->dwTapiDev, 0x00010004, 0x00010004, &g_pcDialErr->m_dwAPIVersion, lpExtensionID); } while (hr && g_pdevice->dwTapiDev++ < dwNumDev-1); // delete ExtenstionID since we don't use it if (lpExtensionID) GlobalFree(lpExtensionID); if (hr != ERROR_SUCCESS) goto GetDisplayableNumberExit; #endif // !WIN16 //RNAAPI * pcRNA; // Get phone number from connectoid // /* ---replaced by call to MyRasGetEntryProperties below #if defined(WIN16) // // Allocate extra 256 bytes to workaround memory overrun bug in RAS // lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)+256); #else lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)); #endif if (!lpRasEntry) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO)); if (!lpRasDevInfo) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } dwRasEntrySize = sizeof(RASENTRY); dwRasDevInfoSize = sizeof(RASDEVINFO); */ /* hRasDll = LoadLibrary(RASAPI_LIBRARY); if (!hRasDll) { hr = GetLastError(); goto GetDisplayableNumberExit; } fp =GetProcAddress(hRasDll,"RasGetEntryPropertiesA"); if (!fp) { FreeLibrary(hRasDll); hRasDll = LoadLibrary(TEXT("RNAPH.DLL")); if (!hRasDll) { hr = GetLastError(); goto GetDisplayableNumberExit; } fp = GetProcAddress(hRasDll,"RasGetEntryPropertiesA"); if (!fp) { hr = GetLastError(); goto GetDisplayableNumberExit; } } */ // lpRasEntry and lpRasDevInfo should not have memory allocated to them, and should be NULL // See MyRasGetEntryProperties function comment for details. hr = MyRasGetEntryProperties( NULL, g_pcDialErr->m_pszConnectoid, &lpRasEntry, &dwRasEntrySize, &lpRasDevInfo, &dwRasDevInfoSize); if (hr != ERROR_SUCCESS) { goto GetDisplayableNumberExit; } //FreeLibrary(hRasDll); // // If this is a dial as is number, just get it from the structure // if (!(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes)) { if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable); g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, lstrlen(lpRasEntry->szLocalPhoneNumber)+1); if (!g_pcDialErr->m_pszDisplayable) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lstrcpy(g_pcDialErr->m_szPhoneNumber, lpRasEntry->szLocalPhoneNumber); lstrcpy(g_pcDialErr->m_pszDisplayable, lpRasEntry->szLocalPhoneNumber); } else { // // If there is no area code, don't use parentheses // if (lpRasEntry->szAreaCode[0]) wsprintf(g_pcDialErr->m_szPhoneNumber,TEXT("+%lu (%s) %s\0"),lpRasEntry->dwCountryCode, lpRasEntry->szAreaCode,lpRasEntry->szLocalPhoneNumber); else wsprintf(g_pcDialErr->m_szPhoneNumber,TEXT("+%lu %s\0"),lpRasEntry->dwCountryCode, lpRasEntry->szLocalPhoneNumber); #if defined(WIN16) char szBuffer[1024]; LONG lRetCode; memset(&szBuffer[0], 0, sizeof(szBuffer)); lpOutput1 = (LPLINETRANSLATEOUTPUT) & szBuffer[0]; lpOutput1->dwTotalSize = sizeof(szBuffer); lRetCode = IETapiTranslateAddress(NULL, g_pcDialErr->m_szPhoneNumber, 0L, 0L, lpOutput1); if (0 != lRetCode) { // // TODO: Set the correct error code // hr = GetLastError(); goto GetDisplayableNumberExit; } if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable); g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, ((size_t)lpOutput1->dwDisplayableStringSize+1)); if (!g_pcDialErr->m_pszDisplayable) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lstrcpy(g_pcDialErr->m_pszDisplayable, &szBuffer[lpOutput1->dwDisplayableStringOffset]); #else //WIN16 /* Normandy 13024 this code was moved up // // Initialize TAPIness // dwNumDev = 0; hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst,LineCallback,NULL,&dwNumDev); if (hr != ERROR_SUCCESS) goto GetDisplayableNumberExit; //Normandy #7019 jmazner //all devices should share the same dialing properties //(at least, this is what icwdial\dialerr.cpp appears to assume, and it works right ;) // if (g_pdevice->dwTapiDev == 0xFFFFFFFF) // { // if (dwNumDev == 1) // g_pdevice->dwTapiDev = 0; // //else // // UNDONE: Tell the user to select a modem // // DO NOT EXIT UNTIL THEY PICK ONE // } if (g_pdevice->dwTapiDev == 0xFFFFFFFF) g_pdevice->dwTapiDev = 0; lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID)); if (!lpExtensionID) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } hr = lineNegotiateAPIVersion(g_pcDialErr->m_hLineApp, g_pdevice->dwTapiDev, 0x00010004, 0x00010004, &g_pcDialErr->m_dwAPIVersion, lpExtensionID); // ditch it since we don't use it // if (lpExtensionID) GlobalFree(lpExtensionID); if (hr != ERROR_SUCCESS) goto GetDisplayableNumberExit; Normandy 13024 (see comments above) */ // Format the phone number // lpOutput1 = (LPLINETRANSLATEOUTPUT)GlobalAlloc(GPTR,sizeof(LINETRANSLATEOUTPUT)); if (!lpOutput1) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lpOutput1->dwTotalSize = sizeof(LINETRANSLATEOUTPUT); // Turn the canonical form into the "displayable" form // hr = lineTranslateAddress(g_pcDialErr->m_hLineApp,g_pdevice->dwTapiDev, g_pcDialErr->m_dwAPIVersion, g_pcDialErr->m_szPhoneNumber,0, LINETRANSLATEOPTION_CANCELCALLWAITING, lpOutput1); if (hr != ERROR_SUCCESS || (lpOutput1->dwNeededSize != lpOutput1->dwTotalSize)) { lpOutput2 = (LPLINETRANSLATEOUTPUT)GlobalAlloc(GPTR, (size_t) lpOutput1->dwNeededSize); if (!lpOutput2) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lpOutput2->dwTotalSize = lpOutput1->dwNeededSize; GlobalFree(lpOutput1); lpOutput1 = lpOutput2; lpOutput2 = NULL; hr = lineTranslateAddress(g_pcDialErr->m_hLineApp,g_pdevice->dwTapiDev, g_pcDialErr->m_dwAPIVersion, g_pcDialErr->m_szPhoneNumber,0, LINETRANSLATEOPTION_CANCELCALLWAITING, lpOutput1); } if (hr != ERROR_SUCCESS) { goto GetDisplayableNumberExit; } if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable); g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, (size_t) lpOutput1->dwDisplayableStringSize+1); if (!g_pcDialErr->m_pszDisplayable) { hr = ERROR_NOT_ENOUGH_MEMORY; goto GetDisplayableNumberExit; } lstrcpyn(g_pcDialErr->m_pszDisplayable, (LPTSTR)&((LPBYTE)lpOutput1)[lpOutput1->dwDisplayableStringOffset], (size_t)lpOutput1->dwDisplayableStringSize); #endif // WIN16 } GetDisplayableNumberExit: if (lpRasEntry) GlobalFree(lpRasEntry); if (lpRasDevInfo) GlobalFree(lpRasDevInfo); #if !defined(WIN16) if (lpOutput1) GlobalFree(lpOutput1); if (g_pcDialErr->m_hLineApp) lineShutdown(g_pcDialErr->m_hLineApp); #endif return hr; } //+--------------------------------------------------------------------------- // // Function: MyRasGetEntryProperties() // // Synopsis: Performs some buffer size checks and then calls RasGetEntryProperties() // See the RasGetEntryProperties() docs to understand why this is needed. // // Arguments: Same as RasGetEntryProperties with the following exceptions: // lplpRasEntryBuff -- pointer to a pointer to a RASENTRY struct. On successfull // return, *lplpRasEntryBuff will point to the RASENTRY struct // and buffer returned by RasGetEntryProperties. // NOTE: should not have memory allocated to it at call time! // To emphasize this point, *lplpRasEntryBuff must be NULL // lplpRasDevInfoBuff -- pointer to a pointer to a RASDEVINFO struct. On successfull // return, *lplpRasDevInfoBuff will point to the RASDEVINFO struct // and buffer returned by RasGetEntryProperties. // NOTE: should not have memory allocated to it at call time! // To emphasize this point, *lplpRasDevInfoBuff must be NULL // NOTE: Even on a successfull call to RasGetEntryProperties, // *lplpRasDevInfoBuff may return with a value of NULL // (occurs when there is no extra device info) // // Returns: ERROR_NOT_ENOUGH_MEMORY if unable to allocate either RASENTRY or RASDEVINFO buffer // Otherwise, it retuns the error code from the call to RasGetEntryProperties. // NOTE: if return is anything other than ERROR_SUCCESS, *lplpRasDevInfoBuff and // *lplpRasEntryBuff will be NULL, // and *lpdwRasEntryBuffSize and *lpdwRasDevInfoBuffSize will be 0 // // Example: // // LPRASENTRY lpRasEntry = NULL; // LPRASDEVINFO lpRasDevInfo = NULL; // DWORD dwRasEntrySize, dwRasDevInfoSize; // // hr = MyRasGetEntryProperties( NULL, // g_pcDialErr->m_pszConnectoid, // &lpRasEntry, // &dwRasEntrySize, // &lpRasDevInfo, // &dwRasDevInfoSize); // // // if (hr != ERROR_SUCCESS) // { // //handle errors here // } else // { // //continue processing // } // // // History: 9/10/96 JMazner Created // //---------------------------------------------------------------------------- HRESULT MyRasGetEntryProperties(LPTSTR lpszPhonebookFile, LPTSTR lpszPhonebookEntry, LPRASENTRY *lplpRasEntryBuff, LPDWORD lpdwRasEntryBuffSize, LPRASDEVINFO *lplpRasDevInfoBuff, LPDWORD lpdwRasDevInfoBuffSize) { HRESULT hr; RNAAPI *pRnaapi = NULL; DWORD dwOldDevInfoBuffSize; Assert( NULL != lplpRasEntryBuff ); Assert( NULL != lpdwRasEntryBuffSize ); Assert( NULL != lplpRasDevInfoBuff ); Assert( NULL != lpdwRasDevInfoBuffSize ); *lpdwRasEntryBuffSize = 0; *lpdwRasDevInfoBuffSize = 0; // Use reference variables internaly to make notation easier LPRASENTRY &reflpRasEntryBuff = *lplpRasEntryBuff; LPRASDEVINFO &reflpRasDevInfoBuff = *lplpRasDevInfoBuff; Assert( NULL == reflpRasEntryBuff ); Assert( NULL == reflpRasDevInfoBuff ); // need to softlink for simultaneous compatability with win95 and winnt pRnaapi = new RNAAPI; if( !pRnaapi ) { hr = ERROR_NOT_ENOUGH_MEMORY; goto MyRasGetEntryPropertiesErrExit; } // use RasGetEntryProperties with a NULL lpRasEntry pointer to find out size buffer we need // As per the docs' recommendation, do the same with a NULL lpRasDevInfo pointer. hr = pRnaapi->RasGetEntryProperties(lpszPhonebookFile, lpszPhonebookEntry, (LPBYTE)NULL, lpdwRasEntryBuffSize, (LPBYTE)NULL,lpdwRasDevInfoBuffSize); // we expect the above call to fail because the buffer size is 0 // If it doesn't fail, that means our RasEntry is messed, so we're in trouble if( ERROR_BUFFER_TOO_SMALL != hr ) { goto MyRasGetEntryPropertiesErrExit; } // dwRasEntryBuffSize and dwRasDevInfoBuffSize now contain the size needed for their // respective buffers, so allocate the memory for them // dwRasEntryBuffSize should never be less than the size of the RASENTRY struct. // If it is, we'll run into problems sticking values into the struct's fields Assert( *lpdwRasEntryBuffSize >= sizeof(RASENTRY) ); #if defined(WIN16) // // Allocate extra 256 bytes to workaround memory overrun bug in RAS // reflpRasEntryBuff = (LPRASENTRY)GlobalAlloc(GPTR,*lpdwRasEntryBuffSize + 256); #else reflpRasEntryBuff = (LPRASENTRY)GlobalAlloc(GPTR,*lpdwRasEntryBuffSize); #endif if (!reflpRasEntryBuff) { hr = ERROR_NOT_ENOUGH_MEMORY; goto MyRasGetEntryPropertiesErrExit; } // // Allocate the DeviceInfo size that RasGetEntryProperties told us we needed. // If size is 0, don't alloc anything // if( *lpdwRasDevInfoBuffSize > 0 ) { Assert( *lpdwRasDevInfoBuffSize >= sizeof(RASDEVINFO) ); reflpRasDevInfoBuff = (LPRASDEVINFO)GlobalAlloc(GPTR,*lpdwRasDevInfoBuffSize); if (!reflpRasDevInfoBuff) { hr = ERROR_NOT_ENOUGH_MEMORY; goto MyRasGetEntryPropertiesErrExit; } } else { reflpRasDevInfoBuff = NULL; } // This is a bit convoluted: lpRasEntrySize->dwSize needs to contain the size of _only_ the // RASENTRY structure, and _not_ the actual size of the buffer that lpRasEntrySize points to. // This is because the dwSize field is used by RAS for compatability purposes to determine which // version of the RASENTRY struct we're using. // Same holds for lpRasDevInfo->dwSize reflpRasEntryBuff->dwSize = sizeof(RASENTRY); if( reflpRasDevInfoBuff ) { reflpRasDevInfoBuff->dwSize = sizeof(RASDEVINFO); } // now we're ready to make the actual call... // jmazner see below for why this is needed dwOldDevInfoBuffSize = *lpdwRasDevInfoBuffSize; hr = pRnaapi->RasGetEntryProperties(lpszPhonebookFile, lpszPhonebookEntry, (LPBYTE)reflpRasEntryBuff, lpdwRasEntryBuffSize, (LPBYTE)reflpRasDevInfoBuff,lpdwRasDevInfoBuffSize); // jmazner 10/7/96 Normandy #8763 // For unknown reasons, in some cases on win95, devInfoBuffSize increases after the above call, // but the return code indicates success, not BUFFER_TOO_SMALL. If this happens, set the // size back to what it was before the call, so the DevInfoBuffSize and the actuall space allocated // for the DevInfoBuff match on exit. if( (ERROR_SUCCESS == hr) && (dwOldDevInfoBuffSize != *lpdwRasDevInfoBuffSize) ) { *lpdwRasDevInfoBuffSize = dwOldDevInfoBuffSize; } delete pRnaapi; pRnaapi = NULL; return( hr ); MyRasGetEntryPropertiesErrExit: if(reflpRasEntryBuff) { GlobalFree(reflpRasEntryBuff); reflpRasDevInfoBuff = NULL; } if(reflpRasDevInfoBuff) { GlobalFree(reflpRasDevInfoBuff); reflpRasDevInfoBuff = NULL; } if (pRnaapi) { delete pRnaapi; pRnaapi = NULL; } *lpdwRasEntryBuffSize = 0; *lpdwRasDevInfoBuffSize = 0; return( hr ); }