/// <summary> /// Set up the session /// </summary> /// <returns>true if ok, false if bad password</returns> private bool DoSessionSetup() { if (Debug.DebugOn) Debug.WriteLine(Debug.Info, "SMB_COM_SESSION_SETUP_ANDX"); byte[] case_sensitive_passwd = null; byte[] case_insensitive_passwd = null; string string_passwd = fShare.Login.Password; SetupSmbMessage(fMsg, SmbMessage.SMB_COM_SESSION_SETUP_ANDX); if (Debug.DebugOn && Debug.DebugLevel >= Debug.Buffer) { Debug.WriteLine(Debug.Buffer, "New SMB Msg:"); Debug.WriteLine(Debug.Buffer, fMsg.getMessageBuffer(), 0, fMsg.getMessageSize()); } if ((fSecurityMode & SM_ENCRYPT_PASSWORDS) != 0) { case_sensitive_passwd = CifsLogin.GetNtAuthData(string_passwd, fEncryptionKey); case_insensitive_passwd = CifsLogin.GetLmAuthData(string_passwd, fEncryptionKey); } else { case_sensitive_passwd = CifsLogin.GetPasswordBytesUnicode(string_passwd); case_insensitive_passwd = CifsLogin.GetPasswordBytesAscii(string_passwd); } /* UCHAR WordCount; Count of parameter words = 13 0: UCHAR AndXCommand; Secondary (X) command; 0xFF = none 1: UCHAR AndXReserved; Reserved (must be 0) 2: USHORT AndXOffset; Offset to next command WordCount 4: USHORT MaxBufferSize; Client's maximum buffer size 6: USHORT MaxMpxCount; Actual maximum multiplexed pending requests 8: USHORT VcNumber; 0 = first (only), nonzero=additional VC number 10:ULONG SessionKey; Session key (valid iff VcNumber != 0) 14:USHORT CaseInsensitivePasswordLength; Account password size, ANSI 16:USHORT CaseSensitivePasswordLength; Account password size, Unicode 18:ULONG Reserved; must be 0 22:ULONG Capabilities; Client capabilities USHORT ByteCount; Count of data bytes; min = 0 UCHAR CaseInsensitivePassword[]; Account Password, ANSI UCHAR CaseSensitivePassword[]; Account Password, Unicode STRING AccountName[]; Account Name, Unicode STRING PrimaryDomain[]; Client's primary domain, Unicode STRING NativeOS[]; Client's native operating system, Unicode STRING NativeLanMan[]; Client's native LAN Manager type, Unicode */ fMsg.setWordCount(13); // AndXCommand fMsg.setByteParameterAt(0, 0xFF); // AndXReserved fMsg.setByteParameterAt(1, 0); // AndXOffset fMsg.setShortParameterAt(2, 0); // MaxBufferSize fMsg.setShortParameterAt(4, CIFS_MAX_BUFFER_SIZE); // MaxMpxCount fMsg.setShortParameterAt(6, 1); // VcNumber fMsg.setShortParameterAt(8, 0); // SessionKey fMsg.setIntParameterAt(10, 0); // CaseInsensitivePasswordLength fMsg.setShortParameterAt(14, case_insensitive_passwd.Length); // CaseSensitivePasswordLength fMsg.setShortParameterAt(16, case_sensitive_passwd.Length); // Reserved fMsg.setIntParameterAt(18, 0); // Capabilities fMsg.setIntParameterAt(22, CAP_UNICODE | CAP_NT_SMBS); var data = new MarshalBuffer(200); int pos = 0; Debug.WriteLine(Debug.Buffer, "Before Ins Pass:"******"After Ins Pass:"******"After Sens Pass:"******"After Acct Name:"); Debug.WriteLine(Debug.Buffer, data.GetBytes(), 0, data.Size); // Primary domain //string pdomain = Environment.GetEnvironmentVariable("CIFSDOMAIN"); // Can this be done better? string pdomain = "?"; // testing -- This works, but the above breaks... why? pos += data.SetZtAsciiStringAt(pos, pdomain); // Native OS pos += data.SetZtAsciiStringAt(pos, ".NET CIFS Client"); data.Size = pos; Debug.WriteLine(Debug.Buffer, "Final data:"); Debug.WriteLine(Debug.Buffer, data.GetBytes(), 0, data.Size); fMsg.setContent(data); if (Debug.DebugOn && Debug.DebugLevel >= Debug.Buffer) { Debug.WriteLine(Debug.Buffer, "Msg to send"); Debug.WriteLine(Debug.Buffer, fMsg.getMessageBuffer(), 0, fMsg.getMessageSize()); } fMsg.SendAndRecieve(fNBTSession, fMsg); if (!fMsg.isResponse()) throw new CifsIoException("PE3"); int errorclass = fMsg.getErrorClass(); if (errorclass != CifsIoException.SUCCESS) { int errorcode = fMsg.getErrorCode(); if ((errorclass == CifsIoException.ERROR_SRV && errorcode == CifsIoException.SRV_BAD_PASSWORD) || (errorclass == CifsIoException.ERROR_DOS && errorcode == CifsIoException.DOS_NO_ACCESS)) return false; throw new CifsIoException(errorclass, errorcode); } fUID = fMsg.getUID(); /* if(Debug.debugOn && Debug.debugLevel >= Debug.INFO) Debug.WriteLine("UID = " + fMsg.getUID()); */ if (fMsg.getWordCount() != 3) return true; /* UCHAR WordCount; Count of parameter words = 3 0: UCHAR AndXCommand; Secondary (X) command; 0xFF = none 1: UCHAR AndXReserved; Reserved (must be 0) 2: USHORT AndXOffset; Offset to next command WordCount 4: USHORT Action; Request mode: bit0 = logged in as GUEST 6: USHORT SecurityBlobLength length of Security Blob that follows in a later field 8: USHORT ByteCount; Count of data bytes UCHAR SecurityBlob[] SecurityBlob of length specified in field SecurityBlobLength STRING NativeOS[]; Server's native operating system STRING NativeLanMan[]; Server's native LAN Manager type STRING PrimaryDomain[]; Server's primary domain */ byte action = fMsg.getByteParameterAt(4); if ((action & 0x01) != 0) fLoggedAsGuest = true; int byte_count = fMsg.getContentSize(); int off = fMsg.getContentOffset(); int max_off = off + byte_count; /* // Skip security blob off += fMsg.getShortParameterAt(6); */ if (off >= max_off) return true; // Read Native OS fServerOS = fMsg.GetZtAsciiStringAt(off, max_off - off); off += fServerOS.Length + 1; if (off >= max_off) return true; // Read NativeLanMan fServerLanMan = fMsg.GetZtAsciiStringAt(off, max_off - off); off += fServerLanMan.Length + 1; if (off >= max_off) return true; // Read Primary Domain fServerPrimaryDomain = fNBTSession.WorkgroupName; return true; }
public void setContent(MarshalBuffer content) { setContent(content.GetBytes(), 0, content.Size); }
public void setContent(MarshalBuffer content) { setContent(content.GetBytes(), 0, content.Size); }