64 HANDLE thread_token, process_snapshot, winlogon_process, winlogon_token, duplicated_token;
65 PROCESSENTRY32 entry = {};
66 entry.dwSize =
sizeof(PROCESSENTRY32);
69 TOKEN_PRIVILEGES privileges = {};
70 privileges.PrivilegeCount = 1;
71 privileges.Privileges->Attributes = SE_PRIVILEGE_ENABLED;
73 if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &privileges.Privileges[0].Luid))
76 if (!ImpersonateSelf(SecurityImpersonation))
81 if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES, FALSE, &thread_token))
83 if (!AdjustTokenPrivileges(thread_token, FALSE, &privileges,
sizeof(privileges), NULL, NULL))
85 CloseHandle(thread_token);
88 CloseHandle(thread_token);
90 process_snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
91 if (process_snapshot == INVALID_HANDLE_VALUE)
94 for (
ret = Process32First(process_snapshot, &entry);
ret;
ret = Process32Next(process_snapshot, &entry))
96 if (!_stricmp(entry.szExeFile,
"winlogon.exe"))
98 pid = entry.th32ProcessID;
102 CloseHandle(process_snapshot);
106 winlogon_process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
107 if (!winlogon_process)
110 if (!OpenProcessToken(winlogon_process, TOKEN_IMPERSONATE | TOKEN_DUPLICATE, &winlogon_token))
112 CloseHandle(winlogon_process);
115 CloseHandle(winlogon_process);
117 if (!DuplicateToken(winlogon_token, SecurityImpersonation, &duplicated_token))
119 CloseHandle(winlogon_token);
122 CloseHandle(winlogon_token);
124 if (!SetThreadToken(NULL, duplicated_token))
126 CloseHandle(duplicated_token);
129 CloseHandle(duplicated_token);
173 UCHAR bTokenUser[
sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];
174 PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;
176 SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;
181 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
185 if (!GetTokenInformation(hToken, TokenUser, pTokenUser,
sizeof(bTokenUser), &cbTokenUser))
194 if (!AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, &pSystemSid))
198 bSystem = EqualSid(pTokenUser->User.Sid, pSystemSid);