/* Copyright (c) 1996, Microsoft Corporation, all rights reserved ** ** rnk.c ** Remote Access shortcut file (.RNK) library ** ** 02/15/96 Steve Cobb */ #include // Win32 core #include // TRACE/ASSERT macros #include // Heap macros #include // Our public header VOID FreeRnkInfo( IN RNKINFO* pInfo ) /* Destroys 'pInfo' buffer returned from ReadShortcutFile. */ { if (pInfo) { Free0( pInfo->pszEntry ); Free0( pInfo->pszPhonebook ); Free( pInfo ); } } RNKINFO* ReadShortcutFile( IN TCHAR* pszRnkPath ) /* Reads shortcut file at 'pszRnkPath' returning a RNKINFO buffer. Caller ** should eventually call FreeRnkInfo on the returned buffer. ** ** Returns 0 or an error code. */ { RNKINFO* pInfo; TCHAR szBuf[ 1024 ]; TRACE("ReadShortcutFile"); pInfo = (RNKINFO* )Malloc( sizeof(RNKINFO) ); if (!pInfo) return NULL; ZeroMemory( pInfo, sizeof(*pInfo) ); GetPrivateProfileString( TEXT(RNK_SEC_Main), TEXT(RNK_KEY_Entry), TEXT(""), szBuf, sizeof(szBuf) / sizeof(TCHAR), pszRnkPath ); pInfo->pszEntry = StrDup( szBuf ); GetPrivateProfileString( TEXT(RNK_SEC_Main), TEXT(RNK_KEY_Phonebook), TEXT(""), szBuf, sizeof(szBuf) / sizeof(TCHAR), pszRnkPath ); pInfo->pszPhonebook = StrDup( szBuf ); return pInfo; } DWORD WriteShortcutFile( IN TCHAR* pszRnkPath, IN TCHAR* pszPbkPath, IN TCHAR* pszEntry ) /* Write the shortcut file 'pszRnkPath' with a command line to dial entry ** 'pszEntry' from phonebook 'pszPath'. ** ** Returns 0 if succesful or an error code. */ { DWORD dwErr; HANDLE hFile; CHAR* pszRnkPathA; CHAR* pszEntryA; CHAR* pszPbkPathA; TRACE("WriteShortcutFile"); /* The file is written in ANSI to ** avoid potential portability/compatibility problems with Windows 95. */ dwErr = 0; pszRnkPathA = StrDupAFromT( pszRnkPath ); if (!pszRnkPathA) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { hFile = CreateFileA( pszRnkPathA, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) { dwErr = GetLastError(); } else { CloseHandle( hFile ); pszEntryA = StrDupAFromT( pszEntry ); pszPbkPathA = StrDupAFromT( pszPbkPath ); if (!pszEntryA || !pszPbkPathA) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { BOOL f; CHAR szBuf[ (2 * MAX_PATH) + 100 ]; CHAR* pszKey; ZeroMemory( szBuf, sizeof(szBuf) ); pszKey = szBuf; wsprintfA( pszKey, "%s=%s", RNK_KEY_Entry, pszEntryA ); pszKey += lstrlenA( pszKey ) + 1; wsprintfA( pszKey, "%s=%s", RNK_KEY_Phonebook, pszPbkPathA ); f = WritePrivateProfileSectionA( RNK_SEC_Main, szBuf, pszRnkPathA ); if (!f) dwErr = GetLastError(); } Free0( pszPbkPathA ); Free0( pszEntryA ); } Free( pszRnkPathA ); } return dwErr; }