windows-nt/Source/XPSP1/NT/ds/security/ntmarta/newsrc/window.cxx

117 lines
3.5 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1994 - 1996.
//
// File: window.cxx
//
// Contents: local functions
//
// History: 8/94 davemont Created
//
//----------------------------------------------------------------------------
#include <aclpch.hxx>
#pragma hdrstop
//+---------------------------------------------------------------------------
//
// Function: ReadWindowPropertyRights
//
// Synopsis: Gets the specified security info from the specified handle's
// window
//
// Arguments: [IN hWindow] -- Handle to the open window to
// read the info on
// [IN pRightsList] -- SecurityInfo to read based
// on properties
// [IN cRights] -- Number of items in rights list
// [IN AccessList] -- Access List to fill in
//
// Returns: ERROR_SUCCESS -- Success
// ERROR_INVALID_PARAMETER -- A bad property was encountered
// ERROR_NOT_ENOUGH_MEMORY -- A memory allocation failed
//
//----------------------------------------------------------------------------
DWORD
ReadWindowPropertyRights(IN HANDLE hWindow,
IN PACTRL_RIGHTS_INFO pRightsList,
IN ULONG cRights,
IN CAccessList& AccessList)
{
acDebugOut((DEB_TRACE, "In ReadWindowPropertyRights\n"));
//
// For the moment, there is only service property itself...
//
ASSERT(cRights == 1 && pRightsList[0].pwszProperty == NULL);
if(cRights != 1 || pRightsList[0].pwszProperty != NULL)
{
return(ERROR_INVALID_PARAMETER);
}
UCHAR SDBuff[PSD_BASE_LENGTH];
PISECURITY_DESCRIPTOR pSD = (PISECURITY_DESCRIPTOR)SDBuff;
DWORD dwErr = ERROR_SUCCESS;
ULONG cSize = 0;
//
// Get the security descriptor
//
if(GetUserObjectSecurity(hWindow,
&(pRightsList[0].SeInfo),
pSD,
PSD_BASE_LENGTH,
&cSize) == FALSE)
{
dwErr = GetLastError();
if(dwErr == ERROR_INSUFFICIENT_BUFFER)
{
pSD = (PISECURITY_DESCRIPTOR)AccAlloc(cSize);
if(pSD == NULL)
{
dwErr = ERROR_NOT_ENOUGH_MEMORY;
}
else
{
dwErr = ERROR_SUCCESS;
//
// Let's read it again
//
if(GetUserObjectSecurity(hWindow,
&(pRightsList[0].SeInfo),
pSD,
cSize,
&cSize) == FALSE)
{
dwErr = GetLastError();
}
}
}
}
if(dwErr == ERROR_SUCCESS)
{
//
// Add it
//
dwErr = AccessList.AddSD(pSD,
pRightsList->SeInfo,
pRightsList->pwszProperty);
}
//
// Free our buffer, if necessary
//
if(cSize > PSD_BASE_LENGTH)
{
AccFree(pSD);
}
acDebugOut((DEB_TRACE, "Out ReadWindowPropertyRights: %lu\n", dwErr));
return(dwErr);
}