Process.EnterDebugMode & "on the current thread"
От: Fortnum  
Дата: 06.11.14 15:15
Оценка:
Читаем описание в MSDN:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.enterdebugmode(v=vs.110).aspx

Process.EnterDebugMode Method

Puts a Process component in state to interact with operating system processes that run in a special mode by enabling the native property SeDebugPrivilege on the current thread.


Как понимать вот эту выделенную выше жирным добавку?

Я бы понимал, если схематично, так: OpenThreadToken(hCurrentThread) -> AdjustTokenPrivileges(currentThreadToken)

Однако рефлектор показывает, что elevat'ится тупо маркер процесса:

  Скрытый текст
public static void EnterDebugMode()
{
    if (ProcessManager.IsNt)
    {
        Process.SetPrivilege("SeDebugPrivilege", 2);
    }
}

private static void SetPrivilege(string privilegeName, int attrib)
{
    IntPtr handle = (IntPtr)0;
    NativeMethods.LUID luid = default(NativeMethods.LUID);
    IntPtr currentProcess = NativeMethods.GetCurrentProcess();
    if (!NativeMethods.OpenProcessToken(new HandleRef(null, currentProcess), 32, out handle))
    {
        throw new Win32Exception();
    }
    try
    {
        if (!NativeMethods.LookupPrivilegeValue(null, privilegeName, out luid))
        {
            throw new Win32Exception();
        }
        NativeMethods.TokenPrivileges tokenPrivileges = new NativeMethods.TokenPrivileges();
        tokenPrivileges.Luid = luid;
        tokenPrivileges.Attributes = attrib;
        NativeMethods.AdjustTokenPrivileges(new HandleRef(null, handle), false, tokenPrivileges, 0, IntPtr.Zero, IntPtr.Zero);
        if (Marshal.GetLastWin32Error() != 0)
        {
            throw new Win32Exception();
        }
    }
    finally
    {
        SafeNativeMethods.CloseHandle(handle);
    }
}


Так, как понимать эту добавку "on the current thread"? Баг в документации или что?

PS.

Вообще там всё криво. Написано "Puts a Process component in state", т.е. можно сделать вывод, что elevat'ить можно любой экземпляр Process. Однако подозрение вызывает уже то, что методы EnterDebugMode и LeaveDebugMode статические. И, действительно, в коде рефлектора выше видно, что идет OpenProcessToken(hСurrentProcess) -> AdjustTokenPrivileges(currentProcessToken). В документации ничего об этом не сказано.

Можно было бы предположить, что надо "on the current thread" читать как "on the current process". Но (1) непонятно, что такое "Process component", и (2) в документации к LeaveDebugMode вообще про "current" ничего не сказано:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.leavedebugmode(v=vs.110).aspx

Process.LeaveDebugMode Method

Takes a Process component out of the state that lets it interact with operating system processes that run in a special mode.


PPS. Смотрю, эти методы с .Net 1.0 существуют, может SafeHandle к ним в стандартных библиотеках прикрутили? Или лучше ими вообще не пользоваться, а писать своё?
Отредактировано 06.11.2014 15:16 fortnum . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.