Windows-Server-2003/net/ipsec/polstore/isakmp-w.c

370 lines
8.4 KiB
C

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: isakmp-w.c
//
// Contents: ISAKMP management for WMI.
//
//
// History: KrishnaG.
// AbhisheV.
// t-hhsu
//
//----------------------------------------------------------------------------
#include "precomp.h"
//extern LPWSTR ISAKMPDNAttributes[];
DWORD
WMIEnumISAKMPDataEx(
IWbemServices *pWbemServices,
PIPSEC_ISAKMP_DATA ** pppIpsecISAKMPData,
PDWORD pdwNumISAKMPObjects
)
{
DWORD dwError = 0;
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects = NULL;
PIPSEC_ISAKMP_DATA pIpsecISAKMPData = NULL;
PIPSEC_ISAKMP_DATA * ppIpsecISAKMPData = NULL;
DWORD dwNumISAKMPObjects = 0;
DWORD i = 0;
DWORD j = 0;
dwError = WMIEnumISAKMPObjectsEx(
pWbemServices,
&ppIpsecISAKMPObjects,
&dwNumISAKMPObjects
);
BAIL_ON_WIN32_ERROR(dwError);
if (dwNumISAKMPObjects) {
ppIpsecISAKMPData = (PIPSEC_ISAKMP_DATA *) AllocPolMem(
dwNumISAKMPObjects*sizeof(PIPSEC_ISAKMP_DATA));
if (!ppIpsecISAKMPData) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
for (i = 0; i < dwNumISAKMPObjects; i++) {
dwError = WMIUnmarshallISAKMPData(
*(ppIpsecISAKMPObjects + i),
&pIpsecISAKMPData
);
if (!dwError) {
*(ppIpsecISAKMPData + j) = pIpsecISAKMPData;
j++;
}
}
if (j == 0) {
if (ppIpsecISAKMPData) {
FreePolMem(ppIpsecISAKMPData);
ppIpsecISAKMPData = NULL;
}
}
*pppIpsecISAKMPData = ppIpsecISAKMPData;
*pdwNumISAKMPObjects = j;
dwError = ERROR_SUCCESS;
cleanup:
if (ppIpsecISAKMPObjects) {
FreeIpsecISAKMPObjects(
ppIpsecISAKMPObjects,
dwNumISAKMPObjects
);
}
return(dwError);
error:
if (ppIpsecISAKMPData) {
FreeMulIpsecISAKMPData(
ppIpsecISAKMPData,
i
);
}
*pppIpsecISAKMPData = NULL;
*pdwNumISAKMPObjects = 0;
goto cleanup;
}
DWORD
WMIEnumISAKMPObjectsEx(
IWbemServices *pWbemServices,
PIPSEC_ISAKMP_OBJECT ** pppIpsecISAKMPObjects,
PDWORD pdwNumISAKMPObjects
)
{
DWORD dwError = 0;
HRESULT hr = S_OK;
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject = NULL;
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects = NULL;
DWORD dwNumISAKMPObjectsReturned = 0;
///wbem
IEnumWbemClassObject *pEnum = NULL;
IWbemClassObject *pObj = NULL;
ULONG uReturned = 0;
VARIANT var;
LPWSTR tmpStr = NULL;
BSTR bstrTmp = NULL;
*pppIpsecISAKMPObjects = NULL;
*pdwNumISAKMPObjects = 0;
VariantInit(&var);
bstrTmp = SysAllocString(L"RSOP_IPSECPolicySetting");
if(!bstrTmp) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
//get enum
hr = IWbemServices_CreateInstanceEnum(
pWbemServices,
bstrTmp, //L"RSOP_IPSECPolicySetting"
WBEM_FLAG_FORWARD_ONLY,
0,
&pEnum
);
SysFreeString(bstrTmp);
BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
uReturned = 1;
while (SUCCEEDED(hr) && (uReturned == 1))
{
hr = IEnumWbemClassObject_Next(pEnum, WBEM_INFINITE, 1, &pObj, &uReturned);
if (SUCCEEDED(hr) && (uReturned == 1))
{
hr = IWbemClassObject_Get(
pObj,
L"id",
0,
&var,
0,
0
);
BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
tmpStr = var.bstrVal;
if (!wcsstr(tmpStr, L"ipsecISAKMPPolicy")) {
IWbemClassObject_Release(pObj);
VariantClear(&var);
continue;
}
pIpsecISAKMPObject = NULL;
dwError = UnMarshallWMIISAKMPObject(
pObj,
&pIpsecISAKMPObject
);
if (dwError == ERROR_SUCCESS) {
dwError = ReallocatePolMem(
(LPVOID *) &ppIpsecISAKMPObjects,
sizeof(PIPSEC_ISAKMP_OBJECT)*(dwNumISAKMPObjectsReturned),
sizeof(PIPSEC_ISAKMP_OBJECT)*(dwNumISAKMPObjectsReturned + 1)
);
BAIL_ON_WIN32_ERROR(dwError);
*(ppIpsecISAKMPObjects + dwNumISAKMPObjectsReturned) = pIpsecISAKMPObject;
dwNumISAKMPObjectsReturned++;
}
IWbemClassObject_Release(pObj);
pObj = NULL;
VariantClear(&var);
} else {
BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
//
// Even if SUCCEEDED(hr), loop will still terminate since uReturned != 1
//
}
}
*pppIpsecISAKMPObjects = ppIpsecISAKMPObjects;
*pdwNumISAKMPObjects = dwNumISAKMPObjectsReturned;
dwError = ERROR_SUCCESS;
cleanup:
if(pEnum)
IEnumWbemClassObject_Release(pEnum);
return(dwError);
error:
if (pObj) {
IWbemClassObject_Release(pObj);
pObj = NULL;
}
VariantClear(&var);
if (ppIpsecISAKMPObjects) {
FreeIpsecISAKMPObjects(
ppIpsecISAKMPObjects,
dwNumISAKMPObjectsReturned
);
}
if (pIpsecISAKMPObject) {
FreeIpsecISAKMPObject(
pIpsecISAKMPObject
);
}
*pppIpsecISAKMPObjects = NULL;
*pdwNumISAKMPObjects = 0;
goto cleanup;
}
DWORD
WMIUnmarshallISAKMPData(
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject,
PIPSEC_ISAKMP_DATA * ppIpsecISAKMPData
)
{
DWORD dwError = 0;
dwError = UnmarshallISAKMPObject(
pIpsecISAKMPObject,
ppIpsecISAKMPData
);
BAIL_ON_WIN32_ERROR(dwError);
if (*ppIpsecISAKMPData) {
(*ppIpsecISAKMPData)->dwFlags |= POLSTORE_READONLY;
}
error:
return(dwError);
}
DWORD
WMIGetISAKMPDataEx(
IWbemServices *pWbemServices,
GUID ISAKMPGUID,
PIPSEC_ISAKMP_DATA * ppIpsecISAKMPData
)
{
DWORD dwError = 0;
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject = NULL;
PIPSEC_ISAKMP_DATA pIpsecISAKMPData = NULL;
WCHAR szIpsecISAKMPName[MAX_PATH];
LPWSTR pszISAKMPName = NULL;
HRESULT hr = S_OK;
///wbem
IWbemClassObject *pObj = NULL;
LPWSTR objPathA = L"RSOP_IPSECPolicySetting.id=";
LPWSTR objPath = NULL;
BSTR bstrObjPath = NULL;
szIpsecISAKMPName[0] = L'\0';
wcscpy(szIpsecISAKMPName, L"ipsecISAKMPPolicy");
dwError = UuidToString(&ISAKMPGUID, &pszISAKMPName);
BAIL_ON_WIN32_ERROR(dwError);
wcscat(szIpsecISAKMPName, L"{");
wcscat(szIpsecISAKMPName, pszISAKMPName);
wcscat(szIpsecISAKMPName, L"}");
objPath = (LPWSTR)AllocPolMem(
sizeof(WCHAR)*(wcslen(objPathA)+wcslen(szIpsecISAKMPName)+3)
);
if(!objPath) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(objPath, objPathA);
wcscat(objPath, L"\"");
wcscat(objPath, szIpsecISAKMPName);
wcscat(objPath, L"\"");
bstrObjPath = SysAllocString(objPath);
if(!bstrObjPath) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
hr = IWbemServices_GetObject(
pWbemServices,
bstrObjPath,
WBEM_FLAG_RETURN_WBEM_COMPLETE,
0,
&pObj,
0
);
SysFreeString(bstrObjPath);
BAIL_ON_WMI_ERROR_WITH_WIN32(hr, dwError);
dwError = UnMarshallWMIISAKMPObject(
pObj,
&pIpsecISAKMPObject
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = WMIUnmarshallISAKMPData(
pIpsecISAKMPObject,
&pIpsecISAKMPData
);
BAIL_ON_WIN32_ERROR(dwError);
*ppIpsecISAKMPData = pIpsecISAKMPData;
cleanup:
if (pIpsecISAKMPObject) {
FreeIpsecISAKMPObject(
pIpsecISAKMPObject
);
}
if (pszISAKMPName) {
RpcStringFree(&pszISAKMPName);
}
if(pObj)
IWbemClassObject_Release(pObj);
if(objPath) {
FreePolStr(objPath);
}
return(dwError);
error:
*ppIpsecISAKMPData = NULL;
goto cleanup;
}