217 lines
5.1 KiB
C
217 lines
5.1 KiB
C
/*++
|
||
|
||
Copyright (c) 1993 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
adtcomn.c
|
||
|
||
Abstract:
|
||
|
||
AdminTools common Routines.
|
||
|
||
This file contains the calls to GetFileSecurity and
|
||
SetFileSecurity that is used on both the client and server
|
||
sides of this RPC server.
|
||
|
||
Author:
|
||
|
||
Dan Lafferty (danl) 23-Mar-1993
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
|
||
Revision History:
|
||
|
||
23-Mar-1993 danl
|
||
Created
|
||
|
||
--*/
|
||
|
||
//
|
||
// Includes
|
||
//
|
||
#include <nt.h>
|
||
#include <ntrtl.h>
|
||
#include <nturtl.h>
|
||
#include <windows.h>
|
||
#include <lmcons.h>
|
||
#include <lmerr.h>
|
||
|
||
#include <rpc.h>
|
||
#include <srvsvc.h>
|
||
#include <netlibnt.h> // NetpNtStatusToApiStatus
|
||
|
||
#include "adtcomn.h"
|
||
|
||
//
|
||
// LOCAL FUNCTIONS
|
||
//
|
||
|
||
|
||
DWORD
|
||
PrivateGetFileSecurity (
|
||
LPWSTR FileName,
|
||
SECURITY_INFORMATION RequestedInfo,
|
||
PSECURITY_DESCRIPTOR *pSDBuffer,
|
||
LPDWORD pBufSize
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function returns to the caller a copy of the security descriptor
|
||
protecting a file or directory. It calls GetFileSecurity. The
|
||
Security Descriptor is always returned in the self-relative format.
|
||
|
||
NOTE: This function allocates storage for the pSDBuffer. Therefore,
|
||
this pointer must be free'd by the caller.
|
||
|
||
Arguments:
|
||
|
||
FileName - A pointer to the name fo the file or directory whose
|
||
security is being retrieved.
|
||
|
||
RequestedInfo - The type of security information being requested.
|
||
|
||
pSDBuffer - A pointer to a location where a pointer for the
|
||
security descriptor and a length field for the security descriptor.
|
||
|
||
pBufSize - A pointer to the location where the size, in bytes, of
|
||
the returned security descriptor is to be placed.
|
||
|
||
|
||
Return Value:
|
||
|
||
NERR_Success - The operation was successful.
|
||
|
||
ERROR_NOT_ENOUGH_MEMORY - Unable to allocate memory for the security
|
||
descriptor.
|
||
|
||
This function can also return any error that GetFileSecurity can
|
||
return.
|
||
|
||
|
||
--*/
|
||
{
|
||
|
||
NET_API_STATUS status;
|
||
DWORD sizeNeeded;
|
||
|
||
*pSDBuffer = NULL;
|
||
//
|
||
// Determine the buffer size for the Descriptor
|
||
//
|
||
if (GetFileSecurityW(
|
||
FileName, // File whose security is being retrieved
|
||
RequestedInfo, // security info being requested
|
||
*pSDBuffer, // buffer to receive security descriptor
|
||
0, // size of the buffer
|
||
&sizeNeeded)) { // size of buffer required
|
||
|
||
//
|
||
// We should have a failed due to a buffer size being too small.
|
||
//
|
||
status = ERROR_INVALID_PARAMETER;
|
||
goto CleanExit;
|
||
}
|
||
|
||
status = GetLastError();
|
||
|
||
if ((status == ERROR_INSUFFICIENT_BUFFER) && (sizeNeeded > 0)) {
|
||
|
||
*pSDBuffer = MIDL_user_allocate(sizeNeeded);
|
||
|
||
if (pSDBuffer == NULL) {
|
||
status = GetLastError();
|
||
ADT_LOG1(ERROR,"NetrpGetFileSecurity:MIDL_user_alloc1 failed %d\n",status);
|
||
goto CleanExit;
|
||
}
|
||
*pBufSize = sizeNeeded;
|
||
|
||
if (!GetFileSecurityW(
|
||
FileName, // File whose security is being retrieved
|
||
RequestedInfo, // security info being requested
|
||
*pSDBuffer, // buffer to receive security descriptor
|
||
sizeNeeded, // size of the buffer
|
||
&sizeNeeded)) { // size of buffer required
|
||
|
||
//
|
||
// The call with the proper buffer size failed.
|
||
//
|
||
status = GetLastError();
|
||
ADT_LOG1(ERROR, "GetFileSecurity Failed %d\n", status);
|
||
MIDL_user_free(*pSDBuffer);
|
||
goto CleanExit;
|
||
}
|
||
|
||
ADT_LOG0(TRACE,"NetrpGetFileSecurity:GetFileSecurity Success\n");
|
||
|
||
if (!IsValidSecurityDescriptor(*pSDBuffer)) {
|
||
ADT_LOG0(TRACE,"FAILURE: SECURITY DESCRIPTOR IS INVALID\n");
|
||
}
|
||
else {
|
||
ADT_LOG0(TRACE,"SUCCESS: SECURITY DESCRIPTOR IS GOOD\n");
|
||
}
|
||
status = NO_ERROR;
|
||
}
|
||
|
||
CleanExit:
|
||
return(status);
|
||
}
|
||
|
||
|
||
DWORD
|
||
PrivateSetFileSecurity (
|
||
LPWSTR FileName,
|
||
SECURITY_INFORMATION SecurityInfo,
|
||
PSECURITY_DESCRIPTOR pSecurityDescriptor
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This function can be used to set the security of a file or directory.
|
||
It calls SetFileSecurity().
|
||
|
||
Arguments:
|
||
|
||
FileName - A pointer to the name of the file or directory whose
|
||
security is being changed.
|
||
|
||
SecurityInfo - Information describing the contents
|
||
of the Security Descriptor.
|
||
|
||
pSecurityDescriptor - A pointer to a structure that contains a
|
||
self-relative security descriptor and a length.
|
||
|
||
Return Value:
|
||
|
||
NERR_Success - The operation was successful.
|
||
|
||
This function can also return any error that GetFileSecurity can
|
||
return.
|
||
|
||
--*/
|
||
{
|
||
DWORD status=NO_ERROR;
|
||
|
||
//
|
||
// Call SetFileSecurity
|
||
//
|
||
if (!SetFileSecurityW (
|
||
FileName,
|
||
SecurityInfo,
|
||
pSecurityDescriptor)) {
|
||
|
||
status = GetLastError();
|
||
return(status);
|
||
}
|
||
return(NO_ERROR);
|
||
}
|
||
|