Article ID: 193073
Article Last Modified on 11/21/2006
102102 How To Add an Access-Allowed ACE to a File
hMutex = CreateMutex(NULL, FALSE, "ThirdPartyDLLMutex");
// Somewhere in your service program.
...
...
...
SECURITY_ATTRIBUTES sa;
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&sa, sizeof(sa));
sa.nLength = sizeof(sa);
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
if (!CreateProcess(NULL, "MyProg.exe", &sa, &sa, TRUE, CREATE_SUSPENDED,
NULL, NULL, &si, &pi))
{
return GetLastError();
}
else
{
ModifyDefaultDacl(pi.hProcess);
ResumeThread(pi.hThread);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
// Continue processing.
...
...
...
/*++
Function : ModifyDefaultDacl
Synopsis : Add EVERYONE ACE to the process token DACL.
Parameter: hProcess - Handle to process to modify the DACL.
Return : 0 if successful, otherwise error code.
--*/
DWORD ModifyDefaultDacl(HANDLE hProcess)
{
int i;
ACL_SIZE_INFORMATION asi;
ACCESS_ALLOWED_ACE *pace;
DWORD dwNewAclSize;
DWORD dwSize = 0;
DWORD dwTokenInfoLength = 0;
DWORD dwResult = 0;
HANDLE hToken = NULL;
PACL pacl = NULL;
PSID psidEveryone = NULL;
SID_IDENTIFIER_AUTHORITY siaWorld = SECURITY_WORLD_SID_AUTHORITY;
TOKEN_DEFAULT_DACL tddNew;
TOKEN_DEFAULT_DACL *ptdd = NULL;
TOKEN_INFORMATION_CLASS tic = TokenDefaultDacl;
__try
{
//
// Obtain an access token.
//
if (!OpenProcessToken(hProcess, TOKEN_QUERY |
TOKEN_ADJUST_DEFAULT, &hToken))
{
dwResult = GetLastError();
__leave;
}
//
// Obtain buffer size for DACL information.
//
if (!GetTokenInformation(hToken, tic, (LPVOID)NULL,
dwTokenInfoLength, &dwSize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
ptdd = (TOKEN_DEFAULT_DACL *) LocalAlloc(LPTR, dwSize);
if (ptdd == NULL)
{
dwResult = GetLastError();
__leave;
}
if (!GetTokenInformation(hToken, tic, (LPVOID)ptdd, dwSize,
&dwSize))
{
dwResult = GetLastError();
__leave;
}
}
else
{
dwResult = GetLastError();
__leave;
}
}
//
// Obtain ACL information.
//
if (!GetAclInformation(ptdd->DefaultDacl, (LPVOID)&asi,
(DWORD)sizeof(ACL_SIZE_INFORMATION),
AclSizeInformation))
{
dwResult = GetLastError();
__leave;
}
//
// Create SID for the Everyone group.
//
if (!AllocateAndInitializeSid(&siaWorld, 1, SECURITY_WORLD_RID, 0,
0, 0, 0, 0, 0, 0, &psidEveryone))
{
dwResult = GetLastError();
__leave;
}
//
// Compute the size of the new ACL.
//
dwNewAclSize = asi.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) +
GetLengthSid(psidEveryone) - sizeof(DWORD);
//
// Allocate buffer for the new ACL.
//
pacl = (PACL) LocalAlloc(LPTR, dwNewAclSize);
if (pacl == NULL)
{
dwResult = GetLastError();
__leave;
}
//
// Intialize the ACL.
//
if (!InitializeAcl(pacl, dwNewAclSize, ACL_REVISION))
{
dwResult = GetLastError();
__leave;
}
//
// Loop through all the ACEs.
//
for (i = 0; i < (int) asi.AceCount; i++)
{
//
// Get current ACE.
//
if (!GetAce(ptdd->DefaultDacl, i, (LPVOID *)&pace))
{
dwResult = GetLastError();
__leave;
}
//
// Build the new ACL.
//
if (!AddAce(pacl, ACL_REVISION, MAXDWORD, pace,
((PACE_HEADER)pace)->AceSize))
{
dwResult = GetLastError();
__leave;
}
}
//
// Add the new ACE.
//
if (!AddAccessAllowedAce(pacl, ACL_REVISION, GENERIC_ALL,
psidEveryone))
{
dwResult = GetLastError();
__leave;
}
//
// Set the new Default DACL.
//
tddNew.DefaultDacl = pacl;
if (!SetTokenInformation(hToken, tic, (LPVOID)&tddNew,
dwNewAclSize))
{
dwResult = GetLastError();
__leave;
}
}
__finally
{
//
// Free the buffer for the sid.
//
if (psidEveryone)
{
FreeSid(psidEveryone);
}
//
// Free the buffers.
//
if (pacl)
{
LocalFree((HLOCAL)pacl);
}
if (ptdd)
{
LocalFree((HLOCAL)ptdd);
}
//
// Close the access token.
//
if (hToken)
{
CloseHandle(hToken);
}
}
return dwResult;
}
Keywords: kbacl kbapi kbcode kbfaq kbhowto kbsecurity KB193073