public SMB2_SessionSetupResponse SendSessionSetupRequests(NetworkCredential optionalCredential = null) { SSPIHelper MyHelper = new SSPIHelper(_server); if (optionalCredential != null) { MyHelper.LoginClient(optionalCredential); } byte[] ServerSSPIPacket = null; byte[] ClientSSPIPacket; byte[] MIC = null; bool bContinueProcessing = true; while (bContinueProcessing) { MyHelper.InitializeClient(out ClientSSPIPacket, ServerSSPIPacket, out bContinueProcessing); if (!bContinueProcessing) { byte[] temp; MyHelper.SignMessage(mechTypes, out temp); MIC = new byte[temp.Length - mechTypes.Length]; Array.Copy(temp, mechTypes.Length, MIC, 0, temp.Length - mechTypes.Length); sessionkey = MyHelper.GetSessionKey(); } var packet = BuildSessionSetupPacket(ClientSSPIPacket, MIC); SendPacket(packet); Trace.WriteLine("SessionSetup Packet sent"); var answer = ReadPacket(); var header = ReadSMB2Header(answer); Trace.WriteLine("SessionSetup Packet received"); if (header.Status == 0) { return(ReadResponse <SMB2_SessionSetupResponse>(answer)); } if (header.Status != STATUS_MORE_PROCESSING_REQUIRED) { Trace.WriteLine("Checking " + _server + "Error " + header.Status); throw new Win32Exception((int)header.Status); } if (!bContinueProcessing) { Trace.WriteLine("Checking " + _server + "Error " + header.Status + " when no processing needed"); throw new Win32Exception((int)header.Status, "Unexpected SessionSetup error"); } var sessionSetupResponse = ReadResponse <SMB2_SessionSetupResponse>(answer); _sessionid = header.SessionId; // extract SSP answer from GSSPAPI answer ServerSSPIPacket = ExtractSSP(answer, sessionSetupResponse); } throw new NotImplementedException("Not supposed to be here"); }