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.
 
 
 
 
 
 

152 lines
3.3 KiB

/*++
Copyright (c) 1999-2001 Microsoft Corporation
Module Name:
custom.cpp
Abstract:
This module implements routines to evaluate
custom mode values by loading the helper dll.
Author:
Vishnu Patankar (VishnuP) - Oct 2001
Environment:
User mode only.
Exported Functions:
Revision History:
Created - Oct 2001
--*/
#include "stdafx.h"
#include "kbproc.h"
#include "process.h"
DWORD
process::SsrpEvaluateCustomFunction(
IN PWSTR pszMachineName,
IN BSTR bstrDLLName,
IN BSTR bstrFunctionName,
OUT BOOL *pbSelect
)
/*++
Routine Description:
Routine called to evaluate custom mode values per role or service
Arguments:
pszMachineName - name of machine to evaluate custom function on
bstrDLLName - name of DLL to load
bstrFunctionName - name of function to evaluate
pbSelect - to emit the boolean evaluation result
Return:
Win32 error code
++*/
{
DWORD rc = ERROR_SUCCESS;
HINSTANCE hDll = NULL;
typedef DWORD (*PFN_SSR_CUSTOM_FUNCTION)(PWSTR, BOOL *);
PFN_SSR_CUSTOM_FUNCTION pfnSsrpCustomFunction = NULL;
PCHAR pStr = NULL;
DWORD dwBytes = 0;
if (pbSelect == NULL ) {
rc = ERROR_INVALID_PARAMETER;
goto ExitHandler;
}
*pbSelect = FALSE;
hDll = LoadLibrary(bstrDLLName);
if ( hDll == NULL ) {
rc = GetLastError();
goto ExitHandler;
}
//
// convert WCHAR into ASCII
//
dwBytes = WideCharToMultiByte(CP_THREAD_ACP,
0,
bstrFunctionName,
wcslen(bstrFunctionName),
NULL,
0,
NULL,
NULL
);
if (dwBytes <= 0) {
rc = ERROR_INVALID_PARAMETER;
goto ExitHandler;
}
pStr = (PCHAR)LocalAlloc(LPTR, dwBytes+1);
if ( pStr == NULL ) {
rc = ERROR_NOT_ENOUGH_MEMORY;
goto ExitHandler;
}
dwBytes = WideCharToMultiByte(CP_THREAD_ACP,
0,
bstrFunctionName,
wcslen(bstrFunctionName),
pStr,
dwBytes,
NULL,
NULL
);
pfnSsrpCustomFunction =
(PFN_SSR_CUSTOM_FUNCTION)GetProcAddress(
hDll,
pStr);
if ( pfnSsrpCustomFunction == NULL ) {
rc = ERROR_PROC_NOT_FOUND;
goto ExitHandler;
}
rc = (*pfnSsrpCustomFunction )( pszMachineName, pbSelect );
ExitHandler:
if (hDll) {
FreeLibrary(hDll);
}
if (pStr) {
LocalFree(pStr);
}
if (m_bDbg)
wprintf(L" Error %i when processing function %s in dll %s \n",rc, bstrFunctionName, bstrDLLName);
return rc;
}