|
|
#include "precomp.h"
DWORD LoadPersistedMMAuthMethods( HKEY hParentRegKey ) { DWORD dwError = 0; HKEY hRegKey = NULL; DWORD dwSize = 0; WCHAR szMMAuthUniqueID[MAX_PATH]; DWORD dwIndex = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; LPWSTR pszServerName = NULL; DWORD dwPersist = 0;
dwPersist |= PERSIST_SPD_OBJECT;
dwError = RegOpenKeyExW( hParentRegKey, L"MM Auth Methods", 0, KEY_ALL_ACCESS, &hRegKey ); BAIL_ON_WIN32_ERROR(dwError);
while (1) {
dwSize = MAX_PATH; szMMAuthUniqueID[0] = L'\0';
dwError = RegEnumKeyExW( hRegKey, dwIndex, szMMAuthUniqueID, &dwSize, NULL, NULL, 0, 0 );
if (dwError == ERROR_NO_MORE_ITEMS) { dwError = ERROR_SUCCESS; break; }
BAIL_ON_WIN32_ERROR(dwError);
dwError = SPDReadMMAuthMethods( hRegKey, szMMAuthUniqueID, &pMMAuthMethods );
if (dwError) { dwIndex++; continue; }
dwError = AddMMAuthMethods( pszServerName, dwPersist, pMMAuthMethods );
if (pMMAuthMethods) { FreeMMAuthMethods( 1, pMMAuthMethods ); }
dwIndex++;
}
error:
if (hRegKey) { RegCloseKey(hRegKey); }
return (dwError); }
DWORD SPDReadMMAuthMethods( HKEY hParentRegKey, LPWSTR pszMMAuthUniqueID, PMM_AUTH_METHODS * ppMMAuthMethods ) { DWORD dwError = 0; HKEY hRegKey = NULL; PMM_AUTH_METHODS pMMAuthMethods = NULL; LPWSTR pszAuthID = NULL; DWORD dwSize = 0; DWORD dwType = 0; LPBYTE pBuffer = NULL; DWORD dwBufferSize = 0;
dwError = RegOpenKeyExW( hParentRegKey, pszMMAuthUniqueID, 0, KEY_ALL_ACCESS, &hRegKey ); BAIL_ON_WIN32_ERROR(dwError);
pMMAuthMethods = (PMM_AUTH_METHODS) AllocSPDMem( sizeof(MM_AUTH_METHODS) ); if (!pMMAuthMethods) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); }
dwError = RegstoreQueryValue( hRegKey, L"AuthID", REG_SZ, (LPBYTE *)&pszAuthID, &dwSize ); BAIL_ON_WIN32_ERROR(dwError);
wGUIDFromString( pszAuthID, &pMMAuthMethods->gMMAuthID );
dwType = REG_DWORD; dwSize = sizeof(DWORD); dwError = RegQueryValueExW( hRegKey, L"Flags", NULL, &dwType, (LPBYTE)&pMMAuthMethods->dwFlags, &dwSize ); BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue( hRegKey, L"AuthInfoBundle", REG_BINARY, (LPBYTE *)&pBuffer, &dwBufferSize ); BAIL_ON_WIN32_ERROR(dwError);
dwError = UnMarshallMMAuthInfoBundle( pBuffer, dwBufferSize, &pMMAuthMethods->pAuthenticationInfo, &pMMAuthMethods->dwNumAuthInfos ); BAIL_ON_WIN32_ERROR(dwError);
*ppMMAuthMethods = pMMAuthMethods;
cleanup:
if (hRegKey) { RegCloseKey(hRegKey); }
if (pszAuthID) { FreeSPDStr(pszAuthID); }
if (pBuffer) { FreeSPDMem(pBuffer); }
return (dwError);
error:
*ppMMAuthMethods = NULL;
if (pMMAuthMethods) { FreeMMAuthMethods( 1, pMMAuthMethods ); }
goto cleanup; }
DWORD UnMarshallMMAuthInfoBundle( LPBYTE pBuffer, DWORD dwBufferSize, PIPSEC_MM_AUTH_INFO * ppMMAuthInfos, PDWORD pdwNumAuthInfos ) { DWORD dwError = 0; LPBYTE pMem = NULL; PIPSEC_MM_AUTH_INFO pMMAuthInfos = NULL; DWORD dwNumAuthInfos = 0; PIPSEC_MM_AUTH_INFO pTemp = NULL; DWORD i = 0; DWORD dwNumBytesAdvanced = 0;
pMem = pBuffer;
pMem += sizeof(GUID); pMem += sizeof(DWORD);
memcpy( (LPBYTE) &dwNumAuthInfos, pMem, sizeof(DWORD) ); pMem += sizeof(DWORD);
pMMAuthInfos = (PIPSEC_MM_AUTH_INFO) AllocSPDMem( sizeof(IPSEC_MM_AUTH_INFO)*dwNumAuthInfos ); if (!pMMAuthInfos) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); }
pTemp = pMMAuthInfos;
for (i = 0; i < dwNumAuthInfos; i++) {
dwError = UnMarshallMMAuthMethod( pMem, pTemp, &dwNumBytesAdvanced ); BAIL_ON_WIN32_ERROR(dwError);
pMem += dwNumBytesAdvanced; pTemp++;
}
*ppMMAuthInfos = pMMAuthInfos; *pdwNumAuthInfos = dwNumAuthInfos; return (dwError);
error:
if (pMMAuthInfos) { FreeIniMMAuthInfos( i, pMMAuthInfos ); }
*ppMMAuthInfos = NULL; *pdwNumAuthInfos = 0; return (dwError); }
DWORD UnMarshallMMAuthMethod( LPBYTE pBuffer, PIPSEC_MM_AUTH_INFO pMMAuthInfo, PDWORD pdwNumBytesAdvanced ) { DWORD dwError = 0; LPBYTE pMem = NULL; DWORD dwNumBytesAdvanced = 0; DWORD dwAuthMethod = 0; DWORD dwAuthInfoSize = 0; LPBYTE pAuthInfo = NULL;
pMem = pBuffer;
memcpy( (LPBYTE) &dwAuthMethod, pMem, sizeof(DWORD) ); pMem += sizeof(DWORD); dwNumBytesAdvanced += sizeof(DWORD);
memcpy( (LPBYTE) &dwAuthInfoSize, pMem, sizeof(DWORD) ); pMem += sizeof(DWORD); dwNumBytesAdvanced += sizeof(DWORD);
if (dwAuthInfoSize) { pAuthInfo = (LPBYTE) AllocSPDMem( dwAuthInfoSize ); if (!pAuthInfo) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); } memcpy( pAuthInfo, pMem, dwAuthInfoSize ); } pMem += dwAuthInfoSize; dwNumBytesAdvanced += dwAuthInfoSize;
pMMAuthInfo->AuthMethod = (MM_AUTH_ENUM) dwAuthMethod; pMMAuthInfo->dwAuthInfoSize = dwAuthInfoSize; pMMAuthInfo->pAuthInfo = pAuthInfo;
*pdwNumBytesAdvanced = dwNumBytesAdvanced; return (dwError);
error:
*pdwNumBytesAdvanced = 0; return (dwError); }
|