/// <summary> /// Create an instance of the Win32 debug console. /// </summary> /// <param name="session_id">The session ID for the console. Set to 0 to capture global output.</param> /// <param name="throw_on_error">True to throw on error.</param> /// <returns>The Win32 debug console.</returns> public static NtResult <Win32DebugConsole> Create(int session_id, bool throw_on_error) { using (var list = new DisposableList()) { using (var mutant = CreateMutant(session_id)) { // Wait 2 seconds for mutex, if it's not released just try and do it anyway. if (mutant.IsSuccess) { mutant.Result.Wait(NtWaitTimeout.FromSeconds(2)); } try { var buffer_ready = list.AddResource(CreateEvent(session_id, BUFFER_EVENT_NAME, throw_on_error)); if (!buffer_ready.IsSuccess) { return(buffer_ready.Cast <Win32DebugConsole>()); } var data_ready = list.AddResource(CreateEvent(session_id, DATA_EVENT_NAME, throw_on_error)); if (!data_ready.IsSuccess) { return(data_ready.Cast <Win32DebugConsole>()); } var buffer = list.AddResource(CreateSection(session_id, throw_on_error)); if (!buffer.IsSuccess) { return(buffer.Cast <Win32DebugConsole>()); } var mapped_buffer = list.AddResource(buffer.Result.MapRead(throw_on_error)); if (!mapped_buffer.IsSuccess) { return(mapped_buffer.Cast <Win32DebugConsole>()); } var ret = new Win32DebugConsole(session_id, buffer_ready.Result, data_ready.Result, buffer.Result, mapped_buffer.Result); list.Clear(); buffer_ready.Result.Set(); return(ret.CreateResult()); } finally { if (mutant.IsSuccess) { mutant.Result.Release(false); } } } } }
private static NtAlpcClient ConnectPort(string path, SecurityQualityOfService sqos) { AlpcReceiveMessageAttributes in_attr = new AlpcReceiveMessageAttributes(); return(NtAlpcClient.Connect(path, null, CreatePortAttributes(sqos), AlpcMessageFlags.SyncRequest, null, null, null, in_attr, NtWaitTimeout.FromSeconds(5))); }