339 lines
6.9 KiB
C
339 lines
6.9 KiB
C
|
|
||
|
|
||
|
#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);
|
||
|
}
|
||
|
|