215 lines
4.7 KiB
C
215 lines
4.7 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 ) {
|
||
|
||
//
|
||
// 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;
|
||
}
|
||
}
|