티스토리 뷰
BOOL CManager::Load_WTS_Process( UINT nId ) { DWORD dwSessionID; DWORD dwWinlogonPID; HANDLE hToken, hTokenDup, hWinlogon; TOKEN_PRIVILEGES token_priv; LUID luid; BOOL bSuc; dwSessionID = nId; hToken = NULL; hTokenDup = NULL; hWinlogon = NULL; try { dwWinlogonPID = IsProcess_running((const PTCHAR)Winlogon, _tcslen(Winlogon)); bSuc = WTSQueryUserToken( nId, &hToken ); if(!bSuc) { bSuc = WTSQueryUserToken( WTSGetActiveConsoleSessionId(), &hToken ); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- WTSQueryUserToken Fail \n") ); throw ERROR_LOAD_WINSTA_DEF_PROC; } } hWinlogon = ::OpenProcess(MAXIMUM_ALLOWED, FALSE, dwWinlogonPID); if(!hWinlogon) { WriteLog( _T("CManager::Load_WTS_Process -- OpenProcess Fail \n") ); throw ERROR_OPENPROCESS; } bSuc = ::OpenProcessToken(hWinlogon, TOKEN_ALL_ACCESS, &hToken); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- OpenProcessToken Fail \n") ); throw ERROR_OPENPROCESS_TOKEN; } bSuc = ::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- LookupPrivilegeValue Fail \n") ); throw ERROR_LOOKUP_PRIV_VALUE; } bSuc = ::DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- DuplicateTokenEx Fail \n") ); throw ERROR_DUP_TOKEN_EX; } bSuc = ::SetTokenInformation(hTokenDup, TokenSessionId, (LPVOID)&dwSessionID, sizeof(dwSessionID)); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- SetTokenInformation Fail \n") ); throw ERROR_SET_TOKEN_INFO; } token_priv.PrivilegeCount = 1; token_priv.Privileges[0].Luid = luid; token_priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; bSuc = ::AdjustTokenPrivileges(hTokenDup, FALSE, &token_priv, sizeof(token_priv), NULL, NULL); if(!bSuc) { WriteLog( _T("CManager::Load_WTS_Process -- AdjustTokenPrivileges Fail \n") ); throw ERROR_ADJ_TOKEN_PRIV; } } catch(...) { if(hToken) ::CloseHandle(hToken); if(hTokenDup) ::CloseHandle(hTokenDup); if(hWinlogon) ::CloseHandle(hWinlogon); return TRUE; } ULONG ulError =0; TCHAR szCmdLine[MAX_PATH] = _T(""); PROCESS_INFORMATION ProcessInfo = {0}; STARTUPINFO StartInfo = {0}; StartInfo.cb = sizeof(StartInfo); _tcscpy_s( szCmdLine, MAX_PATH, g_Manager.GetRetryImagePath() ); ULONG ulState = 0; ulState = ::InterlockedExchange((volatile LONG*)&m_ulRunningProcess, PROCESS_RUNNING); if(ulState) return FALSE; RtlZeroMemory(&m_TrayProcessInfo, sizeof(PROCESS_INFORMATION)); StartInfo.cb = sizeof(StartInfo); StartInfo.lpDesktop = (LPWSTR)Winsta0; bSuc = CreateProcessAsUser( hTokenDup, //hToken NULL, szCmdLine, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NEW_PROCESS_GROUP, NULL, NULL, &StartInfo, &m_TrayProcessInfo ); if(!bSuc) { WriteLog( _T("CreateProcessAsUser Fail \n") ); g_Manager.m_bTrayThreadState = FALSE; } else { g_Manager.m_bTrayThreadState = TRUE; ::InterlockedExchange((volatile LONG*)&m_ulRunningProcess, PROCESS_RUNNING); } if(bSuc) { ::CloseHandle(m_TrayProcessInfo.hThread); ::CloseHandle(m_TrayProcessInfo.hProcess); } m_TrayProcessInfo.hThread = NULL; m_TrayProcessInfo.hProcess = NULL; if(hToken) ::CloseHandle(hToken); if(hTokenDup) ::CloseHandle(hTokenDup); if(hWinlogon) ::CloseHandle(hWinlogon); return bSuc; }
'Tech > Cording' 카테고리의 다른 글
[Java] Analysing a Java Core Dump (0) | 2013.11.25 |
---|---|
[C++] 트레이에 아이콘 등록하기 (0) | 2013.11.25 |
[Grinder] xml parsing (0) | 2013.11.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- tcp_retries2
- 연성결
- 왕좌의 게임
- THE SWELL SEASON
- Glen Hansard
- 백마소서풍
- ONCE
- CLOSE_WAIT
- 홍대 프리마켓
- 메르센 트위스터
- 원양도
- 협객행
- 공연후기
- 스웰시즌
- 홍대앞 놀이터
- rand
- 원스
- swell
- 백혈검
- 설산비호
- Mersenne Twister
- Marketa Irglova
- 서검은구록
- mediastreamvalidator
- 정규분포
- srand
- 월녀검
- game of thrones
- http live streaming
- rsync
글 보관함