Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

860 lines
24 KiB

////////////////////////////////////////////////////////////////////////
//
// Module : FrameWork/Nshipsec.cpp
//
// Purpose : Netshell Frame Work for IPSec Implementation.
//
// Developers Name : Bharat/Radhika
//
// History :
//
// Date Author Comments
// 8-10-2001 Bharat Initial Version. V1.0
//
////////////////////////////////////////////////////////////////////////
#include "nshipsec.h"
//Object to cache the policy store handle
CNshPolStore g_NshPolStoreHandle;
//Object to cache the Policy,filterlist and negpol
CNshPolNegFilData g_NshPolNegFilData;
//Storage Location structure
STORAGELOCATION g_StorageLocation={ {0},{0},IPSEC_REGISTRY_PROVIDER};
HKEY g_hGlobalRegistryKey = HKEY_LOCAL_MACHINE;
HINSTANCE g_hModule = NULL;
PSTA_MM_AUTH_METHODS g_paRootca[MAX_ARGS] = {NULL};
_TCHAR g_wszLastErrorMessage[MAX_STR_LEN] = {0};
PIPSEC_QM_OFFER g_pQmsec[IPSEC_MAX_QM_OFFERS] = {NULL};
PIPSEC_MM_OFFER g_pMmsec[IPSEC_MAX_MM_OFFERS] = {NULL};
void *g_AllocPtr[MAX_ARGS]= {NULL};
_TCHAR g_szMachine[MAX_COMPUTERNAME_LENGTH + 1] = {0};
_TCHAR *g_szDynamicMachine = NULL;
//
//These are the commands other than group...
//
CMD_ENTRY g_TopLevelStaticCommands[] =
{
CREATE_CMD_ENTRY(STATIC_EXPORTPOLICY, HandleStaticExportPolicy),
CREATE_CMD_ENTRY(STATIC_IMPORTPOLICY, HandleStaticImportPolicy),
CREATE_CMD_ENTRY(STATIC_RESTOREDEFAULTS, HandleStaticRestoreDefaults)
};
//
//These are the commands static add group...
//
CMD_ENTRY g_StaticAddCommands[] =
{
CREATE_CMD_ENTRY(STATIC_ADD_FILTER, HandleStaticAddFilter),
CREATE_CMD_ENTRY(STATIC_ADD_FILTERLIST, HandleStaticAddFilterList),
CREATE_CMD_ENTRY(STATIC_ADD_FILTERACTIONS, HandleStaticAddFilterActions),
CREATE_CMD_ENTRY(STATIC_ADD_POLICY, HandleStaticAddPolicy),
CREATE_CMD_ENTRY(STATIC_ADD_RULE, HandleStaticAddRule)
};
//
//These are the commands static set group...
//
CMD_ENTRY g_StaticSetCommands[] =
{
CREATE_CMD_ENTRY(STATIC_SET_FILTERLIST, HandleStaticSetFilterList),
CREATE_CMD_ENTRY(STATIC_SET_FILTERACTIONS, HandleStaticSetFilterActions),
CREATE_CMD_ENTRY(STATIC_SET_POLICY, HandleStaticSetPolicy),
CREATE_CMD_ENTRY(STATIC_SET_RULE, HandleStaticSetRule),
CREATE_CMD_ENTRY(STATIC_SET_STORE , HandleStaticSetStore),
CREATE_CMD_ENTRY(STATIC_SET_DEFAULTRULE, HandleStaticSetDefaultRule),
//CREATE_CMD_ENTRY(STATIC_SET_INTERACTIVE, HandleStaticSetInteractive),
// CREATE_CMD_ENTRY(STATIC_SET_BATCH, HandleStaticSetBatch)
};
//
//These are the commands static delete group...
//
CMD_ENTRY g_StaticDeleteCommands[] =
{
CREATE_CMD_ENTRY(STATIC_DELETE_FILTER, HandleStaticDeleteFilter),
CREATE_CMD_ENTRY(STATIC_DELETE_FILTERLIST, HandleStaticDeleteFilterList),
CREATE_CMD_ENTRY(STATIC_DELETE_FILTERACTIONS, HandleStaticDeleteFilterActions),
CREATE_CMD_ENTRY(STATIC_DELETE_POLICY, HandleStaticDeletePolicy),
CREATE_CMD_ENTRY(STATIC_DELETE_RULE, HandleStaticDeleteRule),
CREATE_CMD_ENTRY(STATIC_DELETE_ALL, HandleStaticDeleteAll)
};
//
//These are the commands static show group...
//
CMD_ENTRY g_StaticShowCommands[] =
{
CREATE_CMD_ENTRY(STATIC_SHOW_FILTERLIST, HandleStaticShowFilterList),
CREATE_CMD_ENTRY(STATIC_SHOW_FILTERACTIONS, HandleStaticShowFilterActions),
CREATE_CMD_ENTRY(STATIC_SHOW_POLICY, HandleStaticShowPolicy),
CREATE_CMD_ENTRY(STATIC_SHOW_RULE, HandleStaticShowRule),
CREATE_CMD_ENTRY(STATIC_SHOW_ALL, HandleStaticShowAll),
CREATE_CMD_ENTRY(STATIC_SHOW_STORE, HandleStaticShowStore),
CREATE_CMD_ENTRY(STATIC_SHOW_GPOASSIGNEDPOLICY, HandleStaticShowGPOAssignedPolicy)
};
//
//Static Grouping commands...
//
CMD_GROUP_ENTRY g_StaticGroups[] =
{
CREATE_CMD_GROUP_ENTRY(STATIC_GROUP_ADD, g_StaticAddCommands),
CREATE_CMD_GROUP_ENTRY(STATIC_GROUP_DELETE, g_StaticDeleteCommands),
CREATE_CMD_GROUP_ENTRY(STATIC_GROUP_SET, g_StaticSetCommands),
CREATE_CMD_GROUP_ENTRY(STATIC_GROUP_SHOW, g_StaticShowCommands)
};
//
// Dynamic Add commands
//
CMD_ENTRY g_DynamicAddCommands[] =
{
CREATE_CMD_ENTRY(DYNAMIC_ADD_QMPOLICY, HandleDynamicAddQMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_ADD_MMPOLICY, HandleDynamicAddMMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_ADD_RULE, HandleDynamicAddRule)
};
//
// Dynamic Set commands
//
CMD_ENTRY g_DynamicSetCommands[] =
{
CREATE_CMD_ENTRY(DYNAMIC_SET_QMPOLICY, HandleDynamicSetQMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_SET_MMPOLICY, HandleDynamicSetMMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_SET_CONFIG, HandleDynamicSetConfig),
CREATE_CMD_ENTRY(DYNAMIC_SET_RULE, HandleDynamicSetRule)
};
//
// Dynamic Delete commands
//
CMD_ENTRY g_DynamicDeleteCommands[] =
{
CREATE_CMD_ENTRY(DYNAMIC_DELETE_QMPOLICY, HandleDynamicDeleteQMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_DELETE_MMPOLICY, HandleDynamicDeleteMMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_DELETE_RULE, HandleDynamicDeleteRule),
CREATE_CMD_ENTRY(DYNAMIC_DELETE_ALL, HandleDynamicDeleteAll)
};
//
// Dynamic Show commands
//
CMD_ENTRY g_DynamicShowCommands[] =
{
CREATE_CMD_ENTRY(DYNAMIC_SHOW_ALL, HandleDynamicShowAll),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_MMPOLICY, HandleDynamicShowMMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_QMPOLICY, HandleDynamicShowQMPolicy),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_MMFILTER, HandleDynamicShowMMFilter),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_QMFILTER, HandleDynamicShowQMFilter),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_STATS, HandleDynamicShowStats),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_MMSAS, HandleDynamicShowMMSas),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_QMSAS, HandleDynamicShowQMSas),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_REGKEYS, HandleDynamicShowRegKeys),
CREATE_CMD_ENTRY(DYNAMIC_SHOW_RULE, HandleDynamicShowRule)
};
//
//Dynamic Grouping commands...
//
CMD_GROUP_ENTRY g_DynamicGroups[] =
{
CREATE_CMD_GROUP_ENTRY(DYNAMIC_GROUP_ADD, g_DynamicAddCommands),
CREATE_CMD_GROUP_ENTRY(DYNAMIC_GROUP_SET, g_DynamicSetCommands),
CREATE_CMD_GROUP_ENTRY(DYNAMIC_GROUP_DELETE, g_DynamicDeleteCommands),
CREATE_CMD_GROUP_ENTRY(DYNAMIC_GROUP_SHOW, g_DynamicShowCommands)
};
DWORD
IpsecConnectInternal(
IN LPCWSTR pwszMachine);
////////////////////////////////////////////////////////////////////////////////////////
//
//Function: GenericStopHelper
//
//Date of Creation: 10-8-2001
//
//Parameters: IN DWORD dwReserved
//
//Return: DWORD
//
//Description: This Function called by Netshell Frame work
// when Helper is stopped. This can be utilized for
// diagnostic purposes. To satisfy the frame work.
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI GenericStopHelper(IN DWORD dwReserved)
{
return ERROR_SUCCESS;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function : DllMain
//
// Date of Creation: 10-8-2001
//
// Parameters : IN HINSTANCE hinstDLL, // handle to DLL module
// IN DWORD fdwReason, // reason for calling function
// IN LPVOID lpvReserved // reserved
// Return : BOOL
//
// Description : This is an optional method to entry into dll.
// Here we can save the instance handle.
//
// History :
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////////////
extern "C"
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
PVOID pReserved ) // reserved
{
UNREFERENCED_PARAMETER(pReserved);
if(fdwReason == DLL_PROCESS_ATTACH)
{
//save the HINSTANCE
g_hModule = hinstDLL;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////
//
//Function: InitHelperDll
//
//Date of Creation: 10-8-2001
//
///Parameters: IN DWORD dwNetshVersion,
// OUT PVOID pReserved
//Return: DWORD
//
//Description: This Function called by Netshell Frame work
// at the start up. Registers the contexts.
//
//Revision History:
//
// Date Author Comments
//
///////////////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI InitHelperDll(
IN DWORD dwNetshVersion,
OUT PVOID pReserved
)
{
DWORD dwReturn = ERROR_SUCCESS;
NS_HELPER_ATTRIBUTES MyAttributes;
if(g_hModule == NULL)
{
_tprintf(_TEXT("\n nshipsec.dll handle not available, not registering the IPSec Helper.\n"));
BAIL_OUT;
}
ZeroMemory(&MyAttributes, sizeof(MyAttributes));
MyAttributes.dwVersion = IPSEC_HELPER_VERSION;
MyAttributes.pfnStart = StartHelpers;
MyAttributes.pfnStop = GenericStopHelper;
//
// Set the GUID of IPSec helper.
//
MyAttributes.guidHelper = g_IPSecGuid;
//
// Specify g_RootGuid as the parent helper to indicate
// that any contexts registered by this helper will be top
// level contexts.
//
dwReturn = RegisterHelper(&g_RootGuid,&MyAttributes);
if (dwReturn != ERROR_SUCCESS)
{
BAIL_OUT;
}
//
// Set the GUID for Static Sub context.
//
MyAttributes.guidHelper = g_StaticGuid;
dwReturn = RegisterHelper(&g_IPSecGuid, &MyAttributes);
if(dwReturn != ERROR_SUCCESS)
{
BAIL_OUT;
}
//
// Set the GUID of Dynamic Sub context...
//
MyAttributes.guidHelper = g_DynamicGuid;
dwReturn = RegisterHelper(&g_IPSecGuid, &MyAttributes);
IpsecConnectInternal(NULL);
error:
return dwReturn;
}
///////////////////////////////////////////////////////////////////////////////////////
//
//Function: StartHelpers
//
//Date of Creation: 10-8-2001
//
//Parameters: IN CONST GUID * pguidParent,
// IN DWORD dwVersion
//Return: DWORD
//
//Description: This Function called by Netshell Frame work,
// at the start up and as enters to every context.
//
//Revision History:
//
// Date Author Comments
//
///////////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI StartHelpers(
IN CONST GUID * pguidParent,
IN DWORD dwVersion
)
{
DWORD dwReturn = ERROR_INVALID_PARAMETER;
NS_CONTEXT_ATTRIBUTES ContextAttributes;
ZeroMemory(&ContextAttributes,sizeof(ContextAttributes));
ContextAttributes.dwVersion = IPSEC_HELPER_VERSION;
if (IsEqualGUID(*pguidParent, g_RootGuid))
{
ContextAttributes.dwFlags = 0;
ContextAttributes.dwVersion = 1;
ContextAttributes.ulPriority = DEFAULT_CONTEXT_PRIORITY;
ContextAttributes.pwszContext = TOKEN_IPSEC;
ContextAttributes.guidHelper = g_IPSecGuid;
ContextAttributes.ulNumTopCmds = 0;
ContextAttributes.pTopCmds = NULL;
ContextAttributes.ulNumGroups = 0;
ContextAttributes.pCmdGroups = NULL;
ContextAttributes.pfnCommitFn = NULL;
ContextAttributes.pfnConnectFn = NULL;
ContextAttributes.pfnDumpFn = NULL;
ContextAttributes.pfnOsVersionCheck = CheckOsVersion;
//
//Registering IPSec Main Context...
//
dwReturn = RegisterContext(&ContextAttributes);
}
else if (IsEqualGUID(*pguidParent, g_IPSecGuid))
{
//
//Registering SubContexts under IPSec Main Context...
//
ContextAttributes.dwFlags = 0;
ContextAttributes.dwVersion = 1;
ContextAttributes.ulPriority = DEFAULT_CONTEXT_PRIORITY;
ContextAttributes.pwszContext = TOKEN_STATIC;
ContextAttributes.guidHelper = g_StaticGuid;
ContextAttributes.ulNumTopCmds = sizeof(g_TopLevelStaticCommands)/sizeof(CMD_ENTRY);
ContextAttributes.pTopCmds = (CMD_ENTRY (*)[])g_TopLevelStaticCommands;
ContextAttributes.ulNumGroups = sizeof(g_StaticGroups)/sizeof(CMD_GROUP_ENTRY);
ContextAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_StaticGroups;
ContextAttributes.pfnCommitFn = NULL;
ContextAttributes.pfnConnectFn = IpsecConnect;
ContextAttributes.pfnOsVersionCheck = CheckOsVersion;
ContextAttributes.pfnDumpFn = NULL;
//
//Registering Static SubContext
//...
dwReturn = RegisterContext(&ContextAttributes);
//even if static sub context not succeeds,
//proceed to register the dynamic context
ContextAttributes.dwFlags = 0;
ContextAttributes.dwVersion = 1;
ContextAttributes.ulPriority = DEFAULT_CONTEXT_PRIORITY;
ContextAttributes.pwszContext = TOKEN_DYNAMIC;
ContextAttributes.guidHelper = g_DynamicGuid;
ContextAttributes.ulNumTopCmds = sizeof(g_DynamicGroups)/sizeof(CMD_ENTRY);
ContextAttributes.pTopCmds = (CMD_ENTRY (*)[])g_DynamicGroups;
ContextAttributes.ulNumGroups = sizeof(g_DynamicGroups)/sizeof(CMD_GROUP_ENTRY);
ContextAttributes.pCmdGroups = (CMD_GROUP_ENTRY (*)[])&g_DynamicGroups;
ContextAttributes.pfnCommitFn = NULL;
ContextAttributes.pfnConnectFn = IpsecConnect;
ContextAttributes.pfnOsVersionCheck = CheckOsVersion;
ContextAttributes.pfnDumpFn = NULL;
//
//Registering Dynamic Sub context...
//
dwReturn = RegisterContext(&ContextAttributes);
}
return dwReturn;
}
DWORD
IpsecConnectInternal(
IN LPCWSTR pwszMachine)
{
DWORD dwReturn, dwReturn2;
if(pwszMachine)
{
_tcsncpy(g_szMachine, pwszMachine, MAX_COMPUTERNAME_LENGTH);
g_szMachine[MAX_COMPUTERNAME_LENGTH] = '\0';
}
else
{
g_szMachine[0] = '\0';
}
g_szDynamicMachine = (_TCHAR*)g_szMachine;
// Have the static and dynamic contexts connect to the specified
// machine. Return an error if either attempt fails.
//
dwReturn = ConnectStaticMachine(g_szMachine, g_StorageLocation.dwLocation);
dwReturn2 = ConnectDynamicMachine(g_szDynamicMachine);
dwReturn = (dwReturn) ? dwReturn : dwReturn2;
return dwReturn;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
//
//Function: IpsecConnect
//
//Date of Creation: October 4th 2001
//
//Parameters: IN LPCWSTR pwszMachine
//
//Return: DWORD
//
//Description: Displays Win32 Error message in locale language for
// given Win 32Error Code.
//
//Revision History:
//
// Date Author Comments
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////
DWORD WINAPI
IpsecConnect( IN LPCWSTR pwszMachine )
{
DWORD dwReturn = ERROR_SUCCESS, dwReturn2 = ERROR_SUCCESS;
BOOL bSetMachine = FALSE;
if((pwszMachine != NULL) && (g_szMachine[0] == '\0'))
{
bSetMachine = TRUE;
}
if((pwszMachine == NULL) && (g_szMachine[0] != '\0'))
{
bSetMachine = TRUE;
}
if((pwszMachine != NULL) && (g_szMachine[0] != '\0'))
{
if(_tcscmp(pwszMachine, g_szMachine) != 0)
{
bSetMachine = TRUE;
}
}
if(bSetMachine)
{
dwReturn = IpsecConnectInternal( pwszMachine );
}
return dwReturn;
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: PrintErrorMessage()
//
//Date of Creation: October 4th 2001
//
//Parameters:
// IN DWORD dwErrorType,
// IN DWORD dwWin32ErrorCode,
// IN DWORD dwIpsecErrorCode,
// ...
//
//
//Return: DWORD
//
//Description: Prints the IPSEC and WIN32 error messages.
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
void PrintErrorMessage(IN DWORD dwErrorType,
IN DWORD dwWin32ErrorCode,
IN DWORD dwIpsecErrorCode,
...)
{
va_list arg_ptr;
BOOL bFound = FALSE;
DWORD i,dwStatus = 0;
DWORD dwRcIndex = 0xFFFF;
LPVOID szWin32Msg = NULL;
DWORD dwMaxErrMsg = sizeof(ERROR_RC)/sizeof(ERROR_TO_RC);
for(i=0;i<dwMaxErrMsg;i++)
{
if (dwIpsecErrorCode == ERROR_RC[i].dwErrCode)
{
bFound = TRUE;
dwRcIndex = ERROR_RC[i].dwRcCode;
break;
}
}
if(dwWin32ErrorCode == ERROR_OUTOFMEMORY)
{
PrintMessageFromModule(g_hModule,ERR_OUTOF_MEMORY);
BAIL_OUT;
}
switch (dwErrorType)
{
case WIN32_ERR :
dwStatus = FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwWin32ErrorCode,
0, // Default country ID.
(LPWSTR)&szWin32Msg,
0,
NULL);
if (dwStatus)
{
PrintMessageFromModule(g_hModule,ERR_WIN32_FMT,dwWin32ErrorCode,szWin32Msg);
UpdateGetLastError((LPWSTR)szWin32Msg);
}
else
{
UpdateGetLastError(_TEXT("ERR Win32\n"));
PrintMessageFromModule(g_hModule,ERR_WIN32_INVALID_WIN32CODE,dwWin32ErrorCode);
}
break;
case IPSEC_ERR :
if (!bFound)
{
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_NEWLINE);
}
else
{
PrintMessageFromModule(g_hModule,ERR_IPSEC_FMT,dwIpsecErrorCode);
va_start(arg_ptr,dwIpsecErrorCode);
PrintErrorMessageFromModule(g_hModule,dwRcIndex,&arg_ptr);
va_end(arg_ptr);
}
break;
default :
break;
}
if(szWin32Msg != NULL)
{
LocalFree(szWin32Msg);
}
error:
return;
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: DisplayErrorMessage()
//
//Date of Creation:October 4th 2001
//
//Parameters:
// IN LPCWSTR pwszFormat,
// IN va_list *parglist
//
//
//Return: DWORD
//
//Description:Displays error message and updates the last error
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD
DisplayErrorMessage(
IN LPCWSTR pwszFormat,
IN va_list *parglist
)
{
DWORD dwMsgLen = 0;
LPWSTR pwszOutput = NULL;
do
{
dwMsgLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_STRING,
pwszFormat,
0,
0L,
(LPWSTR)&pwszOutput,
0,
parglist);
if((dwMsgLen == 0) || (pwszOutput == NULL))
{
BAIL_OUT;
}
PrintMessageFromModule(g_hModule, DYNAMIC_SHOW_PADD, pwszOutput);
UpdateGetLastError(pwszOutput);
} while ( FALSE );
if ( pwszOutput)
{
LocalFree( pwszOutput );
}
error:
return dwMsgLen;
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: PrintErrorMessageFromModule()
//
//Date of Creation: October 4th 2001
//
//Parameters:
// IN HANDLE hModule,
// IN DWORD dwMsgId,
// IN va_list *parglist
//
//
//Return: DWORD
//
//Description: Prints the error message
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
DWORD
PrintErrorMessageFromModule(
IN HANDLE hModule,
IN DWORD dwMsgId,
IN va_list *parglist
)
{
WCHAR rgwcInput[MAX_STR_LEN + 1] = {0};
if ( !LoadStringW(g_hModule,
dwMsgId,
rgwcInput,
MAX_STR_LEN) )
{
return 0;
}
return DisplayErrorMessage(rgwcInput, parglist);
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: UpdateGetLastError()
//
//Date of Creation: October 4th 2001
//
//Parameters:
// IN LPWSTR pwszOutput
//
//Return: VOID
//
//Description: Updates the contents of the global string for GetLastErrorMessage
// If the operation was success, empty string to be passed to the
// UpdateGetLastError function.
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
VOID
UpdateGetLastError(LPWSTR pwszOutput)
{
if (pwszOutput)
{
_tcsncpy(g_wszLastErrorMessage,pwszOutput,MAX_STR_LEN-1);
}
else
{
_tcsncpy(g_wszLastErrorMessage,_TEXT(""), _tcslen(_TEXT(""))+1); // Operation Ok.
}
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: GetIpsecLastError()
//
//Date of Creation: October 4th 2001
//
//Parameters:
// IN VOID
//
//Return: LPWSTR
//
//Description: Returns the error message for the last operation, If the last operation
// was success returns NULL
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
LPCWSTR
GetIpsecLastError(VOID)
{
LPTSTR wszLastErrorMessage = NULL;
if(_tcscmp(g_wszLastErrorMessage, _TEXT("")) != 0)
{
wszLastErrorMessage = g_wszLastErrorMessage;
}
return (LPCWSTR)wszLastErrorMessage;
}
//////////////////////////////////////////////////////////////////////////////
//
//Function: CheckOsVersion
//
//Date of Creation: 10-8-2001
//
//Parameters: IN UINT CIMOSType,
// IN UINT CIMOSProductSuite,
// IN LPCWSTR CIMOSVersion,
// IN LPCWSTR CIMOSBuildNumber,
// IN LPCWSTR CIMServicePackMajorVersion,
// IN LPCWSTR CIMServicePackMinorVersion,
// IN UINT CIMProcessorArchitecture,
// IN DWORD dwReserved
//Return: BOOL
//
//Description: This Function called by Netshell Frame work
// for every command. This can be utilized for
// diagnostic purposes. To satisfy the frame work.
//
//Revision History:
//
// Date Author Comments
//
//////////////////////////////////////////////////////////////////////////////
BOOL
WINAPI CheckOsVersion(
IN UINT CIMOSType,
IN UINT CIMOSProductSuite,
IN LPCWSTR CIMOSVersion,
IN LPCWSTR CIMOSBuildNumber,
IN LPCWSTR CIMServicePackMajorVersion,
IN LPCWSTR CIMServicePackMinorVersion,
IN UINT CIMProcessorArchitecture,
IN DWORD dwReserved
)
{
DWORD dwStatus =0;
DWORD dwBuildNumber=0;
static BOOL bDisplayOnce = FALSE;
dwBuildNumber = _ttol(CIMOSBuildNumber);
if (dwStatus)
if(dwBuildNumber < NSHIPSEC_BUILD_NUMBER)
{
if (!bDisplayOnce)
{
PrintMessageFromModule(g_hModule,NSHIPSEC_CHECK,NSHIPSEC_BUILD_NUMBER);
bDisplayOnce = TRUE;
}
return FALSE;
}
return TRUE;
}
VOID
CleanupAuthMethod(
PSTA_AUTH_METHODS *ppAuthMethod,
BOOL bIsArray
)
{
if (ppAuthMethod && *ppAuthMethod)
{
CleanupMMAuthMethod(&((*ppAuthMethod)->pAuthMethodInfo), bIsArray);
delete *ppAuthMethod;
*ppAuthMethod = NULL;
}
}
VOID
CleanupMMAuthMethod(
PSTA_MM_AUTH_METHODS *ppMMAuth,
BOOL bIsArray
)
{
if (*ppMMAuth)
{
if (bIsArray)
{
delete [] *ppMMAuth;
}
else
{
if ((*ppMMAuth)->pAuthenticationInfo)
{
if ((*ppMMAuth)->pAuthenticationInfo->pAuthInfo)
{
delete (*ppMMAuth)->pAuthenticationInfo->pAuthInfo;
}
delete (*ppMMAuth)->pAuthenticationInfo;
}
delete *ppMMAuth;
}
*ppMMAuth = NULL;
}
}
VOID
CleanupAuthData(
PSTA_AUTH_METHODS *ppKerbAuth,
PSTA_AUTH_METHODS *ppPskAuth,
PSTA_MM_AUTH_METHODS *ppRootcaMMAuth
)
{
CleanupAuthMethod(ppKerbAuth);
CleanupAuthMethod(ppPskAuth);
if (ppRootcaMMAuth)
{
CleanupMMAuthMethod(ppRootcaMMAuth, TRUE);
}
}