예제 #1
0
 /// <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);
                 }
             }
         }
     }
 }
예제 #2
0
        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)));
        }