MalwareSourceCode/MSIL/Virus/Win32/E/Virus.Win32.Expiro.w-f8f9f26e940480624825f6bddbea86e70fc4aa746c4dd8efa7d98dcb477000ed/Microsoft/InfoCards/Request.cs
2022-08-18 06:28:56 -05:00

293 lines
8.9 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Microsoft.InfoCards.Request
// Assembly: infocard, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
// MVID: 1D4D5564-A025-490C-AF1D-DF4FBB709D1F
// Assembly location: C:\Users\Administrateur\Downloads\Virusshare-00001-msil\Virus.Win32.Expiro.w-f8f9f26e940480624825f6bddbea86e70fc4aa746c4dd8efa7d98dcb477000ed.exe
using Microsoft.InfoCards.Diagnostics;
using System;
using System.ComponentModel;
using System.IO;
using System.Net;
using System.Security.Principal;
namespace Microsoft.InfoCards
{
internal abstract class Request : IDisposable
{
private static Request.RequestHandleDictionary s_existingClientRequests = new Request.RequestHandleDictionary();
private static ExceptionTranslationTable s_exceptionToHResultTable = ExceptionTranslationTable.Instance;
private Stream m_inArgs;
private Stream m_outArgs;
private int m_requestHandle;
private static object s_syncRoot = new object();
private IWebProxy m_proxy;
private object m_syncRoot;
private IntPtr m_rpcHandle;
private Exception m_processingException;
private ExceptionList m_recoverableExceptions;
private WindowsImpersonationContext m_impersonationContext;
private int m_initHResult;
private string m_extendedErrorMessage;
private int m_lcid = -1;
protected Request(
IntPtr rpcHandle,
Stream inArgs,
Stream outArgs,
ExceptionList recoverableExceptions)
{
this.m_inArgs = inArgs;
this.m_outArgs = outArgs;
this.m_rpcHandle = rpcHandle;
this.m_recoverableExceptions = recoverableExceptions;
this.m_syncRoot = new object();
this.m_initHResult = 0;
this.InsertThisRequestIntoDictionary();
}
public Exception ProcessingException
{
get => this.m_processingException;
set => this.m_processingException = value;
}
public IWebProxy UserProxy
{
get
{
if (this.m_proxy == null)
this.m_proxy = WebRequest.GetSystemWebProxy();
return this.m_proxy;
}
}
public int UserLanguage
{
get
{
InfoCardTrace.Assert(this.m_lcid >= 0, " The user language has not been set in the service");
return this.m_lcid;
}
set => this.m_lcid = value;
}
protected Stream InArgs => this.m_inArgs;
public Stream OutArgs => this.m_outArgs;
protected object SyncRoot => this.m_syncRoot;
protected IntPtr RpcHandle => this.m_rpcHandle;
public int RequestHandle => this.m_requestHandle;
public abstract WindowsIdentity RequestorIdentity { get; }
internal void Initialize()
{
try
{
this.OnInitializeAsSystem();
this.ImpersonateRequestor();
this.OnInitializeAsUser();
}
catch (Exception ex)
{
this.m_initHResult = this.HandleException(ex, true);
}
}
private void ImpersonateRequestor()
{
InfoCardTrace.Assert(null != this.RequestorIdentity, "RequestorIdentity can not be null, the derived class should have populated this on initialize");
this.m_impersonationContext = !this.RequestorIdentity.IsSystem ? this.RequestorIdentity.Impersonate() : throw InfoCardTrace.ThrowHelperError((Exception) new CommunicationException(SR.GetString("UserIdentityEqualSystemNotSupported")));
}
private int GetHResultFromException(Exception e)
{
int hresultFromException = 0;
Type type = e.GetType();
if (Request.s_exceptionToHResultTable.ContainsKey(type))
hresultFromException = Request.s_exceptionToHResultTable[type];
else if (e is Win32Exception)
hresultFromException = ((Win32Exception) e).NativeErrorCode;
else
InfoCardService.Crash(e);
return hresultFromException;
}
protected int HandleException(Exception e) => this.HandleException(e, false);
protected int HandleException(Exception e, bool isInitializing)
{
int errorCode = 0;
if (InfoCardTrace.IsFatal(e))
{
InfoCardTrace.TraceAndLogException(e);
InfoCardService.Crash(e);
}
Exception exception = !(e is InfoCardRequestException) ? e : e.InnerException;
if (isInitializing || !this.OnHandleException(exception, out errorCode))
{
if (exception is InfoCardBaseException)
{
errorCode = ((InfoCardBaseException) exception).NativeHResult;
this.m_extendedErrorMessage = ((InfoCardBaseException) exception).ExtendedMessage;
}
else if (this.m_recoverableExceptions == ExceptionList.AllNonFatal)
{
CommunicationException e1 = new CommunicationException(SR.GetString("ClientAPIInfocardError"), exception);
InfoCardTrace.TraceAndLogException((Exception) e1);
errorCode = e1.NativeHResult;
}
else if (this.m_recoverableExceptions.Contains(exception.GetType()))
{
errorCode = this.GetHResultFromException(exception);
}
else
{
InfoCardTrace.TraceAndLogException(e);
InfoCardService.Crash(e);
}
}
return errorCode;
}
protected virtual void PreProcessRequest()
{
this.ProcessingException = (Exception) null;
this.OnMarshalInArgs();
if (this.ProcessingException != null)
{
Exception processingException = this.ProcessingException;
this.ProcessingException = (Exception) null;
throw InfoCardTrace.ThrowHelperError((Exception) new InfoCardRequestException(processingException.Message, processingException));
}
if (this.InArgs.Position != this.InArgs.Length)
throw InfoCardTrace.ThrowHelperError((Exception) new CommunicationException(SR.GetString("ServiceInvalidDataInRequest")));
this.InArgs.Close();
}
protected virtual void PostProcessRequest()
{
this.ProcessingException = (Exception) null;
this.OutArgs.Flush();
this.OnMarshalOutArgs();
if (this.ProcessingException != null)
{
Exception processingException = this.ProcessingException;
this.ProcessingException = (Exception) null;
throw InfoCardTrace.ThrowHelperError((Exception) new InfoCardRequestException(processingException.Message, processingException));
}
}
protected virtual void ProcessRequest()
{
this.ProcessingException = (Exception) null;
this.OnProcess();
if (this.ProcessingException != null)
{
Exception processingException = this.ProcessingException;
this.ProcessingException = (Exception) null;
throw InfoCardTrace.ThrowHelperError((Exception) new InfoCardRequestException(processingException.Message, processingException));
}
}
public int DoProcessRequest(out string extendedMessage)
{
int num = this.m_initHResult;
if (num == 0)
{
try
{
this.PreProcessRequest();
this.ProcessRequest();
this.PostProcessRequest();
}
catch (Exception ex)
{
num = this.HandleException(ex);
}
}
extendedMessage = this.m_extendedErrorMessage;
return num;
}
public static Request FindRequestByHandle(int requestHandle)
{
lock (Request.s_syncRoot)
return Request.s_existingClientRequests[requestHandle];
}
public void Dispose()
{
this.OnDisposeAsUser();
if (this.m_impersonationContext != null)
{
this.m_impersonationContext.Undo();
this.m_impersonationContext = (WindowsImpersonationContext) null;
}
this.OnDisposeAsSystem();
this.RemoveThisRequestFromDictionary();
GC.SuppressFinalize((object) this);
}
protected virtual void OnInitializeAsSystem()
{
}
protected virtual void OnInitializeAsUser()
{
}
protected virtual void OnDisposeAsUser()
{
}
protected abstract void OnMarshalInArgs();
protected abstract void OnProcess();
protected abstract void OnMarshalOutArgs();
protected virtual void OnDisposeAsSystem()
{
}
protected virtual bool OnHandleException(Exception e, out int errorCode)
{
errorCode = 0;
return false;
}
private void InsertThisRequestIntoDictionary()
{
lock (Request.s_syncRoot)
{
int newHandle;
try
{
newHandle = Request.s_existingClientRequests.GetNewHandle();
}
catch (IndexOutOfRangeException ex)
{
throw InfoCardTrace.ThrowHelperError((Exception) new ServiceBusyException(SR.GetString("TooManyClientRequests"), (Exception) ex));
}
this.m_requestHandle = newHandle;
Request.s_existingClientRequests[this.m_requestHandle] = this;
}
}
private void RemoveThisRequestFromDictionary()
{
lock (Request.s_syncRoot)
Request.s_existingClientRequests.Remove(this.m_requestHandle);
}
private class RequestHandleDictionary : HandleDictionary<Request>
{
}
}
}