mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
3.5 KiB
116 lines
3.5 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
|