private void Initialize(Secur32.SecHandle credentials, string targetName, int fContextReq, int targetDataRep, Secur32.SecHandle context, Secur32.SecBufferDesc continueTokenBuffer) { var tokenSize = Secur32.MAX_TOKEN_SIZE; var rc = 0; var hasContextAndContinue = context != Secur32.SecHandle.Zero && continueTokenBuffer != Secur32.SecBufferDesc.Zero; do { _token.Dispose(); _token = new Secur32.SecBufferDesc(tokenSize); if (hasContextAndContinue) { rc = Secur32.InitializeSecurityContext( ref credentials, ref context, targetName, fContextReq, 0, targetDataRep, ref continueTokenBuffer, 0, ref _context, ref _token, out _contextAttributes, out _contextLifetime); } else { rc = Secur32.InitializeSecurityContext( ref credentials, IntPtr.Zero, targetName, fContextReq, 0, targetDataRep, IntPtr.Zero, 0, ref _context, ref _token, out _contextAttributes, out _contextLifetime); } switch (rc) { case Secur32.SEC_E_INSUFFICIENT_MEMORY: tokenSize += Secur32.MAX_TOKEN_SIZE; break; case Secur32.SEC_E_OK: break; case Secur32.SEC_I_CONTINUE_NEEDED: _continue = true; break; default: throw new Win32Exception(rc); } } while (rc == Secur32.SEC_E_INSUFFICIENT_MEMORY); }