An initial implementation of cacls.exe. Only displaying ACLs works,
editing is not implemented.
Added: trunk/reactos/subsys/system/cacls/
Added: trunk/reactos/subsys/system/cacls/En.rc
Added: trunk/reactos/subsys/system/cacls/cacls.c
Added: trunk/reactos/subsys/system/cacls/cacls.rc
Added: trunk/reactos/subsys/system/cacls/cacls.xml
Added: trunk/reactos/subsys/system/cacls/precomp.h
Added: trunk/reactos/subsys/system/cacls/resource.h
Modified: trunk/reactos/subsys/system/directory.xml
_____
Added: trunk/reactos/subsys/system/cacls/En.rc
--- trunk/reactos/subsys/system/cacls/En.rc 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/cacls/En.rc 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -0,0 +1,74 @@
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+STRINGTABLE DISCARDABLE
+{
+
+IDS_HELP, "Displays or modifies access control lists (ACLs) of
files\n\n\
+CACLS filename [/T] [/E] [/C] [/G user:perm [...]] [/R user [...]]\n\
+ [/P user:perm [...]] [/D user [...]]\n\
+ filename Displays ACLs.\n\
+ /T Changes ACLs of specified files in\n\
+ the current directory and all subdirectories.\n\
+ /E Edit ACL instead of replacing it.\n\
+ /C Continue on access denied errors.\n\
+ /G user:perm Grant specified user access rights.\n\
+ Perm can be: R Read\n\
+ W Write\n\
+ C Change (write)\n\
+ F Full control\n\
+ /R user Revoke specified user's access rights (only valid with
/E).\n\
+ /P user:perm Replace specified user's access rights.\n\
+ Perm can be: N None\n\
+ R Read\n\
+ W Write\n\
+ C Change (write)\n\
+ F Full control\n\
+ /D user Deny specified user access.\n\
+Wildcards can be used to specify more that one file in a command.\n\
+You can specify more than one user in a command.\n\n\
+Abbreviations:\n\
+ CI - Container Inherit.\n\
+ The ACE will be inherited by directories.\n\
+ OI - Object Inherit.\n\
+ The ACE will be inherited by files.\n\
+ IO - Inherit Only.\n\
+ The ACE does not apply to the current file/directory.\n"
+
+IDS_ABBR_CI, "(CI)"
+IDS_ABBR_OI, "(OI)"
+IDS_ABBR_IO, "(IO)"
+IDS_ABBR_FULL, "F"
+IDS_ABBR_READ, "R"
+IDS_ABBR_WRITE, "W"
+IDS_ABBR_CHANGE, "C"
+IDS_ABBR_NONE, "N"
+IDS_ALLOW, ""
+IDS_DENY, "(DENY)"
+IDS_SPECIAL_ACCESS, "(special access:)"
+IDS_GENERIC_READ, "GENERIC_READ"
+IDS_GENERIC_WRITE, "GENERIC_WRITE"
+IDS_GENERIC_EXECUTE, "GENERIC_EXECUTE"
+IDS_GENERIC_ALL, "GENERIC_ALL"
+IDS_FILE_GENERIC_EXECUTE, "FILE_GENERIC_EXECUTE"
+IDS_FILE_GENERIC_READ, "FILE_GENERIC_READ"
+IDS_FILE_GENERIC_WRITE, "FILE_GENERIC_WRITE"
+IDS_FILE_READ_DATA, "FILE_READ_DATA"
+IDS_FILE_WRITE_DATA, "FILE_WRITE_DATA"
+IDS_FILE_APPEND_DATA, "FILE_APPEND_DATA"
+IDS_FILE_READ_EA, "FILE_READ_EA"
+IDS_FILE_WRITE_EA, "FILE_WRITE_EA"
+IDS_FILE_EXECUTE, "FILE_EXECUTE"
+IDS_FILE_DELETE_CHILD, "FILE_DELETE_CHILD"
+IDS_FILE_READ_ATTRIBUTES, "FILE_READ_ATTRIBUTES"
+IDS_FILE_WRITE_ATTRIBUTES, "FILE_WRITE_ATTRIBUTES"
+IDS_MAXIMUM_ALLOWED, "MAXIMUM_ALLOWED"
+IDS_ACCESS_SYSTEM_SECURITY, "ACCESS_SYSTEM_SECURITY"
+IDS_SPECIFIC_RIGHTS_ALL, "SPECIFIC_RIGHTS_ALL"
+IDS_STANDARD_RIGHTS_REQUIRED, "STANDARD_RIGHTS_REQUIRED"
+IDS_SYNCHRONIZE, "SYNCHRONIZE"
+IDS_WRITE_OWNER, "WRITE_OWNER"
+IDS_WRITE_DAC, "WRITE_DAC"
+IDS_READ_CONTROL, "READ_CONTROL"
+IDS_DELETE, "DELETE"
+IDS_STANDARD_RIGHTS_ALL, "STANDARD_RIGHTS_ALL"
+}
Property changes on: trunk/reactos/subsys/system/cacls/En.rc
___________________________________________________________________
Name: svn:keywords
+ author date revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/system/cacls/cacls.c
--- trunk/reactos/subsys/system/cacls/cacls.c 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/cacls/cacls.c 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -0,0 +1,585 @@
+/*
+ * ReactOS Control ACLs Program
+ * Copyright (C) 2006 Thomas Weidenmueller
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
+ */
+
+#include <precomp.h>
+
+
+static GENERIC_MAPPING FileGenericMapping =
+{
+ FILE_GENERIC_READ,
+ FILE_GENERIC_WRITE,
+ FILE_GENERIC_EXECUTE,
+ FILE_ALL_ACCESS
+};
+
+static INT
+LengthOfStrResource(IN HINSTANCE hInst,
+ IN UINT uID)
+{
+ HRSRC hrSrc;
+ HGLOBAL hRes;
+ LPWSTR lpName, lpStr;
+
+ if (hInst == NULL)
+ {
+ hInst = GetModuleHandle(NULL);
+ }
+
+ /* There are always blocks of 16 strings */
+ lpName = (LPWSTR)MAKEINTRESOURCE((uID >> 4) + 1);
+
+ /* Find the string table block */
+ if ((hrSrc = FindResourceW(hInst,
+ lpName,
+ (LPWSTR)RT_STRING)) &&
+ (hRes = LoadResource(hInst,
+ hrSrc)) &&
+ (lpStr = LockResource(hRes)))
+ {
+ UINT x;
+
+ /* Find the string we're looking for */
+ uID &= 0xF; /* position in the block, same as % 16 */
+ for (x = 0; x < uID; x++)
+ {
+ lpStr += (*lpStr) + 1;
+ }
+
+ /* Found the string */
+ return (int)(*lpStr);
+ }
+ return -1;
+}
+
+
+static INT
+AllocAndLoadString(OUT LPTSTR *lpTarget,
+ IN HINSTANCE hInst,
+ IN UINT uID)
+{
+ INT ln;
+
+ ln = LengthOfStrResource(hInst,
+ uID);
+ if (ln++ > 0)
+ {
+ (*lpTarget) = (LPTSTR)HeapAlloc(GetProcessHeap(),
+ 0,
+ ln * sizeof(TCHAR));
+ if ((*lpTarget) != NULL)
+ {
+ INT Ret;
+ if (!(Ret = LoadString(hInst,
+ uID,
+ *lpTarget,
+ ln)))
+ {
+ HeapFree(GetProcessHeap(),
+ 0,
+ *lpTarget);
+ }
+ return Ret;
+ }
+ }
+ return 0;
+}
+
+
+static VOID
+PrintHelp(VOID)
+{
+ LPTSTR szHelp;
+
+ if (AllocAndLoadString(&szHelp,
+ NULL,
+ IDS_HELP) != 0)
+ {
+ _tprintf(_T("%s"),
+ szHelp);
+
+ HeapFree(GetProcessHeap(),
+ 0,
+ szHelp);
+ }
+}
+
+
+static VOID
+PrintErrorMessage(IN DWORD dwError)
+{
+ LPTSTR szError;
+
+ if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_IGNORE_INSERTS |
+ FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL,
+ dwError,
+ MAKELANGID(LANG_NEUTRAL,
+ SUBLANG_DEFAULT),
+ (LPTSTR)&szError,
+ 0,
+ NULL) != 0)
+ {
+ _tprintf(_T("%s"),
+ szError);
+ LocalFree((HLOCAL)szError);
+ }
+}
+
+
+static DWORD
+LoadAndPrintString(IN HINSTANCE hInst,
+ IN UINT uID)
+{
+ TCHAR szTemp[255];
+ DWORD Len;
+
+ Len = (DWORD)LoadString(hInst,
+ uID,
+ szTemp,
+ sizeof(szTemp) / sizeof(szTemp[0]));
+
+ if (Len != 0)
+ {
+ _tprintf(_T("%s"),
+ szTemp);
+ }
+
+ return Len;
+}
+
+
+static BOOL
+PrintFileDacl(IN LPTSTR FilePath,
+ IN LPTSTR FileName)
+{
+ SIZE_T Indent;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+ DWORD SDSize = 0;
+ TCHAR FullFileName[MAX_PATH + 1];
+ BOOL Ret = FALSE;
+
+ Indent = _tcslen(FilePath) + _tcslen(FileName);
+ if (Indent++ > MAX_PATH - 1)
+ {
+ /* file name too long */
+ SetLastError(ERROR_FILE_NOT_FOUND);
+ return FALSE;
+ }
+
+ _tcscpy(FullFileName,
+ FilePath);
+ _tcscat(FullFileName,
+ FileName);
+
+ /* find out how much memory we need */
+ if (!GetFileSecurity(FullFileName,
+ DACL_SECURITY_INFORMATION,
+ NULL,
+ 0,
+ &SDSize) &&
+ GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+ {
+ return FALSE;
+ }
+
+ SecurityDescriptor =
(PSECURITY_DESCRIPTOR)HeapAlloc(GetProcessHeap(),
+ 0,
+ SDSize);
+ if (SecurityDescriptor != NULL)
+ {
+ if (GetFileSecurity(FullFileName,
+ DACL_SECURITY_INFORMATION,
+ SecurityDescriptor,
+ SDSize,
+ &SDSize))
+ {
+ PACL Dacl;
+ BOOL DaclPresent;
+ BOOL DaclDefaulted;
+
+ if (GetSecurityDescriptorDacl(SecurityDescriptor,
+ &DaclPresent,
+ &Dacl,
+ &DaclDefaulted))
+ {
+ if (DaclPresent)
+ {
+ PACCESS_ALLOWED_ACE Ace;
+ DWORD AceIndex = 0;
+
+ /* dump the ACL */
+ while (GetAce(Dacl,
+ AceIndex,
+ (PVOID*)&Ace))
+ {
+ SID_NAME_USE Use;
+ DWORD NameSize = 0;
+ DWORD DomainSize = 0;
+ LPTSTR Name = NULL;
+ LPTSTR Domain = NULL;
+ LPTSTR SidString = NULL;
+ DWORD IndentAccess;
+ DWORD AccessMask = Ace->Mask;
+ PSID Sid = (PSID)&Ace->SidStart;
+
+ /* attempt to translate the SID into a readable
string */
+ if (!LookupAccountSid(NULL,
+ Sid,
+ Name,
+ &NameSize,
+ Domain,
+ &DomainSize,
+ &Use))
+ {
+ if (GetLastError() == ERROR_NONE_MAPPED)
+ {
+ if (!ConvertSidToStringSid(Sid,
+ &SidString))
+ {
+ break;
+ }
+ }
+ else
+ {
+ if (GetLastError() !=
ERROR_INSUFFICIENT_BUFFER)
+ {
+ break;
+ }
+
+ Name =
(LPTSTR)HeapAlloc(GetProcessHeap(),
+ 0,
+ (NameSize +
DomainSize) * sizeof(TCHAR));
+ if (Name == NULL)
+ {
+
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ break;
+ }
+
+ Domain = Name + NameSize;
+ Name[0] = Domain[0] = _T('\0');
+ if (!LookupAccountSid(NULL,
+ Sid,
+ Name,
+ &NameSize,
+ Domain,
+ &DomainSize,
+ &Use))
+ {
+ HeapFree(GetProcessHeap(),
+ 0,
+ Name);
+ break;
+ }
+ }
+ }
+
+ /* print the file name or space */
+ _tprintf(_T("%s "),
+ FullFileName);
+
+ /* attempt to map the SID to a user name */
+ if (AceIndex == 0)
+ {
+ DWORD i = 0;
+
+ /* overwrite the full file name with spaces
so we
+ only print the file name once */
+ while (FullFileName[i] != _T('\0'))
+ FullFileName[i++] = _T(' ');
+ }
+
+ /* print the domain and/or user if possible, or
the SID string */
+ if (Name != NULL && Domain[0] != _T('\0'))
+ {
+ _tprintf(_T("%s\\%s:"),
+ Domain,
+ Name);
+ IndentAccess = _tcslen(Domain) +
_tcslen(Name);
+ }
+ else
+ {
+ LPTSTR DisplayString = (Name != NULL ? Name
: SidString);
+
+ _tprintf(_T("%s:"),
+ DisplayString);
+ IndentAccess = _tcslen(DisplayString);
+ }
+
+ /* print the ACE Flags */
+ if (Ace->Header.AceFlags &
CONTAINER_INHERIT_ACE)
+ {
+ IndentAccess += LoadAndPrintString(NULL,
+
IDS_ABBR_CI);
+ }
+ if (Ace->Header.AceFlags & OBJECT_INHERIT_ACE)
+ {
+ IndentAccess += LoadAndPrintString(NULL,
+
IDS_ABBR_OI);
+ }
+ if (Ace->Header.AceFlags & INHERIT_ONLY_ACE)
+ {
+ IndentAccess += LoadAndPrintString(NULL,
+
IDS_ABBR_IO);
+ }
+
+ IndentAccess += 2;
+
+ /* print the access rights */
+ MapGenericMask(&AccessMask,
+ &FileGenericMapping);
+ if (Ace->Header.AceType &
ACCESS_DENIED_ACE_TYPE)
+ {
+ if (AccessMask == FILE_ALL_ACCESS)
+ {
+ LoadAndPrintString(NULL,
+ IDS_ABBR_NONE);
+ }
+ else
+ {
+ LoadAndPrintString(NULL,
+ IDS_DENY);
+ goto PrintSpecialAccess;
+ }
+ }
+ else
+ {
+ if (AccessMask == FILE_ALL_ACCESS)
+ {
+ LoadAndPrintString(NULL,
+ IDS_ABBR_FULL);
+ }
+ else if (!(Ace->Mask & (GENERIC_READ |
GENERIC_EXECUTE)) &&
+ AccessMask == (FILE_GENERIC_READ |
FILE_EXECUTE))
+ {
+ LoadAndPrintString(NULL,
+ IDS_ABBR_READ);
+ }
+ else if (AccessMask == (FILE_GENERIC_READ |
FILE_GENERIC_WRITE | FILE_EXECUTE | DELETE))
+ {
+ LoadAndPrintString(NULL,
+ IDS_ABBR_CHANGE);
+ }
+ else if (AccessMask == FILE_GENERIC_WRITE)
+ {
+ LoadAndPrintString(NULL,
+ IDS_ABBR_WRITE);
+ }
+ else
+ {
+ DWORD x, x2;
+ static const struct
+ {
+ DWORD Access;
+ UINT uID;
+ }
+ AccessRights[] = {
+ {FILE_WRITE_ATTRIBUTES,
IDS_FILE_WRITE_ATTRIBUTES},
+ {FILE_READ_ATTRIBUTES,
IDS_FILE_READ_ATTRIBUTES},
+ {FILE_DELETE_CHILD,
IDS_FILE_DELETE_CHILD},
+ {FILE_EXECUTE, IDS_FILE_EXECUTE},
+ {FILE_WRITE_EA, IDS_FILE_WRITE_EA},
+ {FILE_READ_EA, IDS_FILE_READ_EA},
+ {FILE_APPEND_DATA,
IDS_FILE_APPEND_DATA},
+ {FILE_WRITE_DATA,
IDS_FILE_WRITE_DATA},
+ {FILE_READ_DATA,
IDS_FILE_READ_DATA},
+ {FILE_GENERIC_EXECUTE,
IDS_FILE_GENERIC_EXECUTE},
+ {FILE_GENERIC_WRITE,
IDS_FILE_GENERIC_WRITE},
+ {FILE_GENERIC_READ,
IDS_FILE_GENERIC_READ},
+ {GENERIC_ALL, IDS_GENERIC_ALL},
+ {GENERIC_EXECUTE,
IDS_GENERIC_EXECUTE},
+ {GENERIC_WRITE, IDS_GENERIC_WRITE},
+ {GENERIC_READ, IDS_GENERIC_READ},
+ {MAXIMUM_ALLOWED,
IDS_MAXIMUM_ALLOWED},
+ {ACCESS_SYSTEM_SECURITY,
IDS_ACCESS_SYSTEM_SECURITY},
+ {SPECIFIC_RIGHTS_ALL,
IDS_SPECIFIC_RIGHTS_ALL},
+ {STANDARD_RIGHTS_REQUIRED,
IDS_STANDARD_RIGHTS_REQUIRED},
+ {SYNCHRONIZE, IDS_SYNCHRONIZE},
+ {WRITE_OWNER, IDS_WRITE_OWNER},
+ {WRITE_DAC, IDS_WRITE_DAC},
+ {READ_CONTROL, IDS_READ_CONTROL},
+ {DELETE, IDS_DELETE},
+ {STANDARD_RIGHTS_ALL,
IDS_STANDARD_RIGHTS_ALL},
+ };
+
+ LoadAndPrintString(NULL,
+ IDS_ALLOW);
+
+PrintSpecialAccess:
+ LoadAndPrintString(NULL,
+ IDS_SPECIAL_ACCESS);
+
+ /* print the special access rights */
+ x = sizeof(AccessRights) /
sizeof(AccessRights[0]);
+ while (x-- != 0)
+ {
+ if ((Ace->Mask &
AccessRights[x].Access) == AccessRights[x].Access)
+ {
+ _tprintf(_T("\n%s "),
+ FullFileName);
+ for (x2 = 0;
+ x2 < IndentAccess;
+ x2++)
+ {
+ _tprintf(_T(" "));
+ }
+
+ LoadAndPrintString(NULL,
+
AccessRights[x].uID);
+ }
+ }
+
+ _tprintf(_T("\n"));
+ }
+ }
+
+ _tprintf(_T("\n"));
+
+ /* free up all resources */
+ if (Name != NULL)
+ {
+ HeapFree(GetProcessHeap(),
+ 0,
+ Name);
+ }
+
+ if (SidString != NULL)
+ {
+ LocalFree((HLOCAL)SidString);
+ }
+
+ AceIndex++;
+ }
+
+ Ret = TRUE;
+ }
+ else
+ {
+ SetLastError(ERROR_NO_SECURITY_ON_OBJECT);
+ }
+ }
+ }
+
+ HeapFree(GetProcessHeap(),
+ 0,
+ SecurityDescriptor);
+ }
+ else
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ }
+
+ return Ret;
+}
+
+
+#ifdef _UNICODE
+int main(void)
+#else
+int _main (int argc, char *argv[])
+#endif
+{
+#ifdef _UNICODE
+ PWCHAR *argv;
+ int argc = 0;
+ argv = CommandLineToArgvW(GetCommandLineW(), &argc);
+#endif
+
+ if (argc < 2)
+ {
+ PrintHelp();
+ return 1;
+ }
+ else
+ {
+ TCHAR FullPath[MAX_PATH + 1];
+ TCHAR *FilePart = NULL;
+ WIN32_FIND_DATA FindData;
+ HANDLE hFind;
+ BOOL ContinueAccessDenied = FALSE;
+
+ if (argc > 2)
+ {
+ /* FIXME - parse arguments */
+ }
+
+ /* get the full path of where we're searching in */
+ if (GetFullPathName(argv[1],
+ sizeof(FullPath) / sizeof(FullPath[0]),
+ FullPath,
+ &FilePart) != 0)
+ {
+ if (FilePart != NULL)
+ *FilePart = _T('\0');
+ }
+ else
+ goto Error;
+
+ /* find the file(s) */
+ hFind = FindFirstFile(argv[1],
+ &FindData);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ do
+ {
+ if (!(FindData.dwFileAttributes &
FILE_ATTRIBUTE_DIRECTORY) ||
+ (_tcscmp(FindData.cFileName,
+ _T(".")) &&
+ _tcscmp(FindData.cFileName,
+ _T(".."))))
+ {
+ if (argc > 2)
+ {
+ /* FIXME - edit or replace the descriptor */
+ }
+ else
+ {
+ if (!PrintFileDacl(FullPath,
+ FindData.cFileName))
+ {
+ if (GetLastError() == ERROR_ACCESS_DENIED
&&
+ !ContinueAccessDenied)
+ {
+ break;
+ }
+ }
+ else
+ _tprintf(_T("\n"));
+ }
+ }
+ } while (FindNextFile(hFind,
+ &FindData));
+
+ FindClose(hFind);
+
+ if (GetLastError() != ERROR_NO_MORE_FILES)
+ {
+ goto Error;
+ }
+ }
+ else
+ {
+Error:
+ PrintErrorMessage(GetLastError());
+ return 1;
+ }
+ }
+
+ return 0;
+}
Property changes on: trunk/reactos/subsys/system/cacls/cacls.c
___________________________________________________________________
Name: svn:keywords
+ author date revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/system/cacls/cacls.rc
--- trunk/reactos/subsys/system/cacls/cacls.rc 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/cacls/cacls.rc 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -0,0 +1,12 @@
+#include <windows.h>
+#include "resource.h"
+
+#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Control ACLs Program\0"
+#define REACTOS_STR_INTERNAL_NAME "cacls\0"
+#define REACTOS_STR_ORIGINAL_FILENAME "cacls.exe\0"
+#include <reactos/version.rc>
+
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#include "En.rc"
+
Property changes on: trunk/reactos/subsys/system/cacls/cacls.rc
___________________________________________________________________
Name: svn:keywords
+ author date revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/system/cacls/cacls.xml
--- trunk/reactos/subsys/system/cacls/cacls.xml 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/cacls/cacls.xml 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -0,0 +1,15 @@
+<module name="cacls" type="win32cui"
installbase="system32"
installname="cacls.exe" usewrc="false">
+ <include base="cacls">.</include>
+ <define name="__USE_W32API" />
+ <define name="UNICODE" />
+ <define name="_UNICODE" />
+ <define name="_WIN32_IE">0x0500</define>
+ <define name="_WIN32_WINNT">0x0600</define>
+ <define name="WINVER">0x0600</define>
+ <library>kernel32</library>
+ <library>advapi32</library>
+ <library>ntdll</library>
+ <file>cacls.c</file>
+ <file>cacls.rc</file>
+ <pch>precomp.h</pch>
+</module>
Property changes on: trunk/reactos/subsys/system/cacls/cacls.xml
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/system/cacls/precomp.h
--- trunk/reactos/subsys/system/cacls/precomp.h 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/cacls/precomp.h 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -0,0 +1,10 @@
+#ifndef _CACLS_PRECOMP_H
+#define _CACLS_PRECOMP_H
+
+#include <windows.h>
+#include <sddl.h>
+#include <tchar.h>
+#include <stdio.h>
+#include "resource.h"
+
+#endif /* _CACLS_PRECOMP_H */
Property changes on: trunk/reactos/subsys/system/cacls/precomp.h
___________________________________________________________________
Name: svn:keywords
+ author date revision
Name: svn:eol-style
+ native
_____
Added: trunk/reactos/subsys/system/cacls/resource.h
--- trunk/reactos/subsys/system/cacls/resource.h 2006-01-14
01:00:56 UTC (rev 20844)
+++ trunk/reactos/subsys/system/cacls/resource.h 2006-01-14
04:32:37 UTC (rev 20845)
@@ -0,0 +1,44 @@
+#ifndef _CACLS_RESOURCE_H
+#define _CACLS_RESOURCE_H
+
+#define IDS_HELP 101
+#define IDS_ABBR_CI 102
+#define IDS_ABBR_OI 103
+#define IDS_ABBR_IO 104
+#define IDS_ABBR_FULL 105
+#define IDS_ABBR_READ 106
+#define IDS_ABBR_WRITE 107
+#define IDS_ABBR_CHANGE 108
+#define IDS_ABBR_NONE 109
+#define IDS_ALLOW 110
+#define IDS_DENY 111
+#define IDS_SPECIAL_ACCESS 112
+
+#define IDS_GENERIC_READ 113
+#define IDS_GENERIC_WRITE 114
+#define IDS_GENERIC_EXECUTE 115
+#define IDS_GENERIC_ALL 116
+#define IDS_FILE_GENERIC_EXECUTE 118
+#define IDS_FILE_GENERIC_READ 119
+#define IDS_FILE_GENERIC_WRITE 120
+#define IDS_FILE_READ_DATA 121
+#define IDS_FILE_WRITE_DATA 122
+#define IDS_FILE_APPEND_DATA 123
+#define IDS_FILE_READ_EA 124
+#define IDS_FILE_WRITE_EA 125
+#define IDS_FILE_EXECUTE 126
+#define IDS_FILE_DELETE_CHILD 127
+#define IDS_FILE_READ_ATTRIBUTES 128
+#define IDS_FILE_WRITE_ATTRIBUTES 129
+#define IDS_MAXIMUM_ALLOWED 130
+#define IDS_ACCESS_SYSTEM_SECURITY 131
+#define IDS_SPECIFIC_RIGHTS_ALL 132
+#define IDS_STANDARD_RIGHTS_REQUIRED 133
+#define IDS_SYNCHRONIZE 134
+#define IDS_WRITE_OWNER 135
+#define IDS_WRITE_DAC 136
+#define IDS_READ_CONTROL 137
+#define IDS_DELETE 138
+#define IDS_STANDARD_RIGHTS_ALL 139
+
+#endif /* _CACLS_RESOURCE_H */
Property changes on: trunk/reactos/subsys/system/cacls/resource.h
___________________________________________________________________
Name: svn:keywords
+ author date revision
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/subsys/system/directory.xml
--- trunk/reactos/subsys/system/directory.xml 2006-01-14 01:00:56 UTC
(rev 20844)
+++ trunk/reactos/subsys/system/directory.xml 2006-01-14 04:32:37 UTC
(rev 20845)
@@ -2,6 +2,9 @@
<directory name="autochk">
<xi:include href="autochk/autochk.xml" />
</directory>
+<directory name="cacls">
+ <xi:include href="cacls/cacls.xml" />
+</directory>
<directory name="calc">
<xi:include href="calc/calc.xml" />
</directory>