windows-nt/Source/XPSP1/NT/ds/security/services/scerpc/client/svcclnt.cpp

295 lines
6.5 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
svcclnt.cpp
Abstract:
SCE service Client APIs
Author:
Jin Huang (jinhuang) 23-Jun-1997 created
Revision History:
jinhuang 23-Jan-1998 split to client-server model
--*/
#include "headers.h"
#include "scesvc.h"
#include "scerpc.h"
#include <rpcasync.h>
#pragma hdrstop
//
// prototypes exported in scesvc.h (public\sdk)
//
SCESTATUS
WINAPI
SceSvcQueryInfo(
IN SCE_HANDLE sceHandle,
IN SCESVC_INFO_TYPE sceType,
IN PWSTR lpPrefix OPTIONAL,
IN BOOL bExact,
OUT PVOID *ppvInfo,
OUT PSCE_ENUMERATION_CONTEXT psceEnumHandle
)
/*
Routine Description:
Query information for the service in the configuration/analysis database
which contains the modified configuration and last analysis information.
One enumeration returns maximum SCESVC_ENUMERATION_MAX lines (key/value)
matching the lpPrefix for the service. If lpPrefix is NULL, all information
for the service is enumerated. If there is more information, psceEnumHandle
must be used to get next set of keys/values, until *ppvInfo is NULL or Count is 0.
When bExact is set and lpPrefix is not NULL, exact match on the lpPrefix is
searched and only one line is returned.
The output buffer must be freed by SceSvcFree
Arguments:
sceHandle - the opaque handle obtained from SCE
sceType - the information type to query
lpPrefix - the optional key name prefix for the query
bExact - TRUE = exact match on key
ppvInfo - the output buffer
psceEnumHandle - the output enumeration handle for next enumeartion
Return Value:
SCE status for this operation
*/
{
if ( sceHandle == NULL || ppvInfo == NULL ||
psceEnumHandle == NULL ) {
return(SCESTATUS_INVALID_PARAMETER);
}
SCESTATUS rc=SCESTATUS_SUCCESS;
//
// Validate sceHandle
//
PVOID hProfile=NULL;
__try {
hProfile = ((SCEP_HANDLE *)sceHandle)->hProfile;
if ( !hProfile ||
((SCEP_HANDLE *)sceHandle)->ServiceName == NULL ) {
rc = SCESTATUS_INVALID_PARAMETER;
}
} __except(EXCEPTION_EXECUTE_HANDLER) {
rc = SCESTATUS_INVALID_PARAMETER;
}
if ( SCESTATUS_SUCCESS == rc ) {
RpcTryExcept {
//
// call the RPC interface to query info from the database.
//
rc = SceSvcRpcQueryInfo(
(SCEPR_CONTEXT)hProfile,
(SCEPR_SVCINFO_TYPE)sceType,
(wchar_t *)(((SCEP_HANDLE *)sceHandle)->ServiceName),
(wchar_t *)lpPrefix,
bExact,
(PSCEPR_SVCINFO *)ppvInfo,
(PSCEPR_ENUM_CONTEXT)psceEnumHandle
);
} RpcExcept( I_RpcExceptionFilter( RpcExceptionCode()) ) {
//
// get exception code (DWORD) and convert it into SCESTATUS
//
rc = ScepDosErrorToSceStatus(
RpcExceptionCode());
} RpcEndExcept;
}
return(rc);
}
SCESTATUS
WINAPI
SceSvcSetInfo(
IN SCE_HANDLE sceHandle,
IN SCESVC_INFO_TYPE sceType,
IN PWSTR lpPrefix OPTIONAL,
IN BOOL bExact,
IN PVOID pvInfo OPTIONAL
)
/*
Routine Description:
Save information of a service into security manager internal database. It's up
to the service to collect/decide the information to write.
Type indicates the type of internal database: CONFIGURATION or ANALYSIS.
If the service section does not exist, create it.
Arguments:
sceHandle - the opaque handle obtained from SCE
sceType - the service information type to set
lpPrefix - the key prefix to overwrite
bExact - TRUE = only overwrite if there is exact match, insert if no match
FALSE = overwrite all information for the service then add all
info in the pvInfo buffer
pvInfo - the information to set
Return Value:
SCE status
*/
{
if ( sceHandle == NULL ) {
return(SCESTATUS_INVALID_PARAMETER);
}
SCESTATUS rc=SCESTATUS_SUCCESS;
//
// Validate sceHandle
//
PVOID hProfile=NULL;
__try {
hProfile = ((SCEP_HANDLE *)sceHandle)->hProfile;
if ( !hProfile ||
((SCEP_HANDLE *)sceHandle)->ServiceName == NULL ) {
rc = SCESTATUS_INVALID_PARAMETER;
}
} __except(EXCEPTION_EXECUTE_HANDLER) {
rc = SCESTATUS_INVALID_PARAMETER;
}
if ( SCESTATUS_SUCCESS == rc ) {
RpcTryExcept {
//
// call the RPC interface to query info from the database.
//
rc = SceSvcRpcSetInfo(
(SCEPR_CONTEXT)hProfile,
(SCEPR_SVCINFO_TYPE)sceType,
(wchar_t *)(((SCEP_HANDLE *)sceHandle)->ServiceName),
(wchar_t *)lpPrefix,
bExact,
(PSCEPR_SVCINFO)pvInfo
);
} RpcExcept( I_RpcExceptionFilter( RpcExceptionCode()) ) {
//
// get exception code (DWORD) and convert it into SCESTATUS
//
rc = ScepDosErrorToSceStatus(
RpcExceptionCode());
} RpcEndExcept;
}
return(rc);
}
SCESTATUS
WINAPI
SceSvcFree(
IN PVOID pvServiceInfo
)
{
return (SceSvcpFreeMemory(pvServiceInfo) );
}
SCESTATUS
WINAPI
SceSvcConvertTextToSD (
IN PWSTR pwszTextSD,
OUT PSECURITY_DESCRIPTOR *ppSD,
OUT PULONG pulSDSize,
OUT PSECURITY_INFORMATION psiSeInfo
)
{
DWORD Win32rc;
Win32rc = ConvertTextSecurityDescriptor(
pwszTextSD,
ppSD,
pulSDSize,
psiSeInfo
);
return(ScepDosErrorToSceStatus(Win32rc));
}
SCESTATUS
WINAPI
SceSvcConvertSDToText (
IN PSECURITY_DESCRIPTOR pSD,
IN SECURITY_INFORMATION siSecurityInfo,
OUT PWSTR *ppwszTextSD,
OUT PULONG pulTextSize
)
{
DWORD Win32rc;
Win32rc = ConvertSecurityDescriptorToText(
pSD,
siSecurityInfo,
ppwszTextSD,
pulTextSize
);
return(ScepDosErrorToSceStatus(Win32rc));
}