Example #1
0
        private static unsafe int MustRunInitializeSecurityContext(SafeFreeCredentials inCredentials, void *inContextPtr, byte *targetName, SspiContextFlags inFlags, Endianness endianness, SecurityBufferDescriptor inputBuffer, SafeDeleteContext outContext, SecurityBufferDescriptor outputBuffer, ref SspiContextFlags attributes, SafeFreeContextBuffer handleTemplate)
        {
            long num;
            int  num1  = -1;
            bool flag  = false;
            bool flag1 = false;

            RuntimeHelpers.PrepareConstrainedRegions();
            try
            {
                try
                {
                    inCredentials.DangerousAddRef(ref flag);
                    outContext.DangerousAddRef(ref flag1);
                }
                catch (Exception exception1)
                {
                    Exception exception = exception1;
                    if (Fx.IsFatal(exception))
                    {
                        throw;
                    }
                    if (flag)
                    {
                        inCredentials.DangerousRelease();
                        flag = false;
                    }
                    if (flag1)
                    {
                        outContext.DangerousRelease();
                        flag1 = false;
                    }
                    if (!(exception is ObjectDisposedException))
                    {
                        throw;
                    }
                }
            }
            finally
            {
                if (!flag)
                {
                    inCredentials = null;
                }
                else if (flag && flag1)
                {
                    SSPIHandle sSPIHandle = inCredentials._handle;
                    num1 = SafeDeleteContext.InitializeSecurityContextW(ref sSPIHandle, inContextPtr, targetName, inFlags, 0, endianness, inputBuffer, 0, ref outContext._handle, outputBuffer, ref attributes, out num);
                    if (outContext._EffectiveCredential == inCredentials || ((long)num1 & (ulong)-2147483648) != (long)0)
                    {
                        inCredentials.DangerousRelease();
                    }
                    else
                    {
                        if (outContext._EffectiveCredential != null)
                        {
                            outContext._EffectiveCredential.DangerousRelease();
                        }
                        outContext._EffectiveCredential = inCredentials;
                    }
                    outContext.DangerousRelease();
                    if (handleTemplate != null)
                    {
                        handleTemplate.Set((*(outputBuffer.UnmanagedPointer)).token);
                        if (handleTemplate.IsInvalid)
                        {
                            handleTemplate.SetHandleAsInvalid();
                        }
                    }
                }
                if (inContextPtr == null && ((long)num1 & (ulong)-2147483648) != (long)0)
                {
                    outContext._handle.SetToInvalid();
                }
            }
            return(num1);
        }