17 #include "apr_private.h" 21 #include "apr_arch_file_io.h" 22 #if APR_HAVE_SYS_TYPES_H 23 #include <sys/types.h> 35 PSID_IDENTIFIER_AUTHORITY psia;
43 psia = GetSidIdentifierAuthority(
id);
44 nsa = (
DWORD)(psia->Value[5]) + ((
DWORD)(psia->Value[4]) << 8)
45 + ((
DWORD)(psia->Value[3]) << 16) + ((
DWORD)(psia->Value[2]) << 24);
46 sa = (
DWORD)(psia->Value[1]) + ((
DWORD)(psia->Value[0]) << 8);
48 slen = apr_snprintf(
buf, blen,
"S-%d-0x%04x%08x",
49 SID_REVISION, (
unsigned int)
sa, (
unsigned int)nsa);
51 slen = apr_snprintf(
buf, blen,
"S-%d-%lu",
57 nsa = *GetSidSubAuthorityCount(
id);
58 for (
sa = 0;
sa < nsa; ++
sa) {
60 *GetSidSubAuthority(
id,
sa));
72 *
dirname = apr_pstrdup(
p,
"/My Documents");
76 char regkey[MAX_PATH * 2];
89 strcpy(regkey,
"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\" 91 keylen = (
DWORD)strlen(regkey);
95 strcpy(regkey,
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" 97 keylen = (
DWORD)strlen(regkey);
98 apr_cpystrn(regkey + keylen,
username,
sizeof(regkey) - keylen);
101 if ((rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey, 0,
102 KEY_QUERY_VALUE, &
key)) != ERROR_SUCCESS)
105 #if APR_HAS_UNICODE_FS 108 keylen =
sizeof(regkey);
109 rv = RegQueryValueExW(
key, L
"ProfileImagePath", NULL, &
type,
110 (
void*)regkey, &keylen);
112 if (rv != ERROR_SUCCESS)
114 if (
type == REG_SZ) {
115 char retdir[MAX_PATH];
116 if ((rv = unicode_to_utf8_path(retdir,
sizeof(retdir),
121 else if (
type == REG_EXPAND_SZ) {
123 char retdir[MAX_PATH];
126 if ((rv = unicode_to_utf8_path(retdir,
sizeof(retdir),
path))
138 keylen =
sizeof(regkey);
139 rv = RegQueryValueEx(
key,
"ProfileImagePath", NULL, &
type,
140 (
void*)regkey, &keylen);
142 if (rv != ERROR_SUCCESS)
144 if (
type == REG_SZ) {
147 else if (
type == REG_EXPAND_SZ) {
149 ExpandEnvironmentStrings(regkey,
path,
sizeof(
path));
156 for (fixch = *
dirname; *fixch; ++fixch)
173 TOKEN_PRIMARY_GROUP *grp;
175 if(!OpenProcessToken(
GetCurrentProcess(), STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY, &threadtok)) {
180 if (!GetTokenInformation(threadtok, TokenUser, NULL, 0, &needed)
181 && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
182 && (usr = apr_palloc(
p, needed))
183 && GetTokenInformation(threadtok, TokenUser, usr, needed, &needed))
184 *
uid = usr->User.Sid;
188 if (!GetTokenInformation(threadtok, TokenPrimaryGroup, NULL, 0, &needed)
189 && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
190 && (grp = apr_palloc(
p, needed))
191 && GetTokenInformation(threadtok, TokenPrimaryGroup, grp, needed, &needed))
192 *
gid = grp->PrimaryGroup;
206 SID_NAME_USE sidtype;
210 DWORD domlen =
sizeof(anydomain);
214 if ((pos = strchr(
username,
'/'))) {
218 else if ((pos = strchr(
username,
'\\'))) {
227 rv = LookupAccountName(domain,
username, domain, &sidlen,
228 anydomain, &domlen, &sidtype);
232 *
uid = apr_palloc(
p, sidlen);
233 domlen =
sizeof(anydomain);
234 rv = LookupAccountName(domain,
username, *
uid, &sidlen,
235 anydomain, &domlen, &sidtype);
237 if (!sidlen || !rv) {
251 *
username = apr_pstrdup(
p,
"Administrator");
255 char name[MAX_PATH], domain[MAX_PATH];
256 DWORD cbname =
sizeof(
name), cbdomain =
sizeof(domain);
259 if (!LookupAccountSid(NULL, userid,
name, &cbname, domain, &cbdomain, &
type))
261 if (
type != SidTypeUser &&
type != SidTypeAlias &&
type != SidTypeWellKnownGroup)
273 if (!IsValidSid(left) || !IsValidSid(right))
275 if (!EqualSid(left, right))