| 353 | } |
| 354 | |
| 355 | int Ext2CreateToken(DWORD pid, DWORD *sid, HANDLE *token) |
| 356 | { |
| 357 | HANDLE h = NULL, token_user = NULL; |
| 358 | DWORD dwTokenRights; |
| 359 | PSID IntegrityLevelSid = NULL; |
| 360 | CString SIDvalue; |
| 361 | TOKEN_MANDATORY_LABEL IntegrityLevelToken = {0}; |
| 362 | |
| 363 | int rc = -1; |
| 364 | |
| 365 | rc = ProcessIdToSessionId(pid, sid); |
| 366 | if (!rc) { |
| 367 | rc = -1 * GetLastError(); |
| 368 | goto errorout; |
| 369 | } |
| 370 | |
| 371 | h = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid); |
| 372 | if (h == NULL || h == INVALID_HANDLE_VALUE) { |
| 373 | rc = -1 * GetLastError(); |
| 374 | goto errorout; |
| 375 | } |
| 376 | |
| 377 | rc = OpenProcessToken(h, TOKEN_DUPLICATE, &token_user); |
| 378 | if(!rc) { |
| 379 | rc = -1 * GetLastError(); |
| 380 | goto errorout; |
| 381 | } |
| 382 | |
| 383 | dwTokenRights = TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY | |
| 384 | TOKEN_DUPLICATE | TOKEN_ADJUST_DEFAULT | |
| 385 | TOKEN_ADJUST_SESSIONID; |
| 386 | rc = DuplicateTokenEx(token_user, dwTokenRights, NULL, |
| 387 | SecurityImpersonation /*SecurityIdentification*/, |
| 388 | TokenPrimary, token); |
| 389 | if (!rc) { |
| 390 | rc = -1 * GetLastError(); |
| 391 | goto errorout; |
| 392 | } |
| 393 | |
| 394 | // S-revision-authority-rid |
| 395 | // S-1-16-? |
| 396 | // 16 represents |
| 397 | // SECURITY_MANDATORY_LABEL_AUTHORITY |
| 398 | |
| 399 | SIDvalue.Format("S-1-16-%d", SECURITY_MANDATORY_MEDIUM_RID); |
| 400 | if(!ConvertStringSidToSidA(SIDvalue, &IntegrityLevelSid)) { |
| 401 | /* not critical, ignore this error */ |
| 402 | goto errorout; |
| 403 | } |
| 404 | |
| 405 | IntegrityLevelToken.Label.Attributes = SE_GROUP_INTEGRITY; |
| 406 | IntegrityLevelToken.Label.Sid = IntegrityLevelSid; |
| 407 | |
| 408 | SetTokenInformation(*token, |
| 409 | TokenIntegrityLevel, |
| 410 | &IntegrityLevelToken, |
| 411 | sizeof(TOKEN_MANDATORY_LABEL) + |
| 412 | GetLengthSid(IntegrityLevelSid)); |