_nic
14.10.2009, 23:25
Собственно вот код по кусочкам нарыт из гугла и форумов
HANDLE hToken;
TOKEN_PRIVILEGES Priv,PrivOld;
DWORD cbPriv = sizeof(PrivOld);
ZeroMemory(&Priv,sizeof(Priv));
if (!OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|T OKEN_ADJUST_PRIVILEGES,FALSE, &hToken))
{
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|T OKEN_ADJUST_PRIVILEGES,&hToken );
SetLastError(0);
}
_ASSERTE(ANYSIZE_ARRAY > 0);
Priv.PrivilegeCount = 1;
Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid))
{
WaitForSingleObject(&Priv.Privileges[0].Luid,INFINITE);
}
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid);
AdjustTokenPrivileges(hToken,FALSE,&Priv,sizeof(Priv),&PrivOld,&cbPriv);
AdjustTokenPrivileges(hToken,FALSE,&PrivOld,sizeof(PrivOld),NULL,NULL);
CloseHandle(hToken);
На строчке LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid); получаю ошибку ERROR_IO_PENDING, у пользователя под которым собирается код есть админские права.В чем может быть дело?
HANDLE hToken;
TOKEN_PRIVILEGES Priv,PrivOld;
DWORD cbPriv = sizeof(PrivOld);
ZeroMemory(&Priv,sizeof(Priv));
if (!OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|T OKEN_ADJUST_PRIVILEGES,FALSE, &hToken))
{
OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|T OKEN_ADJUST_PRIVILEGES,&hToken );
SetLastError(0);
}
_ASSERTE(ANYSIZE_ARRAY > 0);
Priv.PrivilegeCount = 1;
Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(!LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid))
{
WaitForSingleObject(&Priv.Privileges[0].Luid,INFINITE);
}
LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid);
AdjustTokenPrivileges(hToken,FALSE,&Priv,sizeof(Priv),&PrivOld,&cbPriv);
AdjustTokenPrivileges(hToken,FALSE,&PrivOld,sizeof(PrivOld),NULL,NULL);
CloseHandle(hToken);
На строчке LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&Priv.Privileges[0].Luid); получаю ошибку ERROR_IO_PENDING, у пользователя под которым собирается код есть админские права.В чем может быть дело?