windows-nt/Source/XPSP1/NT/base/screg/winreg/lib/support.c

215 lines
4.7 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
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 ) {
//
// Allocate space for the converted SECURITY_DESCRIPTOR.
//
lpRpcSD->lpSecurityDescriptor =
( PBYTE ) RtlAllocateHeap(
RtlProcessHeap( ), 0,
cbLen
);
//
// If the memory allocation failed, return.
//
if( lpRpcSD->lpSecurityDescriptor == NULL ) {
return ERROR_OUTOFMEMORY;
}
lpRpcSD->cbInSecurityDescriptor = cbLen;
} else {
//
// Make sure that the buffer provided is big enough
//
if ( lpRpcSD->cbInSecurityDescriptor < cbLen ) {
return ERROR_OUTOFMEMORY;
}
}
//
// Set the size of the transmittable buffer
//
lpRpcSD->cbOutSecurityDescriptor = cbLen;
//
// 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;
}
}