Windows2000/private/windows/screg/winreg/lib/support.c
2020-09-30 17:12:32 +02:00

185 lines
4.3 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
Support.c
Abstract:
This module contains support routines for the Win32 Registry API.
Author:
David J. Gilman (davegi) 15-Nov-1991
--*/
/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
error.c
Abstract:
This module contains a routine for converting NT status codes
to DOS/OS|2 error codes.
Author:
David Treadwell (davidtr) 04-Apr-1991
Revision History:
--*/
#include <rpc.h>
#include "regrpc.h"
#include <stdio.h>
LONG
MapSAToRpcSA (
IN LPSECURITY_ATTRIBUTES lpSA,
OUT PRPC_SECURITY_ATTRIBUTES lpRpcSA
)
/*++
Routine Description:
Maps a SECURITY_ATTRIBUTES structure to a RPC_SECURITY_ATTRIBUTES
structure by converting the SECURITY_DESCRIPTOR to a form where it can
be marshalled/unmarshalled.
Arguments:
lpSA - Supplies a pointer to the SECURITY_ATTRIBUTES structure to be
converted.
lpRpcSA - Supplies a pointer to the converted RPC_SECURITY_ATTRIBUTES
structure. The caller should free (using RtlFreeHeap) the field
lpSecurityDescriptor when its finished using it.
Return Value:
LONG - Returns ERROR_SUCCESS if the SECURITY_ATTRIBUTES is
succesfully mapped.
--*/
{
LONG Error;
ASSERT( lpSA != NULL );
ASSERT( lpRpcSA != NULL );
// Map the SECURITY_DESCRIPTOR to a RPC_SECURITY_DESCRIPTOR.
lpRpcSA->RpcSecurityDescriptor.lpSecurityDescriptor = NULL;
if( lpSA->lpSecurityDescriptor != NULL ) {
Error = MapSDToRpcSD(
lpSA->lpSecurityDescriptor,
&lpRpcSA->RpcSecurityDescriptor
);
} else {
lpRpcSA->RpcSecurityDescriptor.cbInSecurityDescriptor = 0;
lpRpcSA->RpcSecurityDescriptor.cbOutSecurityDescriptor = 0;
Error = ERROR_SUCCESS;
}
if( Error == ERROR_SUCCESS ) {
// The supplied SECURITY_DESCRIPTOR was successfully converted
// to self relative format so assign the remaining fields.
lpRpcSA->nLength = lpSA->nLength;
lpRpcSA->bInheritHandle = ( BOOLEAN ) lpSA->bInheritHandle;
}
return Error;
}
LONG
MapSDToRpcSD (
IN PSECURITY_DESCRIPTOR lpSD,
IN OUT PRPC_SECURITY_DESCRIPTOR lpRpcSD
)
/*++
Routine Description:
Maps a SECURITY_DESCRIPTOR to a RPC_SECURITY_DESCRIPTOR by converting
it to a form where it can be marshalled/unmarshalled.
Arguments:
lpSD - Supplies a pointer to the SECURITY_DESCRIPTOR
structure to be converted.
lpRpcSD - Supplies a pointer to the converted RPC_SECURITY_DESCRIPTOR
structure. Memory for the security descriptor is allocated if
not provided. The caller must take care of freeing up the memory
if necessary.
Return Value:
LONG - Returns ERROR_SUCCESS if the SECURITY_DESCRIPTOR is
succesfully mapped.
--*/
{
DWORD cbLen;
ASSERT( lpSD != NULL );
ASSERT( lpRpcSD != NULL );
if( RtlValidSecurityDescriptor( lpSD )) {
cbLen = RtlLengthSecurityDescriptor( lpSD );
ASSERT( cbLen > 0 );
// If we're not provided a buffer for the security descriptor, allocate it.
if ( !lpRpcSD->lpSecurityDescriptor ) {
lpRpcSD->lpSecurityDescriptor = ( PBYTE ) RtlAllocateHeap(RtlProcessHeap( ), 0, cbLen);// Allocate space for the converted SECURITY_DESCRIPTOR.
if( lpRpcSD->lpSecurityDescriptor == NULL ) {// If the memory allocation failed, return.
return ERROR_OUTOFMEMORY;
}
lpRpcSD->cbInSecurityDescriptor = cbLen;
} else {
// Make sure that the buffer provided is big enough
if ( lpRpcSD->cbInSecurityDescriptor < cbLen ) {
return ERROR_OUTOFMEMORY;
}
}
lpRpcSD->cbOutSecurityDescriptor = cbLen;// Set the size of the transmittable buffer
// Convert the supplied SECURITY_DESCRIPTOR to self relative form.
return RtlNtStatusToDosError(
RtlMakeSelfRelativeSD(
lpSD,
lpRpcSD->lpSecurityDescriptor,
&lpRpcSD->cbInSecurityDescriptor
)
);
} else {// The supplied SECURITY_DESCRIPTOR is invalid.
return ERROR_INVALID_PARAMETER;
}
}