295 lines
6.5 KiB
C++
295 lines
6.5 KiB
C++
/*++
|
||
|
||
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));
|
||
|
||
}
|
||
|