Читаем описание в 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 к ним в стандартных библиотеках прикрутили? Или лучше ими вообще не пользоваться, а писать своё?