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
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;
|
|
}
|
|
|
|
|
|
|