OpenProcessToken in dll
есть некий драйвер x.dll, в котором в определенный момент нужно вызвать некий бинарник от имени пользователя (хотел использовать CreateProcessAsUser()). решение было простым:
1) установить SE_DEBUG_NAME для текущего процесса
2) найти PID пользовательского процесса (explorer.exe например)
3) заполучить токен по PID
4) вызвать CreateProcessAsUser() с полученным токеном
проблема появилась на шаге 1, а именно, никак не могу установить SE_DEBUG_NAME привилегию, т.к. вызов OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tok)) возвращает ERROR_ACCESS_DENIED.
в обычных процессах все нормально работает, а в .dll нет.
данную длл использует система при печати. (работает из под system)
Заранее спасибо.
как ты устанавливаешь привилегию? давай код
DWORD res;
HANDLE tok;
LUID luid;
TOKEN_PRIVILEGES privs;
// можно так либо через GetCurrentProcess();
HANDLE hProc=\ OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());
if(hProc){
if(OpenProcessToken(hProc/*GetCurrentProcess()*/,
TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&tok)){
if(LookupPrivilegeValue(NULL,priv_name,&luid)){
DWORD ret_len;
privs.PrivilegeCount=1;
privs.Privileges[0].Luid=luid;
privs.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if(!(res=AdjustTokenPrivileges(tok,FALSE,
&privs,sizeof tok,NULL,&ret_value))){
res=GetLastError();
ERROR_LOG("...",res);
}
CloseHandle(tok);
}
}
else{
res=GetLastError();
ERROR_LOG("..",res);
return res;
}
}
return res;
}
далее вызываю
enable_privilege(SE_DEBUG_NAME);
возможно тут синтаксические ошибки, ибо код в виртуальной машине, набирал заново. Но идея должна быть понятной.
вероятней всего причина в том, что процесс системный и система блокирует вызов данных функций как небезопасных. возможно надо использовать другие функции (ядерные).