diff --git a/CHANGELOG b/CHANGELOG
index e52126b1..aed051f0 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,5 +1,53 @@
-pysmb-1.1.19, 13 Nov 2016
+pysmb-1.1.26, 5 Jan 2019
+========================
+- Prevents OperationError from being raised when listPath() operation does not
+  return any matching file results.
+- SMBConnection is now a context manager #122.
+
+pysmb-1.1.25, 28 July 2018
+========================
+- Fix buggy support for search parameter in listPath() method. Add
+  SMB_FILE_ATTRIBUTE_INCL_NORMAL bit constant to include 'normal' files with
+  other file types in the returned result. From now on, pysmb defines a 'normal' file
+  as a file entry that is not read-only, not hidden, not system, not archive and
+  not a directory; it ignores other attributes like compression, indexed, sparse,
+  temporary and encryption. listPath() method will now include 'normal' files
+  using the default search parameter.
+- Add isNormal property to SharedFile class to support test if the file is a
+  'normal' file (according to pysmb definition of 'normal' file).
+
+pysmb-1.1.24, 19 July 2018
+========================
+- Improve listPath implementation for SMB1
+- Support for STATUS_PENDING responses across all SMB2 operations.
+
+pysmb-1.1.23, 5 May 2018
+========================
+- Fix bug in listShares() method which fails when the remote server has many shares.
+- Improve echo() method to test and fail if the provided data to echo is not a bytes object.
+- Fix bug in listPath() method where the path to query is not properly terminated.
+
+pysmb-1.1.22, 17 Sep 2017
 ========================
+- Fix bug in getAttributes() method which should return only the filename
+  instead of the entire path for the filename property for the return result.
+
+pysmb-1.1.21, 9 Sep 2017
+========================
+- Fix bug where timestamp values for SMB1 getAttributes() response are not
+  converted properly from FILETIME to epoch time values.
+
+pysmb-1.1.20, 13 Aug 2017
+=========================
+- Add getSecurity() method to support security descriptors query via SMB2
+- Improve retrieveFile() and retrieveFileFromOffset() methods to allow file
+  retrievals over SMB2 even when the file is being locked on the server.
+- Silently discards NMB SESSION_KEEPALIVE packets instead of raising warnings.
+- SMB sessionID will be sent in ECHO requests to conform to SMB2 specs.
+- Fix type errors for MD4 functions in python3.
+
+pysmb-1.1.19, 13 Nov 2016
+=========================
 - Ignore STATUS_PENDING during delete and file store operations
 
 pysmb-1.1.18, 9 Apr 2016
diff --git a/LICENSE b/LICENSE
index d1835069..7eaccfaf 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,5 +1,5 @@
 
-Copyright (C) 2001-2015 Michael Teo <miketeo (a) miketeo.net>
+Copyright (C) 2001-2019 Michael Teo <miketeo (a) miketeo.net>
 
 This software is provided 'as-is', without any express or implied warranty.
 In no event will the author be held liable for any damages arising from the
diff --git a/MANIFEST.in b/MANIFEST.in
new file mode 100644
index 00000000..b22628d9
--- /dev/null
+++ b/MANIFEST.in
@@ -0,0 +1,11 @@
+include LICENSE
+include CHANGELOG
+recursive-include python2 *
+recursive-exclude python2 *.pyc
+recursive-exclude python2 *~
+recursive-include python3 *
+recursive-exclude python3 *.pyc
+recursive-exclude python3 *~
+recursive-include sphinx *
+recursive-include docs *
+recursive-exclude docs *.zip
diff --git a/PKG-INFO b/PKG-INFO
index ba886a1b..9f8779df 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: pysmb
-Version: 1.1.19
+Version: 1.1.26
 Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
 Home-page: https://miketeo.net/projects/pysmb
 Author: Michael Teo
@@ -16,9 +16,6 @@ Classifier: License :: OSI Approved :: zlib/libpng License
 Classifier: Operating System :: Microsoft :: Windows
 Classifier: Operating System :: POSIX
 Classifier: Programming Language :: Python
-Classifier: Programming Language :: Python :: 2.4
-Classifier: Programming Language :: Python :: 2.5
-Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Topic :: Communications :: File Sharing
diff --git a/debian/changelog b/debian/changelog
index 75cead53..42db98f4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+pysmb (1.1.26-0kali1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Kali Janitor <janitor@kali.org>  Wed, 25 Aug 2021 09:27:50 -0000
+
 pysmb (1.1.19-0kali2) kali-dev; urgency=medium
 
   [ Raphaël Hertzog ]
diff --git a/docs/doctrees/api/nmb_NetBIOS.doctree b/docs/doctrees/api/nmb_NetBIOS.doctree
index 9b279b39..970596a9 100644
Binary files a/docs/doctrees/api/nmb_NetBIOS.doctree and b/docs/doctrees/api/nmb_NetBIOS.doctree differ
diff --git a/docs/doctrees/api/smb_SMBConnection.doctree b/docs/doctrees/api/smb_SMBConnection.doctree
index 383d6bfc..063d5625 100644
Binary files a/docs/doctrees/api/smb_SMBConnection.doctree and b/docs/doctrees/api/smb_SMBConnection.doctree differ
diff --git a/docs/doctrees/api/smb_SMBHandler.doctree b/docs/doctrees/api/smb_SMBHandler.doctree
index 2fb06a4e..5b414de8 100644
Binary files a/docs/doctrees/api/smb_SMBHandler.doctree and b/docs/doctrees/api/smb_SMBHandler.doctree differ
diff --git a/docs/doctrees/api/smb_SMBProtocolFactory.doctree b/docs/doctrees/api/smb_SMBProtocolFactory.doctree
index d424daab..1e5933d1 100644
Binary files a/docs/doctrees/api/smb_SMBProtocolFactory.doctree and b/docs/doctrees/api/smb_SMBProtocolFactory.doctree differ
diff --git a/docs/doctrees/api/smb_SharedDevice.doctree b/docs/doctrees/api/smb_SharedDevice.doctree
index eb0fa961..d2b2c340 100644
Binary files a/docs/doctrees/api/smb_SharedDevice.doctree and b/docs/doctrees/api/smb_SharedDevice.doctree differ
diff --git a/docs/doctrees/api/smb_SharedFile.doctree b/docs/doctrees/api/smb_SharedFile.doctree
index faa32e54..d4d3b8ac 100644
Binary files a/docs/doctrees/api/smb_SharedFile.doctree and b/docs/doctrees/api/smb_SharedFile.doctree differ
diff --git a/docs/doctrees/api/smb_exceptions.doctree b/docs/doctrees/api/smb_exceptions.doctree
index aec12290..31eff133 100644
Binary files a/docs/doctrees/api/smb_exceptions.doctree and b/docs/doctrees/api/smb_exceptions.doctree differ
diff --git a/docs/doctrees/api/smb_security_descriptors.doctree b/docs/doctrees/api/smb_security_descriptors.doctree
new file mode 100644
index 00000000..734f4f6e
Binary files /dev/null and b/docs/doctrees/api/smb_security_descriptors.doctree differ
diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle
index 987c4bf6..843712b8 100644
Binary files a/docs/doctrees/environment.pickle and b/docs/doctrees/environment.pickle differ
diff --git a/docs/doctrees/extending.doctree b/docs/doctrees/extending.doctree
index dc0b3fcb..4031973c 100644
Binary files a/docs/doctrees/extending.doctree and b/docs/doctrees/extending.doctree differ
diff --git a/docs/doctrees/index.doctree b/docs/doctrees/index.doctree
index 807f40d0..abeb85f2 100644
Binary files a/docs/doctrees/index.doctree and b/docs/doctrees/index.doctree differ
diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo
index bf80f8a2..69caef73 100644
--- a/docs/html/.buildinfo
+++ b/docs/html/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 8ec856095809db2990831edf01ebc5a4
+config: 24e4dd110b51998b070280bf87a2d415
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html
index c518f1e1..972635b8 100644
--- a/docs/html/_modules/index.html
+++ b/docs/html/_modules/index.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Overview: module code &mdash; pysmb 1.1.18 documentation</title>
+    <title>Overview: module code &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" /> 
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" /> 
   </head>
   <body role="document">
     <div class="related" role="navigation" aria-label="related navigation">
@@ -32,7 +32,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -61,9 +64,7 @@
   <h1>All modules for which code is available</h1>
 <ul><li><a href="nmb/NetBIOS.html">nmb.NetBIOS</a></li>
 <li><a href="nmb/NetBIOSProtocol.html">nmb.NetBIOSProtocol</a></li>
-<li><a href="smb/SMBConnection.html">smb.SMBConnection</a></li>
-<li><a href="smb/SMBProtocol.html">smb.SMBProtocol</a></li>
-<li><a href="smb/base.html">smb.base</a></li>
+<li><a href="smb/security_descriptors.html">smb.security_descriptors</a></li>
 <li><a href="smb/smb_structs.html">smb.smb_structs</a></li>
 </ul>
 
@@ -78,11 +79,14 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/_modules/nmb/NetBIOS.html b/docs/html/_modules/nmb/NetBIOS.html
index 82bdf759..680ececc 100644
--- a/docs/html/_modules/nmb/NetBIOS.html
+++ b/docs/html/_modules/nmb/NetBIOS.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>nmb.NetBIOS &mdash; pysmb 1.1.18 documentation</title>
+    <title>nmb.NetBIOS &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../../_static/jquery.js"></script>
     <script type="text/javascript" src="../../_static/underscore.js"></script>
     <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
     <link rel="up" title="Module code" href="../index.html" /> 
   </head>
   <body role="document">
@@ -33,7 +33,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
       </ul>
     </div>
@@ -218,12 +221,15 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/_modules/nmb/NetBIOSProtocol.html b/docs/html/_modules/nmb/NetBIOSProtocol.html
index 50dade2f..05991f52 100644
--- a/docs/html/_modules/nmb/NetBIOSProtocol.html
+++ b/docs/html/_modules/nmb/NetBIOSProtocol.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.18 documentation</title>
+    <title>nmb.NetBIOSProtocol &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../../_static/jquery.js"></script>
     <script type="text/javascript" src="../../_static/underscore.js"></script>
     <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
     <link rel="up" title="Module code" href="../index.html" /> 
   </head>
   <body role="document">
@@ -33,7 +33,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
       </ul>
     </div>
@@ -210,12 +213,15 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/_modules/smb/SMBConnection.html b/docs/html/_modules/smb/SMBConnection.html
deleted file mode 100644
index 1df1ca89..00000000
--- a/docs/html/_modules/smb/SMBConnection.html
+++ /dev/null
@@ -1,668 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>smb.SMBConnection &mdash; pysmb 1.1.18 documentation</title>
-    
-    <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
-    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="../../_static/jquery.js"></script>
-    <script type="text/javascript" src="../../_static/underscore.js"></script>
-    <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
-    <link rel="up" title="Module code" href="../index.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="../../search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <h1>Source code for smb.SMBConnection</h1><div class="highlight"><pre>
-
-<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">select</span><span class="o">,</span> <span class="nn">socket</span><span class="o">,</span> <span class="nn">struct</span><span class="o">,</span> <span class="nn">errno</span>
-<span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">SMB</span><span class="p">,</span> <span class="n">NotConnectedError</span><span class="p">,</span> <span class="n">NotReadyError</span><span class="p">,</span> <span class="n">SMBTimeout</span>
-
-
-<div class="viewcode-block" id="SMBConnection"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">[docs]</a><span class="k">class</span> <span class="nc">SMBConnection</span><span class="p">(</span><span class="n">SMB</span><span class="p">):</span>
-
-    <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBConnection&#39;</span><span class="p">)</span>
-
-    <span class="c1">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
-    <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
-    <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
-    <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
-    <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
-    <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
-
-<div class="viewcode-block" id="SMBConnection.__init__"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.__init__">[docs]</a>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Create a new SMBConnection instance.</span>
-
-<span class="sd">        *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
-<span class="sd">        File operations can only be proceeded after the connection has been authenticated successfully.</span>
-
-<span class="sd">        Note that you need to call *connect* method to actually establish the SMB connection to the remote server and perform authentication.</span>
-
-<span class="sd">        The default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
-<span class="sd">        Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</span>
-
-<span class="sd">        :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
-<span class="sd">                               You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``</span>
-<span class="sd">        :param string remote_name: The NetBIOS machine name of the remote server.</span>
-<span class="sd">                                   On windows, you can find out the machine name by right-clicking on the &quot;My Computer&quot; and selecting &quot;Properties&quot;.</span>
-<span class="sd">                                   This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</span>
-<span class="sd">        :param string domain: The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</span>
-<span class="sd">        :param boolean use_ntlm_v2: Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.</span>
-<span class="sd">                                    The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
-<span class="sd">                                    Hence, we can only &quot;guess&quot; or try both algorithms.</span>
-<span class="sd">                                    On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
-<span class="sd">        :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
-<span class="sd">                                 If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
-<span class="sd">                                 If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
-<span class="sd">                                 If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
-<span class="sd">        :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
-<span class="sd">                                      The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="n">SMB</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">use_ntlm_v2</span><span class="p">,</span> <span class="n">sign_options</span><span class="p">,</span> <span class="n">is_direct_tcp</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span></div>
-
-    <span class="c1">#</span>
-    <span class="c1"># SMB (and its superclass) Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">True</span>
-
-    <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">False</span>
-
-    <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
-        <span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span>
-        <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-        <span class="n">total_sent</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="k">while</span> <span class="n">total_sent</span> <span class="o">&lt;</span> <span class="n">data_len</span><span class="p">:</span>
-            <span class="n">sent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">total_sent</span><span class="p">:])</span>
-            <span class="k">if</span> <span class="n">sent</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Server disconnected&#39;</span><span class="p">)</span>
-            <span class="n">total_sent</span> <span class="o">=</span> <span class="n">total_sent</span> <span class="o">+</span> <span class="n">sent</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Misc Properties</span>
-    <span class="c1">#</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection is using SMB2 protocol.&quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span>
-
-
-    <span class="c1">#</span>
-    <span class="c1"># Public Methods</span>
-    <span class="c1">#</span>
-
-<div class="viewcode-block" id="SMBConnection.connect"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.connect">[docs]</a>    <span class="k">def</span> <span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">139</span><span class="p">,</span> <span class="n">sock_family</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">60</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Establish the SMB connection to the remote SMB/CIFS server.</span>
-
-<span class="sd">        You must call this method before attempting any of the file operations with the remote server.</span>
-<span class="sd">        This method will block until the SMB connection has attempted at least one authentication.</span>
-
-<span class="sd">        :return: A boolean value indicating the result of the authentication atttempt: True if authentication is successful; False, if otherwise.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="o">=</span> <span class="bp">None</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">sock_family</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">settimeout</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span> <span class="n">ip</span><span class="p">,</span> <span class="n">port</span> <span class="p">))</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">auth_result</span></div>
-
-<div class="viewcode-block" id="SMBConnection.close"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.close">[docs]</a>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">sock</span> <span class="o">=</span> <span class="bp">None</span></div>
-
-<div class="viewcode-block" id="SMBConnection.listShares"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listShares">[docs]</a>    <span class="k">def</span> <span class="nf">listShares</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a list of shared resources on remote server.</span>
-
-<span class="sd">        :return: A list of :doc:`smb.base.SharedDevice&lt;smb_SharedDevice&gt;` instances describing the shared resource</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span><span class="p">(</span><span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span></div>
-
-<div class="viewcode-block" id="SMBConnection.listPath"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath">[docs]</a>    <span class="k">def</span> <span class="nf">listPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span>
-                 <span class="n">search</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_READONLY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_DIRECTORY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_ARCHIVE</span><span class="p">,</span>
-                 <span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a directory listing of files/folders at *path*</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.</span>
-<span class="sd">        :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).</span>
-<span class="sd">                               The default *search* value will query for all read-only, hidden, system, archive files and directories.</span>
-<span class="sd">        :param string/unicode pattern: the filter to apply to the results before returning to the client.</span>
-<span class="sd">        :return: A list of :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instances.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">search</span> <span class="o">=</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span></div>
-
-<div class="viewcode-block" id="SMBConnection.listSnapshots"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listSnapshots">[docs]</a>    <span class="k">def</span> <span class="nf">listSnapshots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a list of available snapshots (shadow copies) for *path*.</span>
-
-<span class="sd">        Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
-<span class="sd">        :return: A list of python *datetime.DateTime* instances in GMT/UTC time zone</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">entries</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">entries</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span></div>
-
-<div class="viewcode-block" id="SMBConnection.getAttributes"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.getAttributes">[docs]</a>    <span class="k">def</span> <span class="nf">getAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve information about the file at *path* on the *service_name*.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :return: A :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">info</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
-
-<div class="viewcode-block" id="SMBConnection.retrieveFile"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFile">[docs]</a>    <span class="k">def</span> <span class="nf">retrieveFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
-
-<span class="sd">        Use *retrieveFileFromOffset()* method if you wish to specify the offset to read from the remote *path* and/or the number of bytes to write to the *file_obj*.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
-<span class="sd">        :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
-<span class="sd">                 The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
-
-<div class="viewcode-block" id="SMBConnection.retrieveFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFileFromOffset">[docs]</a>    <span class="k">def</span> <span class="nf">retrieveFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span> <span class="o">=</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* up to *max_length* number of bytes.</span>
-<span class="sd">        :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
-<span class="sd">        :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
-<span class="sd">                                        If zero, the method returns immediately after the file is opened successfully for reading.</span>
-<span class="sd">        :return: A 2-element tuple of ( file attributes of the file on server, number of bytes written to *file_obj* ).</span>
-<span class="sd">                 The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">:])</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
-
-<div class="viewcode-block" id="SMBConnection.storeFile"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFile">[docs]</a>    <span class="k">def</span> <span class="nf">storeFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Store the contents of the *file_obj* at *path* on the *service_name*.</span>
-<span class="sd">        If the file already exists on the remote server, it will be truncated and overwritten.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created. Otherwise, it will be overwritten.</span>
-<span class="sd">                                    If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
-<span class="sd">        :return: Number of bytes uploaded</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">storeFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
-
-<div class="viewcode-block" id="SMBConnection.storeFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFileFromOffset">[docs]</a>    <span class="k">def</span> <span class="nf">storeFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Store the contents of the *file_obj* at *path* on the *service_name*.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created.</span>
-<span class="sd">                                    If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
-<span class="sd">        :param offset: Long integer value which specifies the offset in the remote server to start writing. First byte of the file is 0.</span>
-<span class="sd">        :param truncate: Boolean value. If True and the file exists on the remote server, it will be truncated first before writing. Default is False.</span>
-<span class="sd">        :return: the file position where the next byte will be written.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="n">truncate</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
-
-<div class="viewcode-block" id="SMBConnection.deleteFiles"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteFiles">[docs]</a>    <span class="k">def</span> <span class="nf">deleteFiles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
-<span class="sd">                                                 Wildcards may be used in th filename component of the path.</span>
-<span class="sd">                                                 If your path/filename contains non-English characters, you must pass in an unicode string.</span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
-
-<div class="viewcode-block" id="SMBConnection.resetFileAttributes"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.resetFileAttributes">[docs]</a>    <span class="k">def</span> <span class="nf">resetFileAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Reset file attributes of one or more regular files or folders.</span>
-<span class="sd">        It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.</span>
-<span class="sd">        This function is very helpful when deleting files/folders that are read-only.</span>
-<span class="sd">        Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
-<span class="sd">                                                 Wildcards may be used in the filename component of the path.</span>
-<span class="sd">                                                 If your path/filename contains non-English characters, you must pass in an unicode string.</span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
-
-<div class="viewcode-block" id="SMBConnection.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.createDirectory">[docs]</a>    <span class="k">def</span> <span class="nf">createDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Creates a new directory *path* on the *service_name*.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path: The path of the new folder (relative to) the shared folder.</span>
-<span class="sd">                                    If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
-
-<div class="viewcode-block" id="SMBConnection.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteDirectory">[docs]</a>    <span class="k">def</span> <span class="nf">deleteDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Delete the empty folder at *path* on *service_name*</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path: The path of the to-be-deleted folder (relative to) the shared folder.</span>
-<span class="sd">                                    If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
-
-<div class="viewcode-block" id="SMBConnection.rename"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.rename">[docs]</a>    <span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Rename a file or folder at *old_path* to *new_path* shared at *service_name*. Note that this method cannot be used to rename file/folder across different shared folders</span>
-
-<span class="sd">        *old_path* and *new_path* are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.</span>
-<span class="sd">        If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span></div>
-
-<div class="viewcode-block" id="SMBConnection.echo"><a class="viewcode-back" href="../../api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.echo">[docs]</a>    <span class="k">def</span> <span class="nf">echo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">10</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.</span>
-
-<span class="sd">        :param string data: Data to send to the remote server.</span>
-<span class="sd">        :return: The *data* parameter</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">cb</span><span class="p">(</span><span class="n">r</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">eb</span><span class="p">(</span><span class="n">failure</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-            <span class="k">raise</span> <span class="n">failure</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">True</span>
-        <span class="k">try</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">cb</span><span class="p">,</span> <span class="n">eb</span><span class="p">)</span>
-            <span class="k">while</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_pollForNetBIOSPacket</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span>
-        <span class="k">finally</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_busy</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">return</span> <span class="n">results</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span></div>
-
-    <span class="c1">#</span>
-    <span class="c1"># Protected Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">_pollForNetBIOSPacket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="p">):</span>
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">read_len</span> <span class="o">=</span> <span class="mi">4</span>
-        <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
-
-        <span class="k">while</span> <span class="n">read_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="k">try</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
-                    <span class="k">raise</span> <span class="n">SMBTimeout</span>
-
-                <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">SMBTimeout</span>
-
-                <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
-                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">NotConnectedError</span>
-
-                <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
-                <span class="n">read_len</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
-            <span class="k">except</span> <span class="n">select</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
-                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ex</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</span><span class="p">):</span>
-                    <span class="k">if</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINTR</span> <span class="ow">and</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EAGAIN</span><span class="p">:</span>
-                        <span class="k">raise</span> <span class="n">ex</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">ex</span>
-
-        <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;BBH&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="mh">0x01</span><span class="p">:</span>
-            <span class="n">length</span> <span class="o">=</span> <span class="n">length</span> <span class="o">|</span> <span class="mh">0x10000</span>
-
-        <span class="n">read_len</span> <span class="o">=</span> <span class="n">length</span>
-        <span class="k">while</span> <span class="n">read_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="k">try</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">():</span>
-                    <span class="k">raise</span> <span class="n">SMBTimeout</span>
-
-                <span class="n">ready</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">select</span><span class="o">.</span><span class="n">select</span><span class="p">([</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">fileno</span><span class="p">()</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="p">[</span> <span class="p">],</span> <span class="n">timeout</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">ready</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">SMBTimeout</span>
-
-                <span class="n">d</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">sock</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="n">read_len</span><span class="p">)</span>
-                <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">NotConnectedError</span>
-
-                <span class="n">data</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="n">d</span>
-                <span class="n">read_len</span> <span class="o">-=</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
-            <span class="k">except</span> <span class="n">select</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
-                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">ex</span><span class="p">,</span> <span class="n">types</span><span class="o">.</span><span class="n">TupleType</span><span class="p">):</span>
-                    <span class="k">if</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EINTR</span> <span class="ow">and</span> <span class="n">ex</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">errno</span><span class="o">.</span><span class="n">EAGAIN</span><span class="p">:</span>
-                        <span class="k">raise</span> <span class="n">ex</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">ex</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">feedData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span></div>
-</pre></div>
-
-          </div>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/docs/html/_modules/smb/SMBProtocol.html b/docs/html/_modules/smb/SMBProtocol.html
deleted file mode 100644
index 20cbc733..00000000
--- a/docs/html/_modules/smb/SMBProtocol.html
+++ /dev/null
@@ -1,487 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>smb.SMBProtocol &mdash; pysmb 1.1.18 documentation</title>
-    
-    <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
-    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="../../_static/jquery.js"></script>
-    <script type="text/javascript" src="../../_static/underscore.js"></script>
-    <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
-    <link rel="up" title="Module code" href="../index.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="../../search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <h1>Source code for smb.SMBProtocol</h1><div class="highlight"><pre>
-
-<span class="kn">import</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">time</span>
-<span class="kn">from</span> <span class="nn">twisted.internet</span> <span class="kn">import</span> <span class="n">reactor</span><span class="p">,</span> <span class="n">defer</span>
-<span class="kn">from</span> <span class="nn">twisted.internet.protocol</span> <span class="kn">import</span> <span class="n">ClientFactory</span><span class="p">,</span> <span class="n">Protocol</span>
-<span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">base</span> <span class="kn">import</span> <span class="n">SMB</span><span class="p">,</span> <span class="n">NotConnectedError</span><span class="p">,</span> <span class="n">NotReadyError</span><span class="p">,</span> <span class="n">SMBTimeout</span>
-
-
-<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span> <span class="s1">&#39;SMBProtocolFactory&#39;</span><span class="p">,</span> <span class="s1">&#39;NotConnectedError&#39;</span><span class="p">,</span> <span class="s1">&#39;NotReadyError&#39;</span> <span class="p">]</span>
-
-
-<span class="k">class</span> <span class="nc">SMBProtocol</span><span class="p">(</span><span class="n">Protocol</span><span class="p">,</span> <span class="n">SMB</span><span class="p">):</span>
-
-    <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBProtocol&#39;</span><span class="p">)</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Protocol Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">connectionMade</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">self</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">requestNMBSession</span><span class="p">()</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">onNMBSessionOK</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">connectionLost</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">reason</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span>
-
-    <span class="k">def</span> <span class="nf">dataReceived</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">feedData</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># SMB (and its superclass) Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">write</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
-            <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanupPendingRequests</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
-
-    <span class="k">def</span> <span class="nf">onNMBSessionFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s1">&#39;Cannot establish NetBIOS session. You might have provided a wrong remote_name&#39;</span><span class="p">)</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Protected Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">_cleanupPendingRequests</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">factory</span><span class="o">.</span><span class="n">instance</span> <span class="o">==</span> <span class="bp">self</span><span class="p">:</span>
-            <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
-            <span class="n">to_remove</span> <span class="o">=</span> <span class="p">[]</span>
-            <span class="k">for</span> <span class="n">mid</span><span class="p">,</span> <span class="n">r</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">iteritems</span><span class="p">():</span>
-                <span class="k">if</span> <span class="n">r</span><span class="o">.</span><span class="n">expiry_time</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">:</span>
-                    <span class="k">try</span><span class="p">:</span>
-                        <span class="n">r</span><span class="o">.</span><span class="n">errback</span><span class="p">(</span><span class="n">SMBTimeout</span><span class="p">())</span>
-                    <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> <span class="k">pass</span>
-                    <span class="n">to_remove</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">mid</span><span class="p">)</span>
-
-            <span class="k">for</span> <span class="n">mid</span> <span class="ow">in</span> <span class="n">to_remove</span><span class="p">:</span>
-                <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span>
-
-            <span class="n">reactor</span><span class="o">.</span><span class="n">callLater</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_cleanupPendingRequests</span><span class="p">)</span>
-
-
-<div class="viewcode-block" id="SMBProtocolFactory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory">[docs]</a><span class="k">class</span> <span class="nc">SMBProtocolFactory</span><span class="p">(</span><span class="n">ClientFactory</span><span class="p">):</span>
-
-    <span class="n">protocol</span> <span class="o">=</span> <span class="n">SMBProtocol</span>
-    <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBFactory&#39;</span><span class="p">)</span>
-
-    <span class="c1">#: SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
-    <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
-    <span class="c1">#: SMB messages will be signed when remote server supports signing but not requires signing.</span>
-    <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
-    <span class="c1">#: SMB messages will only be signed when remote server requires signing.</span>
-    <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
-
-<div class="viewcode-block" id="SMBProtocolFactory.__init__"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.__init__">[docs]</a>    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Create a new SMBProtocolFactory instance. You will pass this instance to *reactor.connectTCP()* which will then instantiate the TCP connection to the remote SMB/CIFS server.</span>
-<span class="sd">        Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.</span>
-<span class="sd">        Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</span>
-
-<span class="sd">        *username* and *password* are the user credentials required to authenticate the underlying SMB connection with the remote server.</span>
-<span class="sd">        File operations can only be proceeded after the connection has been authenticated successfully.</span>
-
-<span class="sd">        :param string my_name: The local NetBIOS machine name that will identify where this connection is originating from.</span>
-<span class="sd">                               You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of ``\/:*?&quot;;|+``.</span>
-<span class="sd">        :param string remote_name: The NetBIOS machine name of the remote server.</span>
-<span class="sd">                                   On windows, you can find out the machine name by right-clicking on the &quot;My Computer&quot; and selecting &quot;Properties&quot;.</span>
-<span class="sd">                                   This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</span>
-<span class="sd">        :param string domain: The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</span>
-<span class="sd">        :param boolean use_ntlm_v2: Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.</span>
-<span class="sd">                                    The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.</span>
-<span class="sd">                                    Hence, we can only &quot;guess&quot; or try both algorithms.</span>
-<span class="sd">                                    On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</span>
-<span class="sd">        :param int sign_options: Determines whether SMB messages will be signed. Default is *SIGN_WHEN_REQUIRED*.</span>
-<span class="sd">                                 If *SIGN_WHEN_REQUIRED* (value=2), SMB messages will only be signed when remote server requires signing.</span>
-<span class="sd">                                 If *SIGN_WHEN_SUPPORTED* (value=1), SMB messages will be signed when remote server supports signing but not requires signing.</span>
-<span class="sd">                                 If *SIGN_NEVER* (value=0), SMB messages will never be signed regardless of remote server&#39;s configurations; access errors will occur if the remote server requires signing.</span>
-<span class="sd">        :param boolean is_direct_tcp: Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.</span>
-<span class="sd">                                      The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">username</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">password</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">my_name</span> <span class="o">=</span> <span class="n">my_name</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">=</span> <span class="n">remote_name</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">domain</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="n">use_ntlm_v2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">=</span> <span class="n">sign_options</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="o">=</span> <span class="bp">None</span>    <span class="c1">#: The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</span></div>
-
-    <span class="c1">#</span>
-    <span class="c1"># Public Property</span>
-    <span class="c1">#</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isReady</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection has connected to remote server, has successfully authenticated itself and is ready for file operations.&quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">)</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isUsingSMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;A convenient property to return True if the underlying SMB connection is using SMB2 protocol.&quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">is_using_smb2</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Public Methods for Callbacks</span>
-    <span class="c1">#</span>
-
-<div class="viewcode-block" id="SMBProtocolFactory.onAuthOK"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthOK">[docs]</a>    <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
-<span class="sd">        This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
-<span class="sd">        File operations can proceed when this method has been called.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">pass</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.onAuthFailed"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">[docs]</a>    <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Override this method in your *SMBProtocolFactory* subclass to add in post-authentication handling.</span>
-<span class="sd">        This method will be called when the server has replied that the SMB connection has been successfully authenticated.</span>
-
-<span class="sd">        If you want to retry authenticating from this method,</span>
-<span class="sd">         1. Disconnect the underlying SMB connection (call ``self.instance.transport.loseConnection()``)</span>
-<span class="sd">         2. Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</span>
-<span class="sd">         3. Call ``reactor.connectTCP`` with the new instance to re-establish the SMB connection</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">pass</span></div>
-
-    <span class="c1">#</span>
-    <span class="c1"># Public Methods</span>
-    <span class="c1">#</span>
-
-<div class="viewcode-block" id="SMBProtocolFactory.listShares"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listShares">[docs]</a>    <span class="k">def</span> <span class="nf">listShares</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a list of shared resources on remote server.</span>
-
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedDevice&lt;smb_SharedDevice&gt;` instances.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listShares</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.listPath"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listPath">[docs]</a>    <span class="k">def</span> <span class="nf">listPath</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span>
-                 <span class="n">search</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_READONLY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_DIRECTORY</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_ARCHIVE</span><span class="p">,</span>
-                 <span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a directory listing of files/folders at *path*</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.</span>
-<span class="sd">        :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).</span>
-<span class="sd">                               The default *search* value will query for all read-only, hidden, system, archive files and directories.</span>
-<span class="sd">        :param string/unicode pattern: the filter to apply to the results before returning to the client.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instances.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listPath</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">search</span> <span class="o">=</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span> <span class="o">=</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.listSnapshots"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listSnapshots">[docs]</a>    <span class="k">def</span> <span class="nf">listSnapshots</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve a list of available snapshots (a.k.a. shadow copies) for *path*.</span>
-
-<span class="sd">        Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: path relative to the *service_name* where we are interested in the list of available snapshots</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of python *datetime.DateTime*</span>
-<span class="sd">                 instances in GMT/UTC time zone</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_listSnapshots</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.getAttributes"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">[docs]</a>    <span class="k">def</span> <span class="nf">getAttributes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve information about the file at *path* on the *service_name*.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be raised.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a :doc:`smb.base.SharedFile&lt;smb_SharedFile&gt;` instance containing the attributes of the file.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_getAttributes</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.retrieveFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFile">[docs]</a>    <span class="k">def</span> <span class="nf">retrieveFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
-
-<span class="sd">        Use *retrieveFileFromOffset()* method if you need to specify the offset to read from the remote *path* and/or the maximum number of bytes to write to the *file_obj*.</span>
-
-<span class="sd">        The meaning of the *timeout* parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size</span>
-<span class="sd">        of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
-<span class="sd">        The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 3-element tuple of ( *file_obj*, file attributes of the file on server, number of bytes written to *file_obj* ).</span>
-<span class="sd">                 The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.retrieveFileFromOffset"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">[docs]</a>    <span class="k">def</span> <span class="nf">retrieveFileFromOffset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span> <span class="o">=</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.</span>
-
-<span class="sd">        The meaning of the *timeout* parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size</span>
-<span class="sd">        of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).</span>
-<span class="sd">        The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *write* method. Data will be written continuously to *file_obj* until EOF is received from the remote service.</span>
-<span class="sd">        :param integer/long offset: the offset in the remote *path* where the first byte will be read and written to *file_obj*. Must be either zero or a positive integer/long value.</span>
-<span class="sd">        :param integer/long max_length: maximum number of bytes to read from the remote *path* and write to the *file_obj*. Specify a negative value to read from *offset* to the EOF.</span>
-<span class="sd">                                        If zero, the *Deferred* callback is invoked immediately after the file is opened successfully for reading.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 3-element tuple of ( *file_obj*, file attributes of the file on server, number of bytes written to *file_obj* ).</span>
-<span class="sd">                 The file attributes is an integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py)</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.storeFile"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.storeFile">[docs]</a>    <span class="k">def</span> <span class="nf">storeFile</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Store the contents of the *file_obj* at *path* on the *service_name*.</span>
-
-<span class="sd">        The meaning of the *timeout* parameter will be different from other file operation methods. As the uploaded file usually exceeeds the maximum size</span>
-<span class="sd">        of each SMB/CIFS data message, it will be packetized into a series of messages (usually about 60kBytes).</span>
-<span class="sd">        The *timeout* parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and acknowledged</span>
-<span class="sd">        by the remote SMB/CIFS server.</span>
-
-<span class="sd">        :param string/unicode service_name: the name of the shared folder for the *path*</span>
-<span class="sd">        :param string/unicode path: Path of the file on the remote server. If the file at *path* does not exist, it will be created. Otherwise, it will be overwritten.</span>
-<span class="sd">                                    If the *path* refers to a folder or the file cannot be opened for writing, an :doc:`OperationFailure&lt;smb_exceptions&gt;` will be called in the returned *Deferred* errback.</span>
-<span class="sd">        :param file_obj: A file-like object that has a *read* method. Data will read continuously from *file_obj* until EOF.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 2-element tuple of ( *file_obj*, number of bytes uploaded ).</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_storeFile</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.deleteFiles"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteFiles">[docs]</a>    <span class="k">def</span> <span class="nf">deleteFiles</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.</span>
-<span class="sd">                                                 Wildcards may be used in th filename component of the path.</span>
-<span class="sd">                                                 If your path/filename contains non-English characters, you must pass in an unicode string.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path_file_pattern* parameter.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_deleteFiles</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.createDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.createDirectory">[docs]</a>    <span class="k">def</span> <span class="nf">createDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Creates a new directory *path* on the *service_name*.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path: The path of the new folder (relative to) the shared folder.</span>
-<span class="sd">                                    If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_createDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.deleteDirectory"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">[docs]</a>    <span class="k">def</span> <span class="nf">deleteDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Delete the empty folder at *path* on *service_name*</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param string/unicode path: The path of the to-be-deleted folder (relative to) the shared folder.</span>
-<span class="sd">                                    If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *path* parameter.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_deleteDirectory</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.rename"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.rename">[docs]</a>    <span class="k">def</span> <span class="nf">rename</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Rename a file or folder at *old_path* to *new_path* shared at *service_name*. Note that this method cannot be used to rename file/folder across different shared folders</span>
-
-<span class="sd">        *old_path* and *new_path* are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.</span>
-<span class="sd">        If the path contains non-English characters, an unicode string must be used to pass in the path.</span>
-
-<span class="sd">        :param string/unicode service_name: Contains the name of the shared folder.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a 2-element tuple of ( *old_path*, *new_path* ).</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_rename</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.echo"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.echo">[docs]</a>    <span class="k">def</span> <span class="nf">echo</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">10</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.</span>
-
-<span class="sd">        :param string data: Data to send to the remote server.</span>
-<span class="sd">        :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance&#39;s *errback* method.</span>
-<span class="sd">        :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="n">d</span> <span class="o">=</span> <span class="n">defer</span><span class="o">.</span><span class="n">Deferred</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">_echo</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">callback</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-        <span class="k">return</span> <span class="n">d</span></div>
-
-<div class="viewcode-block" id="SMBProtocolFactory.closeConnection"><a class="viewcode-back" href="../../api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.closeConnection">[docs]</a>    <span class="k">def</span> <span class="nf">closeConnection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Disconnect from the remote SMB/CIFS server. The TCP connection will be closed at the earliest opportunity after this method returns.</span>
-
-<span class="sd">        :return: None</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotConnectedError</span><span class="p">(</span><span class="s1">&#39;Not connected to server&#39;</span><span class="p">)</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">instance</span><span class="o">.</span><span class="n">transport</span><span class="o">.</span><span class="n">loseConnection</span><span class="p">()</span></div>
-
-    <span class="c1">#</span>
-    <span class="c1"># ClientFactory methods</span>
-    <span class="c1"># (Do not touch these unless you know what you are doing)</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">buildProtocol</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">addr</span><span class="p">):</span>
-        <span class="n">p</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">my_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span><span class="p">)</span>
-        <span class="n">p</span><span class="o">.</span><span class="n">factory</span> <span class="o">=</span> <span class="bp">self</span>
-        <span class="k">return</span> <span class="n">p</span></div>
-</pre></div>
-
-          </div>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/docs/html/_modules/smb/base.html b/docs/html/_modules/smb/base.html
deleted file mode 100644
index 9b94c8de..00000000
--- a/docs/html/_modules/smb/base.html
+++ /dev/null
@@ -1,2746 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-    
-    <title>smb.base &mdash; pysmb 1.1.18 documentation</title>
-    
-    <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
-    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
-    
-    <script type="text/javascript">
-      var DOCUMENTATION_OPTIONS = {
-        URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
-        COLLAPSE_INDEX: false,
-        FILE_SUFFIX: '.html',
-        HAS_SOURCE:  true
-      };
-    </script>
-    <script type="text/javascript" src="../../_static/jquery.js"></script>
-    <script type="text/javascript" src="../../_static/underscore.js"></script>
-    <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
-    <link rel="up" title="Module code" href="../index.html" /> 
-  </head>
-  <body role="document">
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
-        <div class="sphinxsidebarwrapper">
-<div id="searchbox" style="display: none" role="search">
-  <h3>Quick search</h3>
-    <form class="search" action="../../search.html" method="get">
-      <input type="text" name="q" />
-      <input type="submit" value="Go" />
-      <input type="hidden" name="check_keywords" value="yes" />
-      <input type="hidden" name="area" value="default" />
-    </form>
-    <p class="searchtip" style="font-size: 90%">
-    Enter search terms or a module, class or function name.
-    </p>
-</div>
-<script type="text/javascript">$('#searchbox').show(0);</script>
-        </div>
-      </div>
-
-    <div class="document">
-      <div class="documentwrapper">
-        <div class="bodywrapper">
-          <div class="body" role="main">
-            
-  <h1>Source code for smb.base</h1><div class="highlight"><pre>
-
-<span class="kn">import</span> <span class="nn">logging</span><span class="o">,</span> <span class="nn">binascii</span><span class="o">,</span> <span class="nn">time</span><span class="o">,</span> <span class="nn">hmac</span>
-<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
-<span class="kn">from</span> <span class="nn">smb_constants</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">smb2_constants</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">smb_structs</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">smb2_structs</span> <span class="kn">import</span> <span class="o">*</span>
-<span class="kn">from</span> <span class="nn">nmb.base</span> <span class="kn">import</span> <span class="n">NMBSession</span>
-<span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">convertFILETIMEtoEpoch</span>
-<span class="kn">import</span> <span class="nn">ntlm</span><span class="o">,</span> <span class="nn">securityblob</span>
-
-<span class="k">try</span><span class="p">:</span>
-    <span class="kn">import</span> <span class="nn">hashlib</span>
-    <span class="n">sha256</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span>
-<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
-    <span class="kn">from</span> <span class="nn">utils</span> <span class="kn">import</span> <span class="n">sha256</span>
-
-
-<div class="viewcode-block" id="NotReadyError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotReadyError">[docs]</a><span class="k">class</span> <span class="nc">NotReadyError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)&quot;&quot;&quot;</span>
-    <span class="k">pass</span></div>
-
-<div class="viewcode-block" id="NotConnectedError"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.NotConnectedError">[docs]</a><span class="k">class</span> <span class="nc">NotConnectedError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;Raised when underlying SMB connection has been disconnected or not connected yet&quot;&quot;&quot;</span>
-    <span class="k">pass</span></div>
-
-<div class="viewcode-block" id="SMBTimeout"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.base.SMBTimeout">[docs]</a><span class="k">class</span> <span class="nc">SMBTimeout</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;Raised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.&quot;&quot;&quot;</span>
-    <span class="k">pass</span></div>
-
-
-<span class="k">def</span> <span class="nf">_convert_to_unicode</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
-    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">):</span>
-        <span class="n">string</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">)</span>
-    <span class="k">return</span> <span class="n">string</span>
-
-
-<span class="k">class</span> <span class="nc">SMB</span><span class="p">(</span><span class="n">NMBSession</span><span class="p">):</span>
-    <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">    This class represents a &quot;connection&quot; to the remote SMB/CIFS server.</span>
-<span class="sd">    It is not meant to be used directly in an application as it does not have any network transport implementations.</span>
-
-<span class="sd">    For application use, please refer to</span>
-<span class="sd">      - L{SMBProtocol.SMBProtocolFactory&lt;smb.SMBProtocol&gt;} if you are using Twisted framework</span>
-
-<span class="sd">    In [MS-CIFS], this class will contain attributes of Client, Client.Connection and Client.Session abstract data models.</span>
-
-<span class="sd">    References:</span>
-<span class="sd">    ===========</span>
-<span class="sd">      - [MS-CIFS]: 3.2.1</span>
-<span class="sd">    &quot;&quot;&quot;</span>
-
-    <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMB&#39;</span><span class="p">)</span>
-
-    <span class="n">SIGN_NEVER</span> <span class="o">=</span> <span class="mi">0</span>
-    <span class="n">SIGN_WHEN_SUPPORTED</span> <span class="o">=</span> <span class="mi">1</span>
-    <span class="n">SIGN_WHEN_REQUIRED</span> <span class="o">=</span> <span class="mi">2</span>
-
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">domain</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="bp">True</span><span class="p">,</span> <span class="n">sign_options</span> <span class="o">=</span> <span class="n">SIGN_WHEN_REQUIRED</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="bp">False</span><span class="p">):</span>
-        <span class="n">NMBSession</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">my_name</span><span class="p">,</span> <span class="n">remote_name</span><span class="p">,</span> <span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">username</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">password</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">password</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">domain</span> <span class="o">=</span> <span class="n">_convert_to_unicode</span><span class="p">(</span><span class="n">domain</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">=</span> <span class="n">sign_options</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_direct_tcp</span> <span class="o">=</span> <span class="n">is_direct_tcp</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="o">=</span> <span class="n">use_ntlm_v2</span> <span class="c1">#: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span> <span class="o">=</span> <span class="bp">False</span>   <span class="c1">#: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span>  <span class="c1">#: MID mapped to _PendingRequest instance</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span> <span class="o">=</span> <span class="p">{</span> <span class="p">}</span>   <span class="c1">#: Share name mapped to TID</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span> <span class="o">=</span> <span class="mi">1</span>    <span class="c1">#: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">False</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span>           <span class="c1">#: True if the remote server accepts message signing. All outgoing messages will be signed. Simiar to IsSigningActive as described in [MS-CIFS] 3.2.1.2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="bp">None</span>          <span class="c1">#: Session key for signing packets, if signing is active. Similar to SigningSessionKey as described in [MS-CIFS] 3.2.1.2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span>   <span class="c1">#: Contains the challenge response for signing, if signing is active. Similar to SigningChallengeResponse as described in [MS-CIFS] 3.2.1.2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span> <span class="o">=</span> <span class="mi">2</span>     <span class="c1">#: Similar to ClientNextSendSequenceNumber as described in [MS-CIFS] 3.2.1.2</span>
-
-        <span class="c1"># SMB1 and SMB2 attributes</span>
-        <span class="c1"># Note that the interpretations of the values may differ between SMB1 and SMB2 protocols</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="mi">0</span>     <span class="c1">#: Initialized from the SecurityMode field of the SMB_COM_NEGOTIATE message</span>
-
-        <span class="c1"># SMB1 attributes</span>
-        <span class="c1"># Most of the following attributes will be initialized upon receipt of SMB_COM_NEGOTIATE message from server (via self._updateServerInfo_SMB1 method)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="bp">False</span>  <span class="c1">#: Similar to PlaintextAuthenticationPolicy in in [MS-CIFS] 3.2.1.1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">=</span> <span class="mi">0</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span> <span class="o">=</span> <span class="mi">0</span>   <span class="c1">#: Similar to MaxBufferSize as described in [MS-CIFS] 3.2.1.1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span> <span class="o">=</span> <span class="mi">0</span>     <span class="c1">#: Similar to MaxMpxCount as described in [MS-CIFS] 3.2.1.1</span>
-
-        <span class="c1"># SMB2 attributes</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span> <span class="o">=</span> <span class="mi">0</span>      <span class="c1">#: Similar to MaxReadSize as described in [MS-SMB2] 2.2.4</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span> <span class="o">=</span> <span class="mi">0</span>     <span class="c1">#: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span> <span class="o">=</span> <span class="mi">0</span>  <span class="c1">#: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="mi">0</span>         <span class="c1">#: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB1Methods</span><span class="p">()</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication with remote machine &quot;</span><span class="si">%s</span><span class="s1">&quot; for user &quot;</span><span class="si">%s</span><span class="s1">&quot; will be using NTLM </span><span class="si">%s</span><span class="s1"> authentication (</span><span class="si">%s</span><span class="s1"> extended security)&#39;</span><span class="p">,</span>
-                      <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                      <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span> <span class="ow">and</span> <span class="s1">&#39;v2&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;v1&#39;</span><span class="p">,</span>
-                      <span class="p">(</span><span class="n">SUPPORT_EXTENDED_SECURITY</span> <span class="ow">and</span> <span class="s1">&#39;with&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;without&#39;</span><span class="p">)</span>
-
-
-    <span class="c1">#</span>
-    <span class="c1"># NMBSession Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">onNMBSessionOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNegotiateRequest</span><span class="p">()))</span>
-
-    <span class="k">def</span> <span class="nf">onNMBSessionFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">pass</span>
-
-    <span class="k">def</span> <span class="nf">onNMBSessionMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
-        <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
-            <span class="k">try</span><span class="p">:</span>
-                <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-            <span class="k">except</span> <span class="n">SMB2ProtocolHeaderError</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Now switching over to SMB2 protocol communication&#39;</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span> <span class="o">=</span> <span class="bp">True</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">0</span>  <span class="c1"># Must reset messageID counter, or else remote SMB2 server will disconnect</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_setupSMB2Methods</span><span class="p">()</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span><span class="p">()</span>
-                <span class="n">i</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-
-            <span class="n">next_message_offset</span> <span class="o">=</span> <span class="mi">0</span>
-            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span><span class="p">:</span>
-                <span class="n">next_message_offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">next_command_offset</span>
-
-            <span class="k">if</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_using_smb2</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Received SMB message &quot;</span><span class="si">%s</span><span class="s1">&quot; (command:0x</span><span class="si">%2X</span><span class="s1"> flags:0x</span><span class="si">%02X</span><span class="s1"> flags2:0x</span><span class="si">%04X</span><span class="s1"> TID:</span><span class="si">%d</span><span class="s1"> UID:</span><span class="si">%d</span><span class="s1">)&#39;</span><span class="p">,</span>
-                                   <span class="n">SMB_COMMAND_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="s1">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span>
-                                   <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags2</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;Received SMB2 message &quot;</span><span class="si">%s</span><span class="s1">&quot; (command:0x</span><span class="si">%04X</span><span class="s1"> flags:0x</span><span class="si">%04x</span><span class="s1">)&#39;</span><span class="p">,</span>
-                                   <span class="n">SMB2_COMMAND_NAMES</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="s1">&#39;&lt;unknown&gt;&#39;</span><span class="p">),</span>
-                                   <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">command</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span><span class="p">)</span>
-                <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span><span class="p">):</span>
-                    <span class="c1"># We need to create a new instance instead of calling reset() because the instance could be captured in the message history.</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">smb_message</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span><span class="p">()</span>
-
-            <span class="k">if</span> <span class="n">next_message_offset</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">next_message_offset</span><span class="p">:]</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="k">break</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Public Methods for Overriding in Subclasses</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">onAuthOK</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">pass</span>
-
-    <span class="k">def</span> <span class="nf">onAuthFailed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">pass</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># Protected Methods</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">_setupSMB1Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMBMessage</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rename_SMB1</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB1</span>
-
-    <span class="k">def</span> <span class="nf">_setupSMB2Methods</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_klassSMBMessage</span> <span class="o">=</span> <span class="n">SMB2Message</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_updateState</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateState_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listShares</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listShares_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listPath</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listPath_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_listSnapshots_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getAttributes_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFile_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFile_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteFiles_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_resetFileAttributes_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_createDirectory_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deleteDirectory_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_rename</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_rename_SMB2</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_echo</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_echo_SMB2</span>
-
-    <span class="k">def</span> <span class="nf">_getNextRPCCallID</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span> <span class="o">+=</span> <span class="mi">1</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_rpc_call_id</span>
-
-    <span class="c1">#</span>
-    <span class="c1"># SMB2 Methods Family</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">_sendSMBMessage_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">smb_message</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB2</span><span class="p">()</span>
-
-        <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_NEGOTIATE</span> <span class="ow">and</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">command</span> <span class="o">!=</span> <span class="n">SMB2_COM_ECHO</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">flags</span> <span class="o">|=</span> <span class="n">SMB2_FLAGS_SIGNED</span>
-            <span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">signature</span> <span class="o">=</span> <span class="n">hmac</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span><span class="p">,</span> <span class="n">raw_data</span><span class="p">,</span> <span class="n">sha256</span><span class="p">)</span><span class="o">.</span><span class="n">digest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>
-
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;MID is </span><span class="si">%d</span><span class="s1">. Signature is </span><span class="si">%s</span><span class="s1">. Total raw message is </span><span class="si">%d</span><span class="s1"> bytes&#39;</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">signature</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">))</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sendNMBMessage</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_getNextMID_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
-
-    <span class="k">def</span> <span class="nf">_updateState_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
-            <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB2_COM_NEGOTIATE</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;SMB2 dialect negotiation successful&#39;</span><span class="p">)</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="p">)</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB2_COM_NEGOTIATE&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="p">,</span>
-                                        <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-            <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB2_COM_SESSION_SETUP</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">session_id</span>
-                    <span class="k">try</span><span class="p">:</span>
-                        <span class="n">result</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeAuthResponseSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
-                        <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_COMPLETED</span><span class="p">:</span>
-                            <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
-                            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (on SMB2) successful!&#39;</span><span class="p">)</span>
-                            <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
-                        <span class="k">else</span><span class="p">:</span>
-                            <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                    <span class="k">except</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
-                        <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0xc0000016</span><span class="p">:</span>  <span class="c1"># STATUS_MORE_PROCESSING_REQUIRED</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">session_id</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">session_id</span>
-                    <span class="k">try</span><span class="p">:</span>
-                        <span class="n">result</span><span class="p">,</span> <span class="n">ntlm_token</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeChallengeSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
-                        <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_INCOMPLETE</span><span class="p">:</span>
-                            <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">)</span>
-                    <span class="k">except</span> <span class="p">(</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">UnsupportedSecurityProvider</span> <span class="p">),</span> <span class="n">ex</span><span class="p">:</span>
-                        <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0xc000006d</span><span class="p">:</span>  <span class="c1"># STATUS_LOGON_FAILURE</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (on SMB2) failed. Please check username and password.&#39;</span><span class="p">)</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_SESSION_SETUP_ANDX (with extended security)&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="p">,</span>
-                                        <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-
-            <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
-                <span class="n">req</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
-                <span class="k">return</span> <span class="bp">True</span>
-
-
-    <span class="k">def</span> <span class="nf">_updateServerInfo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_transact_size</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_read_size</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_write_size</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="bp">False</span>   <span class="c1"># SMB2 never allows plaintext authentication</span>
-
-
-    <span class="k">def</span> <span class="nf">_handleNegotiateResponse_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
-        <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
-        <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SessionSetupRequest</span><span class="p">(</span><span class="n">blob</span><span class="p">)))</span>
-
-
-    <span class="k">def</span> <span class="nf">_handleSessionChallenge_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">):</span>
-        <span class="n">server_challenge</span><span class="p">,</span> <span class="n">server_flags</span><span class="p">,</span> <span class="n">server_info</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">decodeChallengeMessage</span><span class="p">(</span><span class="n">ntlm_token</span><span class="p">)</span>
-
-        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
-            <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span>
-                                                                                                         <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                                                                                                         <span class="n">server_challenge</span><span class="p">,</span>
-                                                                                                         <span class="n">server_info</span><span class="p">,</span>
-                                                                                                         <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
-
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (on SMB2) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
-            <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">server_challenge</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
-
-        <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateAuthenticateMessage</span><span class="p">(</span><span class="n">server_flags</span><span class="p">,</span>
-                                                     <span class="n">nt_challenge_response</span><span class="p">,</span>
-                                                     <span class="n">lm_challenge_response</span><span class="p">,</span>
-                                                     <span class="n">session_key</span><span class="p">,</span>
-                                                     <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                                                     <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">isEnabledFor</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">))</span>
-
-        <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateAuthSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SessionSetupRequest</span><span class="p">(</span><span class="n">blob</span><span class="p">)))</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">SMB2_NEGOTIATE_SIGNING_REQUIRED</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server requires all SMB messages to be signed&#39;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">!=</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_NEVER</span><span class="p">)</span>
-        <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">SMB2_NEGOTIATE_SIGNING_ENABLED</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server supports SMB signing&#39;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">==</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_WHEN_SUPPORTED</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing activated. All SMB messages will be signed.&quot;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="p">(</span><span class="n">session_key</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="o">*</span><span class="mi">16</span><span class="p">)[:</span><span class="mi">16</span><span class="p">]</span>
-            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">&amp;</span> <span class="n">CAP_EXTENDED_SECURITY</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="n">blob</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</span><span class="p">)</span>
-
-
-    <span class="k">def</span> <span class="nf">_listShares_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="s1">&#39;srvsvc&#39;</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_OPEN_NO_RECALL</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">))</span>
-
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectSrvSvcCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">connectSrvSvcCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
-                <span class="c1"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
-                <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 0b 03 10 00 00 00 74 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">b8 10 b8 10 00 00 00 00 02 00 00 00 00 00 01 00</span>
-<span class="s2">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
-<span class="s2">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
-<span class="s2">2b 10 48 60 02 00 00 00 01 00 01 00 c8 4f 32 4b</span>
-<span class="s2">70 16 d3 01 12 78 5a 47 bf 6e e1 88 03 00 00 00</span>
-<span class="s2">2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00</span>
-<span class="s2">01 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2WriteRequest</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">,</span> <span class="mi">0</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcBindCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to locate Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">rpcBindCB</span><span class="p">(</span><span class="n">trans_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">trans_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">read_len</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">,</span> <span class="n">read_offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcReadCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s1">&#39;Failed to list shares: Unable to read from Server Service RPC endpoint&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">rpcReadCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
-
-                <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
-                <span class="n">remote_name</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\\\\</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span>
-                <span class="n">server_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">remote_name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
-                <span class="n">server_bytes_len</span> <span class="o">=</span> <span class="n">server_len</span> <span class="o">*</span> <span class="mi">2</span>
-                <span class="k">if</span> <span class="n">server_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
-                    <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
-
-                <span class="c1"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
-                <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 00 03 10 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHI&#39;</span><span class="p">,</span> <span class="mi">72</span><span class="o">+</span><span class="n">server_bytes_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;4c 00 00 00 00 00 0f 00 00 00 02 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">server_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">server_len</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="p">(</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2IoctlRequest</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="mh">0x0011C017</span><span class="p">,</span> <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x01</span><span class="p">,</span> <span class="n">max_out_size</span> <span class="o">=</span> <span class="mi">8196</span><span class="p">,</span> <span class="n">in_data</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="s1">&#39;Failed to list shares: Unable to bind to Server Service RPC endpoint&#39;</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">listShareResultsCB</span><span class="p">(</span><span class="n">result_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="c1"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">result_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span>
-
-                <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">decodeResults</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
-            <span class="k">elif</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0x0103</span><span class="p">:</span>   <span class="c1"># STATUS_PENDING</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">result_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">decodeResults</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
-            <span class="n">shares_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">36</span><span class="p">:</span><span class="mi">40</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
-            <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>     <span class="c1"># A list of SharedDevice instances</span>
-            <span class="n">offset</span> <span class="o">=</span> <span class="mi">36</span> <span class="o">+</span> <span class="mi">12</span>  <span class="c1"># You need to study the byte stream to understand the meaning of these constants</span>
-            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
-                <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedDevice</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="o">+</span><span class="mi">4</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-
-            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
-                <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-                <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-                <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
-
-                <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-                <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-                <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
-
-            <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
-            <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span><span class="p">)</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
-                                                           <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span>
-
-                <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">decodeResults</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
-            <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">],</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">connectSrvSvc</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to connect to IPC$&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">path</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">connectSrvSvc</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_listPath_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendQuery</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_buf</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2QueryDirectoryRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span>
-                                                      <span class="n">info_class</span> <span class="o">=</span> <span class="mh">0x03</span><span class="p">,</span>   <span class="c1"># FileBothDirectoryInformation</span>
-                                                      <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                      <span class="n">output_buf_len</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_transact_size</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">queryCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_buf</span> <span class="o">=</span> <span class="n">data_buf</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">queryCB</span><span class="p">(</span><span class="n">query_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">query_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">data_buf</span> <span class="o">=</span> <span class="n">decodeQueryStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">query_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
-                <span class="n">sendQuery</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_buf</span><span class="p">)</span>
-            <span class="k">elif</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mh">0x80000006</span><span class="n">L</span><span class="p">:</span>  <span class="c1"># STATUS_NO_MORE_FILES</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">query_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">decodeQueryStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
-            <span class="c1"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
-            <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;IIQQQQQQIIIBB24s&#39;</span>
-            <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
-
-            <span class="n">data_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
-            <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
-            <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
-                    <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
-
-                <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
-                <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
-                <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
-                <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
-
-                <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
-                <span class="k">if</span> <span class="n">offset2</span> <span class="o">+</span> <span class="n">filename_length</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
-                    <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
-
-                <span class="n">filename</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset2</span><span class="p">:</span><span class="n">offset2</span><span class="o">+</span><span class="n">filename_length</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                <span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedFile</span><span class="p">(</span><span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">create_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_access_time</span><span class="p">),</span>
-                                          <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_write_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_attr_change_time</span><span class="p">),</span>
-                                          <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
-
-                <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">break</span>
-            <span class="k">return</span> <span class="s1">&#39;&#39;</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
-            <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_getAttributes_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">p</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span>
-                <span class="n">info</span> <span class="o">=</span> <span class="n">SharedFile</span><span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">create_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastaccess_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">lastwrite_time</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">change_time</span><span class="p">,</span>
-                                  <span class="n">p</span><span class="o">.</span><span class="n">file_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">allocation_size</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span>
-                                  <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">p</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open remote file object&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">info</span> <span class="o">=</span> <span class="n">info</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;info&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;info&#39;</span><span class="p">])</span>
-            <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Query failed with errorcode 0x</span><span class="si">%08x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_retrieveFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_retrieveFileFromOffset_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2QueryInfoRequest</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span>
-                                                     <span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
-                                                     <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x16</span><span class="p">,</span>  <span class="c1"># FileStreamInformation [MS-FSCC] 2.4</span>
-                                                     <span class="n">input_buf</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span>
-                                                     <span class="n">output_buf_len</span> <span class="o">=</span> <span class="mi">4096</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">infoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
-                                                               <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">)</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">infoCB</span><span class="p">(</span><span class="n">info_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">info_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">info_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">file_len</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;Q&#39;</span><span class="p">,</span> <span class="n">info_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="mi">8</span><span class="p">:</span><span class="mi">16</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
-                <span class="k">if</span> <span class="n">max_length</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">or</span> <span class="n">starting_offset</span> <span class="o">&gt;</span> <span class="n">file_len</span><span class="p">:</span>
-                    <span class="n">closeFid</span><span class="p">(</span><span class="n">info_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                    <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="mi">0</span> <span class="p">))</span>  <span class="c1"># Note that this is a tuple of 3-elements</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">max_length</span>
-                    <span class="k">if</span> <span class="n">remaining_len</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
-                        <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span>
-                    <span class="k">if</span> <span class="n">starting_offset</span> <span class="o">+</span> <span class="n">remaining_len</span> <span class="o">&gt;</span> <span class="n">file_len</span><span class="p">:</span>
-                        <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">file_len</span> <span class="o">-</span> <span class="n">starting_offset</span>
-                    <span class="n">sendRead</span><span class="p">(</span><span class="n">info_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve information on file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendRead</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">):</span>
-            <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_read_size</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">)</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2ReadRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">read_count</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span>
-                                                           <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
-                                                           <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">remaining_len</span><span class="p">,</span>
-                                                           <span class="n">read_len</span> <span class="o">=</span> <span class="n">read_len</span><span class="p">,</span>
-                                                           <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="c1"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
-            <span class="k">if</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
-                <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
-
-                <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;remaining_len&#39;</span><span class="p">]</span> <span class="o">-</span> <span class="n">data_len</span>
-
-                <span class="k">if</span> <span class="n">remaining_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">sendRead</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">])</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">(</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_len</span> <span class="p">))</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">error</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;ret&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;ret&#39;</span><span class="p">])</span>
-            <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_storeFile_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB2</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_storeFileFromOffset_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 20 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 08 00 00 00 41 6c 53 69 00 00 00 00</span>
-<span class="s2">85 62 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">ATTR_ARCHIVE</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SEQUENTIAL_ONLY</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OVERWRITE_IF</span> <span class="k">if</span> <span class="n">truncate</span> <span class="k">else</span> <span class="n">FILE_OPEN_IF</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendWrite</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendWrite</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
-            <span class="n">write_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_write_size</span>
-            <span class="n">data</span> <span class="o">=</span> <span class="n">file_obj</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">write_count</span><span class="p">)</span>
-            <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2WriteRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">offset</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">writeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="o">+</span><span class="n">data_len</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">writeCB</span><span class="p">(</span><span class="n">write_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="c1"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</span>
-            <span class="k">if</span> <span class="n">write_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendWrite</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">write_message</span><span class="p">)</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">error</span> <span class="o">=</span> <span class="n">error</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span> <span class="p">))</span>  <span class="c1"># Note that this is a tuple of 2-elements</span>
-            <span class="k">elif</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;error&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-
-    <span class="k">def</span> <span class="nf">_deleteFiles_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendDelete</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
-                                               <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                               <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
-                                               <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span>  <span class="c1"># SMB2_FILE_DISPOSITION_INFO</span>
-                                               <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x01</span><span class="s1">&#39;</span><span class="p">))</span>
-            <span class="sd">&#39;&#39;&#39;</span>
-<span class="sd">                Resources:</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc246560.aspx</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc232098.aspx</span>
-<span class="sd">            &#39;&#39;&#39;</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_resetFileAttributes_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_WRITE_ATTRIBUTES</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendReset</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendReset</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
-                                               <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                               <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
-                                               <span class="n">file_info_class</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span>  <span class="c1"># FileBasicInformation</span>
-                                               <span class="n">data</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;qqqqii&#39;</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mi">0</span><span class="p">)))</span> <span class="c1"># FILE_ATTRIBUTE_NORMAL</span>
-            <span class="sd">&#39;&#39;&#39;</span>
-<span class="sd">                Resources:</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc246560.aspx</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc232064.aspx</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc232094.aspx</span>
-<span class="sd">                https://msdn.microsoft.com/en-us/library/cc232110.aspx</span>
-<span class="sd">            &#39;&#39;&#39;</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">resetCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">resetCB</span><span class="p">(</span><span class="n">reset_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">reset_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">reset_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">reset_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">reset_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">reset_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Reset failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to reset attributes of </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_createDirectory_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span> <span class="o">|</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_CREATE</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Create failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_deleteDirectory_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_DIRECTORY_FILE</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendDelete</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
-                                               <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                               <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
-                                               <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0d</span><span class="p">,</span>  <span class="c1"># SMB2_FILE_DISPOSITION_INFO</span>
-                                               <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x01</span><span class="s1">&#39;</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">delete_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_rename_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">new_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">new_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-
-        <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">old_path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">old_path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 18 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00</span>
-<span class="s2">51 46 69 64 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">old_path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">DELETE</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span> <span class="o">|</span> <span class="n">FILE_SHARE_DELETE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendRename</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file/directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendRename</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="o">*</span><span class="mi">16</span> <span class="o">+</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">new_path</span><span class="p">)</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="n">new_path</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2SetInfoRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
-                                               <span class="n">additional_info</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                               <span class="n">info_type</span> <span class="o">=</span> <span class="n">SMB2_INFO_FILE</span><span class="p">,</span>
-                                               <span class="n">file_info_class</span> <span class="o">=</span> <span class="mh">0x0a</span><span class="p">,</span>  <span class="c1"># SMB2_FILE_RENAME_INFO</span>
-                                               <span class="n">data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">renameCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">renameCB</span><span class="p">(</span><span class="n">rename_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rename_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">rename_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">rename_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;status&#39;</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">((</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span> <span class="p">))</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Rename failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_listSnapshots_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">28 00 00 00 10 00 04 00 00 00 18 00 10 00 00 00</span>
-<span class="s2">44 48 6e 51 00 00 00 00 00 00 00 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00</span>
-<span class="s2">00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CreateRequest</span><span class="p">(</span><span class="n">path</span><span class="p">,</span>
-                                              <span class="n">file_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">access_mask</span> <span class="o">=</span> <span class="n">FILE_READ_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">SYNCHRONIZE</span><span class="p">,</span>
-                                              <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
-                                              <span class="n">oplock</span> <span class="o">=</span> <span class="n">SMB2_OPLOCK_LEVEL_NONE</span><span class="p">,</span>
-                                              <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                              <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_SYNCHRONOUS_IO_NONALERT</span><span class="p">,</span>
-                                              <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                              <span class="n">create_context_data</span> <span class="o">=</span> <span class="n">create_context_data</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">sendEnumSnapshots</span><span class="p">(</span><span class="n">create_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file/directory&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendEnumSnapshots</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2IoctlRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">,</span>
-                                             <span class="n">ctlcode</span> <span class="o">=</span> <span class="mh">0x00144064</span><span class="p">,</span>  <span class="c1"># FSCTL_SRV_ENUMERATE_SNAPSHOTS</span>
-                                             <span class="n">flags</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>
-                                             <span class="n">in_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">enumSnapshotsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">enum_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-                <span class="n">snapshots_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
-                <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">snapshots_count</span><span class="p">):</span>
-                    <span class="n">s</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">out_data</span><span class="p">[</span><span class="mi">12</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">:</span><span class="mi">12</span><span class="o">+</span><span class="mi">48</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                    <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="o">*</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="p">(</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">9</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="p">:</span><span class="mi">12</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">13</span><span class="p">:</span><span class="mi">15</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">16</span><span class="p">:</span><span class="mi">18</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">21</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">22</span><span class="p">:</span><span class="mi">24</span><span class="p">]</span> <span class="p">))))</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">status</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="bp">None</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2CloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">closeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">status</span> <span class="o">=</span> <span class="n">status</span><span class="p">,</span> <span class="n">results</span> <span class="o">=</span> <span class="n">results</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">closeCB</span><span class="p">(</span><span class="n">close_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;results&#39;</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: List failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2TreeConnectRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">)))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_echo_SMB2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">echo_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">echo_message</span><span class="o">.</span><span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="n">m</span> <span class="o">=</span> <span class="n">SMB2Message</span><span class="p">(</span><span class="n">SMB2EchoRequest</span><span class="p">())</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">echoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-        <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-
-    <span class="c1">#</span>
-    <span class="c1"># SMB1 Methods Family</span>
-    <span class="c1">#</span>
-
-    <span class="k">def</span> <span class="nf">_sendSMBMessage_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">smb_message</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextMID_SMB1</span><span class="p">()</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_SMB_SECURITY_SIGNATURE</span>
-
-            <span class="c1"># Increment the next_signing_id as described in [MS-CIFS] 3.2.4.1.3</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">security</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">next_signing_id</span> <span class="o">+=</span> <span class="mi">2</span>  <span class="c1"># All our defined messages currently have responses, so always increment by 2</span>
-            <span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
-
-            <span class="n">md</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">MD5</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span><span class="p">)</span>
-            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">:</span>
-                <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span><span class="p">)</span>
-            <span class="n">md</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">raw_data</span><span class="p">)</span>
-            <span class="n">signature</span> <span class="o">=</span> <span class="n">md</span><span class="o">.</span><span class="n">digest</span><span class="p">()[:</span><span class="mi">8</span><span class="p">]</span>
-
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;MID is </span><span class="si">%d</span><span class="s1">. Signing ID is </span><span class="si">%d</span><span class="s1">. Signature is </span><span class="si">%s</span><span class="s1">. Total raw message is </span><span class="si">%d</span><span class="s1"> bytes&#39;</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">security</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">signature</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">raw_data</span><span class="p">))</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">raw_data</span><span class="p">[:</span><span class="mi">14</span><span class="p">]</span> <span class="o">+</span> <span class="n">signature</span> <span class="o">+</span> <span class="n">raw_data</span><span class="p">[</span><span class="mi">22</span><span class="p">:]</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span> <span class="o">=</span> <span class="n">smb_message</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">sendNMBMessage</span><span class="p">(</span><span class="n">smb_message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_getNextMID_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">+=</span> <span class="mi">1</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">&gt;=</span> <span class="mh">0xFFFF</span><span class="p">:</span> <span class="c1"># MID cannot be 0xFFFF. [MS-CIFS]: 2.2.1.6.2</span>
-            <span class="c1"># We don&#39;t use MID of 0 as MID can be reused for SMB_COM_TRANSACTION2_SECONDARY messages</span>
-            <span class="c1"># where if mid=0, _sendSMBMessage will re-assign new MID values again</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="mi">1</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mid</span>
-
-    <span class="k">def</span> <span class="nf">_updateState_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">isReply</span><span class="p">:</span>
-            <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_NEGOTIATE</span><span class="p">:</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">has_negotiated</span> <span class="o">=</span> <span class="bp">True</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;SMB dialect negotiation successful (ExtendedSecurity:</span><span class="si">%s</span><span class="s1">)&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">)</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">_updateServerInfo</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="p">)</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">_handleNegotiateResponse</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_NEGOTIATE&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span>
-                                        <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-            <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_SESSION_SETUP_ANDX</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span><span class="p">:</span>
-                    <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                        <span class="k">try</span><span class="p">:</span>
-                            <span class="n">result</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeAuthResponseSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
-                            <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_COMPLETED</span><span class="p">:</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;SMB uid is now </span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (with extended security) successful!&#39;</span><span class="p">)</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
-                            <span class="k">else</span><span class="p">:</span>
-                                <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;SMB_COM_SESSION_SETUP_ANDX status is 0 but security blob negResult value is </span><span class="si">%d</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">result</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                        <span class="k">except</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">ex</span><span class="p">:</span>
-                            <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                    <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mh">0xc0000016</span><span class="p">:</span>  <span class="c1"># STATUS_MORE_PROCESSING_REQUIRED</span>
-                        <span class="k">try</span><span class="p">:</span>
-                            <span class="n">result</span><span class="p">,</span> <span class="n">ntlm_token</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">decodeChallengeSecurityBlob</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">security_blob</span><span class="p">)</span>
-                            <span class="k">if</span> <span class="n">result</span> <span class="o">==</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">RESULT_ACCEPT_INCOMPLETE</span><span class="p">:</span>
-                                <span class="bp">self</span><span class="o">.</span><span class="n">_handleSessionChallenge</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">)</span>
-                        <span class="k">except</span> <span class="p">(</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">BadSecurityBlobError</span><span class="p">,</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">UnsupportedSecurityProvider</span> <span class="p">),</span> <span class="n">ex</span><span class="p">:</span>
-                            <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">ex</span><span class="p">),</span> <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                    <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mh">0xc000006d</span><span class="p">:</span>  <span class="c1"># STATUS_LOGON_FAILURE</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.&#39;</span><span class="p">)</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="k">raise</span> <span class="n">ProtocolError</span><span class="p">(</span><span class="s1">&#39;Unknown status value (0x</span><span class="si">%08X</span><span class="s1">) in SMB_COM_SESSION_SETUP_ANDX (with extended security)&#39;</span> <span class="o">%</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span><span class="p">,</span>
-                                            <span class="n">message</span><span class="o">.</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">internal_value</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;SMB uid is now </span><span class="si">%d</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span><span class="p">)</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">True</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (without extended security) successful!&#39;</span><span class="p">)</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">onAuthOK</span><span class="p">()</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span> <span class="o">=</span> <span class="bp">False</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Authentication (without extended security) failed. Please check username and password&#39;</span><span class="p">)</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">onAuthFailed</span><span class="p">()</span>
-            <span class="k">elif</span> <span class="n">message</span><span class="o">.</span><span class="n">command</span> <span class="o">==</span> <span class="n">SMB_COM_TREE_CONNECT_ANDX</span><span class="p">:</span>
-                <span class="k">try</span><span class="p">:</span>
-                    <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span>
-                <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
-                    <span class="k">pass</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">if</span> <span class="ow">not</span> <span class="n">message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                        <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;path&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">tid</span>
-
-            <span class="n">req</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="bp">None</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">req</span><span class="p">:</span>
-                <span class="n">req</span><span class="o">.</span><span class="n">callback</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="o">**</span><span class="n">req</span><span class="o">.</span><span class="n">kwargs</span><span class="p">)</span>
-                <span class="k">return</span> <span class="bp">True</span>
-
-
-    <span class="k">def</span> <span class="nf">_updateServerInfo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">capabilities</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_raw_size</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_buffer_size</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">max_mpx_count</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">max_mpx_count</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span> <span class="o">=</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">payload</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_ENCRYPT_PASSWORDS</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_plaintext_authentication</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s1">&#39;Remote server only supports plaintext authentication. Your password can be stolen easily over the network.&#39;</span><span class="p">)</span>
-
-
-    <span class="k">def</span> <span class="nf">_handleSessionChallenge_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">ntlm_token</span><span class="p">):</span>
-        <span class="k">assert</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span>
-
-        <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
-
-        <span class="n">server_challenge</span><span class="p">,</span> <span class="n">server_flags</span><span class="p">,</span> <span class="n">server_info</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">decodeChallengeMessage</span><span class="p">(</span><span class="n">ntlm_token</span><span class="p">)</span>
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">use_ntlm_v2</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv2 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
-            <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV2</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span>
-                                                                                                         <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                                                                                                         <span class="n">server_challenge</span><span class="p">,</span>
-                                                                                                         <span class="n">server_info</span><span class="p">,</span>
-                                                                                                         <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
-
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (with extended security) with server challenge &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">server_challenge</span><span class="p">))</span>
-            <span class="n">nt_challenge_response</span><span class="p">,</span> <span class="n">lm_challenge_response</span><span class="p">,</span> <span class="n">session_key</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">server_challenge</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
-
-        <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateAuthenticateMessage</span><span class="p">(</span><span class="n">server_flags</span><span class="p">,</span>
-                                                     <span class="n">nt_challenge_response</span><span class="p">,</span>
-                                                     <span class="n">lm_challenge_response</span><span class="p">,</span>
-                                                     <span class="n">session_key</span><span class="p">,</span>
-                                                     <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                                                     <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">isEnabledFor</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">):</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;NT challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">nt_challenge_response</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s1">&#39;LM challenge response is &quot;</span><span class="si">%s</span><span class="s1">&quot; (</span><span class="si">%d</span><span class="s1"> bytes)&#39;</span><span class="p">,</span> <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">),</span> <span class="nb">len</span><span class="p">(</span><span class="n">lm_challenge_response</span><span class="p">))</span>
-
-        <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateAuthSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__WithSecurityExtension</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">blob</span><span class="p">)))</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_SECURITY_SIGNATURES_REQUIRE</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server requires all SMB messages to be signed&#39;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">!=</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_NEVER</span><span class="p">)</span>
-        <span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">security_mode</span> <span class="o">&amp;</span> <span class="n">NEGOTIATE_SECURITY_SIGNATURES_ENABLE</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Server supports SMB signing&#39;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">sign_options</span> <span class="o">==</span> <span class="n">SMB</span><span class="o">.</span><span class="n">SIGN_WHEN_SUPPORTED</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="o">=</span> <span class="bp">False</span>
-
-        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing activated. All SMB messages will be signed.&quot;</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">signing_session_key</span> <span class="o">=</span> <span class="n">session_key</span>
-            <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">capabilities</span> <span class="o">&amp;</span> <span class="n">CAP_EXTENDED_SECURITY</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="bp">None</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">signing_challenge_response</span> <span class="o">=</span> <span class="n">blob</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;SMB signing deactivated. SMB messages will NOT be signed.&quot;</span><span class="p">)</span>
-
-
-    <span class="k">def</span> <span class="nf">_handleNegotiateResponse_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
-        <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span> <span class="ow">and</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">uid</span><span class="p">:</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">uid</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">uid</span>
-
-        <span class="k">if</span> <span class="n">message</span><span class="o">.</span><span class="n">hasExtendedSecurity</span> <span class="ow">or</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">supportsExtendedSecurity</span><span class="p">:</span>
-            <span class="n">ntlm_data</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateNegotiateMessage</span><span class="p">()</span>
-            <span class="n">blob</span> <span class="o">=</span> <span class="n">securityblob</span><span class="o">.</span><span class="n">generateNegotiateSecurityBlob</span><span class="p">(</span><span class="n">ntlm_data</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__WithSecurityExtension</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span> <span class="n">blob</span><span class="p">)))</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">nt_password</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="n">ntlm</span><span class="o">.</span><span class="n">generateChallengeResponseV1</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">challenge</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">log</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s1">&#39;Performing NTLMv1 authentication (without extended security) with challenge &quot;</span><span class="si">%s</span><span class="s1">&quot; and hashed password of &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span><span class="p">,</span>
-                          <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">challenge</span><span class="p">),</span>
-                          <span class="n">binascii</span><span class="o">.</span><span class="n">hexlify</span><span class="p">(</span><span class="n">nt_password</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComSessionSetupAndxRequest__NoSecurityExtension</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">session_key</span><span class="p">,</span>
-                                                                                           <span class="bp">self</span><span class="o">.</span><span class="n">username</span><span class="p">,</span>
-                                                                                           <span class="n">nt_password</span><span class="p">,</span>
-                                                                                           <span class="bp">True</span><span class="p">,</span>
-                                                                                           <span class="bp">self</span><span class="o">.</span><span class="n">domain</span><span class="p">)))</span>
-
-    <span class="k">def</span> <span class="nf">_listShares_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="s1">&#39;IPC$&#39;</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">connectSrvSvc</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNTCreateAndxRequest</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">srvsvc&#39;</span><span class="p">,</span>
-                                                  <span class="n">flags</span> <span class="o">=</span> <span class="n">NT_CREATE_REQUEST_EXTENDED_RESPONSE</span><span class="p">,</span>
-                                                  <span class="n">access_mask</span> <span class="o">=</span> <span class="n">READ_CONTROL</span> <span class="o">|</span> <span class="n">FILE_WRITE_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_READ_ATTRIBUTES</span> <span class="o">|</span> <span class="n">FILE_WRITE_EA</span> <span class="o">|</span> <span class="n">FILE_READ_EA</span> <span class="o">|</span> <span class="n">FILE_APPEND_DATA</span> <span class="o">|</span> <span class="n">FILE_WRITE_DATA</span> <span class="o">|</span> <span class="n">FILE_READ_DATA</span><span class="p">,</span>
-                                                  <span class="n">share_access</span> <span class="o">=</span> <span class="n">FILE_SHARE_READ</span> <span class="o">|</span> <span class="n">FILE_SHARE_WRITE</span><span class="p">,</span>
-                                                  <span class="n">create_disp</span> <span class="o">=</span> <span class="n">FILE_OPEN</span><span class="p">,</span>
-                                                  <span class="n">create_options</span> <span class="o">=</span> <span class="n">FILE_OPEN_NO_RECALL</span> <span class="o">|</span> <span class="n">FILE_NON_DIRECTORY_FILE</span><span class="p">,</span>
-                                                  <span class="n">impersonation</span> <span class="o">=</span> <span class="n">SEC_IMPERSONATE</span><span class="p">,</span>
-                                                  <span class="n">security_flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectSrvSvcCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">connectSrvSvcCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
-                <span class="c1"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
-                <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HH&#39;</span><span class="p">,</span> <span class="mh">0x0026</span><span class="p">,</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-                <span class="c1"># The data_bytes are binding call to Server Service RPC using DCE v1.1 RPC over SMB. See [MS-SRVS] and [C706]</span>
-                <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 0b 03 10 00 00 00 48 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00</span>
-<span class="s2">c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88</span>
-<span class="s2">03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00</span>
-<span class="s2">2b 10 48 60 02 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransactionRequest</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
-                                                     <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">,</span>
-                                                     <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">rpcBindCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">create_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to locate Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">rpcBindCB</span><span class="p">(</span><span class="n">trans_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">trans_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">call_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_getNextRPCCallID</span><span class="p">()</span>
-
-                <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
-                <span class="n">server_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
-                <span class="n">server_bytes_len</span> <span class="o">=</span> <span class="n">server_len</span> <span class="o">*</span> <span class="mi">2</span>
-                <span class="k">if</span> <span class="n">server_len</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">padding</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\0\0</span><span class="s1">&#39;</span>
-                    <span class="n">server_bytes_len</span> <span class="o">+=</span> <span class="mi">2</span>
-
-                <span class="c1"># See [MS-CIFS]: 2.2.5.6.1 for more information on TRANS_TRANSACT_NMPIPE (0x0026) parameters</span>
-                <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HH&#39;</span><span class="p">,</span> <span class="mh">0x0026</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="c1"># The data bytes are the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
-                <span class="c1"># If you wish to understand the meanings of the byte stream, I would suggest you use a recent version of WireShark to packet capture the stream</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;05 00 00 03 10 00 00 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHI&#39;</span><span class="p">,</span> <span class="mi">72</span><span class="o">+</span><span class="n">server_bytes_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">call_id</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;4c 00 00 00 00 00 0f 00 00 00 02 00&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">+</span> \
-                    <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">server_len</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">server_len</span><span class="p">)</span> <span class="o">+</span> \
-                    <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="n">padding</span> <span class="o">+</span> \
-                    <span class="n">binascii</span><span class="o">.</span><span class="n">unhexlify</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>
-<span class="s2">01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00</span>
-<span class="s2">00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00</span>
-<span class="s2">&quot;&quot;&quot;</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransactionRequest</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">4280</span><span class="p">,</span>
-                                                     <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                     <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">,</span>
-                                                     <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">listShareResultsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">trans_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to bind to Server Service RPC endpoint&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">listShareResultsCB</span><span class="p">(</span><span class="n">result_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">result_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="c1"># The payload.data_bytes will contain the results of the RPC call to NetrShareEnum (Opnum 15) at Server Service RPC.</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">result_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span>
-
-                <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">decodeResults</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">data_bytes</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">result_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">decodeResults</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
-            <span class="n">shares_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">36</span><span class="p">:</span><span class="mi">40</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
-            <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>     <span class="c1"># A list of SharedDevice instances</span>
-            <span class="n">offset</span> <span class="o">=</span> <span class="mi">36</span> <span class="o">+</span> <span class="mi">12</span>  <span class="c1"># You need to study the byte stream to understand the meaning of these constants</span>
-            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
-                <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedDevice</span><span class="p">(</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="o">+</span><span class="mi">4</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">],</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">None</span><span class="p">))</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-
-            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">shares_count</span><span class="p">):</span>
-                <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-                <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-                <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
-
-                <span class="n">max_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">length</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;III&#39;</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="mi">12</span><span class="p">])</span>
-                <span class="n">offset</span> <span class="o">+=</span> <span class="mi">12</span>
-                <span class="n">results</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">length</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-                <span class="k">if</span> <span class="n">length</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="p">(</span><span class="n">length</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
-
-            <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">sendReadRequest</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">):</span>
-            <span class="n">read_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mi">4280</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
-                                              <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">max_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">,</span>
-                                              <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
-                <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span>
-
-                <span class="k">if</span> <span class="nb">ord</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">3</span><span class="p">])</span> <span class="o">&amp;</span> <span class="mh">0x02</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">sendReadRequest</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">decodeResults</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_bytes&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">data_bytes</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="n">data_len</span><span class="o">-</span><span class="mi">24</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to retrieve shared device list&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">path</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                <span class="n">connectSrvSvc</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list shares: Unable to connect to IPC$&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">path</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">)</span>
-        <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_listPath_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">search</span><span class="p">,</span> <span class="n">pattern</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendFindFirst</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
-            <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0001</span><span class="p">)</span>  <span class="c1"># TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1</span>
-            <span class="n">params_bytes</span> <span class="o">=</span> \
-                <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHHI&#39;</span><span class="p">,</span>
-                            <span class="n">search</span><span class="p">,</span> <span class="c1"># SearchAttributes</span>
-                            <span class="mi">100</span><span class="p">,</span>    <span class="c1"># SearchCount</span>
-                            <span class="mh">0x0006</span><span class="p">,</span> <span class="c1"># Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
-                            <span class="mh">0x0104</span><span class="p">,</span> <span class="c1"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
-                            <span class="mh">0x0000</span><span class="p">)</span> <span class="c1"># SearchStorageType</span>
-            <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
-                <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span> <span class="o">+</span> <span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
-                                                  <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
-                                                  <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                  <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
-                                                  <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_DFS</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findFirstCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="n">support_dfs</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">decodeFindStruct</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">):</span>
-            <span class="c1"># SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1</span>
-            <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;IIQQQQQQIIIBB24s&#39;</span>
-            <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
-
-            <span class="n">data_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
-            <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
-            <span class="k">while</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="n">data_length</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
-                    <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
-
-                <span class="n">next_offset</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> \
-                <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
-                <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">filename_length</span><span class="p">,</span> <span class="n">ea_size</span><span class="p">,</span> \
-                <span class="n">short_name_length</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">short_name</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:</span><span class="n">offset</span><span class="o">+</span><span class="n">info_size</span><span class="p">])</span>
-
-                <span class="n">offset2</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="n">info_size</span>
-                <span class="k">if</span> <span class="n">offset2</span> <span class="o">+</span> <span class="n">filename_length</span> <span class="o">&gt;</span> <span class="n">data_length</span><span class="p">:</span>
-                    <span class="k">return</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset</span><span class="p">:]</span>
-
-                <span class="n">filename</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">[</span><span class="n">offset2</span><span class="p">:</span><span class="n">offset2</span><span class="o">+</span><span class="n">filename_length</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                <span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">SharedFile</span><span class="p">(</span><span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">create_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_access_time</span><span class="p">),</span>
-                                          <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_write_time</span><span class="p">),</span> <span class="n">convertFILETIMEtoEpoch</span><span class="p">(</span><span class="n">last_attr_change_time</span><span class="p">),</span>
-                                          <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">))</span>
-
-                <span class="k">if</span> <span class="n">next_offset</span><span class="p">:</span>
-                    <span class="n">offset</span> <span class="o">+=</span> <span class="n">next_offset</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="k">break</span>
-            <span class="k">return</span> <span class="s1">&#39;&#39;</span>
-
-        <span class="k">def</span> <span class="nf">findFirstCB</span><span class="p">(</span><span class="n">find_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">find_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">find_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;total_count&#39;</span><span class="p">):</span>
-                    <span class="c1"># TRANS2_FIND_FIRST2 response. [MS-CIFS]: 2.2.6.2.2</span>
-                    <span class="n">sid</span><span class="p">,</span> <span class="n">search_count</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHHH&#39;</span><span class="p">,</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">params_bytes</span><span class="p">[:</span><span class="mi">10</span><span class="p">])</span>
-                    <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;sid&#39;</span><span class="p">:</span> <span class="n">sid</span><span class="p">,</span> <span class="s1">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s1">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s1">&#39;&#39;</span> <span class="p">})</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">sid</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;sid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;last_name_offset&#39;</span><span class="p">]</span>
-
-                <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
-                <span class="k">if</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">:</span>
-                    <span class="n">d</span> <span class="o">=</span> <span class="n">decodeFindStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
-                    <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;data_count&#39;</span><span class="p">):</span>
-                        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span> <span class="o">!=</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">:</span>
-                            <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;data_count&#39;</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span>
-                                            <span class="s1">&#39;total_count&#39;</span><span class="p">:</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
-                                            <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
-                                            <span class="p">})</span>
-                            <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">])</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
-                        <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]:</span>
-                            <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
-
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findFirstCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
-                <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
-                    <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">sendFindNext</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;support_dfs&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve file list&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendFindNext</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">resume_key</span><span class="p">,</span> <span class="n">support_dfs</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
-            <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0002</span><span class="p">)</span>  <span class="c1"># TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1</span>
-            <span class="n">params_bytes</span> <span class="o">=</span> \
-                <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHIH&#39;</span><span class="p">,</span>
-                            <span class="n">sid</span><span class="p">,</span>        <span class="c1"># SID</span>
-                            <span class="mi">100</span><span class="p">,</span>        <span class="c1"># SearchCount</span>
-                            <span class="mh">0x0104</span><span class="p">,</span>     <span class="c1"># InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO</span>
-                            <span class="n">resume_key</span><span class="p">,</span> <span class="c1"># ResumeKey</span>
-                            <span class="mh">0x000a</span><span class="p">)</span>     <span class="c1"># Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS</span>
-            <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
-                <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span> <span class="o">+</span> <span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="n">pattern</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
-                                                  <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
-                                                  <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                  <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
-                                                  <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="k">if</span> <span class="n">support_dfs</span><span class="p">:</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">flags2</span> <span class="o">|=</span> <span class="n">SMB_FLAGS2_DFS</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findNextCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">sid</span> <span class="o">=</span> <span class="n">sid</span><span class="p">,</span> <span class="n">support_dfs</span> <span class="o">=</span> <span class="n">support_dfs</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">findNextCB</span><span class="p">(</span><span class="n">find_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">find_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">find_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;total_count&#39;</span><span class="p">):</span>
-                    <span class="c1"># TRANS2_FIND_NEXT2 response. [MS-CIFS]: 2.2.6.3.2</span>
-                    <span class="n">search_count</span><span class="p">,</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;HHHH&#39;</span><span class="p">,</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">params_bytes</span><span class="p">[:</span><span class="mi">8</span><span class="p">])</span>
-                    <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;end_of_search&#39;</span><span class="p">:</span> <span class="n">end_of_search</span><span class="p">,</span> <span class="s1">&#39;last_name_offset&#39;</span><span class="p">:</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="s1">&#39;&#39;</span> <span class="p">})</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">end_of_search</span><span class="p">,</span> <span class="n">last_name_offset</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;end_of_search&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;last_name_offset&#39;</span><span class="p">]</span>
-
-                <span class="n">send_next</span> <span class="o">=</span> <span class="bp">True</span>
-                <span class="k">if</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">:</span>
-                    <span class="n">d</span> <span class="o">=</span> <span class="n">decodeFindStruct</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">+</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
-                    <span class="k">if</span> <span class="ow">not</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="s1">&#39;data_count&#39;</span><span class="p">):</span>
-                        <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span> <span class="o">!=</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">:</span>
-                            <span class="n">kwargs</span><span class="o">.</span><span class="n">update</span><span class="p">({</span> <span class="s1">&#39;data_count&#39;</span><span class="p">:</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">),</span>
-                                            <span class="s1">&#39;total_count&#39;</span><span class="p">:</span> <span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span>
-                                            <span class="s1">&#39;data_buf&#39;</span><span class="p">:</span> <span class="n">d</span><span class="p">,</span>
-                                            <span class="p">})</span>
-                            <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">)</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">total_data_count</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">])</span>
-                        <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_buf&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">d</span>
-                        <span class="k">if</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;data_count&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;total_count&#39;</span><span class="p">]:</span>
-                            <span class="n">send_next</span> <span class="o">=</span> <span class="bp">False</span>
-
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">send_next</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">findNextCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
-                <span class="k">elif</span> <span class="n">end_of_search</span><span class="p">:</span>
-                    <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">sendFindNext</span><span class="p">(</span><span class="n">find_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;sid&#39;</span><span class="p">],</span> <span class="n">last_name_offset</span><span class="p">,</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;support_dfs&#39;</span><span class="p">,</span> <span class="bp">False</span><span class="p">))</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to retrieve file list&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendDFSReferral</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0010</span><span class="p">)</span>  <span class="c1"># TRANS2_GET_DFS_REFERRAL sub-command. See [MS-CIFS]: 2.2.6.16.1</span>
-            <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>      <span class="c1"># Max referral level 3</span>
-            <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="se">\\</span><span class="s2">&quot;</span> <span class="o">+</span> <span class="n">service_name</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
-                                                  <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">16644</span><span class="p">,</span>
-                                                  <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                  <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
-                                                  <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">dfsReferralCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">dfsReferralCB</span><span class="p">(</span><span class="n">dfs_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">sendFindFirst</span><span class="p">(</span><span class="n">dfs_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">True</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="k">if</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">optional_support</span> <span class="o">&amp;</span> <span class="n">SMB_TREE_CONNECTX_SUPPORT_DFS</span><span class="p">:</span>
-                        <span class="n">sendDFSReferral</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="n">sendFindFirst</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="bp">False</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendFindFirst</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_getAttributes_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
-        <span class="k">if</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendQuery</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="mh">0x0005</span><span class="p">)</span>  <span class="c1"># TRANS2_QUERY_PATH_INFORMATION sub-command. See [MS-CIFS]: 2.2.6.6.1</span>
-            <span class="n">params_bytes</span> <span class="o">=</span> \
-                <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;HI&#39;</span><span class="p">,</span>
-                            <span class="mh">0x0107</span><span class="p">,</span> <span class="c1"># SMB_QUERY_FILE_ALL_INFO ([MS-CIFS] 2.2.2.3.3)</span>
-                            <span class="mh">0x0000</span><span class="p">)</span> <span class="c1"># Reserved</span>
-            <span class="n">params_bytes</span> <span class="o">+=</span> <span class="p">(</span><span class="n">path</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\0</span><span class="s1">&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTransaction2Request</span><span class="p">(</span><span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span>
-                                                  <span class="n">max_data_count</span> <span class="o">=</span> <span class="mi">65535</span><span class="p">,</span>
-                                                  <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                  <span class="n">params_bytes</span> <span class="o">=</span> <span class="n">params_bytes</span><span class="p">,</span>
-                                                  <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">queryCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">queryCB</span><span class="p">(</span><span class="n">query_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">query_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">query_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">info_format</span> <span class="o">=</span> <span class="s1">&#39;&lt;QQQQIIQQ&#39;</span>
-                <span class="n">info_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">info_format</span><span class="p">)</span>
-                <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> \
-                <span class="n">file_attributes</span><span class="p">,</span> <span class="n">_</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">info_format</span><span class="p">,</span> <span class="n">query_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[:</span><span class="n">info_size</span><span class="p">])</span>
-
-                <span class="n">info</span> <span class="o">=</span> <span class="n">SharedFile</span><span class="p">(</span><span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span>
-                                  <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">),</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">info</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendQuery</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to get attributes for </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendQuery</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_retrieveFile_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_retrieveFileFromOffset</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="o">-</span><span class="il">1L</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_retrieveFileFromOffset_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">max_length</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
-                                              <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span>  <span class="c1"># Sharing mode: Deny nothing to others</span>
-                                              <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>    <span class="c1"># Failed if file does not exist</span>
-                                              <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">,</span>
-                                              <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="k">if</span> <span class="n">max_length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="n">closeFid</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-                    <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="il">0L</span> <span class="p">))</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">sendRead</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">file_attributes</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="n">max_length</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendRead</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">):</span>
-            <span class="n">read_count</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComReadAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span>
-                                              <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span>
-                                              <span class="n">max_return_bytes_count</span> <span class="o">=</span> <span class="n">read_count</span><span class="p">,</span>
-                                              <span class="n">min_return_bytes_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="mh">0xFFFF</span><span class="p">,</span> <span class="n">read_count</span><span class="p">)))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">readCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span><span class="p">,</span>
-                                                           <span class="n">read_len</span> <span class="o">=</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">remaining_len</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">readCB</span><span class="p">(</span><span class="n">read_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="c1"># To avoid crazy memory usage when retrieving large files, we do not save every read_message in messages_history.</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">read_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">read_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;read_len&#39;</span><span class="p">]</span>
-                <span class="n">remaining_len</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;remaining_len&#39;</span><span class="p">]</span>
-                <span class="n">data_len</span> <span class="o">=</span> <span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_length</span>
-                <span class="k">if</span> <span class="n">max_length</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                    <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="n">remaining_len</span><span class="p">:</span>
-                        <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">[:</span><span class="n">remaining_len</span><span class="p">])</span>
-                        <span class="n">read_len</span> <span class="o">+=</span> <span class="n">remaining_len</span>
-                        <span class="n">remaining_len</span> <span class="o">=</span> <span class="mi">0</span>
-                    <span class="k">else</span><span class="p">:</span>
-                        <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
-                        <span class="n">remaining_len</span> <span class="o">-=</span> <span class="n">data_len</span>
-                        <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">file_obj</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
-                    <span class="n">read_len</span> <span class="o">+=</span> <span class="n">data_len</span>
-
-                <span class="k">if</span> <span class="p">(</span><span class="n">max_length</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">remaining_len</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="ow">or</span> <span class="n">data_len</span> <span class="o">&lt;</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span> <span class="o">-</span> <span class="mi">2</span><span class="p">):</span>
-                    <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                    <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">read_len</span> <span class="p">))</span>  <span class="c1"># Note that this is a tuple of 3-elements</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">sendRead</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">]</span><span class="o">+</span><span class="n">data_len</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;file_attributes&#39;</span><span class="p">],</span> <span class="n">read_len</span><span class="p">,</span> <span class="n">remaining_len</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">read_message</span><span class="p">)</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">read_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Read failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to retrieve </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_storeFile_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_storeFileFromOffset_SMB1</span><span class="p">(</span><span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="il">0L</span><span class="p">,</span> <span class="bp">True</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_storeFileFromOffset_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">,</span> <span class="n">truncate</span> <span class="o">=</span> <span class="bp">False</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
-                                              <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0041</span><span class="p">,</span>  <span class="c1"># Sharing mode: Deny nothing to others + Open for writing</span>
-                                              <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0012</span> <span class="k">if</span> <span class="n">truncate</span> <span class="k">else</span> <span class="mh">0x0011</span><span class="p">,</span>    <span class="c1"># Create file if file does not exist. Overwrite or append depending on truncate parameter.</span>
-                                              <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">,</span>
-                                              <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">sendWrite</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">,</span> <span class="n">starting_offset</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open file&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendWrite</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
-            <span class="c1"># For message signing, the total SMB message size must be not exceed the max_buffer_size. Non-message signing does not have this limitation</span>
-            <span class="n">write_count</span> <span class="o">=</span> <span class="nb">min</span><span class="p">((</span><span class="bp">self</span><span class="o">.</span><span class="n">is_signing_active</span> <span class="ow">and</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">max_buffer_size</span><span class="o">-</span><span class="mi">64</span><span class="p">))</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_raw_size</span><span class="p">,</span> <span class="mh">0xFFFF</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>  <span class="c1"># Need to minus 1 byte from 0xFFFF because of the first NULL byte in the ComWriteAndxRequest message data</span>
-            <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">file_obj</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">write_count</span><span class="p">)</span>
-            <span class="n">data_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">data_bytes</span><span class="p">)</span>
-            <span class="k">if</span> <span class="n">data_len</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
-                <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComWriteAndxRequest</span><span class="p">(</span><span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="p">,</span> <span class="n">data_bytes</span> <span class="o">=</span> <span class="n">data_bytes</span><span class="p">))</span>
-                <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-                <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">writeCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">,</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">offset</span><span class="o">+</span><span class="n">data_len</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">)</span>
-                <span class="n">callback</span><span class="p">((</span> <span class="n">file_obj</span><span class="p">,</span> <span class="n">offset</span> <span class="p">))</span>  <span class="c1"># Note that this is a tuple of 2-elements</span>
-
-        <span class="k">def</span> <span class="nf">writeCB</span><span class="p">(</span><span class="n">write_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="c1"># To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">write_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">sendWrite</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;offset&#39;</span><span class="p">])</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">write_message</span><span class="p">)</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">write_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Write failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_deleteFiles_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path_file_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComDeleteRequest</span><span class="p">(</span><span class="n">filename_pattern</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
-                                            <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path_file_pattern</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to store </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendDelete</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendDelete</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_resetFileAttributes_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path_file_pattern</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;resetFileAttributes is not yet implemented for SMB1&#39;</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">_createDirectory_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendCreate</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCreateDirectoryRequest</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">createCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">createCB</span><span class="p">(</span><span class="n">create_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">create_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">create_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Create failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendCreate</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to create directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendCreate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_deleteDirectory_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendDelete</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComDeleteDirectoryRequest</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">deleteCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">deleteCB</span><span class="p">(</span><span class="n">delete_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">delete_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">delete_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete directory </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Delete failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendDelete</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to delete </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendDelete</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_rename_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendRename</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComRenameRequest</span><span class="p">(</span><span class="n">old_path</span> <span class="o">=</span> <span class="n">old_path</span><span class="p">,</span>
-                                            <span class="n">new_path</span> <span class="o">=</span> <span class="n">new_path</span><span class="p">,</span>
-                                            <span class="n">search_attributes</span> <span class="o">=</span> <span class="n">SMB_FILE_ATTRIBUTE_HIDDEN</span> <span class="o">|</span> <span class="n">SMB_FILE_ATTRIBUTE_SYSTEM</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">renameCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">renameCB</span><span class="p">(</span><span class="n">rename_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rename_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">rename_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">((</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">new_path</span> <span class="p">))</span>  <span class="c1"># Note that this is a tuple of 2-elements</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Rename failed&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendRename</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to rename </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">old_path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendRename</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_listSnapshots_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_name</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">has_authenticated</span><span class="p">:</span>
-            <span class="k">raise</span> <span class="n">NotReadyError</span><span class="p">(</span><span class="s1">&#39;SMB connection not authenticated&#39;</span><span class="p">)</span>
-
-        <span class="n">expiry_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> <span class="o">+</span> <span class="n">timeout</span>
-        <span class="n">path</span> <span class="o">=</span> <span class="n">path</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">)</span>
-        <span class="k">if</span> <span class="ow">not</span> <span class="n">path</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span><span class="p">):</span>
-            <span class="n">path</span> <span class="o">+=</span> <span class="s1">&#39;</span><span class="se">\\</span><span class="s1">&#39;</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-        <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">sendOpen</span><span class="p">(</span><span class="n">tid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComOpenAndxRequest</span><span class="p">(</span><span class="n">filename</span> <span class="o">=</span> <span class="n">path</span><span class="p">,</span>
-                                              <span class="n">access_mode</span> <span class="o">=</span> <span class="mh">0x0040</span><span class="p">,</span>  <span class="c1"># Sharing mode: Deny nothing to others</span>
-                                              <span class="n">open_mode</span> <span class="o">=</span> <span class="mh">0x0001</span><span class="p">,</span>    <span class="c1"># Failed if file does not exist</span>
-                                              <span class="n">search_attributes</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                              <span class="n">timeout</span> <span class="o">=</span> <span class="n">timeout</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">openCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">openCB</span><span class="p">(</span><span class="n">open_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">open_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">open_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">sendEnumSnapshots</span><span class="p">(</span><span class="n">open_message</span><span class="o">.</span><span class="n">tid</span><span class="p">,</span> <span class="n">open_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">fid</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to open path&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">sendEnumSnapshots</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="c1"># [MS-CIFS]: 2.2.7.2</span>
-            <span class="c1"># [MS-SMB]: 2.2.7.2.1</span>
-            <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s1">&#39;&lt;IHBB&#39;</span><span class="p">,</span>
-                                      <span class="mh">0x00144064</span><span class="p">,</span>  <span class="c1"># [MS-SMB]: 2.2.7.2.1</span>
-                                      <span class="n">fid</span><span class="p">,</span>         <span class="c1"># FID</span>
-                                      <span class="mh">0x01</span><span class="p">,</span>        <span class="c1"># IsFctl</span>
-                                      <span class="mi">0</span><span class="p">)</span>           <span class="c1"># IsFlags</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComNTTransactRequest</span><span class="p">(</span><span class="n">function</span> <span class="o">=</span> <span class="mh">0x0002</span><span class="p">,</span>  <span class="c1"># NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1</span>
-                                                <span class="n">max_params_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                <span class="n">max_data_count</span> <span class="o">=</span> <span class="mh">0xFFFF</span><span class="p">,</span>
-                                                <span class="n">max_setup_count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
-                                                <span class="n">setup_bytes</span> <span class="o">=</span> <span class="n">setup_bytes</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">enumSnapshotsCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span><span class="p">,</span> <span class="n">fid</span> <span class="o">=</span> <span class="n">fid</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">def</span> <span class="nf">enumSnapshotsCB</span><span class="p">(</span><span class="n">enum_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">enum_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">results</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-                <span class="n">snapshots_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
-                <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">snapshots_count</span><span class="p">):</span>
-                    <span class="n">s</span> <span class="o">=</span> <span class="n">enum_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data_bytes</span><span class="p">[</span><span class="mi">12</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">:</span><span class="mi">12</span><span class="o">+</span><span class="mi">48</span><span class="o">+</span><span class="n">i</span><span class="o">*</span><span class="mi">50</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;UTF-16LE&#39;</span><span class="p">)</span>
-                    <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">datetime</span><span class="p">(</span><span class="o">*</span><span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="p">(</span> <span class="n">s</span><span class="p">[</span><span class="mi">5</span><span class="p">:</span><span class="mi">9</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="p">:</span><span class="mi">12</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">13</span><span class="p">:</span><span class="mi">15</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">16</span><span class="p">:</span><span class="mi">18</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">19</span><span class="p">:</span><span class="mi">21</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">22</span><span class="p">:</span><span class="mi">24</span><span class="p">]</span> <span class="p">))))</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">results</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">closeFid</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;tid&#39;</span><span class="p">],</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;fid&#39;</span><span class="p">])</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to list snapshots on path&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="k">def</span> <span class="nf">closeFid</span><span class="p">(</span><span class="n">tid</span><span class="p">,</span> <span class="n">fid</span><span class="p">):</span>
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComCloseRequest</span><span class="p">(</span><span class="n">fid</span><span class="p">))</span>
-            <span class="n">m</span><span class="o">.</span><span class="n">tid</span> <span class="o">=</span> <span class="n">tid</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-        <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="o">.</span><span class="n">has_key</span><span class="p">(</span><span class="n">service_name</span><span class="p">):</span>
-            <span class="k">def</span> <span class="nf">connectCB</span><span class="p">(</span><span class="n">connect_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-                <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">connect_message</span><span class="p">)</span>
-                <span class="k">if</span> <span class="ow">not</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                    <span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">]</span> <span class="o">=</span> <span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span>
-                    <span class="n">sendOpen</span><span class="p">(</span><span class="n">connect_message</span><span class="o">.</span><span class="n">tid</span><span class="p">)</span>
-                <span class="k">else</span><span class="p">:</span>
-                    <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Failed to list snapshots </span><span class="si">%s</span><span class="s1"> on </span><span class="si">%s</span><span class="s1">: Unable to connect to shared device&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="n">path</span><span class="p">,</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">messages_history</span><span class="p">))</span>
-
-            <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComTreeConnectAndxRequest</span><span class="p">(</span><span class="s1">r&#39;</span><span class="se">\\</span><span class="si">%s</span><span class="s1">\</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">remote_name</span><span class="o">.</span><span class="n">upper</span><span class="p">(),</span> <span class="n">service_name</span> <span class="p">),</span> <span class="n">SERVICE_ANY</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">))</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-            <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">connectCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">path</span> <span class="o">=</span> <span class="n">service_name</span><span class="p">)</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">sendOpen</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">connected_trees</span><span class="p">[</span><span class="n">service_name</span><span class="p">])</span>
-
-    <span class="k">def</span> <span class="nf">_echo_SMB1</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="n">timeout</span> <span class="o">=</span> <span class="mi">30</span><span class="p">):</span>
-        <span class="n">messages_history</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-
-        <span class="k">def</span> <span class="nf">echoCB</span><span class="p">(</span><span class="n">echo_message</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-            <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">echo_message</span><span class="p">)</span>
-            <span class="k">if</span> <span class="ow">not</span> <span class="n">echo_message</span><span class="o">.</span><span class="n">status</span><span class="o">.</span><span class="n">hasError</span><span class="p">:</span>
-                <span class="n">callback</span><span class="p">(</span><span class="n">echo_message</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">data</span><span class="p">)</span>
-            <span class="k">else</span><span class="p">:</span>
-                <span class="n">errback</span><span class="p">(</span><span class="n">OperationFailure</span><span class="p">(</span><span class="s1">&#39;Echo failed&#39;</span><span class="p">,</span> <span class="n">messages_history</span><span class="p">))</span>
-
-        <span class="n">m</span> <span class="o">=</span> <span class="n">SMBMessage</span><span class="p">(</span><span class="n">ComEchoRequest</span><span class="p">(</span><span class="n">echo_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">))</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_sendSMBMessage</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">pending_requests</span><span class="p">[</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">]</span> <span class="o">=</span> <span class="n">_PendingRequest</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">mid</span><span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">())</span> <span class="o">+</span> <span class="n">timeout</span><span class="p">,</span> <span class="n">echoCB</span><span class="p">,</span> <span class="n">errback</span><span class="p">)</span>
-        <span class="n">messages_history</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
-
-
-<div class="viewcode-block" id="SharedDevice"><a class="viewcode-back" href="../../api/smb_SharedDevice.html#smb.base.SharedDevice">[docs]</a><span class="k">class</span> <span class="nc">SharedDevice</span><span class="p">:</span>
-    <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">    Contains information about a single shared device on the remote server.</span>
-<span class="sd">    &quot;&quot;&quot;</span>
-
-    <span class="c1"># The following constants are taken from [MS-SRVS]: 2.2.2.4</span>
-    <span class="c1"># They are used to identify the type of shared resource from the results from the NetrShareEnum in Server Service RPC</span>
-    <span class="n">DISK_TREE</span>   <span class="o">=</span> <span class="mh">0x00</span>
-    <span class="n">PRINT_QUEUE</span> <span class="o">=</span> <span class="mh">0x01</span>
-    <span class="n">COMM_DEVICE</span> <span class="o">=</span> <span class="mh">0x02</span>
-    <span class="n">IPC</span>         <span class="o">=</span> <span class="mh">0x03</span>
-
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">type</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">comments</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">=</span> <span class="nb">type</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>         <span class="c1">#: An unicode string containing the name of the shared device</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="o">=</span> <span class="n">comments</span> <span class="c1">#: An unicode string containing the user description of the shared device</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Returns one of the following integral constants.</span>
-<span class="sd">         - SharedDevice.DISK_TREE</span>
-<span class="sd">         - SharedDevice.PRINT_QUEUE</span>
-<span class="sd">         - SharedDevice.COMM_DEVICE</span>
-<span class="sd">         - SharedDevice.IPC</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isSpecial</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Returns True if this shared device is a special share reserved for interprocess communication (IPC$)</span>
-<span class="sd">        or remote administration of the server (ADMIN$). Can also refer to administrative shares such as</span>
-<span class="sd">        C$, D$, E$, and so forth</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0x80000000</span><span class="p">)</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isTemporary</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">        Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</span>
-<span class="sd">        &quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_type</span> <span class="o">&amp;</span> <span class="mh">0x40000000</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">return</span> <span class="s1">u&#39;Shared device: </span><span class="si">%s</span><span class="s1"> (type:0x</span><span class="si">%02x</span><span class="s1"> comments:</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">comments</span> <span class="p">)</span></div>
-
-
-<div class="viewcode-block" id="SharedFile"><a class="viewcode-back" href="../../api/smb_SharedFile.html#smb.base.SharedFile">[docs]</a><span class="k">class</span> <span class="nc">SharedFile</span><span class="p">:</span>
-    <span class="sd">&quot;&quot;&quot;</span>
-<span class="sd">    Contain information about a file/folder entry that is shared on the shared device.</span>
-
-<span class="sd">    As an application developer, you should not need to instantiate a *SharedFile* instance directly in your application.</span>
-<span class="sd">    These *SharedFile* instances are usually returned via a call to *listPath* method in :doc:`smb.SMBProtocol.SMBProtocolFactory&lt;smb_SMBProtocolFactory&gt;`.</span>
-
-<span class="sd">    If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond</span>
-<span class="sd">    to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains</span>
-<span class="sd">    one of these prohibited characters: &quot;\/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).</span>
-<span class="sd">    &quot;&quot;&quot;</span>
-
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">create_time</span><span class="p">,</span> <span class="n">last_access_time</span><span class="p">,</span> <span class="n">last_write_time</span><span class="p">,</span> <span class="n">last_attr_change_time</span><span class="p">,</span> <span class="n">file_size</span><span class="p">,</span> <span class="n">alloc_size</span><span class="p">,</span> <span class="n">file_attributes</span><span class="p">,</span> <span class="n">short_name</span><span class="p">,</span> <span class="n">filename</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">create_time</span> <span class="o">=</span> <span class="n">create_time</span>  <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">last_access_time</span> <span class="o">=</span> <span class="n">last_access_time</span>  <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">last_write_time</span> <span class="o">=</span> <span class="n">last_write_time</span>    <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">last_attr_change_time</span> <span class="o">=</span> <span class="n">last_attr_change_time</span>  <span class="c1">#: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">file_size</span> <span class="o">=</span> <span class="n">file_size</span>   <span class="c1">#: File size in number of bytes</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">alloc_size</span> <span class="o">=</span> <span class="n">alloc_size</span> <span class="c1">#: Total number of bytes allocated to store this file</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">=</span> <span class="n">file_attributes</span> <span class="c1">#: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">short_name</span> <span class="o">=</span> <span class="n">short_name</span> <span class="c1">#: Unicode string containing the short name of this file (usually in 8.3 notation)</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>     <span class="c1">#: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isDirectory</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;A convenient property to return True if this file resource is a directory on the remote server&quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">&amp;</span> <span class="n">ATTR_DIRECTORY</span><span class="p">)</span>
-
-    <span class="nd">@property</span>
-    <span class="k">def</span> <span class="nf">isReadOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="sd">&quot;&quot;&quot;A convenient property to return True if this file resource is read-only on the remote server&quot;&quot;&quot;</span>
-        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">file_attributes</span> <span class="o">&amp;</span> <span class="n">ATTR_READONLY</span><span class="p">)</span>
-
-    <span class="k">def</span> <span class="nf">__unicode__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
-        <span class="k">return</span> <span class="s1">u&#39;Shared file: </span><span class="si">%s</span><span class="s1"> (FileSize:</span><span class="si">%d</span><span class="s1"> bytes, isDirectory:</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">file_size</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">isDirectory</span> <span class="p">)</span></div>
-
-
-<span class="k">class</span> <span class="nc">_PendingRequest</span><span class="p">:</span>
-
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">expiry_time</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span> <span class="n">errback</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">mid</span> <span class="o">=</span> <span class="n">mid</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">expiry_time</span> <span class="o">=</span> <span class="n">expiry_time</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">callback</span> <span class="o">=</span> <span class="n">callback</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">errback</span> <span class="o">=</span> <span class="n">errback</span>
-        <span class="bp">self</span><span class="o">.</span><span class="n">kwargs</span> <span class="o">=</span> <span class="n">kwargs</span>
-</pre></div>
-
-          </div>
-        </div>
-      </div>
-      <div class="clearer"></div>
-    </div>
-    <div class="related" role="navigation" aria-label="related navigation">
-      <h3>Navigation</h3>
-      <ul>
-        <li class="right" style="margin-right: 10px">
-          <a href="../../genindex.html" title="General Index"
-             >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
-          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
-      </ul>
-    </div>
-    <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
-      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
-    </div>
-  </body>
-</html>
\ No newline at end of file
diff --git a/docs/html/_modules/smb/security_descriptors.html b/docs/html/_modules/smb/security_descriptors.html
new file mode 100644
index 00000000..cbd41f32
--- /dev/null
+++ b/docs/html/_modules/smb/security_descriptors.html
@@ -0,0 +1,459 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>smb.security_descriptors &mdash; pysmb 1.1.25 documentation</title>
+    
+    <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
+    <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '../../',
+        VERSION:     '1.1.25',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="../../_static/jquery.js"></script>
+    <script type="text/javascript" src="../../_static/underscore.js"></script>
+    <script type="text/javascript" src="../../_static/doctools.js"></script>
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
+    <link rel="up" title="Module code" href="../index.html" /> 
+  </head>
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../../genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
+          <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
+      </ul>
+    </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none" role="search">
+  <h3>Quick search</h3>
+    <form class="search" action="../../search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <h1>Source code for smb.security_descriptors</h1><div class="highlight"><pre>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">This module implements security descriptors, and the partial structures</span>
+<span class="sd">used in them, as specified in [MS-DTYP].</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">struct</span>
+
+
+<span class="c1"># Security descriptor control flags</span>
+<span class="c1"># [MS-DTYP]: 2.4.6</span>
+<span class="n">SECURITY_DESCRIPTOR_OWNER_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0001</span>
+<span class="n">SECURITY_DESCRIPTOR_GROUP_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0002</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_PRESENT</span> <span class="o">=</span> <span class="mh">0x0004</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0008</span>
+<span class="n">SECURITY_DESCRIPTOR_SACL_PRESENT</span> <span class="o">=</span> <span class="mh">0x0010</span>
+<span class="n">SECURITY_DESCRIPTOR_SACL_DEFAULTED</span> <span class="o">=</span> <span class="mh">0x0020</span>
+<span class="n">SECURITY_DESCRIPTOR_SERVER_SECURITY</span> <span class="o">=</span> <span class="mh">0x0040</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_TRUSTED</span> <span class="o">=</span> <span class="mh">0x0080</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED</span> <span class="o">=</span> <span class="mh">0x0100</span>
+<span class="n">SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED</span> <span class="o">=</span> <span class="mh">0x0200</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED</span> <span class="o">=</span> <span class="mh">0x0400</span>
+<span class="n">SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED</span> <span class="o">=</span> <span class="mh">0x0800</span>
+<span class="n">SECURITY_DESCRIPTOR_DACL_PROTECTED</span> <span class="o">=</span> <span class="mh">0x1000</span>
+<span class="n">SECURITY_DESCRIPTOR_SACL_PROTECTED</span> <span class="o">=</span> <span class="mh">0x2000</span>
+<span class="n">SECURITY_DESCRIPTOR_RM_CONTROL_VALID</span> <span class="o">=</span> <span class="mh">0x4000</span>
+<span class="n">SECURITY_DESCRIPTOR_SELF_RELATIVE</span> <span class="o">=</span> <span class="mh">0x8000</span>
+
+<span class="c1"># ACE types</span>
+<span class="c1"># [MS-DTYP]: 2.4.4.1</span>
+<span class="n">ACE_TYPE_ACCESS_ALLOWED</span> <span class="o">=</span> <span class="mh">0x00</span>
+<span class="n">ACE_TYPE_ACCESS_DENIED</span> <span class="o">=</span> <span class="mh">0x01</span>
+<span class="n">ACE_TYPE_SYSTEM_AUDIT</span> <span class="o">=</span> <span class="mh">0x02</span>
+<span class="n">ACE_TYPE_SYSTEM_ALARM</span> <span class="o">=</span> <span class="mh">0x03</span>
+<span class="n">ACE_TYPE_ACCESS_ALLOWED_COMPOUND</span> <span class="o">=</span> <span class="mh">0x04</span>
+<span class="n">ACE_TYPE_ACCESS_ALLOWED_OBJECT</span> <span class="o">=</span> <span class="mh">0x05</span>
+<span class="n">ACE_TYPE_ACCESS_DENIED_OBJECT</span> <span class="o">=</span> <span class="mh">0x06</span>
+<span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span> <span class="o">=</span> <span class="mh">0x07</span>
+<span class="n">ACE_TYPE_SYSTEM_ALARM_OBJECT</span> <span class="o">=</span> <span class="mh">0x08</span>
+<span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK</span> <span class="o">=</span> <span class="mh">0x09</span>
+<span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0A</span>
+<span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0B</span>
+<span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0C</span>
+<span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0D</span>
+<span class="n">ACE_TYPE_SYSTEM_ALARM_CALLBACK</span> <span class="o">=</span> <span class="mh">0x0E</span>
+<span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x0F</span>
+<span class="n">ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT</span> <span class="o">=</span> <span class="mh">0x10</span>
+<span class="n">ACE_TYPE_SYSTEM_MANDATORY_LABEL</span> <span class="o">=</span> <span class="mh">0x11</span>
+<span class="n">ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE</span> <span class="o">=</span> <span class="mh">0x12</span>
+<span class="n">ACE_TYPE_SYSTEM_SCOPED_POLICY_ID</span> <span class="o">=</span> <span class="mh">0x13</span>
+
+<span class="c1"># ACE flags</span>
+<span class="c1"># [MS-DTYP]: 2.4.4.1</span>
+<span class="n">ACE_FLAG_OBJECT_INHERIT</span> <span class="o">=</span> <span class="mh">0x01</span>
+<span class="n">ACE_FLAG_CONTAINER_INHERIT</span> <span class="o">=</span> <span class="mh">0x02</span>
+<span class="n">ACE_FLAG_NO_PROPAGATE_INHERIT</span> <span class="o">=</span> <span class="mh">0x04</span>
+<span class="n">ACE_FLAG_INHERIT_ONLY</span> <span class="o">=</span> <span class="mh">0x08</span>
+<span class="n">ACE_FLAG_INHERITED</span> <span class="o">=</span> <span class="mh">0x10</span>
+<span class="n">ACE_FLAG_SUCCESSFUL_ACCESS</span> <span class="o">=</span> <span class="mh">0x40</span>
+<span class="n">ACE_FLAG_FAILED_ACCESS</span> <span class="o">=</span> <span class="mh">0x80</span>
+
+<span class="c1"># Pre-defined well-known SIDs</span>
+<span class="c1"># [MS-DTYP]: 2.4.2.4</span>
+<span class="n">SID_NULL</span> <span class="o">=</span> <span class="s2">&quot;S-1-0-0&quot;</span>
+<span class="n">SID_EVERYONE</span> <span class="o">=</span> <span class="s2">&quot;S-1-1-0&quot;</span>
+<span class="n">SID_LOCAL</span> <span class="o">=</span> <span class="s2">&quot;S-1-2-0&quot;</span>
+<span class="n">SID_CONSOLE_LOGON</span> <span class="o">=</span> <span class="s2">&quot;S-1-2-1&quot;</span>
+<span class="n">SID_CREATOR_OWNER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-0&quot;</span>
+<span class="n">SID_CREATOR_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-1&quot;</span>
+<span class="n">SID_OWNER_SERVER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-2&quot;</span>
+<span class="n">SID_GROUP_SERVER</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-3&quot;</span>
+<span class="n">SID_OWNER_RIGHTS</span> <span class="o">=</span> <span class="s2">&quot;S-1-3-4&quot;</span>
+<span class="n">SID_NT_AUTHORITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-5&quot;</span>
+<span class="n">SID_DIALUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-1&quot;</span>
+<span class="n">SID_NETWORK</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-2&quot;</span>
+<span class="n">SID_BATCH</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-3&quot;</span>
+<span class="n">SID_INTERACTIVE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-4&quot;</span>
+<span class="n">SID_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-6&quot;</span>
+<span class="n">SID_ANONYMOUS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-7&quot;</span>
+<span class="n">SID_PROXY</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-8&quot;</span>
+<span class="n">SID_ENTERPRISE_DOMAIN_CONTROLLERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-9&quot;</span>
+<span class="n">SID_PRINCIPAL_SELF</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-10&quot;</span>
+<span class="n">SID_AUTHENTICATED_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-11&quot;</span>
+<span class="n">SID_RESTRICTED_CODE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-12&quot;</span>
+<span class="n">SID_TERMINAL_SERVER_USER</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-13&quot;</span>
+<span class="n">SID_REMOTE_INTERACTIVE_LOGON</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-14&quot;</span>
+<span class="n">SID_THIS_ORGANIZATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-15&quot;</span>
+<span class="n">SID_IUSR</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-17&quot;</span>
+<span class="n">SID_LOCAL_SYSTEM</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-18&quot;</span>
+<span class="n">SID_LOCAL_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-19&quot;</span>
+<span class="n">SID_NETWORK_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-20&quot;</span>
+<span class="n">SID_COMPOUNDED_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-21-0-0-0-496&quot;</span>
+<span class="n">SID_CLAIMS_VALID</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-21-0-0-0-497&quot;</span>
+<span class="n">SID_BUILTIN_ADMINISTRATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-544&quot;</span>
+<span class="n">SID_BUILTIN_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-545&quot;</span>
+<span class="n">SID_BUILTIN_GUESTS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-546&quot;</span>
+<span class="n">SID_POWER_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-547&quot;</span>
+<span class="n">SID_ACCOUNT_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-548&quot;</span>
+<span class="n">SID_SERVER_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-549&quot;</span>
+<span class="n">SID_PRINTER_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-550&quot;</span>
+<span class="n">SID_BACKUP_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-551&quot;</span>
+<span class="n">SID_REPLICATOR</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-552&quot;</span>
+<span class="n">SID_ALIAS_PREW2KCOMPACC</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-554&quot;</span>
+<span class="n">SID_REMOTE_DESKTOP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-555&quot;</span>
+<span class="n">SID_NETWORK_CONFIGURATION_OPS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-556&quot;</span>
+<span class="n">SID_INCOMING_FOREST_TRUST_BUILDERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-557&quot;</span>
+<span class="n">SID_PERFMON_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-558&quot;</span>
+<span class="n">SID_PERFLOG_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-559&quot;</span>
+<span class="n">SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-560&quot;</span>
+<span class="n">SID_TERMINAL_SERVER_LICENSE_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-561&quot;</span>
+<span class="n">SID_DISTRIBUTED_COM_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-562&quot;</span>
+<span class="n">SID_IIS_IUSRS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-568&quot;</span>
+<span class="n">SID_CRYPTOGRAPHIC_OPERATORS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-569&quot;</span>
+<span class="n">SID_EVENT_LOG_READERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-573&quot;</span>
+<span class="n">SID_CERTIFICATE_SERVICE_DCOM_ACCESS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-574&quot;</span>
+<span class="n">SID_RDS_REMOTE_ACCESS_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-575&quot;</span>
+<span class="n">SID_RDS_ENDPOINT_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-576&quot;</span>
+<span class="n">SID_RDS_MANAGEMENT_SERVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-577&quot;</span>
+<span class="n">SID_HYPER_V_ADMINS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-578&quot;</span>
+<span class="n">SID_ACCESS_CONTROL_ASSISTANCE_OPS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-579&quot;</span>
+<span class="n">SID_REMOTE_MANAGEMENT_USERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-32-580&quot;</span>
+<span class="n">SID_WRITE_RESTRICTED_CODE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-33&quot;</span>
+<span class="n">SID_NTLM_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-10&quot;</span>
+<span class="n">SID_SCHANNEL_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-14&quot;</span>
+<span class="n">SID_DIGEST_AUTHENTICATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-64-21&quot;</span>
+<span class="n">SID_THIS_ORGANIZATION_CERTIFICATE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-65-1&quot;</span>
+<span class="n">SID_NT_SERVICE</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-80&quot;</span>
+<span class="n">SID_USER_MODE_DRIVERS</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-84-0-0-0-0-0&quot;</span>
+<span class="n">SID_LOCAL_ACCOUNT</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-113&quot;</span>
+<span class="n">SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-114&quot;</span>
+<span class="n">SID_OTHER_ORGANIZATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-5-1000&quot;</span>
+<span class="n">SID_ALL_APP_PACKAGES</span> <span class="o">=</span> <span class="s2">&quot;S-1-15-2-1&quot;</span>
+<span class="n">SID_ML_UNTRUSTED</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-0&quot;</span>
+<span class="n">SID_ML_LOW</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-4096&quot;</span>
+<span class="n">SID_ML_MEDIUM</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-8192&quot;</span>
+<span class="n">SID_ML_MEDIUM_PLUS</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-8448&quot;</span>
+<span class="n">SID_ML_HIGH</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-12288&quot;</span>
+<span class="n">SID_ML_SYSTEM</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-16384&quot;</span>
+<span class="n">SID_ML_PROTECTED_PROCESS</span> <span class="o">=</span> <span class="s2">&quot;S-1-16-20480&quot;</span>
+<span class="n">SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-1&quot;</span>
+<span class="n">SID_SERVICE_ASSERTED_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-2&quot;</span>
+<span class="n">SID_FRESH_PUBLIC_KEY_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-3&quot;</span>
+<span class="n">SID_KEY_TRUST_IDENTITY</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-4&quot;</span>
+<span class="n">SID_KEY_PROPERTY_MFA</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-5&quot;</span>
+<span class="n">SID_KEY_PROPERTY_ATTESTATION</span> <span class="o">=</span> <span class="s2">&quot;S-1-18-6&quot;</span>
+
+
+<div class="viewcode-block" id="SID"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.SID">[docs]</a><span class="k">class</span> <span class="nc">SID</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    A Windows security identifier. Represents a single principal, such a</span>
+<span class="sd">    user or a group, as a sequence of numbers consisting of the revision,</span>
+<span class="sd">    identifier authority, and a variable-length list of subauthorities.</span>
+
+<span class="sd">    See [MS-DTYP]: 2.4.2</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">revision</span><span class="p">,</span> <span class="n">identifier_authority</span><span class="p">,</span> <span class="n">subauthorities</span><span class="p">):</span>
+        <span class="c1">#: Revision, should always be 1.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">revision</span> <span class="o">=</span> <span class="n">revision</span>
+        <span class="c1">#: An integer representing the identifier authority.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span> <span class="o">=</span> <span class="n">identifier_authority</span>
+        <span class="c1">#: A list of integers representing all subauthorities.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">subauthorities</span> <span class="o">=</span> <span class="n">subauthorities</span>
+
+    <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        String representation, as specified in [MS-DTYP]: 2.4.2.1</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="o">**</span><span class="mi">32</span><span class="p">:</span>
+            <span class="n">id_auth</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%#x</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span><span class="p">,)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">id_auth</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">identifier_authority</span>
+        <span class="n">auths</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">revision</span><span class="p">,</span> <span class="n">id_auth</span><span class="p">]</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">subauthorities</span>
+        <span class="k">return</span> <span class="s1">&#39;S-&#39;</span> <span class="o">+</span> <span class="s1">&#39;-&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">subauth</span><span class="p">)</span> <span class="k">for</span> <span class="n">subauth</span> <span class="ow">in</span> <span class="n">auths</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s1">&#39;SID(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">),)</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">return_tail</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
+        <span class="n">revision</span><span class="p">,</span> <span class="n">subauth_count</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;BB&#39;</span><span class="p">,</span> <span class="n">data</span><span class="p">[:</span><span class="mi">2</span><span class="p">])</span>
+        <span class="n">identifier_authority</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&gt;Q&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\x00\x00</span><span class="s1">&#39;</span> <span class="o">+</span> <span class="n">data</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">8</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
+        <span class="n">subauth_data</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="mi">8</span><span class="p">:]</span>
+        <span class="n">subauthorities</span> <span class="o">=</span> <span class="p">[</span><span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;L&#39;</span><span class="p">,</span> <span class="n">subauth_data</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="n">i</span> <span class="p">:</span> <span class="mi">4</span> <span class="o">*</span> <span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">)])[</span><span class="mi">0</span><span class="p">]</span>
+                          <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">subauth_count</span><span class="p">)]</span>
+        <span class="n">sid</span> <span class="o">=</span> <span class="n">cls</span><span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">identifier_authority</span><span class="p">,</span> <span class="n">subauthorities</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">return_tail</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">sid</span><span class="p">,</span> <span class="n">subauth_data</span><span class="p">[</span><span class="mi">4</span> <span class="o">*</span> <span class="n">subauth_count</span> <span class="p">:]</span>
+        <span class="k">return</span> <span class="n">sid</span></div>
+
+
+<div class="viewcode-block" id="ACE"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.ACE">[docs]</a><span class="k">class</span> <span class="nc">ACE</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Represents a single access control entry.</span>
+
+<span class="sd">    See [MS-DTYP]: 2.4.4</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBH&#39;</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">additional_data</span><span class="p">):</span>
+        <span class="c1">#: An integer representing the type of the ACE. One of the</span>
+        <span class="c1">#: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field</span>
+        <span class="c1">#: from [MS-DTYP] 2.4.4.1.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">type_</span>
+        <span class="c1">#: An integer bitmask with ACE flags, corresponds to the</span>
+        <span class="c1">#: ``AceFlags`` field.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
+        <span class="c1">#: An integer representing the ``ACCESS_MASK`` as specified in</span>
+        <span class="c1">#: [MS-DTYP] 2.4.3.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">mask</span> <span class="o">=</span> <span class="n">mask</span>
+        <span class="c1">#: The :class:`SID` of a trustee.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sid</span> <span class="o">=</span> <span class="n">sid</span>
+        <span class="c1">#: A dictionary of additional fields present in the ACE, depending</span>
+        <span class="c1">#: on the type. The following fields can be present:</span>
+        <span class="c1">#:</span>
+        <span class="c1">#: * ``flags``</span>
+        <span class="c1">#: * ``object_type``</span>
+        <span class="c1">#: * ``inherited_object_type``</span>
+        <span class="c1">#: * ``application_data``</span>
+        <span class="c1">#: * ``attribute_data``</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">additional_data</span> <span class="o">=</span> <span class="n">additional_data</span>
+
+    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s2">&quot;ACE(type=</span><span class="si">%#04x</span><span class="s2">, flags=</span><span class="si">%#04x</span><span class="s2">, mask=</span><span class="si">%#010x</span><span class="s2">, sid=</span><span class="si">%s</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">flags</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">mask</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">sid</span><span class="p">,</span>
+        <span class="p">)</span>
+
+    <span class="nd">@property</span>
+    <span class="k">def</span> <span class="nf">isInheritOnly</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;Convenience property which indicates if this ACE is inherit</span>
+<span class="sd">        only, meaning that it doesn&#39;t apply to the object itself.&quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">&amp;</span> <span class="n">ACE_FLAG_INHERIT_ONLY</span><span class="p">)</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+        <span class="n">header_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)</span>
+        <span class="n">header</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">header_size</span><span class="p">]</span>
+        <span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
+
+        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">size</span>
+
+        <span class="n">body</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="n">header_size</span><span class="p">:</span><span class="n">size</span><span class="p">]</span>
+        <span class="n">additional_data</span> <span class="o">=</span> <span class="p">{}</span>
+
+        <span class="c1"># In all ACE types, the mask immediately follows the header.</span>
+        <span class="n">mask</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">body</span><span class="p">[:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
+        <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">4</span><span class="p">:]</span>
+
+        <span class="c1"># All OBJECT-type ACEs contain additional flags, and two GUIDs as</span>
+        <span class="c1"># the following fields.</span>
+        <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ACE_TYPE_ACCESS_ALLOWED_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_DENIED_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span><span class="p">):</span>
+            <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;flags&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;I&#39;</span><span class="p">,</span> <span class="n">body</span><span class="p">[:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
+            <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;object_type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">4</span><span class="p">:</span><span class="mi">20</span><span class="p">]</span>
+            <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;inherited_object_type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">20</span><span class="p">:</span><span class="mi">36</span><span class="p">]</span>
+            <span class="n">body</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="mi">36</span><span class="p">:]</span>
+
+        <span class="c1"># Then the SID in all types.</span>
+        <span class="n">sid</span><span class="p">,</span> <span class="n">body</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">body</span><span class="p">,</span> <span class="n">return_tail</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
+
+        <span class="c1"># CALLBACK-type ACEs (and for some obscure reason,</span>
+        <span class="c1"># SYSTEM_AUDIT_OBJECT) have a final tail of application data.</span>
+        <span class="k">if</span> <span class="n">type_</span> <span class="ow">in</span> <span class="p">(</span><span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_SYSTEM_AUDIT_OBJECT</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK</span><span class="p">,</span>
+                     <span class="n">ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT</span><span class="p">):</span>
+            <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;application_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span>
+
+        <span class="c1"># SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.</span>
+        <span class="k">if</span> <span class="n">type_</span> <span class="o">==</span> <span class="n">ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE</span><span class="p">:</span>
+            <span class="n">additional_data</span><span class="p">[</span><span class="s1">&#39;attribute_data&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">body</span>
+
+        <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">type_</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">mask</span><span class="p">,</span> <span class="n">sid</span><span class="p">,</span> <span class="n">additional_data</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="ACL"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.ACL">[docs]</a><span class="k">class</span> <span class="nc">ACL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Access control list, encapsulating a sequence of access control</span>
+<span class="sd">    entries.</span>
+
+<span class="sd">    See [MS-DTYP]: 2.4.5</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHHH&#39;</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">revision</span><span class="p">,</span> <span class="n">aces</span><span class="p">):</span>
+        <span class="c1">#: Integer value of the revision.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">revision</span> <span class="o">=</span> <span class="n">revision</span>
+        <span class="c1">#: List of :class:`ACE` instances.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">aces</span> <span class="o">=</span> <span class="n">aces</span>
+
+    <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="s2">&quot;ACL(</span><span class="si">%r</span><span class="s2">)&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">aces</span><span class="p">,)</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+        <span class="n">revision</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="n">aces</span> <span class="o">=</span> <span class="p">[]</span>
+
+        <span class="n">header_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)</span>
+        <span class="n">header</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">header_size</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="n">header_size</span><span class="p">:]</span>
+        <span class="n">revision</span><span class="p">,</span> <span class="n">sbz1</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">sbz2</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
+
+        <span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">size</span>
+
+        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">count</span><span class="p">):</span>
+            <span class="n">ace_size</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s1">&#39;&lt;H&#39;</span><span class="p">,</span> <span class="n">remaining</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="mi">4</span><span class="p">])[</span><span class="mi">0</span><span class="p">]</span>
+            <span class="n">ace_data</span><span class="p">,</span> <span class="n">remaining</span> <span class="o">=</span> <span class="n">remaining</span><span class="p">[:</span><span class="n">ace_size</span><span class="p">],</span> <span class="n">remaining</span><span class="p">[</span><span class="n">ace_size</span><span class="p">:]</span>
+            <span class="n">aces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ACE</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">ace_data</span><span class="p">))</span>
+
+        <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">aces</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="SecurityDescriptor"><a class="viewcode-back" href="../../api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor">[docs]</a><span class="k">class</span> <span class="nc">SecurityDescriptor</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Represents a security descriptor.</span>
+
+<span class="sd">    See [MS-DTYP]: 2.4.6</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="n">HEADER_FORMAT</span> <span class="o">=</span> <span class="s1">&#39;&lt;BBHIIII&#39;</span>
+
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">dacl</span><span class="p">,</span> <span class="n">sacl</span><span class="p">):</span>
+        <span class="c1">#: Integer bitmask of control flags. Corresponds to the</span>
+        <span class="c1">#: ``Control`` field in [MS-DTYP] 2.4.6.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">flags</span> <span class="o">=</span> <span class="n">flags</span>
+        <span class="c1">#: Instance of :class:`SID` representing the owner user.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">owner</span> <span class="o">=</span> <span class="n">owner</span>
+        <span class="c1">#: Instance of :class:`SID` representing the owner group.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">group</span> <span class="o">=</span> <span class="n">group</span>
+        <span class="c1">#: Instance of :class:`ACL` representing the discretionary access</span>
+        <span class="c1">#: control list, which specifies access restrictions of an object.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">dacl</span> <span class="o">=</span> <span class="n">dacl</span>
+        <span class="c1">#: Instance of :class:`ACL` representing the system access control</span>
+        <span class="c1">#: list, which specifies audit logging of an object.</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">sacl</span> <span class="o">=</span> <span class="n">sacl</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">from_bytes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
+        <span class="n">owner</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="n">group</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="n">dacl</span> <span class="o">=</span> <span class="bp">None</span>
+        <span class="n">sacl</span> <span class="o">=</span> <span class="bp">None</span>
+
+        <span class="n">header</span> <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">struct</span><span class="o">.</span><span class="n">calcsize</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">)]</span>
+        <span class="p">(</span><span class="n">revision</span><span class="p">,</span> <span class="n">sbz1</span><span class="p">,</span> <span class="n">flags</span><span class="p">,</span> <span class="n">owner_offset</span><span class="p">,</span> <span class="n">group_offset</span><span class="p">,</span> <span class="n">sacl_offset</span><span class="p">,</span>
+         <span class="n">dacl_offset</span><span class="p">)</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="n">cls</span><span class="o">.</span><span class="n">HEADER_FORMAT</span><span class="p">,</span> <span class="n">header</span><span class="p">)</span>
+
+        <span class="k">assert</span> <span class="n">revision</span> <span class="o">==</span> <span class="mi">1</span>
+        <span class="k">assert</span> <span class="n">flags</span> <span class="o">&amp;</span> <span class="n">SECURITY_DESCRIPTOR_SELF_RELATIVE</span>
+        <span class="k">for</span> <span class="n">offset</span> <span class="ow">in</span> <span class="p">(</span><span class="n">owner_offset</span><span class="p">,</span> <span class="n">group_offset</span><span class="p">,</span> <span class="n">sacl_offset</span><span class="p">,</span> <span class="n">dacl_offset</span><span class="p">):</span>
+            <span class="k">assert</span> <span class="mi">0</span> <span class="o">&lt;=</span> <span class="n">offset</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+
+        <span class="k">if</span> <span class="n">owner_offset</span><span class="p">:</span>
+            <span class="n">owner</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">owner_offset</span><span class="p">:])</span>
+        <span class="k">if</span> <span class="n">group_offset</span><span class="p">:</span>
+            <span class="n">group</span> <span class="o">=</span> <span class="n">SID</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">group_offset</span><span class="p">:])</span>
+        <span class="k">if</span> <span class="n">dacl_offset</span><span class="p">:</span>
+            <span class="n">dacl</span> <span class="o">=</span> <span class="n">ACL</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">dacl_offset</span><span class="p">:])</span>
+        <span class="k">if</span> <span class="n">sacl_offset</span><span class="p">:</span>
+            <span class="n">sacl</span> <span class="o">=</span> <span class="n">ACL</span><span class="o">.</span><span class="n">from_bytes</span><span class="p">(</span><span class="n">data</span><span class="p">[</span><span class="n">sacl_offset</span><span class="p">:])</span>
+
+        <span class="k">return</span> <span class="n">cls</span><span class="p">(</span><span class="n">flags</span><span class="p">,</span> <span class="n">owner</span><span class="p">,</span> <span class="n">group</span><span class="p">,</span> <span class="n">dacl</span><span class="p">,</span> <span class="n">sacl</span><span class="p">)</span></div>
+</pre></div>
+
+          </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../../genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
+          <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer" role="contentinfo">
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/html/_modules/smb/smb_structs.html b/docs/html/_modules/smb/smb_structs.html
index 61587b1e..e90a7266 100644
--- a/docs/html/_modules/smb/smb_structs.html
+++ b/docs/html/_modules/smb/smb_structs.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>smb.smb_structs &mdash; pysmb 1.1.18 documentation</title>
+    <title>smb.smb_structs &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../../_static/jquery.js"></script>
     <script type="text/javascript" src="../../_static/underscore.js"></script>
     <script type="text/javascript" src="../../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../../index.html" />
     <link rel="up" title="Module code" href="../index.html" /> 
   </head>
   <body role="document">
@@ -33,7 +33,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &raquo;</li> 
       </ul>
     </div>
@@ -73,17 +76,20 @@
 <span class="c1"># Set to True if you want to enable SMB2 protocol.</span>
 <span class="n">SUPPORT_SMB2</span> <span class="o">=</span> <span class="bp">True</span>
 
-<span class="c1"># Supported dialects</span>
-<span class="n">DIALECTS</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span> <span class="n">name</span><span class="p">,</span> <span class="n">dialect</span> <span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">([</span> <span class="p">(</span> <span class="s1">&#39;NT_LAN_MANAGER_DIALECT&#39;</span><span class="p">,</span> <span class="s1">&#39;NT LM 0.12&#39;</span> <span class="p">),</span> <span class="p">]):</span>
-    <span class="n">DIALECTS</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dialect</span><span class="p">)</span>
-    <span class="nb">globals</span><span class="p">()[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span>
+<span class="c1"># Set to True if you want to enable SMB2.1 and above protocol.</span>
+<span class="n">SUPPORT_SMB2x</span> <span class="o">=</span> <span class="bp">True</span>
 
-<span class="n">DIALECTS2</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
-<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="p">(</span> <span class="n">name</span><span class="p">,</span> <span class="n">dialect</span> <span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">([</span> <span class="p">(</span> <span class="s1">&#39;SMB2_DIALECT&#39;</span><span class="p">,</span> <span class="s1">&#39;SMB 2.002&#39;</span> <span class="p">)</span> <span class="p">]):</span>
-    <span class="n">DIALECTS2</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">dialect</span><span class="p">)</span>
-    <span class="nb">globals</span><span class="p">()[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">DIALECTS</span><span class="p">)</span>
+<span class="c1"># Supported dialects</span>
+<span class="n">NT_LAN_MANAGER_DIALECT</span> <span class="o">=</span> <span class="mi">0</span>  <span class="c1"># &#39;NT LM 0.12&#39; is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)</span>
 
+<span class="c1"># Return the list of support SMB dialects based on the SUPPORT_x constants</span>
+<span class="k">def</span> <span class="nf">init_dialects_list</span><span class="p">():</span>
+    <span class="n">dialects</span> <span class="o">=</span> <span class="p">[</span> <span class="s1">&#39;NT LM 0.12&#39;</span> <span class="p">]</span>
+    <span class="k">if</span> <span class="n">SUPPORT_SMB2</span><span class="p">:</span>
+        <span class="n">dialects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;SMB 2.002&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="n">SUPPORT_SMB2x</span><span class="p">:</span>
+        <span class="n">dialects</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;SMB 2.???&#39;</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">dialects</span>
 
 <div class="viewcode-block" id="UnsupportedFeature"><a class="viewcode-back" href="../../api/smb_exceptions.html#smb.smb_structs.UnsupportedFeature">[docs]</a><span class="k">class</span> <span class="nc">UnsupportedFeature</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
     <span class="sd">&quot;&quot;&quot;</span>
@@ -171,8 +177,9 @@
     <span class="n">log</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="s1">&#39;SMB.SMBMessage&#39;</span><span class="p">)</span>
     <span class="n">protocol</span> <span class="o">=</span> <span class="mi">1</span>
 
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">payload</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">conn</span><span class="p">,</span> <span class="n">payload</span> <span class="o">=</span> <span class="bp">None</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">reset</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">conn</span> <span class="o">=</span> <span class="n">conn</span>
         <span class="k">if</span> <span class="n">payload</span><span class="p">:</span>
             <span class="bp">self</span><span class="o">.</span><span class="n">payload</span> <span class="o">=</span> <span class="n">payload</span>
             <span class="bp">self</span><span class="o">.</span><span class="n">payload</span><span class="o">.</span><span class="n">initMessage</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
@@ -353,10 +360,7 @@
     <span class="k">def</span> <span class="nf">prepare</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
         <span class="k">assert</span> <span class="n">message</span><span class="o">.</span><span class="n">payload</span> <span class="o">==</span> <span class="bp">self</span>
         <span class="n">message</span><span class="o">.</span><span class="n">parameters_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
-        <span class="k">if</span> <span class="n">SUPPORT_SMB2</span><span class="p">:</span>
-            <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</span> <span class="o">+</span> <span class="n">DIALECTS2</span><span class="p">))</span>
-        <span class="k">else</span><span class="p">:</span>
-            <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">DIALECTS</span><span class="p">))</span>
+        <span class="n">message</span><span class="o">.</span><span class="n">data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="s1">&#39;</span><span class="se">\x02</span><span class="s1">&#39;</span><span class="o">+</span><span class="n">s</span><span class="o">+</span><span class="s1">&#39;</span><span class="se">\x00</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">init_dialects_list</span><span class="p">()))</span>
 
 
 <span class="k">class</span> <span class="nc">ComNegotiateResponse</span><span class="p">(</span><span class="n">Payload</span><span class="p">):</span>
@@ -1343,7 +1347,7 @@
 <span class="sd">    - [MS-CIFS]: 2.2.4.39.1</span>
 <span class="sd">    &quot;&quot;&quot;</span>
 
-    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">echo_data</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">echo_count</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">echo_data</span> <span class="o">=</span> <span class="n">b</span><span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">echo_count</span> <span class="o">=</span> <span class="mi">1</span><span class="p">):</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">echo_count</span> <span class="o">=</span> <span class="n">echo_count</span>
         <span class="bp">self</span><span class="o">.</span><span class="n">echo_data</span> <span class="o">=</span> <span class="n">echo_data</span>
 
@@ -1494,12 +1498,15 @@
         <li class="right" style="margin-right: 10px">
           <a href="../../genindex.html" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.18 documentation</a> &raquo;</li>
+        <li class="right" >
+          <a href="../../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../../index.html">pysmb 1.1.25 documentation</a> &raquo;</li>
           <li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/_sources/api/smb_security_descriptors.txt b/docs/html/_sources/api/smb_security_descriptors.txt
new file mode 100644
index 00000000..0f048fe8
--- /dev/null
+++ b/docs/html/_sources/api/smb_security_descriptors.txt
@@ -0,0 +1,23 @@
+
+Security Descriptors
+====================
+
+.. module:: smb.security_descriptors
+   :synopsis: Data structures used in Windows security descriptors.
+
+This module implements security descriptors, and associated data
+structures, as specified in `[MS-DTYP]`_.
+
+.. autoclass:: SID
+   :members:
+
+.. autoclass:: ACE
+   :members:
+
+.. autoclass:: ACL
+   :members:
+
+.. autoclass:: SecurityDescriptor
+   :members:
+
+.. _[MS-DTYP]: https://msdn.microsoft.com/en-us/library/cc230273.aspx
diff --git a/docs/html/api/nmb_NBNSProtocol.html b/docs/html/api/nmb_NBNSProtocol.html
index 263abd9e..fdbaa08e 100644
--- a/docs/html/api/nmb_NBNSProtocol.html
+++ b/docs/html/api/nmb_NBNSProtocol.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>NBNSProtocol Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>NBNSProtocol Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="NetBIOS class" href="nmb_NetBIOS.html" />
     <link rel="prev" title="Welcome to pysmb’s documentation!" href="../index.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="nmb_NetBIOS.html" title="NetBIOS class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="../index.html" title="Welcome to pysmb’s documentation!"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -185,17 +188,20 @@ On timeout, the errback function will be called with a Failure instance wrapping
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="nmb_NetBIOS.html" title="NetBIOS class"
              >next</a> |</li>
         <li class="right" >
           <a href="../index.html" title="Welcome to pysmb’s documentation!"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/nmb_NetBIOS.html b/docs/html/api/nmb_NetBIOS.html
index 9bf23b52..165ff63f 100644
--- a/docs/html/api/nmb_NetBIOS.html
+++ b/docs/html/api/nmb_NetBIOS.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>NetBIOS class &mdash; pysmb 1.1.18 documentation</title>
+    <title>NetBIOS class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SMBConnection Class" href="smb_SMBConnection.html" />
     <link rel="prev" title="NBNSProtocol Class" href="nmb_NBNSProtocol.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBConnection.html" title="SMBConnection Class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -189,17 +192,20 @@ If the NBNSProtocol instance was instianted with broadcast=False, then you shoul
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBConnection.html" title="SMBConnection Class"
              >next</a> |</li>
         <li class="right" >
           <a href="nmb_NBNSProtocol.html" title="NBNSProtocol Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_SMBConnection.html b/docs/html/api/smb_SMBConnection.html
index 3caf88cb..38e03ac8 100644
--- a/docs/html/api/smb_SMBConnection.html
+++ b/docs/html/api/smb_SMBConnection.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SMBConnection Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>SMBConnection Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SMbHandler Class" href="smb_SMBHandler.html" />
     <link rel="prev" title="NetBIOS class" href="nmb_NetBIOS.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBHandler.html" title="SMbHandler Class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="nmb_NetBIOS.html" title="NetBIOS class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -136,401 +139,6 @@ Otherwise, it will fallback automatically back to using SMB1 protocol.</p>
 Most SMB/CIFS servers have some sort of keepalive mechanism and impose a timeout limit.
 If the clients fail to respond within the timeout limit, the SMB/CIFS server may disconnect the client.</li>
 </ul>
-<dl class="class">
-<dt id="smb.SMBConnection.SMBConnection">
-<em class="property">class </em><code class="descclassname">smb.SMBConnection.</code><code class="descname">SMBConnection</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.__init__">
-<code class="descname">__init__</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.__init__" title="Permalink to this definition">¶</a></dt>
-<dd><p>Create a new SMBConnection instance.</p>
-<p><em>username</em> and <em>password</em> are the user credentials required to authenticate the underlying SMB connection with the remote server.
-File operations can only be proceeded after the connection has been authenticated successfully.</p>
-<p>Note that you need to call <em>connect</em> method to actually establish the SMB connection to the remote server and perform authentication.</p>
-<p>The default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.
-Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
-<li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
-You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of <code class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></code></li>
-<li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
-On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
-This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
-<li><strong>domain</strong> (<em>string</em>) &#8211; The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</li>
-<li><strong>use_ntlm_v2</strong> (<em>boolean</em>) &#8211; Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.
-The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.
-Hence, we can only &#8220;guess&#8221; or try both algorithms.
-On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</li>
-<li><strong>sign_options</strong> (<em>int</em>) &#8211; Determines whether SMB messages will be signed. Default is <em>SIGN_WHEN_REQUIRED</em>.
-If <em>SIGN_WHEN_REQUIRED</em> (value=2), SMB messages will only be signed when remote server requires signing.
-If <em>SIGN_WHEN_SUPPORTED</em> (value=1), SMB messages will be signed when remote server supports signing but not requires signing.
-If <em>SIGN_NEVER</em> (value=0), SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</li>
-<li><strong>is_direct_tcp</strong> (<em>boolean</em>) &#8211; Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.
-The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.close">
-<code class="descname">close</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.close"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.close" title="Permalink to this definition">¶</a></dt>
-<dd><p>Terminate the SMB connection (if it has been started) and release any sources held by the underlying socket.</p>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.connect">
-<code class="descname">connect</code><span class="sig-paren">(</span><em>ip</em>, <em>port=139</em>, <em>sock_family=2</em>, <em>timeout=60</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.connect"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.connect" title="Permalink to this definition">¶</a></dt>
-<dd><p>Establish the SMB connection to the remote SMB/CIFS server.</p>
-<p>You must call this method before attempting any of the file operations with the remote server.
-This method will block until the SMB connection has attempted at least one authentication.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">A boolean value indicating the result of the authentication atttempt: True if authentication is successful; False, if otherwise.</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.createDirectory">
-<code class="descname">createDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.createDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.createDirectory" title="Permalink to this definition">¶</a></dt>
-<dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the new folder (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.deleteDirectory">
-<code class="descname">deleteDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.deleteDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.deleteDirectory" title="Permalink to this definition">¶</a></dt>
-<dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the to-be-deleted folder (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.deleteFiles">
-<code class="descname">deleteFiles</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.deleteFiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.deleteFiles" title="Permalink to this definition">¶</a></dt>
-<dd><p>Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
-Wildcards may be used in th filename component of the path.
-If your path/filename contains non-English characters, you must pass in an unicode string.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.echo">
-<code class="descname">echo</code><span class="sig-paren">(</span><em>data</em>, <em>timeout=10</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.echo"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.echo" title="Permalink to this definition">¶</a></dt>
-<dd><p>Send an echo command containing <em>data</em> to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same <em>data</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>data</strong> (<em>string</em>) &#8211; Data to send to the remote server.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">The <em>data</em> parameter</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.getAttributes">
-<code class="descname">getAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.getAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.getAttributes" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.listPath">
-<code class="descname">listPath</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listPath"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listPath" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested to learn about its files/sub-folders.</li>
-<li><strong>search</strong> (<em>integer</em>) &#8211; integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py).
-The default <em>search</em> value will query for all read-only, hidden, system, archive files and directories.</li>
-<li><strong>pattern</strong> (<em>string/unicode</em>) &#8211; the filter to apply to the results before returning to the client.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A list of <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instances.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.listShares">
-<code class="descname">listShares</code><span class="sig-paren">(</span><em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listShares"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listShares" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a list of shared resources on remote server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">A list of <a class="reference internal" href="smb_SharedDevice.html"><em>smb.base.SharedDevice</em></a> instances describing the shared resource</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.listSnapshots">
-<code class="descname">listSnapshots</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.listSnapshots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.listSnapshots" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a list of available snapshots (shadow copies) for <em>path</em>.</p>
-<p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested in the list of available snapshots</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A list of python <em>datetime.DateTime</em> instances in GMT/UTC time zone</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.rename">
-<code class="descname">rename</code><span class="sig-paren">(</span><em>service_name</em>, <em>old_path</em>, <em>new_path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.rename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.rename" title="Permalink to this definition">¶</a></dt>
-<dd><p>Rename a file or folder at <em>old_path</em> to <em>new_path</em> shared at <em>service_name</em>. Note that this method cannot be used to rename file/folder across different shared folders</p>
-<p><em>old_path</em> and <em>new_path</em> are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">None</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.resetFileAttributes">
-<code class="descname">resetFileAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.resetFileAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.resetFileAttributes" title="Permalink to this definition">¶</a></dt>
-<dd><p>Reset file attributes of one or more regular files or folders.
-It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
-This function is very helpful when deleting files/folders that are read-only.
-Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See <a class="reference external" href="https://msdn.microsoft.com/en-us/library/cc232110.aspx">https://msdn.microsoft.com/en-us/library/cc232110.aspx</a> for further information)</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
-Wildcards may be used in the filename component of the path.
-If your path/filename contains non-English characters, you must pass in an unicode string.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">None</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.retrieveFile">
-<code class="descname">retrieveFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.retrieveFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.retrieveFile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
-<p>Use <em>retrieveFileFromOffset()</em> method if you wish to specify the offset to read from the remote <em>path</em> and/or the number of bytes to write to the <em>file_obj</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A 2-element tuple of ( file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
-The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.retrieveFileFromOffset">
-<code class="descname">retrieveFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.retrieveFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.retrieveFileFromOffset" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> up to <em>max_length</em> number of bytes.</li>
-<li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
-<li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
-If zero, the method returns immediately after the file is opened successfully for reading.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A 2-element tuple of ( file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
-The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.storeFile">
-<code class="descname">storeFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.storeFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.storeFile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.
-If the file already exists on the remote server, it will be truncated and overwritten.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
-If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">Number of bytes uploaded</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBConnection.SMBConnection.storeFileFromOffset">
-<code class="descname">storeFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>truncate=False</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBConnection.html#SMBConnection.storeFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBConnection.SMBConnection.storeFileFromOffset" title="Permalink to this definition">¶</a></dt>
-<dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created.
-If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
-<li><strong>offset</strong> &#8211; Long integer value which specifies the offset in the remote server to start writing. First byte of the file is 0.</li>
-<li><strong>truncate</strong> &#8211; Boolean value. If True and the file exists on the remote server, it will be truncated first before writing. Default is False.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">the file position where the next byte will be written.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBConnection.SMBConnection.SIGN_NEVER">
-<code class="descname">SIGN_NEVER</code><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_NEVER" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED">
-<code class="descname">SIGN_WHEN_REQUIRED</code><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will only be signed when remote server requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED">
-<code class="descname">SIGN_WHEN_SUPPORTED</code><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBConnection.SMBConnection.isUsingSMB2">
-<code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBConnection.SMBConnection.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
-<dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
-</dd></dl>
-
-</dd></dl>
-
 </div>
 </div>
 
@@ -546,17 +154,20 @@ If the <em>path</em> refers to a folder or the file cannot be opened for writing
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBHandler.html" title="SMbHandler Class"
              >next</a> |</li>
         <li class="right" >
           <a href="nmb_NetBIOS.html" title="NetBIOS class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_SMBHandler.html b/docs/html/api/smb_SMBHandler.html
index e4aaf640..ff3e9ac7 100644
--- a/docs/html/api/smb_SMBHandler.html
+++ b/docs/html/api/smb_SMBHandler.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SMbHandler Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>SMbHandler Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" />
     <link rel="prev" title="SMBConnection Class" href="smb_SMBConnection.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="smb_SMBConnection.html" title="SMBConnection Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -150,17 +153,20 @@ In uploads, if the parent folders do not exist, an <em>urllib2.URLError</em> wil
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
              >next</a> |</li>
         <li class="right" >
           <a href="smb_SMBConnection.html" title="SMBConnection Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_SMBProtocolFactory.html b/docs/html/api/smb_SMBProtocolFactory.html
index def8ac36..232c75f9 100644
--- a/docs/html/api/smb_SMBProtocolFactory.html
+++ b/docs/html/api/smb_SMBProtocolFactory.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SMBProtocolFactory Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>SMBProtocolFactory Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SharedDevice Class" href="smb_SharedDevice.html" />
     <link rel="prev" title="SMbHandler Class" href="smb_SMBHandler.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SharedDevice.html" title="SharedDevice Class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="smb_SMBHandler.html" title="SMbHandler Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -173,403 +176,6 @@ Otherwise, it will fallback automatically back to using SMB1 protocol.</p>
 <li>The <em>timeout</em> parameter in the file operation methods are not precise; it is accurate to within 1 second interval, i.e. with a timeout of 0.5 sec, pysmb might raise
 <em>SMBTimeout</em> exception after 1.5 sec.</li>
 </ul>
-<dl class="class">
-<dt id="smb.SMBProtocol.SMBProtocolFactory">
-<em class="property">class </em><code class="descclassname">smb.SMBProtocol.</code><code class="descname">SMBProtocolFactory</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.__init__">
-<code class="descname">__init__</code><span class="sig-paren">(</span><em>username</em>, <em>password</em>, <em>my_name</em>, <em>remote_name</em>, <em>domain=''</em>, <em>use_ntlm_v2=True</em>, <em>sign_options=2</em>, <em>is_direct_tcp=False</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.__init__" title="Permalink to this definition">¶</a></dt>
-<dd><p>Create a new SMBProtocolFactory instance. You will pass this instance to <em>reactor.connectTCP()</em> which will then instantiate the TCP connection to the remote SMB/CIFS server.
-Note that the default TCP port for most SMB/CIFS servers using NetBIOS over TCP/IP is 139.
-Some newer server installations might also support Direct hosting of SMB over TCP/IP; for these servers, the default TCP port is 445.</p>
-<p><em>username</em> and <em>password</em> are the user credentials required to authenticate the underlying SMB connection with the remote server.
-File operations can only be proceeded after the connection has been authenticated successfully.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first last simple">
-<li><strong>my_name</strong> (<em>string</em>) &#8211; The local NetBIOS machine name that will identify where this connection is originating from.
-You can freely choose a name as long as it contains a maximum of 15 alphanumeric characters and does not contain spaces and any of <code class="docutils literal"><span class="pre">\/:*?&quot;;|+</span></code>.</li>
-<li><strong>remote_name</strong> (<em>string</em>) &#8211; The NetBIOS machine name of the remote server.
-On windows, you can find out the machine name by right-clicking on the &#8220;My Computer&#8221; and selecting &#8220;Properties&#8221;.
-This parameter must be the same as what has been configured on the remote server, or else the connection will be rejected.</li>
-<li><strong>domain</strong> (<em>string</em>) &#8211; The network domain. On windows, it is known as the workgroup. Usually, it is safe to leave this parameter as an empty string.</li>
-<li><strong>use_ntlm_v2</strong> (<em>boolean</em>) &#8211; Indicates whether pysmb should be NTLMv1 or NTLMv2 authentication algorithm for authentication.
-The choice of NTLMv1 and NTLMv2 is configured on the remote server, and there is no mechanism to auto-detect which algorithm has been configured.
-Hence, we can only &#8220;guess&#8221; or try both algorithms.
-On Sambda, Windows Vista and Windows 7, NTLMv2 is enabled by default. On Windows XP, we can use NTLMv1 before NTLMv2.</li>
-<li><strong>sign_options</strong> (<em>int</em>) &#8211; Determines whether SMB messages will be signed. Default is <em>SIGN_WHEN_REQUIRED</em>.
-If <em>SIGN_WHEN_REQUIRED</em> (value=2), SMB messages will only be signed when remote server requires signing.
-If <em>SIGN_WHEN_SUPPORTED</em> (value=1), SMB messages will be signed when remote server supports signing but not requires signing.
-If <em>SIGN_NEVER</em> (value=0), SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</li>
-<li><strong>is_direct_tcp</strong> (<em>boolean</em>) &#8211; Controls whether the NetBIOS over TCP/IP (is_direct_tcp=False) or the newer Direct hosting of SMB over TCP/IP (is_direct_tcp=True) will be used for the communication.
-The default parameter is False which will use NetBIOS over TCP/IP for wider compatibility (TCP port: 139).</li>
-</ul>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.closeConnection">
-<code class="descname">closeConnection</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.closeConnection"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.closeConnection" title="Permalink to this definition">¶</a></dt>
-<dd><p>Disconnect from the remote SMB/CIFS server. The TCP connection will be closed at the earliest opportunity after this method returns.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Returns:</th><td class="field-body">None</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.createDirectory">
-<code class="descname">createDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.createDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.createDirectory" title="Permalink to this definition">¶</a></dt>
-<dd><p>Creates a new directory <em>path</em> on the <em>service_name</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the new folder (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path</em> parameter.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">
-<code class="descname">deleteDirectory</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.deleteDirectory"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory" title="Permalink to this definition">¶</a></dt>
-<dd><p>Delete the empty folder at <em>path</em> on <em>service_name</em></p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; The path of the to-be-deleted folder (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path</em> parameter.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.deleteFiles">
-<code class="descname">deleteFiles</code><span class="sig-paren">(</span><em>service_name</em>, <em>path_file_pattern</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.deleteFiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.deleteFiles" title="Permalink to this definition">¶</a></dt>
-<dd><p>Delete one or more regular files. It supports the use of wildcards in file names, allowing for deletion of multiple files in a single request.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>path_file_pattern</strong> (<em>string/unicode</em>) &#8211; The pathname of the file(s) to be deleted, relative to the service_name.
-Wildcards may be used in th filename component of the path.
-If your path/filename contains non-English characters, you must pass in an unicode string.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>path_file_pattern</em> parameter.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.echo">
-<code class="descname">echo</code><span class="sig-paren">(</span><em>data</em>, <em>timeout=10</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.echo"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.echo" title="Permalink to this definition">¶</a></dt>
-<dd><p>Send an echo command containing <em>data</em> to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same <em>data</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>data</strong> (<em>string</em>) &#8211; Data to send to the remote server.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with the <em>data</em> parameter.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.getAttributes">
-<code class="descname">getAttributes</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.getAttributes"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.getAttributes" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve information about the file at <em>path</em> on the <em>service_name</em>.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be raised.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instance containing the attributes of the file.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.listPath">
-<code class="descname">listPath</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>search=55</em>, <em>pattern='*'</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listPath"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listPath" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a directory listing of files/folders at <em>path</em></p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested to learn about its files/sub-folders.</li>
-<li><strong>search</strong> (<em>integer</em>) &#8211; integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py).
-The default <em>search</em> value will query for all read-only, hidden, system, archive files and directories.</li>
-<li><strong>pattern</strong> (<em>string/unicode</em>) &#8211; the filter to apply to the results before returning to the client.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of <a class="reference internal" href="smb_SharedFile.html"><em>smb.base.SharedFile</em></a> instances.</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.listShares">
-<code class="descname">listShares</code><span class="sig-paren">(</span><em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listShares"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listShares" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a list of shared resources on remote server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of <a class="reference internal" href="smb_SharedDevice.html"><em>smb.base.SharedDevice</em></a> instances.</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.listSnapshots">
-<code class="descname">listSnapshots</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.listSnapshots"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.listSnapshots" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve a list of available snapshots (a.k.a. shadow copies) for <em>path</em>.</p>
-<p>Note that snapshot features are only supported on Windows Vista Business, Enterprise and Ultimate, and on all Windows 7 editions.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; path relative to the <em>service_name</em> where we are interested in the list of available snapshots</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a list of python <em>datetime.DateTime</em>
-instances in GMT/UTC time zone</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">
-<code class="descname">onAuthFailed</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.onAuthFailed"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed" title="Permalink to this definition">¶</a></dt>
-<dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
-This method will be called when the server has replied that the SMB connection has been successfully authenticated.</p>
-<dl class="docutils">
-<dt>If you want to retry authenticating from this method,</dt>
-<dd><ol class="first last arabic simple">
-<li>Disconnect the underlying SMB connection (call <code class="docutils literal"><span class="pre">self.instance.transport.loseConnection()</span></code>)</li>
-<li>Create a new SMBProtocolFactory subclass instance with different user credientials or different NTLM algorithm flag.</li>
-<li>Call <code class="docutils literal"><span class="pre">reactor.connectTCP</span></code> with the new instance to re-establish the SMB connection</li>
-</ol>
-</dd>
-</dl>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.onAuthOK">
-<code class="descname">onAuthOK</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.onAuthOK"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.onAuthOK" title="Permalink to this definition">¶</a></dt>
-<dd><p>Override this method in your <em>SMBProtocolFactory</em> subclass to add in post-authentication handling.
-This method will be called when the server has replied that the SMB connection has been successfully authenticated.
-File operations can proceed when this method has been called.</p>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.rename">
-<code class="descname">rename</code><span class="sig-paren">(</span><em>service_name</em>, <em>old_path</em>, <em>new_path</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.rename"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.rename" title="Permalink to this definition">¶</a></dt>
-<dd><p>Rename a file or folder at <em>old_path</em> to <em>new_path</em> shared at <em>service_name</em>. Note that this method cannot be used to rename file/folder across different shared folders</p>
-<p><em>old_path</em> and <em>new_path</em> are string/unicode referring to the old and new path of the renamed resources (relative to) the shared folder.
-If the path contains non-English characters, an unicode string must be used to pass in the path.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; Contains the name of the shared folder.</li>
-<li><strong>timeout</strong> (<em>integer/float</em>) &#8211; Number of seconds that pysmb will wait before raising <em>SMBTimeout</em> via the returned <em>Deferred</em> instance&#8217;s <em>errback</em> method.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 2-element tuple of ( <em>old_path</em>, <em>new_path</em> ).</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFile">
-<code class="descname">retrieveFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.retrieveFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.retrieveFile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
-<p>Use <em>retrieveFileFromOffset()</em> method if you need to specify the offset to read from the remote <em>path</em> and/or the maximum number of bytes to write to the <em>file_obj</em>.</p>
-<p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size
-of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
-The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 3-element tuple of ( <em>file_obj</em>, file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
-The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">
-<code class="descname">retrieveFileFromOffset</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>offset=0L</em>, <em>max_length=-1L</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.retrieveFileFromOffset"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset" title="Permalink to this definition">¶</a></dt>
-<dd><p>Retrieve the contents of the file at <em>path</em> on the <em>service_name</em> and write these contents to the provided <em>file_obj</em>.</p>
-<p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the downloaded file usually exceeeds the maximum size
-of each SMB/CIFS data message, it will be packetized into a series of request messages (each message will request about about 60kBytes).
-The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and downloaded from the remote SMB/CIFS server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file cannot be opened for reading, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>write</em> method. Data will be written continuously to <em>file_obj</em> until EOF is received from the remote service.</li>
-<li><strong>offset</strong> (<em>integer/long</em>) &#8211; the offset in the remote <em>path</em> where the first byte will be read and written to <em>file_obj</em>. Must be either zero or a positive integer/long value.</li>
-<li><strong>max_length</strong> (<em>integer/long</em>) &#8211; maximum number of bytes to read from the remote <em>path</em> and write to the <em>file_obj</em>. Specify a negative value to read from <em>offset</em> to the EOF.
-If zero, the <em>Deferred</em> callback is invoked immediately after the file is opened successfully for reading.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 3-element tuple of ( <em>file_obj</em>, file attributes of the file on server, number of bytes written to <em>file_obj</em> ).
-The file attributes is an integer value made up from a bitwise-OR of <em>SMB_FILE_ATTRIBUTE_xxx</em> bits (see smb_constants.py)</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="method">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.storeFile">
-<code class="descname">storeFile</code><span class="sig-paren">(</span><em>service_name</em>, <em>path</em>, <em>file_obj</em>, <em>timeout=30</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/SMBProtocol.html#SMBProtocolFactory.storeFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.storeFile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Store the contents of the <em>file_obj</em> at <em>path</em> on the <em>service_name</em>.</p>
-<p>The meaning of the <em>timeout</em> parameter will be different from other file operation methods. As the uploaded file usually exceeeds the maximum size
-of each SMB/CIFS data message, it will be packetized into a series of messages (usually about 60kBytes).
-The <em>timeout</em> parameter is an integer/float value that specifies the timeout interval for these individual SMB/CIFS message to be transmitted and acknowledged
-by the remote SMB/CIFS server.</p>
-<table class="docutils field-list" frame="void" rules="none">
-<col class="field-name" />
-<col class="field-body" />
-<tbody valign="top">
-<tr class="field-odd field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple">
-<li><strong>service_name</strong> (<em>string/unicode</em>) &#8211; the name of the shared folder for the <em>path</em></li>
-<li><strong>path</strong> (<em>string/unicode</em>) &#8211; Path of the file on the remote server. If the file at <em>path</em> does not exist, it will be created. Otherwise, it will be overwritten.
-If the <em>path</em> refers to a folder or the file cannot be opened for writing, an <a class="reference internal" href="smb_exceptions.html"><em>OperationFailure</em></a> will be called in the returned <em>Deferred</em> errback.</li>
-<li><strong>file_obj</strong> &#8211; A file-like object that has a <em>read</em> method. Data will read continuously from <em>file_obj</em> until EOF.</li>
-</ul>
-</td>
-</tr>
-<tr class="field-even field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last">A <em>twisted.internet.defer.Deferred</em> instance. The callback function will be called with a 2-element tuple of ( <em>file_obj</em>, number of bytes uploaded ).</p>
-</td>
-</tr>
-</tbody>
-</table>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER">
-<code class="descname">SIGN_NEVER</code><em class="property"> = 0</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will never be signed regardless of remote server&#8217;s configurations; access errors will occur if the remote server requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED">
-<code class="descname">SIGN_WHEN_REQUIRED</code><em class="property"> = 2</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will only be signed when remote server requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED">
-<code class="descname">SIGN_WHEN_SUPPORTED</code><em class="property"> = 1</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED" title="Permalink to this definition">¶</a></dt>
-<dd><p>SMB messages will be signed when remote server supports signing but not requires signing.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.instance">
-<code class="descname">instance</code><em class="property"> = None</em><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.instance" title="Permalink to this definition">¶</a></dt>
-<dd><p>The single SMBProtocol instance for each SMBProtocolFactory instance. Usually, you should not need to touch this attribute directly.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.isReady">
-<code class="descname">isReady</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isReady" title="Permalink to this definition">¶</a></dt>
-<dd><p>A convenient property to return True if the underlying SMB connection has connected to remote server, has successfully authenticated itself and is ready for file operations.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">
-<code class="descname">isUsingSMB2</code><a class="headerlink" href="#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2" title="Permalink to this definition">¶</a></dt>
-<dd><p>A convenient property to return True if the underlying SMB connection is using SMB2 protocol.</p>
-</dd></dl>
-
-</dd></dl>
-
 </div>
 </div>
 
@@ -585,17 +191,20 @@ If the <em>path</em> refers to a folder or the file cannot be opened for writing
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SharedDevice.html" title="SharedDevice Class"
              >next</a> |</li>
         <li class="right" >
           <a href="smb_SMBHandler.html" title="SMbHandler Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_SharedDevice.html b/docs/html/api/smb_SharedDevice.html
index c13b6d09..46d17a9e 100644
--- a/docs/html/api/smb_SharedDevice.html
+++ b/docs/html/api/smb_SharedDevice.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SharedDevice Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>SharedDevice Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SharedFile Class" href="smb_SharedFile.html" />
     <link rel="prev" title="SMBProtocolFactory Class" href="smb_SMBProtocolFactory.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SharedFile.html" title="SharedFile Class"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -81,53 +84,6 @@
             
   <div class="section" id="shareddevice-class">
 <h1>SharedDevice Class<a class="headerlink" href="#shareddevice-class" title="Permalink to this headline">¶</a></h1>
-<dl class="class">
-<dt id="smb.base.SharedDevice">
-<em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SharedDevice</code><span class="sig-paren">(</span><em>type</em>, <em>name</em>, <em>comments</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/base.html#SharedDevice"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedDevice" title="Permalink to this definition">¶</a></dt>
-<dd><p>Contains information about a single shared device on the remote server.</p>
-<dl class="attribute">
-<dt id="smb.base.SharedDevice.comments">
-<code class="descname">comments</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.comments" title="Permalink to this definition">¶</a></dt>
-<dd><p>An unicode string containing the user description of the shared device</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedDevice.isSpecial">
-<code class="descname">isSpecial</code><a class="headerlink" href="#smb.base.SharedDevice.isSpecial" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns True if this shared device is a special share reserved for interprocess communication (IPC$)
-or remote administration of the server (ADMIN$). Can also refer to administrative shares such as
-C$, D$, E$, and so forth</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedDevice.isTemporary">
-<code class="descname">isTemporary</code><a class="headerlink" href="#smb.base.SharedDevice.isTemporary" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns True if this is a temporary share that is not persisted for creation each time the file server initializes.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedDevice.name">
-<code class="descname">name</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedDevice.name" title="Permalink to this definition">¶</a></dt>
-<dd><p>An unicode string containing the name of the shared device</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedDevice.type">
-<code class="descname">type</code><a class="headerlink" href="#smb.base.SharedDevice.type" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="docutils">
-<dt>Returns one of the following integral constants.</dt>
-<dd><ul class="first last simple">
-<li>SharedDevice.DISK_TREE</li>
-<li>SharedDevice.PRINT_QUEUE</li>
-<li>SharedDevice.COMM_DEVICE</li>
-<li>SharedDevice.IPC</li>
-</ul>
-</dd>
-</dl>
-</dd></dl>
-
-</dd></dl>
-
 </div>
 
 
@@ -142,17 +98,20 @@ C$, D$, E$, and so forth</p>
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_SharedFile.html" title="SharedFile Class"
              >next</a> |</li>
         <li class="right" >
           <a href="smb_SMBProtocolFactory.html" title="SMBProtocolFactory Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_SharedFile.html b/docs/html/api/smb_SharedFile.html
index 7b4e37cc..7a708e27 100644
--- a/docs/html/api/smb_SharedFile.html
+++ b/docs/html/api/smb_SharedFile.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SharedFile Class &mdash; pysmb 1.1.18 documentation</title>
+    <title>SharedFile Class &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
     <link rel="next" title="SMB Exceptions" href="smb_exceptions.html" />
     <link rel="prev" title="SharedDevice Class" href="smb_SharedDevice.html" /> 
   </head>
@@ -34,13 +34,16 @@
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_exceptions.html" title="SMB Exceptions"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="smb_SharedDevice.html" title="SharedDevice Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -81,83 +84,6 @@
             
   <div class="section" id="sharedfile-class">
 <h1>SharedFile Class<a class="headerlink" href="#sharedfile-class" title="Permalink to this headline">¶</a></h1>
-<dl class="class">
-<dt id="smb.base.SharedFile">
-<em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SharedFile</code><span class="sig-paren">(</span><em>create_time</em>, <em>last_access_time</em>, <em>last_write_time</em>, <em>last_attr_change_time</em>, <em>file_size</em>, <em>alloc_size</em>, <em>file_attributes</em>, <em>short_name</em>, <em>filename</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/base.html#SharedFile"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SharedFile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Contain information about a file/folder entry that is shared on the shared device.</p>
-<p>As an application developer, you should not need to instantiate a <em>SharedFile</em> instance directly in your application.
-These <em>SharedFile</em> instances are usually returned via a call to <em>listPath</em> method in <a class="reference internal" href="smb_SMBProtocolFactory.html"><em>smb.SMBProtocol.SMBProtocolFactory</em></a>.</p>
-<p>If you encounter <em>SharedFile</em> instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
-to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
-one of these prohibited characters: &#8220;/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).</p>
-<dl class="attribute">
-<dt id="smb.base.SharedFile.alloc_size">
-<code class="descname">alloc_size</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.alloc_size" title="Permalink to this definition">¶</a></dt>
-<dd><p>Total number of bytes allocated to store this file</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.create_time">
-<code class="descname">create_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.create_time" title="Permalink to this definition">¶</a></dt>
-<dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.file_attributes">
-<code class="descname">file_attributes</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_attributes" title="Permalink to this definition">¶</a></dt>
-<dd><p>A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.file_size">
-<code class="descname">file_size</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.file_size" title="Permalink to this definition">¶</a></dt>
-<dd><p>File size in number of bytes</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.filename">
-<code class="descname">filename</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.filename" title="Permalink to this definition">¶</a></dt>
-<dd><p>Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.isDirectory">
-<code class="descname">isDirectory</code><a class="headerlink" href="#smb.base.SharedFile.isDirectory" title="Permalink to this definition">¶</a></dt>
-<dd><p>A convenient property to return True if this file resource is a directory on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.isReadOnly">
-<code class="descname">isReadOnly</code><a class="headerlink" href="#smb.base.SharedFile.isReadOnly" title="Permalink to this definition">¶</a></dt>
-<dd><p>A convenient property to return True if this file resource is read-only on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.last_access_time">
-<code class="descname">last_access_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_access_time" title="Permalink to this definition">¶</a></dt>
-<dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.last_attr_change_time">
-<code class="descname">last_attr_change_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_attr_change_time" title="Permalink to this definition">¶</a></dt>
-<dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.last_write_time">
-<code class="descname">last_write_time</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.last_write_time" title="Permalink to this definition">¶</a></dt>
-<dd><p>Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server</p>
-</dd></dl>
-
-<dl class="attribute">
-<dt id="smb.base.SharedFile.short_name">
-<code class="descname">short_name</code><em class="property"> = None</em><a class="headerlink" href="#smb.base.SharedFile.short_name" title="Permalink to this definition">¶</a></dt>
-<dd><p>Unicode string containing the short name of this file (usually in 8.3 notation)</p>
-</dd></dl>
-
-</dd></dl>
-
 </div>
 
 
@@ -172,17 +98,20 @@ one of these prohibited characters: &#8220;/[]:+|&lt;&gt;=;?,* (see [MS-CIFS]: 2
         <li class="right" style="margin-right: 10px">
           <a href="../genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="smb_exceptions.html" title="SMB Exceptions"
              >next</a> |</li>
         <li class="right" >
           <a href="smb_SharedDevice.html" title="SharedDevice Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_exceptions.html b/docs/html/api/smb_exceptions.html
index aac30428..ebc21c79 100644
--- a/docs/html/api/smb_exceptions.html
+++ b/docs/html/api/smb_exceptions.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>SMB Exceptions &mdash; pysmb 1.1.18 documentation</title>
+    <title>SMB Exceptions &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    '../',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,8 +23,8 @@
     <script type="text/javascript" src="../_static/jquery.js"></script>
     <script type="text/javascript" src="../_static/underscore.js"></script>
     <script type="text/javascript" src="../_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="../index.html" />
-    <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
+    <link rel="next" title="Security Descriptors" href="smb_security_descriptors.html" />
     <link rel="prev" title="SharedFile Class" href="smb_SharedFile.html" /> 
   </head>
   <body role="document">
@@ -35,12 +35,15 @@
           <a href="../genindex.html" title="General Index"
              accesskey="I">index</a></li>
         <li class="right" >
-          <a href="../extending.html" title="Extending pysmb For Other Frameworks"
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="smb_security_descriptors.html" title="Security Descriptors"
              accesskey="N">next</a> |</li>
         <li class="right" >
           <a href="smb_SharedFile.html" title="SharedFile Class"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -49,8 +52,8 @@
   <p class="topless"><a href="smb_SharedFile.html"
                         title="previous chapter">SharedFile Class</a></p>
   <h4>Next topic</h4>
-  <p class="topless"><a href="../extending.html"
-                        title="next chapter">Extending pysmb For Other Frameworks</a></p>
+  <p class="topless"><a href="smb_security_descriptors.html"
+                        title="next chapter">Security Descriptors</a></p>
   <div role="note" aria-label="source link">
     <h3>This Page</h3>
     <ul class="this-page-menu">
@@ -81,24 +84,6 @@
             
   <div class="section" id="smb-exceptions">
 <h1>SMB Exceptions<a class="headerlink" href="#smb-exceptions" title="Permalink to this headline">¶</a></h1>
-<dl class="class">
-<dt id="smb.base.SMBTimeout">
-<em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">SMBTimeout</code><a class="reference internal" href="../_modules/smb/base.html#SMBTimeout"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.SMBTimeout" title="Permalink to this definition">¶</a></dt>
-<dd><p>Raised when a timeout has occurred while waiting for a response or for a SMB/CIFS operation to complete.</p>
-</dd></dl>
-
-<dl class="class">
-<dt id="smb.base.NotReadyError">
-<em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">NotReadyError</code><a class="reference internal" href="../_modules/smb/base.html#NotReadyError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.NotReadyError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Raised when SMB connection is not ready (i.e. not authenticated or authentication failed)</p>
-</dd></dl>
-
-<dl class="class">
-<dt id="smb.base.NotConnectedError">
-<em class="property">class </em><code class="descclassname">smb.base.</code><code class="descname">NotConnectedError</code><a class="reference internal" href="../_modules/smb/base.html#NotConnectedError"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.base.NotConnectedError" title="Permalink to this definition">¶</a></dt>
-<dd><p>Raised when underlying SMB connection has been disconnected or not connected yet</p>
-</dd></dl>
-
 <dl class="class">
 <dt id="smb.smb_structs.UnsupportedFeature">
 <em class="property">class </em><code class="descclassname">smb.smb_structs.</code><code class="descname">UnsupportedFeature</code><a class="reference internal" href="../_modules/smb/smb_structs.html#UnsupportedFeature"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.smb_structs.UnsupportedFeature" title="Permalink to this definition">¶</a></dt>
@@ -131,16 +116,19 @@ currently supported by pysmb</p>
           <a href="../genindex.html" title="General Index"
              >index</a></li>
         <li class="right" >
-          <a href="../extending.html" title="Extending pysmb For Other Frameworks"
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="smb_security_descriptors.html" title="Security Descriptors"
              >next</a> |</li>
         <li class="right" >
           <a href="smb_SharedFile.html" title="SharedFile Class"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/api/smb_security_descriptors.html b/docs/html/api/smb_security_descriptors.html
new file mode 100644
index 00000000..0d583d53
--- /dev/null
+++ b/docs/html/api/smb_security_descriptors.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Security Descriptors &mdash; pysmb 1.1.25 documentation</title>
+    
+    <link rel="stylesheet" href="../_static/sphinxdoc.css" type="text/css" />
+    <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    '../',
+        VERSION:     '1.1.25',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="../_static/jquery.js"></script>
+    <script type="text/javascript" src="../_static/underscore.js"></script>
+    <script type="text/javascript" src="../_static/doctools.js"></script>
+    <link rel="top" title="pysmb 1.1.25 documentation" href="../index.html" />
+    <link rel="next" title="Extending pysmb For Other Frameworks" href="../extending.html" />
+    <link rel="prev" title="SMB Exceptions" href="smb_exceptions.html" /> 
+  </head>
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="../extending.html" title="Extending pysmb For Other Frameworks"
+             accesskey="N">next</a> |</li>
+        <li class="right" >
+          <a href="smb_exceptions.html" title="SMB Exceptions"
+             accesskey="P">previous</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper">
+  <h4>Previous topic</h4>
+  <p class="topless"><a href="smb_exceptions.html"
+                        title="previous chapter">SMB Exceptions</a></p>
+  <h4>Next topic</h4>
+  <p class="topless"><a href="../extending.html"
+                        title="next chapter">Extending pysmb For Other Frameworks</a></p>
+  <div role="note" aria-label="source link">
+    <h3>This Page</h3>
+    <ul class="this-page-menu">
+      <li><a href="../_sources/api/smb_security_descriptors.txt"
+            rel="nofollow">Show Source</a></li>
+    </ul>
+   </div>
+<div id="searchbox" style="display: none" role="search">
+  <h3>Quick search</h3>
+    <form class="search" action="../search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+  <div class="section" id="module-smb.security_descriptors">
+<span id="security-descriptors"></span><h1>Security Descriptors<a class="headerlink" href="#module-smb.security_descriptors" title="Permalink to this headline">¶</a></h1>
+<p>This module implements security descriptors, and associated data
+structures, as specified in <a class="reference external" href="https://msdn.microsoft.com/en-us/library/cc230273.aspx">[MS-DTYP]</a>.</p>
+<dl class="class">
+<dt id="smb.security_descriptors.SID">
+<em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">SID</code><span class="sig-paren">(</span><em>revision</em>, <em>identifier_authority</em>, <em>subauthorities</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#SID"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.SID" title="Permalink to this definition">¶</a></dt>
+<dd><p>A Windows security identifier. Represents a single principal, such a
+user or a group, as a sequence of numbers consisting of the revision,
+identifier authority, and a variable-length list of subauthorities.</p>
+<p>See [MS-DTYP]: 2.4.2</p>
+<dl class="attribute">
+<dt id="smb.security_descriptors.SID.identifier_authority">
+<code class="descname">identifier_authority</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.identifier_authority" title="Permalink to this definition">¶</a></dt>
+<dd><p>An integer representing the identifier authority.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SID.revision">
+<code class="descname">revision</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.revision" title="Permalink to this definition">¶</a></dt>
+<dd><p>Revision, should always be 1.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SID.subauthorities">
+<code class="descname">subauthorities</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SID.subauthorities" title="Permalink to this definition">¶</a></dt>
+<dd><p>A list of integers representing all subauthorities.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="smb.security_descriptors.ACE">
+<em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">ACE</code><span class="sig-paren">(</span><em>type_</em>, <em>flags</em>, <em>mask</em>, <em>sid</em>, <em>additional_data</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#ACE"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.ACE" title="Permalink to this definition">¶</a></dt>
+<dd><p>Represents a single access control entry.</p>
+<p>See [MS-DTYP]: 2.4.4</p>
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.additional_data">
+<code class="descname">additional_data</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.additional_data" title="Permalink to this definition">¶</a></dt>
+<dd><p>A dictionary of additional fields present in the ACE, depending
+on the type. The following fields can be present:</p>
+<ul class="simple">
+<li><code class="docutils literal"><span class="pre">flags</span></code></li>
+<li><code class="docutils literal"><span class="pre">object_type</span></code></li>
+<li><code class="docutils literal"><span class="pre">inherited_object_type</span></code></li>
+<li><code class="docutils literal"><span class="pre">application_data</span></code></li>
+<li><code class="docutils literal"><span class="pre">attribute_data</span></code></li>
+</ul>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.flags">
+<code class="descname">flags</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.flags" title="Permalink to this definition">¶</a></dt>
+<dd><p>An integer bitmask with ACE flags, corresponds to the
+<code class="docutils literal"><span class="pre">AceFlags</span></code> field.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.isInheritOnly">
+<code class="descname">isInheritOnly</code><a class="headerlink" href="#smb.security_descriptors.ACE.isInheritOnly" title="Permalink to this definition">¶</a></dt>
+<dd><p>Convenience property which indicates if this ACE is inherit
+only, meaning that it doesn&#8217;t apply to the object itself.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.mask">
+<code class="descname">mask</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.mask" title="Permalink to this definition">¶</a></dt>
+<dd><p>An integer representing the <code class="docutils literal"><span class="pre">ACCESS_MASK</span></code> as specified in
+[MS-DTYP] 2.4.3.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.sid">
+<code class="descname">sid</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.sid" title="Permalink to this definition">¶</a></dt>
+<dd><p>The <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> of a trustee.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACE.type">
+<code class="descname">type</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACE.type" title="Permalink to this definition">¶</a></dt>
+<dd><p>An integer representing the type of the ACE. One of the
+<code class="docutils literal"><span class="pre">ACE_TYPE_*</span></code> constants. Corresponds to the <code class="docutils literal"><span class="pre">AceType</span></code> field
+from [MS-DTYP] 2.4.4.1.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="smb.security_descriptors.ACL">
+<em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">ACL</code><span class="sig-paren">(</span><em>revision</em>, <em>aces</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#ACL"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.ACL" title="Permalink to this definition">¶</a></dt>
+<dd><p>Access control list, encapsulating a sequence of access control
+entries.</p>
+<p>See [MS-DTYP]: 2.4.5</p>
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACL.aces">
+<code class="descname">aces</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACL.aces" title="Permalink to this definition">¶</a></dt>
+<dd><p>List of <a class="reference internal" href="#smb.security_descriptors.ACE" title="smb.security_descriptors.ACE"><code class="xref py py-class docutils literal"><span class="pre">ACE</span></code></a> instances.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.ACL.revision">
+<code class="descname">revision</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.ACL.revision" title="Permalink to this definition">¶</a></dt>
+<dd><p>Integer value of the revision.</p>
+</dd></dl>
+
+</dd></dl>
+
+<dl class="class">
+<dt id="smb.security_descriptors.SecurityDescriptor">
+<em class="property">class </em><code class="descclassname">smb.security_descriptors.</code><code class="descname">SecurityDescriptor</code><span class="sig-paren">(</span><em>flags</em>, <em>owner</em>, <em>group</em>, <em>dacl</em>, <em>sacl</em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/smb/security_descriptors.html#SecurityDescriptor"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor" title="Permalink to this definition">¶</a></dt>
+<dd><p>Represents a security descriptor.</p>
+<p>See [MS-DTYP]: 2.4.6</p>
+<dl class="attribute">
+<dt id="smb.security_descriptors.SecurityDescriptor.dacl">
+<code class="descname">dacl</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.dacl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.ACL" title="smb.security_descriptors.ACL"><code class="xref py py-class docutils literal"><span class="pre">ACL</span></code></a> representing the discretionary access
+control list, which specifies access restrictions of an object.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SecurityDescriptor.flags">
+<code class="descname">flags</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.flags" title="Permalink to this definition">¶</a></dt>
+<dd><p>Integer bitmask of control flags. Corresponds to the
+<code class="docutils literal"><span class="pre">Control</span></code> field in [MS-DTYP] 2.4.6.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SecurityDescriptor.group">
+<code class="descname">group</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.group" title="Permalink to this definition">¶</a></dt>
+<dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> representing the owner group.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SecurityDescriptor.owner">
+<code class="descname">owner</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.owner" title="Permalink to this definition">¶</a></dt>
+<dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.SID" title="smb.security_descriptors.SID"><code class="xref py py-class docutils literal"><span class="pre">SID</span></code></a> representing the owner user.</p>
+</dd></dl>
+
+<dl class="attribute">
+<dt id="smb.security_descriptors.SecurityDescriptor.sacl">
+<code class="descname">sacl</code><em class="property"> = None</em><a class="headerlink" href="#smb.security_descriptors.SecurityDescriptor.sacl" title="Permalink to this definition">¶</a></dt>
+<dd><p>Instance of <a class="reference internal" href="#smb.security_descriptors.ACL" title="smb.security_descriptors.ACL"><code class="xref py py-class docutils literal"><span class="pre">ACL</span></code></a> representing the system access control
+list, which specifies audit logging of an object.</p>
+</dd></dl>
+
+</dd></dl>
+
+</div>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="../genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="../py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="../extending.html" title="Extending pysmb For Other Frameworks"
+             >next</a> |</li>
+        <li class="right" >
+          <a href="smb_exceptions.html" title="SMB Exceptions"
+             >previous</a> |</li>
+        <li class="nav-item nav-item-0"><a href="../index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer" role="contentinfo">
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/html/extending.html b/docs/html/extending.html
index 14881f4d..b7903bd3 100644
--- a/docs/html/extending.html
+++ b/docs/html/extending.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.18 documentation</title>
+    <title>Extending pysmb For Other Frameworks &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,8 +23,8 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
-    <link rel="prev" title="SMB Exceptions" href="api/smb_exceptions.html" /> 
+    <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
+    <link rel="prev" title="Security Descriptors" href="api/smb_security_descriptors.html" /> 
   </head>
   <body role="document">
     <div class="related" role="navigation" aria-label="related navigation">
@@ -34,16 +34,19 @@
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
         <li class="right" >
-          <a href="api/smb_exceptions.html" title="SMB Exceptions"
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="api/smb_security_descriptors.html" title="Security Descriptors"
              accesskey="P">previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
         <div class="sphinxsidebarwrapper">
   <h4>Previous topic</h4>
-  <p class="topless"><a href="api/smb_exceptions.html"
-                        title="previous chapter">SMB Exceptions</a></p>
+  <p class="topless"><a href="api/smb_security_descriptors.html"
+                        title="previous chapter">Security Descriptors</a></p>
   <div role="note" aria-label="source link">
     <h3>This Page</h3>
     <ul class="this-page-menu">
@@ -111,13 +114,16 @@ The <em>feedData</em> method has its own internal buffer, so it can accept incom
           <a href="genindex.html" title="General Index"
              >index</a></li>
         <li class="right" >
-          <a href="api/smb_exceptions.html" title="SMB Exceptions"
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="right" >
+          <a href="api/smb_security_descriptors.html" title="Security Descriptors"
              >previous</a> |</li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/genindex.html b/docs/html/genindex.html
index 1e2852b4..585930f6 100644
--- a/docs/html/genindex.html
+++ b/docs/html/genindex.html
@@ -7,7 +7,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Index &mdash; pysmb 1.1.18 documentation</title>
+    <title>Index &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -15,7 +15,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -24,7 +24,7 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" /> 
+    <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" /> 
   </head>
   <body role="document">
     <div class="related" role="navigation" aria-label="related navigation">
@@ -33,7 +33,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -70,11 +73,10 @@
  | <a href="#A"><strong>A</strong></a>
  | <a href="#C"><strong>C</strong></a>
  | <a href="#D"><strong>D</strong></a>
- | <a href="#E"><strong>E</strong></a>
  | <a href="#F"><strong>F</strong></a>
  | <a href="#G"><strong>G</strong></a>
  | <a href="#I"><strong>I</strong></a>
- | <a href="#L"><strong>L</strong></a>
+ | <a href="#M"><strong>M</strong></a>
  | <a href="#N"><strong>N</strong></a>
  | <a href="#O"><strong>O</strong></a>
  | <a href="#P"><strong>P</strong></a>
@@ -97,14 +99,6 @@
   <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol.__init__">(nmb.NetBIOSProtocol.NBNSProtocol method)</a>
   </dt>
 
-        
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.__init__">(smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.__init__">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
       </dl></dd>
   </dl></td>
 </tr></table>
@@ -113,97 +107,43 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.alloc_size">alloc_size (smb.base.SharedFile attribute)</a>
-  </dt>
-
-  </dl></td>
-</tr></table>
-
-<h2 id="C">C</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.close">close() (nmb.NetBIOS.NetBIOS method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.close">(smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      </dl></dd>
-      
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.closeConnection">closeConnection() (smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE">ACE (class in smb.security_descriptors)</a>
   </dt>
 
       
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.comments">comments (smb.base.SharedDevice attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL.aces">aces (smb.security_descriptors.ACL attribute)</a>
   </dt>
 
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.connect">connect() (smb.SMBConnection.SMBConnection method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL">ACL (class in smb.security_descriptors)</a>
   </dt>
 
       
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.create_time">create_time (smb.base.SharedFile attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.additional_data">additional_data (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.createDirectory">createDirectory() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.createDirectory">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
   </dl></td>
 </tr></table>
 
-<h2 id="D">D</h2>
+<h2 id="C">C</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteDirectory">deleteDirectory() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteDirectory">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
-  </dl></td>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.deleteFiles">deleteFiles() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.deleteFiles">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/nmb_NetBIOS.html#nmb.NetBIOS.NetBIOS.close">close() (nmb.NetBIOS.NetBIOS method)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
 </tr></table>
 
-<h2 id="E">E</h2>
+<h2 id="D">D</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.echo">echo() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.echo">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.dacl">dacl (smb.security_descriptors.SecurityDescriptor attribute)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
 </tr></table>
 
@@ -211,19 +151,15 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.file_attributes">file_attributes (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.file_size">file_size (smb.base.SharedFile attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.flags">flags (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
-  </dl></td>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.filename">filename (smb.base.SharedFile attribute)</a>
+      <dd><dl>
+        
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.flags">(smb.security_descriptors.SecurityDescriptor attribute)</a>
   </dt>
 
+      </dl></dd>
   </dl></td>
 </tr></table>
 
@@ -231,15 +167,9 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.getAttributes">getAttributes() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.getAttributes">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.group">group (smb.security_descriptors.SecurityDescriptor attribute)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
 </tr></table>
 
@@ -247,91 +177,25 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.instance">instance (smb.SMBProtocol.SMBProtocolFactory attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isDirectory">isDirectory (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.isReadOnly">isReadOnly (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isReady">isReady (smb.SMBProtocol.SMBProtocolFactory attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.identifier_authority">identifier_authority (smb.security_descriptors.SID attribute)</a>
   </dt>
 
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.isSpecial">isSpecial (smb.base.SharedDevice attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.isTemporary">isTemporary (smb.base.SharedDevice attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.isUsingSMB2">isUsingSMB2 (smb.SMBConnection.SMBConnection attribute)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.isUsingSMB2">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.isInheritOnly">isInheritOnly (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
 </tr></table>
 
-<h2 id="L">L</h2>
+<h2 id="M">M</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_access_time">last_access_time (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_attr_change_time">last_attr_change_time (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.last_write_time">last_write_time (smb.base.SharedFile attribute)</a>
-  </dt>
-
-  </dl></td>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listPath">listPath() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listPath">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listShares">listShares() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listShares">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.listSnapshots">listSnapshots() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.listSnapshots">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.mask">mask (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
 </tr></table>
 
@@ -339,10 +203,6 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.name">name (smb.base.SharedDevice attribute)</a>
-  </dt>
-
-      
   <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NBNSProtocol">NBNSProtocol (class in nmb.NetBIOSProtocol)</a>
   </dt>
 
@@ -356,14 +216,6 @@
   <dt><a href="api/nmb_NBNSProtocol.html#nmb.NetBIOSProtocol.NetBIOSTimeout">NetBIOSTimeout (class in nmb.NetBIOSProtocol)</a>
   </dt>
 
-      
-  <dt><a href="api/smb_exceptions.html#smb.base.NotConnectedError">NotConnectedError (class in smb.base)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_exceptions.html#smb.base.NotReadyError">NotReadyError (class in smb.base)</a>
-  </dt>
-
   </dl></td>
 </tr></table>
 
@@ -371,17 +223,13 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthFailed">onAuthFailed() (smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.onAuthOK">onAuthOK() (smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_exceptions.html#smb.smb_structs.OperationFailure">OperationFailure (class in smb.smb_structs)</a>
   </dt>
 
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_exceptions.html#smb.smb_structs.OperationFailure">OperationFailure (class in smb.smb_structs)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.owner">owner (smb.security_descriptors.SecurityDescriptor attribute)</a>
   </dt>
 
   </dl></td>
@@ -429,38 +277,12 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.rename">rename() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.rename">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.resetFileAttributes">resetFileAttributes() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-  </dl></td>
-  <td style="width: 33%" valign="top"><dl>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFile">retrieveFile() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFile">(smb.SMBProtocol.SMBProtocolFactory method)</a>
-  </dt>
-
-      </dl></dd>
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.retrieveFileFromOffset">retrieveFileFromOffset() (smb.SMBConnection.SMBConnection method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACL.revision">revision (smb.security_descriptors.ACL attribute)</a>
   </dt>
 
       <dd><dl>
         
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.retrieveFileFromOffset">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.revision">(smb.security_descriptors.SID attribute)</a>
   </dt>
 
       </dl></dd>
@@ -471,73 +293,29 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice">SharedDevice (class in smb.base)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile">SharedFile (class in smb.base)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SharedFile.html#smb.base.SharedFile.short_name">short_name (smb.base.SharedFile attribute)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_NEVER">SIGN_NEVER (smb.SMBConnection.SMBConnection attribute)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_NEVER">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor.sacl">sacl (smb.security_descriptors.SecurityDescriptor attribute)</a>
   </dt>
 
-      </dl></dd>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_WHEN_REQUIRED">SIGN_WHEN_REQUIRED (smb.SMBConnection.SMBConnection attribute)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_REQUIRED">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SecurityDescriptor">SecurityDescriptor (class in smb.security_descriptors)</a>
   </dt>
 
-      </dl></dd>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.SIGN_WHEN_SUPPORTED">SIGN_WHEN_SUPPORTED (smb.SMBConnection.SMBConnection attribute)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.SIGN_WHEN_SUPPORTED">(smb.SMBProtocol.SMBProtocolFactory attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID">SID (class in smb.security_descriptors)</a>
   </dt>
 
-      </dl></dd>
   </dl></td>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection">SMBConnection (class in smb.SMBConnection)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory">SMBProtocolFactory (class in smb.SMBProtocol)</a>
-  </dt>
-
-      
-  <dt><a href="api/smb_exceptions.html#smb.base.SMBTimeout">SMBTimeout (class in smb.base)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.sid">sid (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFile">storeFile() (smb.SMBConnection.SMBConnection method)</a>
-  </dt>
-
-      <dd><dl>
-        
-  <dt><a href="api/smb_SMBProtocolFactory.html#smb.SMBProtocol.SMBProtocolFactory.storeFile">(smb.SMBProtocol.SMBProtocolFactory method)</a>
+  <dt><a href="api/smb_security_descriptors.html#module-smb.security_descriptors">smb.security_descriptors (module)</a>
   </dt>
 
-      </dl></dd>
       
-  <dt><a href="api/smb_SMBConnection.html#smb.SMBConnection.SMBConnection.storeFileFromOffset">storeFileFromOffset() (smb.SMBConnection.SMBConnection method)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.SID.subauthorities">subauthorities (smb.security_descriptors.SID attribute)</a>
   </dt>
 
   </dl></td>
@@ -547,7 +325,7 @@
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%" valign="top"><dl>
       
-  <dt><a href="api/smb_SharedDevice.html#smb.base.SharedDevice.type">type (smb.base.SharedDevice attribute)</a>
+  <dt><a href="api/smb_security_descriptors.html#smb.security_descriptors.ACE.type">type (smb.security_descriptors.ACE attribute)</a>
   </dt>
 
   </dl></td>
@@ -576,11 +354,14 @@
         <li class="right" style="margin-right: 10px">
           <a href="#" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/index.html b/docs/html/index.html
index 614879b4..cf745496 100644
--- a/docs/html/index.html
+++ b/docs/html/index.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Welcome to pysmb’s documentation! &mdash; pysmb 1.1.18 documentation</title>
+    <title>Welcome to pysmb’s documentation! &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -23,7 +23,7 @@
     <script type="text/javascript" src="_static/jquery.js"></script>
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="#" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="#" />
     <link rel="next" title="NBNSProtocol Class" href="api/nmb_NBNSProtocol.html" /> 
   </head>
   <body role="document">
@@ -33,10 +33,13 @@
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
              accesskey="N">next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -187,6 +190,7 @@ Provides support for &#8220;<a class="reference external" href="smb://">smb://</
 <li class="toctree-l1"><a class="reference internal" href="api/smb_SharedDevice.html">SharedDevice Class</a></li>
 <li class="toctree-l1"><a class="reference internal" href="api/smb_SharedFile.html">SharedFile Class</a></li>
 <li class="toctree-l1"><a class="reference internal" href="api/smb_exceptions.html">SMB Exceptions</a></li>
+<li class="toctree-l1"><a class="reference internal" href="api/smb_security_descriptors.html">Security Descriptors</a></li>
 <li class="toctree-l1"><a class="reference internal" href="extending.html">Extending pysmb For Other Frameworks</a></li>
 </ul>
 </div>
@@ -208,14 +212,17 @@ Provides support for &#8220;<a class="reference external" href="smb://">smb://</
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
         <li class="right" >
           <a href="api/nmb_NBNSProtocol.html" title="NBNSProtocol Class"
              >next</a> |</li>
-        <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="nav-item nav-item-0"><a href="#">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/objects.inv b/docs/html/objects.inv
index 86b35385..50ddef60 100644
Binary files a/docs/html/objects.inv and b/docs/html/objects.inv differ
diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html
new file mode 100644
index 00000000..c5dbc0dd
--- /dev/null
+++ b/docs/html/py-modindex.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    
+    <title>Python Module Index &mdash; pysmb 1.1.25 documentation</title>
+    
+    <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
+    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
+    
+    <script type="text/javascript">
+      var DOCUMENTATION_OPTIONS = {
+        URL_ROOT:    './',
+        VERSION:     '1.1.25',
+        COLLAPSE_INDEX: false,
+        FILE_SUFFIX: '.html',
+        HAS_SOURCE:  true
+      };
+    </script>
+    <script type="text/javascript" src="_static/jquery.js"></script>
+    <script type="text/javascript" src="_static/underscore.js"></script>
+    <script type="text/javascript" src="_static/doctools.js"></script>
+    <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
+ 
+
+
+  </head>
+  <body role="document">
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             accesskey="I">index</a></li>
+        <li class="right" >
+          <a href="#" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+      <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
+        <div class="sphinxsidebarwrapper">
+<div id="searchbox" style="display: none" role="search">
+  <h3>Quick search</h3>
+    <form class="search" action="search.html" method="get">
+      <input type="text" name="q" />
+      <input type="submit" value="Go" />
+      <input type="hidden" name="check_keywords" value="yes" />
+      <input type="hidden" name="area" value="default" />
+    </form>
+    <p class="searchtip" style="font-size: 90%">
+    Enter search terms or a module, class or function name.
+    </p>
+</div>
+<script type="text/javascript">$('#searchbox').show(0);</script>
+        </div>
+      </div>
+
+    <div class="document">
+      <div class="documentwrapper">
+        <div class="bodywrapper">
+          <div class="body" role="main">
+            
+
+   <h1>Python Module Index</h1>
+
+   <div class="modindex-jumpbox">
+   <a href="#cap-s"><strong>s</strong></a>
+   </div>
+
+   <table class="indextable modindextable" cellspacing="0" cellpadding="2">
+     <tr class="pcap"><td></td><td>&nbsp;</td><td></td></tr>
+     <tr class="cap" id="cap-s"><td></td><td>
+       <strong>s</strong></td><td></td></tr>
+     <tr>
+       <td><img src="_static/minus.png" class="toggler"
+              id="toggle-1" style="display: none" alt="-" /></td>
+       <td>
+       <code class="xref">smb</code></td><td>
+       <em></em></td></tr>
+     <tr class="cg-1">
+       <td></td>
+       <td>&nbsp;&nbsp;&nbsp;
+       <a href="api/smb_security_descriptors.html#module-smb.security_descriptors"><code class="xref">smb.security_descriptors</code></a></td><td>
+       <em>Data structures used in Windows security descriptors.</em></td></tr>
+   </table>
+
+
+          </div>
+        </div>
+      </div>
+      <div class="clearer"></div>
+    </div>
+    <div class="related" role="navigation" aria-label="related navigation">
+      <h3>Navigation</h3>
+      <ul>
+        <li class="right" style="margin-right: 10px">
+          <a href="genindex.html" title="General Index"
+             >index</a></li>
+        <li class="right" >
+          <a href="#" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
+      </ul>
+    </div>
+    <div class="footer" role="contentinfo">
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
+      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
+    </div>
+  </body>
+</html>
\ No newline at end of file
diff --git a/docs/html/search.html b/docs/html/search.html
index 1e29df4e..f85a1c9b 100644
--- a/docs/html/search.html
+++ b/docs/html/search.html
@@ -6,7 +6,7 @@
   <head>
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
-    <title>Search &mdash; pysmb 1.1.18 documentation</title>
+    <title>Search &mdash; pysmb 1.1.25 documentation</title>
     
     <link rel="stylesheet" href="_static/sphinxdoc.css" type="text/css" />
     <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
@@ -14,7 +14,7 @@
     <script type="text/javascript">
       var DOCUMENTATION_OPTIONS = {
         URL_ROOT:    './',
-        VERSION:     '1.1.18',
+        VERSION:     '1.1.25',
         COLLAPSE_INDEX: false,
         FILE_SUFFIX: '.html',
         HAS_SOURCE:  true
@@ -24,7 +24,7 @@
     <script type="text/javascript" src="_static/underscore.js"></script>
     <script type="text/javascript" src="_static/doctools.js"></script>
     <script type="text/javascript" src="_static/searchtools.js"></script>
-    <link rel="top" title="pysmb 1.1.18 documentation" href="index.html" />
+    <link rel="top" title="pysmb 1.1.25 documentation" href="index.html" />
   <script type="text/javascript">
     jQuery(function() { Search.loadIndex("searchindex.js"); });
   </script>
@@ -40,7 +40,10 @@
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              accesskey="I">index</a></li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
       <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
@@ -88,11 +91,14 @@
         <li class="right" style="margin-right: 10px">
           <a href="genindex.html" title="General Index"
              >index</a></li>
-        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.18 documentation</a> &raquo;</li> 
+        <li class="right" >
+          <a href="py-modindex.html" title="Python Module Index"
+             >modules</a> |</li>
+        <li class="nav-item nav-item-0"><a href="index.html">pysmb 1.1.25 documentation</a> &raquo;</li> 
       </ul>
     </div>
     <div class="footer" role="contentinfo">
-        &copy; Copyright 2001-2015, Michael Teo http://miketeo.net/.
+        &copy; Copyright 2001-2018, Michael Teo http://miketeo.net/.
       Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.3.6.
     </div>
   </body>
diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js
index 0cbc511d..d364bb4b 100644
--- a/docs/html/searchindex.js
+++ b/docs/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({envversion:46,filenames:["api/nmb_NBNSProtocol","api/nmb_NetBIOS","api/smb_SMBConnection","api/smb_SMBHandler","api/smb_SMBProtocolFactory","api/smb_SharedDevice","api/smb_SharedFile","api/smb_exceptions","extending","index"],objects:{"nmb.NetBIOS":{NetBIOS:[1,0,1,""]},"nmb.NetBIOS.NetBIOS":{"__init__":[1,1,1,""],close:[1,1,1,""],queryIPForName:[1,1,1,""],queryName:[1,1,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[0,0,1,""],NetBIOSTimeout:[0,0,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{"__init__":[0,1,1,""],queryIPForName:[0,1,1,""],queryName:[0,1,1,""]},"smb.SMBConnection":{SMBConnection:[2,0,1,""]},"smb.SMBConnection.SMBConnection":{"__init__":[2,1,1,""],SIGN_NEVER:[2,2,1,""],SIGN_WHEN_REQUIRED:[2,2,1,""],SIGN_WHEN_SUPPORTED:[2,2,1,""],close:[2,1,1,""],connect:[2,1,1,""],createDirectory:[2,1,1,""],deleteDirectory:[2,1,1,""],deleteFiles:[2,1,1,""],echo:[2,1,1,""],getAttributes:[2,1,1,""],isUsingSMB2:[2,2,1,""],listPath:[2,1,1,""],listShares:[2,1,1,""],listSnapshots:[2,1,1,""],rename:[2,1,1,""],resetFileAttributes:[2,1,1,""],retrieveFile:[2,1,1,""],retrieveFileFromOffset:[2,1,1,""],storeFile:[2,1,1,""],storeFileFromOffset:[2,1,1,""]},"smb.SMBProtocol":{SMBProtocolFactory:[4,0,1,""]},"smb.SMBProtocol.SMBProtocolFactory":{"__init__":[4,1,1,""],SIGN_NEVER:[4,2,1,""],SIGN_WHEN_REQUIRED:[4,2,1,""],SIGN_WHEN_SUPPORTED:[4,2,1,""],closeConnection:[4,1,1,""],createDirectory:[4,1,1,""],deleteDirectory:[4,1,1,""],deleteFiles:[4,1,1,""],echo:[4,1,1,""],getAttributes:[4,1,1,""],instance:[4,2,1,""],isReady:[4,2,1,""],isUsingSMB2:[4,2,1,""],listPath:[4,1,1,""],listShares:[4,1,1,""],listSnapshots:[4,1,1,""],onAuthFailed:[4,1,1,""],onAuthOK:[4,1,1,""],rename:[4,1,1,""],retrieveFile:[4,1,1,""],retrieveFileFromOffset:[4,1,1,""],storeFile:[4,1,1,""]},"smb.base":{NotConnectedError:[7,0,1,""],NotReadyError:[7,0,1,""],SMBTimeout:[7,0,1,""],SharedDevice:[5,0,1,""],SharedFile:[6,0,1,""]},"smb.base.SharedDevice":{comments:[5,2,1,""],isSpecial:[5,2,1,""],isTemporary:[5,2,1,""],name:[5,2,1,""],type:[5,2,1,""]},"smb.base.SharedFile":{alloc_size:[6,2,1,""],create_time:[6,2,1,""],file_attributes:[6,2,1,""],file_size:[6,2,1,""],filename:[6,2,1,""],isDirectory:[6,2,1,""],isReadOnly:[6,2,1,""],last_access_time:[6,2,1,""],last_attr_change_time:[6,2,1,""],last_write_time:[6,2,1,""],short_name:[6,2,1,""]},"smb.smb_structs":{OperationFailure:[7,0,1,""],ProtocolError:[7,0,1,""],UnsupportedFeature:[7,0,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"3rd":9,"60kbyte":4,"\u5783\u573e\u6587\u4ef6":3,"\u6d4b\u8bd5\u6587\u4ef6\u5939":3,"__init__":[0,1,2,4,8],"abstract":9,"boolean":[0,1,2,4],"byte":[2,4,6],"case":4,"default":[2,4],"float":[0,1,4,6],"function":[0,1,2,4,9],"import":[2,3,4,9],"int":[2,4],"long":[2,4,6],"new":[1,2,4,8],"public":4,"return":[0,1,2,3,4,5,6,9],"short":6,"true":[0,1,2,4,5,6],"try":[2,4,8],"while":7,aaa:[0,1],about:[2,4,5,6],abov:8,accept:[4,8],access:[2,4,6],accur:4,acknowledg:4,across:[2,4],actual:2,add:[0,4],addcallback:[0,4],adderrback:4,address:[0,1,3,8,9],admin:5,administr:5,after:[0,1,2,4,9],again:0,against:9,algorithm:[2,4,8,9],all:[2,4,9],alloc:6,alloc_s:6,allow:[0,2,4],alon:9,alphanumer:[2,4],alreadi:2,also:[2,4,5],alwai:9,anderson:[0,1],ani:[1,2,4,6,9],appli:[2,4],applic:[0,1,4,6,9],appropri:[0,1],arbitari:[2,4],archiv:[2,4],arg:4,around:0,ascii:[2,4],asn:9,aspx:2,assert:2,asynchron:[0,2,8],attempt:2,attribut:[2,4,6],atttempt:2,auth:4,authent:[2,4,7,8,9],authenthent:4,auto:[2,4],automat:[0,1,2,4],avail:[2,4,9],avoid:4,back:[0,1,2,4],base:[2,4,5,6,7,8,9],batch:4,bbb:[0,1],been:[2,4,7,8,9],befor:[2,4],begin:[2,4],between:9,bind:[0,1],bit:[2,4,9],bitwis:[2,4],blob:9,block:[0,1,2,9],both:[2,4],briefli:8,broadcast:[0,1],buffer:8,build_open:3,busi:[2,4],call:[0,1,2,4,6,8],callback:[0,4,8],can:[0,1,2,3,4,5,8,9],cannot:[2,3,4],captur:[2,4],care:8,cc232110:2,ccc:[0,1],chang:6,charact:[2,3,4,6],choic:[2,4],choos:[2,4],cif:[1,2,4,6,7,8,9],clear:2,click:[2,4],client:[2,4,9],client_machine_nam:[2,4],close:[1,2,3,4],closeconnect:4,code:3,com:2,come:9,comm_devic:5,command:[2,4],comment:5,commerci:9,commun:[2,4,5,9],compat:[2,4],complet:[2,4,7,9],compon:[2,3,4],comput:[2,4],concurr:[2,4],configur:[2,4],conflict:9,conn:2,connect:[2,4,7,8],connecttcp:4,constant:[5,9],constructor:8,contain:[1,2,4,5,6,9],content:[2,4],continu:[2,4],contribut:[0,1],control:[2,4],conveni:[2,4,6],copi:[2,4,9],correspond:6,could:[6,9],cover:9,creat:[0,1,2,3,4,8],create_tim:6,createdirectori:[2,4],creation:[5,6],credenti:[2,4],credienti:4,current:[2,7],dat:3,data:[2,3,4,8,9],data_buf:7,datetim:[2,4],ddd:[0,1],decod:9,def:4,defer:[0,4],defin:[0,1],delet:[2,3,4],deletedirectori:[2,4],deletefil:[2,4],depend:9,describ:[2,8],descript:5,detail:[6,8,9],detect:[2,4],determin:[0,1,2,4,9],develop:[2,6,9],devic:[5,6],dialect:9,differ:[2,4,8,9],digest:9,direct:[2,4],directli:[4,6],director:3,directori:[2,3,4,6],disabl:[2,4],disconnect:[2,4,7],discret:9,disk_tre:5,dixon:9,dmitri:9,doe:[2,4,6,9],domain:[2,4,9],done:[0,1],dot:[0,1],download:[4,9],due:8,each:[1,2,4,5,6],earliest:4,echo:[2,4],edit:[2,4],either:[2,4],element:[2,4],els:[2,4],empti:[0,1,2,3,4,6],enabl:[2,4],encod:9,encount:[2,6],encrypt:9,end:[2,4],english:[2,4],enterpris:[2,4],entir:4,entri:6,eof:[2,4],errback:[0,4],error:[2,4,8],establish:[2,4],etc:4,excee:4,except:[0,4],exercis:9,exist:[2,3,4],expos:4,facilit:9,factori:4,fail:[2,4,7,8],failur:0,fallback:[2,4],fals:[0,1,2,4],familiar:9,featur:[2,4,7],feeddata:8,fh2:3,file:[2,3,4,5,6,8,9],file_attribut:[2,4,6],file_attribute_norm:2,file_fh:3,file_obj:[2,4],file_s:[4,6],filenam:[2,4,6],fileretriev:4,files:2,filter:[2,4],find:[2,4,8],first:[2,3,4],flag:[0,1,2,4],folder:[2,3,4,6,9],follow:[2,3,4,5,9],forth:5,framework:[0,4],free:[0,1,9],freeli:[2,4],from:[0,1,2,3,4,8,9],functionl:4,further:2,gener:8,getattribut:[2,4],gmt:[2,4],googl:9,guess:[2,4],handl:[4,8],hash:9,have:[0,2,8,9],held:2,help:2,henc:[2,4,9],hidden:[2,4],hope:[0,1],host:[2,3,4],hostnam:3,http:2,iana:[0,1],identifi:[2,4],idl:2,illustr:[2,3,4],immedi:[2,4],implement:[0,1,2,4,8,9],impos:[2,4],includ:[8,9],incom:0,incomplet:8,index:9,indic:[0,1,2,4],individu:4,inform:[2,4,5,6],initi:[5,8],insid:[2,4],instal:[2,4,9],instanc:[0,1,2,4,6],instanti:[0,1,4,6],instiant:[0,1],integ:[0,1,2,4,6,9],integr:[5,9],interest:[2,4],intern:[4,8,9],internet:[0,4],interprocess:5,interv:4,invok:[2,4],involv:8,ipc:5,ipv4:1,is_direct_tcp:[2,4],isdirectori:6,isreadi:4,isreadonli:6,isspeci:5,istemporari:5,isusingsmb2:[2,4],itself:[4,9],jason:[0,1],just:[0,4],keep:2,keepal:2,know:[0,1,4],known:[2,4],kwarg:4,last:6,last_access_tim:6,last_attr_change_tim:6,last_write_tim:6,latest:9,learn:[2,4],least:2,leav:[0,1,2,4],length:6,lgpl:9,librari:[2,9],like:[2,3,4],limit:[2,4,6],linux:9,list:[0,1,2,4,9],listen:[0,1],listen_port:[0,1],listenudp:0,listpath:[2,4,6],listshar:[2,4],listsnapshot:[2,4],local:[2,4],local_fil:3,look:9,loop:8,loseconnect:4,machin:[0,1,2,3,4,9],made:[2,4,9],mai:[2,4],main:9,match:[0,1,2,4],max_length:[2,4],maximum:[2,4],md4:9,mean:4,meant:2,mechan:[2,4],messag:[2,4,7,9],method:[0,1,2,3,4,6,8],microsoft:[2,9],might:[2,4],miketeo:9,mit:9,mode:[0,1],modif:6,modifi:9,modul:[2,4,9],more:[2,4,6,8,9],most:[2,4,8,9],msdn:2,multipl:[2,4],must:[0,2,4],my_nam:[2,4],mypassword:3,myuserid:3,name:[0,1,2,3,4,5,6,9],namedtemporaryfil:[2,4],nbn:[1,9],need:[2,3,4,6,8,9],neg:[2,4],net:9,netbio:0,netbiosprotocol:[0,9],netbiossess:9,netbiostimeout:0,network:[0,1,2,4,9],never:[2,4],new_path:[2,4],newer:[2,4],next:2,nmb:[0,1,9],non:[2,4],none:[0,1,2,4,5,6,7],notat:[0,1,6],notconnectederror:[4,7],note:2,notreadyerror:[4,7],now:8,ntlm:[4,8,9],ntlmssp:9,ntlmv1:[2,4,9],ntlmv2:[2,4,9],number:[0,1,2,4,6],obj:[2,4],object:[2,3,4],occur:[2,4,7],offset:[2,4],often:8,old:[2,4],old_path:[2,4],onauthfail:[4,8],onauthok:[4,8],onc:[4,8],onli:[2,3,4,6,9],onnmbsessionfail:8,open:[2,3,4,9],opensourc:9,oper:[1,2,4,7,8,9],operationfailur:[2,4,7],opportun:4,organ:9,origin:[2,4,6],other:[2,4],otherwis:[2,4],out:[2,4],over:[2,4,9],overrid:[4,8],overwritten:[2,4],own:[4,8,9],packag:3,packet:[0,1,4,8],page:[8,9],paramet:[0,1,2,3,4,8,9],parent:3,pars:9,part:8,parti:9,pass:[2,3,4],password:[2,4],path:[2,3,4],path_file_pattern:[2,4],pathnam:[2,4],pattern:[2,4],perform:[0,1,2,4,8],period:4,persist:5,place:9,pleas:9,point:3,port:[0,1,2,4],posit:[2,4],possibl:9,post:[4,8],precis:4,present:7,print:[4,9],print_queu:5,proce:4,proceed:[2,4],process:[3,8],prohibit:6,project:[0,4,9],promis:9,properti:[2,4,6],protocol:[2,4,7,9],protocolerror:7,provid:[0,1,2,3,4,8,9],pure:9,purpos:9,pyasn1:9,pyde:9,pymsb:4,pysmb:[0,2,4,7],python:[2,3,4,9],queri:[0,1,2,4,9],queryipfornam:[0,1],querynam:[0,1],queue:4,rais:[0,2,3,4,7],reactor:[0,4],read:[2,3,4,6,8,9],readi:[4,7],receiv:[0,1,2,4],refer:[2,4,5,9],referenc:9,regardless:[2,4],regular:[2,4],reject:[2,4],rel:[2,4],relat:9,releas:[1,2],remot:[1,2,4,5,6,8],remote_nam:[2,4,8],remov:0,renam:[2,4],repli:[0,1,2,4],report:8,request:[2,4],requir:[2,4,7],reserv:5,reset:2,resetfileattribut:2,resourc:[1,2,4,6],respond:2,respons:7,result:[0,2,4],retri:4,retriev:[2,3,4],retrievefil:[2,4],retrievefilefactori:4,retrievefilefromoffset:[2,4],reus:4,rfc1001:[2,3,4],right:[2,4],routin:9,rozmanov:9,safe:[2,4],samba:9,sambda:[2,4],same:[2,4],search:[2,4,9],sec:4,second:[0,1,4,6],section:9,secur:9,securityblob:9,see:[2,4,6],seek:[2,4],select:[0,1,2,4],self:[4,8],send:[0,1,2,4],separ:9,sequenti:2,seri:4,server:[2,4,5,6,8,9],server_ip:[2,4],server_nam:[2,4],servic:[1,2,4,8,9],service_nam:[2,4],session:[8,9],set:[2,4],setup:[0,1,4,8],sha256:9,sha:9,shadow:[2,4],share:[2,3,4,5,6,9],shareddevic:[2,4],sharedfil:[2,4],sharedfold:3,short_nam:6,should:[0,1,2,4,6],side:9,sign:[2,4],sign_nev:[2,4],sign_opt:[2,4],sign_when_requir:[2,4],sign_when_support:[2,4],simpl:[2,4],simpli:3,sinc:6,singl:[2,4,5],site:9,size:[4,6],smb1:[2,4,9],smb2_constant:9,smb2_struct:9,smb:[1,2,3,4,5,6],smb_constant:[2,4,9],smb_ext_file_attr:6,smb_file_attribute_xxx:[2,4],smb_messag:7,smb_struct:[2,4,7,9],smbprotocol:[4,6,9],smbtest:[2,4],smbtimeout:[4,7],snapshot:[2,4],snippet:3,sock_famili:2,socket:[1,2,8],softwar:9,some:[2,4,9],sort:2,sourc:[0,1,2,4,5,6,7,9],sp3:9,space:[2,4],special:5,specif:9,specifi:[0,1,2,4],standard:[0,1,9],start:[0,2,4],step:8,stoplisten:0,store:[2,4,6],storefil:[2,4],storefilefromoffset:2,string:[0,1,2,3,4,5,6],style:9,sub:[2,4],subclass:[4,8],subsequ:3,success:[2,8],successfulli:[2,4],suitabl:[2,9],support_smb2:[2,4],synchron:[8,9],system:[2,4],take:[8,9],target:[0,1],tcp:[2,4,8],technic:[2,8],tempfil:[2,4],temporari:5,term:9,termin:[2,4],test:9,than:[2,4],thei:9,therefor:2,thi:[0,1,2,4,5,6,8,9],thoma:9,those:4,thousand:4,through:4,time:[2,4,5,6,9],timeout:[0,1,2,4,7],todd:9,togeth:9,too:2,total:6,touch:[0,1,4],transfer:[4,9],translat:9,transmit:4,transport:[0,4,9],truncat:2,tupl:[2,4],twist:[0,4,9],txt:[2,3,4],type:5,u32:9,udp:[0,1],ultim:[2,4],under:9,underli:[1,2,4,7,9],unicod:[2,3,4,5,6],unless:[0,1],unlock:2,unsign:9,unsupportedfeatur:7,until:[1,2,4],upload:[2,3,4],upload_fil:3,url:[3,9],urlerror:3,urllib2:[3,9],use_ntlm_v2:[2,4,8],user:[2,4,5],userid:[2,4],usernam:[2,4],usual:[2,4,6,8,9],utc:[2,4],utf:3,util:[2,4],valid:3,valu:[2,4,6],variou:9,veri:2,version:9,via:[0,4,6,9],vista:[2,4,9],wait:[0,1,4,7],want:[4,9],web:9,well:9,what:[0,1,2,4,8],when:[0,1,2,4,7,8,9],where:[2,4,6,9],whether:[2,4],which:[0,1,2,4,6,8,9],whiteman:9,who:[2,4,9],whose:9,wider:[2,4],wildcard:[2,4],window:[2,3,4,6,9],wish:[1,2],within:[2,4,9],without:[0,9],workgroup:[2,4],wrap:0,write:[2,4,8],write_result:4,written:[2,4],wrong:8,yet:7,you:[0,1,2,3,4,6,8,9],your:[0,1,2,4,6,8,9],yourself:9,zero:[0,1,2,4],zone:[2,4]},titles:["NBNSProtocol Class","NetBIOS class","SMBConnection Class","SMbHandler Class","SMBProtocolFactory Class","SharedDevice Class","SharedFile Class","SMB Exceptions","Extending pysmb For Other Frameworks","Welcome to pysmb&#8217;s documentation!"],titleterms:{"class":[0,1,2,3,4,5,6],caveat:[2,4],content:9,credit:9,descript:9,document:9,exampl:[2,3,4],except:7,extend:8,framework:8,indic:9,licens:9,nbnsprotocol:0,netbio:1,note:3,other:8,packag:9,pysmb:[8,9],shareddevic:5,sharedfil:6,smb2:[2,4],smb:7,smbconnect:2,smbhandler:3,smbprotocolfactori:4,support:[2,4],tabl:9,welcom:9}})
\ No newline at end of file
+Search.setIndex({envversion:46,filenames:["api/nmb_NBNSProtocol","api/nmb_NetBIOS","api/smb_SMBConnection","api/smb_SMBHandler","api/smb_SMBProtocolFactory","api/smb_SharedDevice","api/smb_SharedFile","api/smb_exceptions","api/smb_security_descriptors","extending","index"],objects:{"nmb.NetBIOS":{NetBIOS:[1,0,1,""]},"nmb.NetBIOS.NetBIOS":{"__init__":[1,1,1,""],close:[1,1,1,""],queryIPForName:[1,1,1,""],queryName:[1,1,1,""]},"nmb.NetBIOSProtocol":{NBNSProtocol:[0,0,1,""],NetBIOSTimeout:[0,0,1,""]},"nmb.NetBIOSProtocol.NBNSProtocol":{"__init__":[0,1,1,""],queryIPForName:[0,1,1,""],queryName:[0,1,1,""]},"smb.security_descriptors":{ACE:[8,0,1,""],ACL:[8,0,1,""],SID:[8,0,1,""],SecurityDescriptor:[8,0,1,""]},"smb.security_descriptors.ACE":{additional_data:[8,3,1,""],flags:[8,3,1,""],isInheritOnly:[8,3,1,""],mask:[8,3,1,""],sid:[8,3,1,""],type:[8,3,1,""]},"smb.security_descriptors.ACL":{aces:[8,3,1,""],revision:[8,3,1,""]},"smb.security_descriptors.SID":{identifier_authority:[8,3,1,""],revision:[8,3,1,""],subauthorities:[8,3,1,""]},"smb.security_descriptors.SecurityDescriptor":{dacl:[8,3,1,""],flags:[8,3,1,""],group:[8,3,1,""],owner:[8,3,1,""],sacl:[8,3,1,""]},"smb.smb_structs":{OperationFailure:[7,0,1,""],ProtocolError:[7,0,1,""],UnsupportedFeature:[7,0,1,""]},smb:{security_descriptors:[8,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:attribute"},terms:{"3rd":10,"\u5783\u573e\u6587\u4ef6":3,"\u6d4b\u8bd5\u6587\u4ef6\u5939":3,"__init__":[0,1,4,9],"abstract":10,"boolean":[0,1],"case":4,"float":[0,1],"function":[0,1,4,10],"import":[2,3,4,10],"long":2,"new":[1,4,9],"public":4,"return":[0,1,2,3,4,10],"true":[0,1,2,4],"try":9,aaa:[0,1],abov:9,accept:[4,9],access:8,access_mask:8,accur:4,ace_type_:8,aceflag:8,acetyp:8,acl:8,add:[0,4],addcallback:[0,4],adderrback:4,addit:8,additional_data:8,address:[0,1,3,9,10],after:[0,1,2,4,10],again:0,against:10,algorithm:[9,10],all:[4,8,10],allow:0,alon:10,alwai:[8,10],anderson:[0,1],ani:[1,10],appli:8,applic:[0,1,4,10],application_data:8,appropri:[0,1],arbitari:[2,4],arg:4,around:0,ascii:[2,4],asn:10,assert:2,associ:8,asynchron:[0,2,9],attribute_data:8,audit:8,auth:4,authent:[4,9,10],authenthent:4,author:8,automat:[0,1,2,4],avail:10,avoid:4,back:[0,1,2,4],base:[9,10],batch:4,bbb:[0,1],been:[4,9,10],befor:[2,4],begin:[2,4],between:10,bind:[0,1],bit:10,bitmask:8,blob:10,block:[0,1,2,10],briefli:9,broadcast:[0,1],buffer:9,build_open:3,call:[0,1,4,9],callback:[0,9],can:[0,1,2,3,4,8,9,10],cannot:3,captur:[2,4],care:9,ccc:[0,1],charact:3,cif:[1,2,4,9,10],client:[2,4,10],client_machine_nam:[2,4],close:[1,2,3,4],closeconnect:4,code:3,come:10,commerci:10,commun:[2,4,10],complet:[2,4,10],compon:3,concurr:[2,4],conflict:10,conn:2,connect:[2,4,9],connecttcp:4,consist:8,constant:[8,10],constructor:9,contain:[1,10],content:[2,4],contribut:[0,1],control:8,conveni:8,copi:10,correspond:8,could:10,cover:10,creat:[0,1,2,3,4,9],current:7,dacl:8,dat:3,data:[3,8,9,10],data_buf:7,ddd:[0,1],decod:10,def:4,defer:[0,4],defin:[0,1],delet:3,depend:[8,10],describ:9,detail:[9,10],determin:[0,1,10],develop:[2,10],dialect:10,dictionari:8,differ:[9,10],digest:10,directli:4,director:3,directori:3,disabl:[2,4],disconnect:[2,4],discret:10,discretionari:8,dixon:10,dmitri:10,doe:10,doesn:8,domain:10,done:[0,1],dot:[0,1],download:10,dtyp:8,due:9,each:[1,2,4],els:[2,4],empti:[0,1,3],encapsul:8,encod:10,encount:2,encrypt:10,end:[2,4],entir:4,entri:8,errback:[0,4],error:[2,9],etc:4,except:[0,4],exercis:10,exist:3,expos:4,facilit:10,factori:4,fail:[2,4,9],failur:0,fallback:[2,4],fals:[0,1,2,4],familiar:10,featur:7,feeddata:9,fh2:3,field:8,file:[2,3,4,9,10],file_attribut:[2,4],file_fh:3,file_obj:[2,4],file_s:4,fileretriev:4,files:2,find:9,first:3,flag:[0,1,2,4,8],folder:[3,10],follow:[2,3,4,8,10],framework:[0,4],free:[0,1,10],from:[0,1,2,3,4,8,9,10],functionl:4,gener:9,googl:10,group:8,handl:[4,9],hash:10,have:[0,2,9,10],henc:10,hope:[0,1],host:3,hostnam:3,iana:[0,1],identifi:8,identifier_author:8,idl:2,illustr:[2,3,4],implement:[0,1,2,4,8,9,10],impos:[2,4],includ:[9,10],incom:0,incomplet:9,index:10,indic:[0,1,8],inherit:8,inherited_object_typ:8,initi:9,insid:[2,4],instal:10,instanc:[0,1,2,4,8],instanti:[0,1],instiant:[0,1],integ:[0,1,8,10],integr:10,interest:4,intern:[4,9,10],internet:[0,4],interv:4,invok:2,involv:9,ipv4:1,isinheritonli:8,itself:[8,10],jason:[0,1],just:[0,4],keep:2,keepal:2,know:[0,1,4],kwarg:4,latest:10,learn:4,leav:[0,1],length:8,lgpl:10,librari:10,like:3,limit:[2,4],linux:10,list:[0,1,8,10],listen:[0,1],listen_port:[0,1],listenudp:0,local_fil:3,log:8,look:10,loop:9,loseconnect:4,machin:[0,1,2,3,4,10],made:10,mai:[2,4],main:10,mask:8,match:[0,1,2,4],md4:10,mean:8,meant:2,mechan:[2,4],messag:[7,10],method:[0,1,2,3,4,9],microsoft:10,might:[2,4],miketeo:10,mit:10,mode:[0,1],modifi:10,modul:[2,4,8,10],more:[2,4,9,10],most:[2,4,9,10],must:[0,4],mypassword:3,myuserid:3,name:[0,1,2,3,4,10],namedtemporaryfil:[2,4],nbn:[1,10],need:[2,3,4,9,10],net:10,netbio:0,netbiosprotocol:[0,10],netbiossess:10,netbiostimeout:0,network:[0,1,10],nmb:[0,1,10],none:[0,1,7,8],notat:[0,1],notconnectederror:4,note:2,notreadyerror:4,now:9,ntlm:[9,10],ntlmssp:10,ntlmv1:10,ntlmv2:10,number:[0,1,4,8],obj:[2,4],object:[3,8],object_typ:8,often:9,onauthfail:[4,9],onauthok:[4,9],onc:[4,9],onli:[3,8,10],onnmbsessionfail:9,open:[3,10],opensourc:10,oper:[1,2,4,9,10],operationfailur:[4,7],organ:10,otherwis:[2,4],over:10,overrid:[4,9],own:[4,9,10],owner:8,packag:3,packet:[0,1,9],page:[9,10],paramet:[0,1,3,4,9,10],parent:3,pars:10,part:9,parti:10,pass:3,password:[2,4],path:[3,4],perform:[0,1,2,4,9],period:4,place:10,pleas:10,point:3,port:[0,1],posit:[2,4],possibl:10,post:[4,9],precis:4,present:[7,8],princip:8,print:[4,10],process:[3,9],project:[0,4,10],promis:10,properti:8,protocol:[2,4,7,10],protocolerror:7,provid:[0,1,3,4,9,10],pure:10,purpos:10,pyasn1:10,pyde:10,pymsb:4,pysmb:[0,2,4,7],python:[3,10],queri:[0,1,10],queryipfornam:[0,1],querynam:[0,1],queue:4,rais:[0,3,4,7],reactor:[0,4],read:[2,3,4,9,10],readi:4,receiv:[0,1],refer:10,referenc:10,reject:[2,4],relat:10,releas:1,remot:[1,2,4,9],remote_nam:9,remov:0,repli:[0,1],report:9,repres:8,requir:7,resourc:1,respond:2,restrict:8,result:[0,4],retriev:[2,3,4],retrievefil:[2,4],retrievefilefactori:4,reus:4,revis:8,rfc1001:[2,3,4],routin:10,rozmanov:10,sacl:8,samba:10,same:[2,4],search:10,sec:4,second:[0,1,4],section:10,security_descriptor:8,securityblob:10,securitydescriptor:8,see:8,seek:[2,4],select:[0,1],self:[4,9],send:[0,1],separ:10,sequenc:8,sequenti:2,server:[2,4,9,10],server_ip:[2,4],server_nam:[2,4],servic:[1,2,4,9,10],session:[9,10],set:[2,4],setup:[0,1,4,9],sha256:10,sha:10,share:[3,10],sharedfold:3,should:[0,1,2,4,8],sid:8,side:10,simpl:[2,4],simpli:3,singl:[2,8],site:10,smb1:[2,4,10],smb2_constant:10,smb2_struct:10,smb:[1,2,3,4],smb_constant:10,smb_messag:7,smb_struct:[2,4,7,10],smbprotocol:[4,10],smbtest:[2,4],smbtimeout:4,snippet:3,socket:[1,9],softwar:10,some:[2,4,10],sort:2,sourc:[0,1,7,8,10],sp3:10,specif:10,specifi:[0,1,4,8],standard:[0,1,10],start:[0,2,4],step:9,stoplisten:0,storefil:4,string:[0,1,2,3,4],structur:8,style:10,subauthor:8,subclass:[4,9],subsequ:3,success:9,suitabl:[2,10],support_smb2:[2,4],synchron:[9,10],system:8,take:[9,10],target:[0,1],tcp:9,technic:9,tempfil:[2,4],term:10,termin:4,test:10,than:[2,4],thei:10,thi:[0,1,4,8,9,10],thoma:10,those:4,thousand:4,through:4,time:[2,4,10],timeout:[0,1,2,4],todd:10,togeth:10,too:2,touch:[0,1,4],transfer:[4,10],translat:10,transport:[0,4,10],truste:8,twist:[0,4,10],txt:[2,3,4],type:8,type_:8,u32:10,udp:[0,1],under:10,underli:[1,4,10],unicod:3,unless:[0,1],unsign:10,unsupportedfeatur:7,until:1,upload:3,upload_fil:3,url:[3,10],urlerror:3,urllib2:[3,10],use_ntlm_v2:[2,4,9],user:8,userid:[2,4],usual:[4,9,10],utf:3,util:[2,4],valid:3,valu:8,variabl:8,variou:10,version:10,via:[0,4,10],vista:10,wait:[0,1,4],want:[4,10],web:10,well:10,what:[0,1,2,4,9],when:[0,1,2,4,7,9,10],where:[4,10],which:[0,1,8,9,10],whiteman:10,who:[2,4,10],whose:10,window:[3,8,10],wish:[1,2],within:[2,4,10],without:[0,10],wrap:0,write:9,write_result:4,wrong:9,you:[0,1,2,3,4,9,10],your:[0,1,4,9,10],yourself:10,zero:[0,1]},titles:["NBNSProtocol Class","NetBIOS class","SMBConnection Class","SMbHandler Class","SMBProtocolFactory Class","SharedDevice Class","SharedFile Class","SMB Exceptions","Security Descriptors","Extending pysmb For Other Frameworks","Welcome to pysmb&#8217;s documentation!"],titleterms:{"class":[0,1,2,3,4,5,6],caveat:[2,4],content:10,credit:10,descript:10,descriptor:8,document:10,exampl:[2,3,4],except:7,extend:9,framework:9,indic:10,licens:10,nbnsprotocol:0,netbio:1,note:3,other:9,packag:10,pysmb:[9,10],secur:8,shareddevic:5,sharedfil:6,smb2:[2,4],smb:7,smbconnect:2,smbhandler:3,smbprotocolfactori:4,support:[2,4],tabl:10,welcom:10}})
\ No newline at end of file
diff --git a/python2/nmb/base.py b/python2/nmb/base.py
index 4731dfe3..0bbef825 100644
--- a/python2/nmb/base.py
+++ b/python2/nmb/base.py
@@ -77,6 +77,9 @@ class NMBSession:
             self.onNMBSessionOK()
         elif packet.type == NEGATIVE_SESSION_RESPONSE:
             self.onNMBSessionFailed()
+        elif packet.type == SESSION_KEEPALIVE:
+            # Discard keepalive packets - [RFC1002]: 5.2.2.1
+            pass
         else:
             self.log.warning('Unrecognized NMB session type: 0x%02x', packet.type)
 
diff --git a/python2/pysmb.egg-info/PKG-INFO b/python2/pysmb.egg-info/PKG-INFO
new file mode 100644
index 00000000..9f8779df
--- /dev/null
+++ b/python2/pysmb.egg-info/PKG-INFO
@@ -0,0 +1,23 @@
+Metadata-Version: 1.1
+Name: pysmb
+Version: 1.1.26
+Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
+Home-page: https://miketeo.net/projects/pysmb
+Author: Michael Teo
+Author-email: miketeo@miketeo.net
+License: zlib/libpng
+Description: pysmb is an experimental SMB/CIFS library written in Python. It implements the client-side SMB/CIFS protocol which allows your Python application to access and transfer files to/from SMB/CIFS shared folders like your Windows file sharing and Samba folders.
+Keywords: windows samba cifs sharing ftp smb linux
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: Console
+Classifier: License :: OSI Approved :: zlib/libpng License
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Communications :: File Sharing
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Networking
diff --git a/python2/pysmb.egg-info/SOURCES.txt b/python2/pysmb.egg-info/SOURCES.txt
new file mode 100644
index 00000000..636e6d02
--- /dev/null
+++ b/python2/pysmb.egg-info/SOURCES.txt
@@ -0,0 +1,242 @@
+CHANGELOG
+LICENSE
+MANIFEST.in
+README.txt
+setup.py
+docs/doctrees/environment.pickle
+docs/doctrees/extending.doctree
+docs/doctrees/index.doctree
+docs/doctrees/api/nmb_NBNSProtocol.doctree
+docs/doctrees/api/nmb_NetBIOS.doctree
+docs/doctrees/api/smb_SMBConnection.doctree
+docs/doctrees/api/smb_SMBHandler.doctree
+docs/doctrees/api/smb_SMBProtocolFactory.doctree
+docs/doctrees/api/smb_SharedDevice.doctree
+docs/doctrees/api/smb_SharedFile.doctree
+docs/doctrees/api/smb_exceptions.doctree
+docs/doctrees/api/smb_security_descriptors.doctree
+docs/html/.buildinfo
+docs/html/extending.html
+docs/html/genindex.html
+docs/html/index.html
+docs/html/objects.inv
+docs/html/py-modindex.html
+docs/html/search.html
+docs/html/searchindex.js
+docs/html/_modules/index.html
+docs/html/_modules/nmb/NetBIOS.html
+docs/html/_modules/nmb/NetBIOSProtocol.html
+docs/html/_modules/smb/security_descriptors.html
+docs/html/_modules/smb/smb_structs.html
+docs/html/_sources/extending.txt
+docs/html/_sources/index.txt
+docs/html/_sources/api/nmb_NBNSProtocol.txt
+docs/html/_sources/api/nmb_NetBIOS.txt
+docs/html/_sources/api/smb_SMBConnection.txt
+docs/html/_sources/api/smb_SMBHandler.txt
+docs/html/_sources/api/smb_SMBProtocolFactory.txt
+docs/html/_sources/api/smb_SharedDevice.txt
+docs/html/_sources/api/smb_SharedFile.txt
+docs/html/_sources/api/smb_exceptions.txt
+docs/html/_sources/api/smb_security_descriptors.txt
+docs/html/_static/ajax-loader.gif
+docs/html/_static/basic.css
+docs/html/_static/comment-bright.png
+docs/html/_static/comment-close.png
+docs/html/_static/comment.png
+docs/html/_static/contents.png
+docs/html/_static/doctools.js
+docs/html/_static/down-pressed.png
+docs/html/_static/down.png
+docs/html/_static/file.png
+docs/html/_static/jquery.js
+docs/html/_static/minus.png
+docs/html/_static/navigation.png
+docs/html/_static/plus.png
+docs/html/_static/pygments.css
+docs/html/_static/searchtools.js
+docs/html/_static/sphinxdoc.css
+docs/html/_static/underscore.js
+docs/html/_static/up-pressed.png
+docs/html/_static/up.png
+docs/html/_static/websupport.js
+docs/html/api/nmb_NBNSProtocol.html
+docs/html/api/nmb_NetBIOS.html
+docs/html/api/smb_SMBConnection.html
+docs/html/api/smb_SMBHandler.html
+docs/html/api/smb_SMBProtocolFactory.html
+docs/html/api/smb_SharedDevice.html
+docs/html/api/smb_SharedFile.html
+docs/html/api/smb_exceptions.html
+docs/html/api/smb_security_descriptors.html
+python2/nmb/NetBIOS.py
+python2/nmb/NetBIOSProtocol.py
+python2/nmb/__init__.py
+python2/nmb/base.py
+python2/nmb/nmb_constants.py
+python2/nmb/nmb_structs.py
+python2/nmb/utils.py
+python2/pysmb.egg-info/PKG-INFO
+python2/pysmb.egg-info/SOURCES.txt
+python2/pysmb.egg-info/dependency_links.txt
+python2/pysmb.egg-info/requires.txt
+python2/pysmb.egg-info/top_level.txt
+python2/smb/SMBConnection.py
+python2/smb/SMBHandler.py
+python2/smb/SMBProtocol.py
+python2/smb/__init__.py
+python2/smb/base.py
+python2/smb/ntlm.py
+python2/smb/security_descriptors.py
+python2/smb/securityblob.py
+python2/smb/smb2_constants.py
+python2/smb/smb2_structs.py
+python2/smb/smb_constants.py
+python2/smb/smb_structs.py
+python2/smb/utils/README.txt
+python2/smb/utils/U32.py
+python2/smb/utils/__init__.py
+python2/smb/utils/md4.py
+python2/smb/utils/pyDes.py
+python2/smb/utils/sha256.py
+python2/tests/README_1st.txt
+python2/tests/__init__.py
+python2/tests/connection.ini
+python2/tests/test_ntlm.py
+python2/tests/test_security_descriptors.py
+python2/tests/test_securityblob.py
+python2/tests/DirectSMBConnectionTests/__init__.py
+python2/tests/DirectSMBConnectionTests/test_SMBHandler.py
+python2/tests/DirectSMBConnectionTests/test_auth.py
+python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+python2/tests/DirectSMBConnectionTests/test_echo.py
+python2/tests/DirectSMBConnectionTests/test_listpath.py
+python2/tests/DirectSMBConnectionTests/test_listshares.py
+python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
+python2/tests/DirectSMBConnectionTests/test_rename.py
+python2/tests/DirectSMBConnectionTests/test_retrievefile.py
+python2/tests/DirectSMBConnectionTests/test_storefile.py
+python2/tests/DirectSMBConnectionTests/util.py
+python2/tests/DirectSMBTwistedTests/test_auth.py
+python2/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
+python2/tests/DirectSMBTwistedTests/test_echo.py
+python2/tests/DirectSMBTwistedTests/test_listpath.py
+python2/tests/DirectSMBTwistedTests/test_listshares.py
+python2/tests/DirectSMBTwistedTests/test_listsnapshots.py
+python2/tests/DirectSMBTwistedTests/test_rename.py
+python2/tests/DirectSMBTwistedTests/test_retrievefile.py
+python2/tests/DirectSMBTwistedTests/test_storefile.py
+python2/tests/DirectSMBTwistedTests/util.py
+python2/tests/NetBIOSTests/__init__.py
+python2/tests/NetBIOSTests/test_queryname.py
+python2/tests/NetBIOSTwistedTests/__init__.py
+python2/tests/NetBIOSTwistedTests/test_queryname.py
+python2/tests/SMBConnectionTests/__init__.py
+python2/tests/SMBConnectionTests/test_SMBHandler.py
+python2/tests/SMBConnectionTests/test_auth.py
+python2/tests/SMBConnectionTests/test_createdeletedirectory.py
+python2/tests/SMBConnectionTests/test_deletepattern.py
+python2/tests/SMBConnectionTests/test_echo.py
+python2/tests/SMBConnectionTests/test_getattributes.py
+python2/tests/SMBConnectionTests/test_listpath.py
+python2/tests/SMBConnectionTests/test_listshares.py
+python2/tests/SMBConnectionTests/test_listsnapshots.py
+python2/tests/SMBConnectionTests/test_rename.py
+python2/tests/SMBConnectionTests/test_retrievefile.py
+python2/tests/SMBConnectionTests/test_security.py
+python2/tests/SMBConnectionTests/test_storefile.py
+python2/tests/SMBConnectionTests/test_with_context.py
+python2/tests/SMBConnectionTests/util.py
+python2/tests/SMBTwistedTests/__init__.py
+python2/tests/SMBTwistedTests/test_auth.py
+python2/tests/SMBTwistedTests/test_createdeletedirectory.py
+python2/tests/SMBTwistedTests/test_echo.py
+python2/tests/SMBTwistedTests/test_getattributes.py
+python2/tests/SMBTwistedTests/test_listpath.py
+python2/tests/SMBTwistedTests/test_listshares.py
+python2/tests/SMBTwistedTests/test_listsnapshots.py
+python2/tests/SMBTwistedTests/test_rename.py
+python2/tests/SMBTwistedTests/test_retrievefile.py
+python2/tests/SMBTwistedTests/test_storefile.py
+python2/tests/SMBTwistedTests/util.py
+python2/tests/SupportFiles/binary.dat
+python3/nmb/NetBIOS.py
+python3/nmb/NetBIOSProtocol.py
+python3/nmb/__init__.py
+python3/nmb/base.py
+python3/nmb/nmb_constants.py
+python3/nmb/nmb_structs.py
+python3/nmb/utils.py
+python3/pysmb.egg-info/PKG-INFO
+python3/pysmb.egg-info/SOURCES.txt
+python3/pysmb.egg-info/dependency_links.txt
+python3/pysmb.egg-info/requires.txt
+python3/pysmb.egg-info/top_level.txt
+python3/smb/SMBConnection.py
+python3/smb/SMBHandler.py
+python3/smb/SMBProtocol.py
+python3/smb/__init__.py
+python3/smb/base.py
+python3/smb/ntlm.py
+python3/smb/security_descriptors.py
+python3/smb/securityblob.py
+python3/smb/smb2_constants.py
+python3/smb/smb2_structs.py
+python3/smb/smb_constants.py
+python3/smb/smb_structs.py
+python3/smb/utils/U32.py
+python3/smb/utils/__init__.py
+python3/smb/utils/md4.py
+python3/smb/utils/pyDes.py
+python3/smb/utils/sha256.py
+python3/tests/README_1st.txt
+python3/tests/__init__.py
+python3/tests/connection.ini
+python3/tests/test_ntlm.py
+python3/tests/test_security_descriptors.py
+python3/tests/test_securityblob.py
+python3/tests/DirectSMBConnectionTests/__init__.py
+python3/tests/DirectSMBConnectionTests/test_auth.py
+python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+python3/tests/DirectSMBConnectionTests/test_echo.py
+python3/tests/DirectSMBConnectionTests/test_listpath.py
+python3/tests/DirectSMBConnectionTests/test_listshares.py
+python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
+python3/tests/DirectSMBConnectionTests/test_rename.py
+python3/tests/DirectSMBConnectionTests/test_retrievefile.py
+python3/tests/DirectSMBConnectionTests/test_storefile.py
+python3/tests/DirectSMBConnectionTests/util.py
+python3/tests/NetBIOSTests/__init__.py
+python3/tests/NetBIOSTests/test_queryname.py
+python3/tests/SMBConnectionTests/__init__.py
+python3/tests/SMBConnectionTests/test_SMBHandler.py
+python3/tests/SMBConnectionTests/test_auth.py
+python3/tests/SMBConnectionTests/test_createdeletedirectory.py
+python3/tests/SMBConnectionTests/test_deletepattern.py
+python3/tests/SMBConnectionTests/test_echo.py
+python3/tests/SMBConnectionTests/test_getattributes.py
+python3/tests/SMBConnectionTests/test_listpath.py
+python3/tests/SMBConnectionTests/test_listshares.py
+python3/tests/SMBConnectionTests/test_listsnapshots.py
+python3/tests/SMBConnectionTests/test_rename.py
+python3/tests/SMBConnectionTests/test_retrievefile.py
+python3/tests/SMBConnectionTests/test_security.py
+python3/tests/SMBConnectionTests/test_storefile.py
+python3/tests/SMBConnectionTests/test_with_context.py
+python3/tests/SMBConnectionTests/util.py
+python3/tests/SupportFiles/binary.dat
+sphinx/Makefile
+sphinx/make.bat
+sphinx/requirements.txt
+sphinx/source/conf.py
+sphinx/source/extending.rst
+sphinx/source/index.rst
+sphinx/source/api/nmb_NBNSProtocol.rst
+sphinx/source/api/nmb_NetBIOS.rst
+sphinx/source/api/smb_SMBConnection.rst
+sphinx/source/api/smb_SMBHandler.rst
+sphinx/source/api/smb_SMBProtocolFactory.rst
+sphinx/source/api/smb_SharedDevice.rst
+sphinx/source/api/smb_SharedFile.rst
+sphinx/source/api/smb_exceptions.rst
+sphinx/source/api/smb_security_descriptors.rst
\ No newline at end of file
diff --git a/python2/pysmb.egg-info/dependency_links.txt b/python2/pysmb.egg-info/dependency_links.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/python2/pysmb.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/python2/pysmb.egg-info/requires.txt b/python2/pysmb.egg-info/requires.txt
new file mode 100644
index 00000000..38fe4145
--- /dev/null
+++ b/python2/pysmb.egg-info/requires.txt
@@ -0,0 +1 @@
+pyasn1
diff --git a/python2/pysmb.egg-info/top_level.txt b/python2/pysmb.egg-info/top_level.txt
new file mode 100644
index 00000000..65ad1103
--- /dev/null
+++ b/python2/pysmb.egg-info/top_level.txt
@@ -0,0 +1,2 @@
+nmb
+smb
diff --git a/python2/smb/SMBConnection.py b/python2/smb/SMBConnection.py
index 77b1760a..8ac23b96 100644
--- a/python2/smb/SMBConnection.py
+++ b/python2/smb/SMBConnection.py
@@ -71,6 +71,15 @@ class SMBConnection(SMB):
                 raise NotConnectedError('Server disconnected')
             total_sent = total_sent + sent
 
+    #
+    # Support for "with" context
+    #
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
     #
     # Misc Properties
     #
@@ -153,15 +162,23 @@ class SMBConnection(SMB):
         return results
 
     def listPath(self, service_name, path,
-                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
+                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
                  pattern = '*', timeout = 30):
         """
         Retrieve a directory listing of files/folders at *path*
 
+        For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+
+        Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
+        system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
+        and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
+        If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
+        SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
+
         :param string/unicode service_name: the name of the shared folder for the *path*
         :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
         :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
-                               The default *search* value will query for all read-only, hidden, system, archive files and directories.
         :param string/unicode pattern: the filter to apply to the results before returning to the client.
         :return: A list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
         """
@@ -252,6 +269,37 @@ class SMBConnection(SMB):
 
         return results[0]
 
+    def getSecurity(self, service_name, path, timeout = 30):
+        """
+        Retrieve the security descriptor of the file at *path* on the *service_name*.
+
+        :param string/unicode service_name: the name of the shared folder for the *path*
+        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure<smb_exceptions>` will be raised.
+        :return: A :class:`smb.security_descriptors.SecurityDescriptor` instance containing the security information of the file.
+        """
+        if not self.sock:
+            raise NotConnectedError('Not connected to server')
+
+        results = [ ]
+
+        def cb(info):
+            self.is_busy = False
+            results.append(info)
+
+        def eb(failure):
+            self.is_busy = False
+            raise failure
+
+        self.is_busy = True
+        try:
+            self._getSecurity(service_name, path, cb, eb, timeout)
+            while self.is_busy:
+                self._pollForNetBIOSPacket(timeout)
+        finally:
+            self.is_busy = False
+
+        return results[0]
+
     def retrieveFile(self, service_name, path, file_obj, timeout = 30):
         """
         Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.
@@ -384,7 +432,7 @@ class SMBConnection(SMB):
         It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
         This function is very helpful when deleting files/folders that are read-only.
         Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)
-        
+
         :param string/unicode service_name: Contains the name of the shared folder.
         :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
                                                  Wildcards may be used in the filename component of the path.
@@ -495,7 +543,7 @@ class SMBConnection(SMB):
         """
         Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
 
-        :param string data: Data to send to the remote server.
+        :param bytes data: Data to send to the remote server. Must be a bytes object.
         :return: The *data* parameter
         """
         if not self.sock:
@@ -553,8 +601,17 @@ class SMBConnection(SMB):
                     raise ex
 
         type_, flags, length = struct.unpack('>BBH', data)
-        if flags & 0x01:
-            length = length | 0x10000
+        if type_ == 0x0:
+            # This is a Direct TCP packet
+            # The length is specified in the header from byte 8. (0-indexed)
+            # we read a structure assuming NBT, so to get the real length
+            # combine the length and flag fields together
+            length = length + (flags << 16)
+        else:
+            # This is a NetBIOS over TCP (NBT) packet
+            # The length is specified in the header from byte 16. (0-indexed)
+            if flags & 0x01:
+                length = length | 0x10000
 
         read_len = length
         while read_len > 0:
diff --git a/python2/smb/SMBProtocol.py b/python2/smb/SMBProtocol.py
index 2af2747e..1238d637 100644
--- a/python2/smb/SMBProtocol.py
+++ b/python2/smb/SMBProtocol.py
@@ -177,15 +177,23 @@ class SMBProtocolFactory(ClientFactory):
         return d
 
     def listPath(self, service_name, path,
-                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
+                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
                  pattern = '*', timeout = 30):
         """
         Retrieve a directory listing of files/folders at *path*
 
+        For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+
+        Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
+        system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
+        and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
+        If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
+        SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
+
         :param string/unicode service_name: the name of the shared folder for the *path*
         :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
         :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
-                               The default *search* value will query for all read-only, hidden, system, archive files and directories.
         :param string/unicode pattern: the filter to apply to the results before returning to the client.
         :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
         :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
@@ -368,7 +376,7 @@ class SMBProtocolFactory(ClientFactory):
         """
         Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
 
-        :param string data: Data to send to the remote server.
+        :param bytes data: Data to send to the remote server. Must be a bytes object.
         :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
         :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.
         """
diff --git a/python2/smb/base.py b/python2/smb/base.py
index c1544c8a..d2346aaf 100644
--- a/python2/smb/base.py
+++ b/python2/smb/base.py
@@ -5,6 +5,7 @@ from smb_constants import *
 from smb2_constants import *
 from smb_structs import *
 from smb2_structs import *
+from .security_descriptors import SecurityDescriptor
 from nmb.base import NMBSession
 from utils import convertFILETIMEtoEpoch
 import ntlm, securityblob
@@ -64,8 +65,9 @@ class SMB(NMBSession):
         self.sign_options = sign_options
         self.is_direct_tcp = is_direct_tcp
         self.use_ntlm_v2 = use_ntlm_v2 #: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1
-        self.smb_message = SMBMessage()
+        self.smb_message = SMBMessage(self)
         self.is_using_smb2 = False   #: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True
+        self.async_requests = { }    #: AsyncID mapped to _PendingRequest instance
         self.pending_requests = { }  #: MID mapped to _PendingRequest instance
         self.connected_trees = { }   #: Share name mapped to TID
         self.next_rpc_call_id = 1    #: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages
@@ -96,6 +98,13 @@ class SMB(NMBSession):
         self.max_write_size = 0     #: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4
         self.max_transact_size = 0  #: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4
         self.session_id = 0         #: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method
+        self.smb2_dialect = 0
+
+
+        # SMB 2.1 attributes
+        self.cap_leasing = False
+        self.cap_multi_credit = False
+        self.credits = 0   # how many credits we're allowed to spend per request
 
         self._setupSMB1Methods()
 
@@ -110,7 +119,7 @@ class SMB(NMBSession):
     #
 
     def onNMBSessionOK(self):
-        self._sendSMBMessage(SMBMessage(ComNegotiateRequest()))
+        self._sendSMBMessage(SMBMessage(self, ComNegotiateRequest()))
 
     def onNMBSessionFailed(self):
         pass
@@ -124,13 +133,31 @@ class SMB(NMBSession):
                 self.is_using_smb2 = True
                 self.mid = 0  # Must reset messageID counter, or else remote SMB2 server will disconnect
                 self._setupSMB2Methods()
-                self.smb_message = self._klassSMBMessage()
+                self.smb_message = self._klassSMBMessage(self)
                 i = self.smb_message.decode(data)
+                self.log.info('SMB2 dialect is 0x%04x', self.smb2_dialect)
 
             next_message_offset = 0
             if self.is_using_smb2:
                 next_message_offset = self.smb_message.next_command_offset
 
+                # update how many credits we're allowed to spend on requests
+                self.credits = self.smb_message.credit_response
+
+                # SMB2 CANCEL commands do not consume message IDs
+                if self.smb_message.command != SMB2_COM_CANCEL:
+                    self.log.debug('Received SMB2 packet from server - "%s" (command:0x%02X). Credit charge recv: %s',
+                                   SMB_COMMAND_NAMES.get(self.smb_message.command, '<unknown>'), self.smb_message.command, self.smb_message.credit_charge)
+                    if self.smb_message.credit_charge > 0:
+                        # Let's update the sequenceWindow based on the CreditsCharged
+                        # In the SMB 2.0.2 dialect, this field MUST NOT be used and MUST be reserved.
+                        # The sender MUST set this to 0, and the receiver MUST ignore it.
+                        # In all other dialects, this field indicates the number of credits that this request consumes.
+                        self.log.debug("Updating MID to add credit charge from server...")
+                        self.log.debug("*** Before: " + str(self.mid))
+                        self.mid = self.mid + (self.smb_message.credit_charge - 1)
+                        self.log.debug("*** After: " + str(self.mid))
+
             if i > 0:
                 if not self.is_using_smb2:
                     self.log.debug('Received SMB message "%s" (command:0x%2X flags:0x%02X flags2:0x%04X TID:%d UID:%d)',
@@ -142,7 +169,7 @@ class SMB(NMBSession):
                                    self.smb_message.command, self.smb_message.flags)
                 if self._updateState(self.smb_message):
                     # We need to create a new instance instead of calling reset() because the instance could be captured in the message history.
-                    self.smb_message = self._klassSMBMessage()
+                    self.smb_message = self._klassSMBMessage(self)
 
             if next_message_offset > 0:
                 data = data[next_message_offset:]
@@ -173,6 +200,7 @@ class SMB(NMBSession):
         self._listShares = self._listShares_SMB1
         self._listPath = self._listPath_SMB1
         self._listSnapshots = self._listSnapshots_SMB1
+        self._getSecurity = self._getSecurity_SMB1
         self._getAttributes = self._getAttributes_SMB1
         self._retrieveFile = self._retrieveFile_SMB1
         self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
@@ -196,6 +224,7 @@ class SMB(NMBSession):
         self._listPath = self._listPath_SMB2
         self._listSnapshots = self._listSnapshots_SMB2
         self._getAttributes = self._getAttributes_SMB2
+        self._getSecurity = self._getSecurity_SMB2
         self._retrieveFile = self._retrieveFile_SMB2
         self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
         self._storeFile = self._storeFile_SMB2
@@ -219,7 +248,7 @@ class SMB(NMBSession):
         if smb_message.mid == 0:
             smb_message.mid = self._getNextMID_SMB2()
 
-        if smb_message.command != SMB2_COM_NEGOTIATE and smb_message.command != SMB2_COM_ECHO:
+        if smb_message.command != SMB2_COM_NEGOTIATE:
             smb_message.session_id = self.session_id
 
         if self.is_signing_active:
@@ -241,10 +270,23 @@ class SMB(NMBSession):
         if message.isReply:
             if message.command == SMB2_COM_NEGOTIATE:
                 if message.status == 0:
-                    self.has_negotiated = True
-                    self.log.info('SMB2 dialect negotiation successful')
-                    self._updateServerInfo(message.payload)
-                    self._handleNegotiateResponse(message)
+
+                    if self.smb_message.payload.dialect_revision == SMB2_DIALECT_2ALL:
+                        # Dialects from SMB 2.1 must be negotiated in a second negotiate phase
+                        # We send a SMB2 Negotiate Request to accomplish this
+                        self._sendSMBMessage(SMB2Message(self, SMB2NegotiateRequest()))
+                    else:
+                        if self.smb_message.payload.dialect_revision == SMB2_DIALECT_21:
+                            # We negotiated SMB 2.1.
+                            # we must now send credit requests (MUST!)
+                            #self.send_credits_request = True
+                            pass
+
+                        self.has_negotiated = True
+                        self.log.info('SMB2 dialect negotiation successful')
+                        self.dialect = self.smb_message.payload.dialect_revision
+                        self._updateServerInfo(message.payload)
+                        self._handleNegotiateResponse(message)
                 else:
                     raise ProtocolError('Unknown status value (0x%08X) in SMB2_COM_NEGOTIATE' % message.status,
                                         message.raw_data, message)
@@ -256,6 +298,19 @@ class SMB(NMBSession):
                         if result == securityblob.RESULT_ACCEPT_COMPLETED:
                             self.has_authenticated = True
                             self.log.info('Authentication (on SMB2) successful!')
+
+                            # [MS-SMB2]: 3.2.5.3.1
+                            # If the security subsystem indicates that the session was established by an anonymous user,
+                            # Session.SigningRequired MUST be set to FALSE.
+                            # If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags field of the
+                            # SMB2 SESSION_SETUP Response and if Session.SigningRequired is TRUE, this indicates a SESSION_SETUP
+                            # failure and the connection MUST be terminated. If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags
+                            # field of the SMB2 SESSION_SETUP Response and if RequireMessageSigning is FALSE, Session.SigningRequired
+                            # MUST be set to FALSE.
+                            if message.payload.isGuestSession or message.payload.isAnonymousSession:
+                                self.is_signing_active = False
+                                self.log.info('Signing disabled because session is guest/anonymous')
+
                             self.onAuthOK()
                         else:
                             raise ProtocolError('SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is %d' % result, message.raw_data, message)
@@ -269,18 +324,58 @@ class SMB(NMBSession):
                             self._handleSessionChallenge(message, ntlm_token)
                     except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ), ex:
                         raise ProtocolError(str(ex), message.raw_data, message)
-                elif message.status == 0xc000006d:  # STATUS_LOGON_FAILURE
+                elif (message.status == 0xc000006d   # STATUS_LOGON_FAILURE
+                    or message.status == 0xc0000064  # STATUS_NO_SUCH_USER
+                    or message.status == 0xc000006a):# STATUS_WRONG_PASSWORD
                     self.has_authenticated = False
                     self.log.info('Authentication (on SMB2) failed. Please check username and password.')
                     self.onAuthFailed()
+                elif (message.status == 0xc0000193    # STATUS_ACCOUNT_EXPIRED
+                    or message.status == 0xC0000071): # STATUS_PASSWORD_EXPIRED
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account or password has expired.')
+                    self.onAuthFailed()
+                elif message.status == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account has been locked due to too many invalid logon attempts.')
+                    self.onAuthFailed()
+                elif message.status == 0xc0000072: # STATUS_ACCOUNT_DISABLED
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account has been disabled.')
+                    self.onAuthFailed()
+                elif (message.status == 0xc000006f    # STATUS_INVALID_LOGON_HOURS
+                    or message.status == 0xc000015b   # STATUS_LOGON_TYPE_NOT_GRANTED
+                    or message.status == 0xc0000070): # STATUS_INVALID_WORKSTATION
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Not allowed.')
+                    self.onAuthFailed()
+                elif message.status == 0xc000018c:  # STATUS_TRUSTED_DOMAIN_FAILURE
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Domain not trusted.')
+                    self.onAuthFailed()
+                elif message.status == 0xc000018d:  # STATUS_TRUSTED_RELATIONSHIP_FAILURE
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Workstation not trusted.')
+                    self.onAuthFailed()
                 else:
                     raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status,
                                         message.raw_data, message)
 
-            req = self.pending_requests.pop(message.mid, None)
-            if req:
-                req.callback(message, **req.kwargs)
-                return True
+            if message.isAsync:
+                if message.status == 0x00000103:  # STATUS_PENDING
+                    req = self.pending_requests.pop(message.mid, None)
+                    if req:
+                        self.async_requests[message.async_id] = req
+                else: # All other status including SUCCESS
+                    req = self.async_requests.pop(message.async_id, None)
+                    if req:
+                        req.callback(message, **req.kwargs)
+                        return True
+            else:
+                req = self.pending_requests.pop(message.mid, None)
+                if req:
+                    req.callback(message, **req.kwargs)
+                    return True
 
 
     def _updateServerInfo_SMB2(self, payload):
@@ -291,11 +386,17 @@ class SMB(NMBSession):
         self.max_write_size = payload.max_write_size
         self.use_plaintext_authentication = False   # SMB2 never allows plaintext authentication
 
+        if (self.capabilities & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
+            self.cap_leasing = True
+
+        if (self.capabilities & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
+            self.cap_multi_credit = True
+
 
     def _handleNegotiateResponse_SMB2(self, message):
         ntlm_data = ntlm.generateNegotiateMessage()
         blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
+        self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
 
 
     def _handleSessionChallenge_SMB2(self, message, ntlm_token):
@@ -320,14 +421,15 @@ class SMB(NMBSession):
                                                      lm_challenge_response,
                                                      session_key,
                                                      self.username,
-                                                     self.domain)
+                                                     self.domain,
+                                                     self.my_name)
 
         if self.log.isEnabledFor(logging.DEBUG):
             self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
             self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
 
         blob = securityblob.generateAuthSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
+        self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
 
         if self.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED:
             self.log.info('Server requires all SMB messages to be signed')
@@ -358,7 +460,7 @@ class SMB(NMBSession):
         messages_history = [ ]
 
         def connectSrvSvc(tid):
-            m = SMB2Message(SMB2CreateRequest('srvsvc',
+            m = SMB2Message(self, SMB2CreateRequest('srvsvc',
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -369,7 +471,7 @@ class SMB(NMBSession):
 
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback, tid = tid)
             messages_history.append(m)
 
         def connectSrvSvcCB(create_message, **kwargs):
@@ -390,10 +492,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00
 01 00 00 00
 """.replace(' ', '').replace('\n', ''))
-                m = SMB2Message(SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
-                m.tid = create_message.tid
+                m = SMB2Message(self, SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, fid = create_message.payload.fid)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
                 messages_history.append(m)
             else:
                 errback(OperationFailure('Failed to list shares: Unable to locate Server Service RPC endpoint', messages_history))
@@ -401,13 +503,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def rpcBindCB(trans_message, **kwargs):
             messages_history.append(trans_message)
             if trans_message.status == 0:
-                m = SMB2Message(SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
-                m.tid = trans_message.tid
+                m = SMB2Message(self, SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, fid = kwargs['fid'])
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
                 messages_history.append(m)
             else:
-                closeFid(trans_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
+                closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
 
         def rpcReadCB(read_message, **kwargs):
             messages_history.append(read_message)
@@ -434,13 +536,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-                m = SMB2Message(SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
-                m.tid = read_message.tid
+                m = SMB2Message(self, SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
                 messages_history.append(m)
             else:
-                closeFid(read_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
+                closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
 
         def listShareResultsCB(result_message, **kwargs):
             messages_history.append(result_message)
@@ -449,13 +551,11 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 data_bytes = result_message.payload.out_data
 
                 if ord(data_bytes[3]) & 0x02 == 0:
-                    sendReadRequest(result_message.tid, kwargs['fid'], data_bytes)
+                    sendReadRequest(kwargs['tid'], kwargs['fid'], data_bytes)
                 else:
-                    decodeResults(result_message.tid, kwargs['fid'], data_bytes)
-            elif result_message.status == 0x0103:   # STATUS_PENDING
-                self.pending_requests[result_message.mid] = _PendingRequest(result_message.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
+                    decodeResults(kwargs['tid'], kwargs['fid'], data_bytes)
             else:
-                closeFid(result_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def decodeResults(tid, fid, data_bytes):
@@ -490,28 +590,27 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendReadRequest(tid, fid, data_bytes):
             read_count = min(4280, self.max_read_size)
-            m = SMB2Message(SMB2ReadRequest(fid, 0, read_count))
+            m = SMB2Message(self, SMB2ReadRequest(fid, 0, read_count))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
-                                                           fid = fid, data_bytes = data_bytes)
+                                                           tid = tid, fid = fid, data_bytes = data_bytes)
 
         def readCB(read_message, **kwargs):
             messages_history.append(read_message)
             if read_message.status == 0:
-                data_len = read_message.payload.data_length
                 data_bytes = read_message.payload.data
 
                 if ord(data_bytes[3]) & 0x02 == 0:
-                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    sendReadRequest(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
                 else:
-                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    decodeResults(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
             else:
-                closeFid(read_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def closeFid(tid, fid, results = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
@@ -532,7 +631,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
             messages_history.append(m)
@@ -561,7 +660,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -572,39 +671,44 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendQuery(create_message.tid, create_message.payload.fid, '')
+                sendQuery(kwargs['tid'], create_message.payload.fid, '')
             else:
                 errback(OperationFailure('Failed to list %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
 
         def sendQuery(tid, fid, data_buf):
-            m = SMB2Message(SMB2QueryDirectoryRequest(fid, pattern,
-                                                      info_class = 0x03,   # FileBothDirectoryInformation
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                output_buf_len = 64 * 1024 * (self.credits - 1)
+            else:
+                output_buf_len = self.max_transact_size
+
+            m = SMB2Message(self, SMB2QueryDirectoryRequest(fid, pattern,
+                                                      info_class = 0x25,   # FileIdBothDirectoryInformation
                                                       flags = 0,
-                                                      output_buf_len = self.max_transact_size))
+                                                      output_buf_len = output_buf_len))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, fid = fid, data_buf = data_buf)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = tid, fid = fid, data_buf = data_buf)
             messages_history.append(m)
 
         def queryCB(query_message, **kwargs):
             messages_history.append(query_message)
             if query_message.status == 0:
                 data_buf = decodeQueryStruct(kwargs['data_buf'] + query_message.payload.data)
-                sendQuery(query_message.tid, kwargs['fid'], data_buf)
+                sendQuery(kwargs['tid'], kwargs['fid'], data_buf)
             elif query_message.status == 0x80000006L:  # STATUS_NO_MORE_FILES
-                closeFid(query_message.tid, kwargs['fid'], results = results)
+                closeFid(kwargs['tid'], kwargs['fid'], results = results)
             else:
-                closeFid(query_message.tid, kwargs['fid'], error = query_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
 
         def decodeQueryStruct(data_bytes):
-            # SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1
-            info_format = '<IIQQQQQQIIIBB24s'
+            # FileIdBothDirectoryInformation structure. See [MS-SMB]: 2.2.8.1.3 and [MS-FSCC]: 2.4.17
+            info_format = '<IIQQQQQQIIIBB24sHQ'
             info_size = struct.calcsize(info_format)
 
             data_length = len(data_bytes)
@@ -616,17 +720,24 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 next_offset, _, \
                 create_time, last_access_time, last_write_time, last_attr_change_time, \
                 file_size, alloc_size, file_attributes, filename_length, ea_size, \
-                short_name_length, _, short_name = struct.unpack(info_format, data_bytes[offset:offset+info_size])
+                short_name_length, _, short_name, _, file_id = struct.unpack(info_format, data_bytes[offset:offset+info_size])
 
                 offset2 = offset + info_size
                 if offset2 + filename_length > data_length:
                     return data_bytes[offset:]
 
                 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
-                short_name = short_name.decode('UTF-16LE')
-                results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
-                                          convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
-                                          file_size, alloc_size, file_attributes, short_name, filename))
+                short_name = short_name[:short_name_length].decode('UTF-16LE')
+
+                accept_result = False
+                if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
+                    accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+                else:
+                    accept_result = (file_attributes & search) > 0
+                if accept_result:
+                    results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
+                                              convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                              file_size, alloc_size, file_attributes, short_name, filename, file_id))
 
                 if next_offset:
                     offset += next_offset
@@ -635,7 +746,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             return ''
 
         def closeFid(tid, fid, results = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
@@ -645,7 +756,11 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             if kwargs['results'] is not None:
                 callback(kwargs['results'])
             elif kwargs['error'] is not None:
-                errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
+                if kwargs['error'] == 0xC000000F:  # [MS-ERREF]: STATUS_NO_SUCH_FILE
+                    # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
+                    callback([ ])
+                else:
+                    errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
 
         if not self.connected_trees.has_key(service_name):
             def connectCB(connect_message, **kwargs):
@@ -656,7 +771,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -684,7 +799,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -695,22 +810,23 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
                 p = create_message.payload
+                filename = self._extractLastPathComponent(unicode(path))
                 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
                                   p.file_size, p.allocation_size, p.file_attributes,
-                                  unicode(path), unicode(path))
-                closeFid(create_message.tid, p.fid, info = info)
+                                  filename, filename)
+                closeFid(kwargs['tid'], p.fid, info = info)
             else:
                 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid, info = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
@@ -731,7 +847,93 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
+            messages_history.append(m)
+        else:
+            sendCreate(self.connected_trees[service_name])
+
+    def _getSecurity_SMB2(self, service_name, path, callback, errback, timeout = 30):
+        if not self.has_authenticated:
+            raise NotReadyError('SMB connection not authenticated')
+
+        expiry_time = time.time() + timeout
+        path = path.replace('/', '\\')
+        if path.startswith('\\'):
+            path = path[1:]
+        if path.endswith('\\'):
+            path = path[:-1]
+        messages_history = [ ]
+        results = [ ]
+
+        def sendCreate(tid):
+            m = SMB2Message(self, SMB2CreateRequest(path,
+                                              file_attributes = 0,
+                                              access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
+                                              share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                                              oplock = SMB2_OPLOCK_LEVEL_NONE,
+                                              impersonation = SEC_IMPERSONATE,
+                                              create_options = 0,
+                                              create_disp = FILE_OPEN))
+            m.tid = tid
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
+            messages_history.append(m)
+
+        def createCB(create_message, **kwargs):
+            messages_history.append(create_message)
+            if create_message.status == 0:
+                if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                    output_buf_len = 64 * 1024 * (self.credits - 1)
+                else:
+                    output_buf_len = self.max_transact_size
+
+                m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
+                                                     flags = 0,
+                                                     additional_info = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
+                                                     info_type = SMB2_INFO_SECURITY,
+                                                     file_info_class = 0, # [MS-SMB2] 2.2.37, 3.2.4.12
+                                                     input_buf = '',
+                                                     output_buf_len = output_buf_len))
+                m.tid = kwargs['tid']
+                self._sendSMBMessage(m)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
+                messages_history.append(m)
+            else:
+                errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to open file or directory' % ( path, service_name ), messages_history))
+
+        def queryCB(query_message, **kwargs):
+            messages_history.append(query_message)
+            if query_message.status == 0:
+                security = SecurityDescriptor.from_bytes(query_message.payload.data)
+                closeFid(kwargs['tid'], kwargs['fid'], result = security)
+            else:
+                closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
+
+        def closeFid(tid, fid, result = None, error = None):
+            m = SMB2Message(self, SMB2CloseRequest(fid))
+            m.tid = tid
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, result = result, error = error)
+            messages_history.append(m)
+
+        def closeCB(close_message, **kwargs):
+            if kwargs['result'] is not None:
+                callback(kwargs['result'])
+            elif kwargs['error'] is not None:
+                errback(OperationFailure('Failed to get the security descriptor of %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
+
+        if not self.connected_trees.has_key(service_name):
+            def connectCB(connect_message, **kwargs):
+                messages_history.append(connect_message)
+                if connect_message.status == 0:
+                    self.connected_trees[service_name] = connect_message.tid
+                    sendCreate(connect_message.tid)
+                else:
+                    errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
+
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -763,10 +965,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
-                                              share_access = FILE_SHARE_READ,
+                                              share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
                                               oplock = SMB2_OPLOCK_LEVEL_NONE,
                                               impersonation = SEC_IMPERSONATE,
                                               create_options = FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE,
@@ -780,20 +982,22 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                m = SMB2Message(SMB2QueryInfoRequest(create_message.payload.fid,
+                m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
                                                      flags = 0,
                                                      additional_info = 0,
                                                      info_type = SMB2_INFO_FILE,
                                                      file_info_class = 0x16,  # FileStreamInformation [MS-FSCC] 2.4
                                                      input_buf = '',
                                                      output_buf_len = 4096))
-                m.tid = create_message.tid
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
                 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, infoCB, errback,
-                                                               fid = create_message.payload.fid, file_attributes = create_message.payload.file_attributes)
+                                                               tid = kwargs['tid'],
+                                                               fid = create_message.payload.fid,
+                                                               file_attributes = create_message.payload.file_attributes)
                 messages_history.append(m)
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to open file' % ( path, service_name ), messages_history))
+                errback(OperationFailure('Failed to retrieve %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def infoCB(info_message, **kwargs):
             messages_history.append(info_message)
@@ -808,17 +1012,22 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                         remaining_len = file_len
                     if starting_offset + remaining_len > file_len:
                         remaining_len = file_len - starting_offset
-                    sendRead(info_message.tid, kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
+                    sendRead(kwargs['tid'], kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
+                errback(OperationFailure('Failed to retrieve %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
 
         def sendRead(tid, fid, offset, remaining_len, read_len, file_attributes):
             read_count = min(self.max_read_size, remaining_len)
-            m = SMB2Message(SMB2ReadRequest(fid, offset, read_count))
+
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                max_read_count = 64 * 1024 * (self.credits -1)
+                read_count = min(read_count, max_read_count)
+
+            m = SMB2Message(self, SMB2ReadRequest(fid, offset, read_count))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
-                                                           fid = fid, offset = offset,
+                                                           tid = tid, fid = fid, offset = offset,
                                                            remaining_len = remaining_len,
                                                            read_len = read_len,
                                                            file_attributes = file_attributes)
@@ -832,15 +1041,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 remaining_len = kwargs['remaining_len'] - data_len
 
                 if remaining_len > 0:
-                    sendRead(read_message.tid, kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
+                    sendRead(kwargs['tid'], kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
                 else:
-                    closeFid(read_message.tid, kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
+                    closeFid(kwargs['tid'], kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
             else:
                 messages_history.append(read_message)
-                closeFid(read_message.tid, kwargs['fid'], error = read_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], error = read_message.status)
 
         def closeFid(tid, fid, ret = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, ret = ret, error = error)
@@ -861,7 +1070,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -894,7 +1103,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = ATTR_ARCHIVE,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | SYNCHRONIZE,
                                               share_access = 0,
@@ -913,36 +1122,35 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             messages_history.append(create_message)
             if create_message.status == 0:
                 sendWrite(create_message.tid, create_message.payload.fid, starting_offset)
-            elif create_message.status == 0x0103:  # STATUS_PENDING
-                self.pending_requests[create_message.mid] = _PendingRequest(create_message.mid, expiry_time,
-                                                                          createCB, errback,
-                                                                            tid=kwargs['tid'])
             else:
                 errback(OperationFailure('Failed to store %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendWrite(tid, fid, offset):
-            write_count = self.max_write_size
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                write_count = 64 * 1024 * (self.credits -1)
+            else:
+                write_count = self.max_write_size
             data = file_obj.read(write_count)
             data_len = len(data)
             if data_len > 0:
-                m = SMB2Message(SMB2WriteRequest(fid, data, offset))
+                m = SMB2Message(self, SMB2WriteRequest(fid, data, offset))
                 m.tid = tid
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, tid = tid, fid = fid, offset = offset+data_len)
             else:
                 closeFid(tid, fid, offset = offset)
 
         def writeCB(write_message, **kwargs):
             # To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.
             if write_message.status == 0:
-                sendWrite(write_message.tid, kwargs['fid'], kwargs['offset'])
+                sendWrite(kwargs['tid'], kwargs['fid'], kwargs['offset'])
             else:
                 messages_history.append(write_message)
-                closeFid(write_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid, error = None, offset = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, fid = fid, offset = offset, error = error)
@@ -963,7 +1171,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -992,7 +1200,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1011,38 +1219,30 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             messages_history.append(open_message)
             if open_message.status == 0:
                 sendDelete(open_message.tid, open_message.payload.fid)
-            elif open_message.status == 0x0103:  # STATUS_PENDING
-                self.pending_requests[open_message.mid] = _PendingRequest(open_message.mid, expiry_time,
-                                                                          createCB, errback,
-                                                                          tid=kwargs['tid'])
             else:
                 errback(OperationFailure('Failed to delete %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendDelete(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0d,  # SMB2_FILE_DISPOSITION_INFO
                                                data = '\x01'))
-            '''
-                Resources:
-                https://msdn.microsoft.com/en-us/library/cc246560.aspx
-                https://msdn.microsoft.com/en-us/library/cc232098.aspx
-            '''
+            # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4.11
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def deleteCB(delete_message, **kwargs):
             messages_history.append(delete_message)
             if delete_message.status == 0:
-                closeFid(delete_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
@@ -1063,7 +1263,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1092,7 +1292,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
 
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_WRITE_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1109,37 +1309,31 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(open_message, **kwargs):
             messages_history.append(open_message)
             if open_message.status == 0:
-                sendReset(open_message.tid, open_message.payload.fid)
+                sendReset(kwargs['tid'], open_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendReset(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 4,  # FileBasicInformation
                                                data = struct.pack('qqqqii',0,0,0,0,0x80,0))) # FILE_ATTRIBUTE_NORMAL
-            '''
-                Resources:
-                https://msdn.microsoft.com/en-us/library/cc246560.aspx
-                https://msdn.microsoft.com/en-us/library/cc232064.aspx
-                https://msdn.microsoft.com/en-us/library/cc232094.aspx
-                https://msdn.microsoft.com/en-us/library/cc232110.aspx
-            '''
+            # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4, [MS-FSCC]: 2.4.7, [MS-FSCC]: 2.6
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def resetCB(reset_message, **kwargs):
             messages_history.append(reset_message)
             if reset_message.status == 0:
-                closeFid(reset_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(reset_message.tid, kwargs['fid'], status = reset_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = reset_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
@@ -1160,7 +1354,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1188,7 +1382,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_READ_EA | FILE_WRITE_EA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | READ_CONTROL | DELETE | SYNCHRONIZE,
                                               share_access = 0,
@@ -1199,18 +1393,18 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                closeFid(create_message.tid, create_message.payload.fid)
+                closeFid(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to create directory %s on %s: Create failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback)
@@ -1228,7 +1422,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1256,7 +1450,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1273,30 +1467,30 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(open_message, **kwargs):
             messages_history.append(open_message)
             if open_message.status == 0:
-                sendDelete(open_message.tid, open_message.payload.fid)
+                sendDelete(kwargs['tid'], open_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to delete %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
 
         def sendDelete(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0d,  # SMB2_FILE_DISPOSITION_INFO
                                                data = '\x01'))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def deleteCB(delete_message, **kwargs):
             messages_history.append(delete_message)
             if delete_message.status == 0:
-                closeFid(delete_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
@@ -1317,7 +1511,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1352,7 +1546,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(old_path,
+            m = SMB2Message(self, SMB2CreateRequest(old_path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1369,31 +1563,31 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendRename(create_message.tid, create_message.payload.fid)
+                sendRename(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to rename %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
 
         def sendRename(tid, fid):
             data = '\x00'*16 + struct.pack('<I', len(new_path)*2) + new_path.encode('UTF-16LE')
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0a,  # SMB2_FILE_RENAME_INFO
                                                data = data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def renameCB(rename_message, **kwargs):
             messages_history.append(rename_message)
             if rename_message.status == 0:
-                closeFid(rename_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(rename_message.tid, kwargs['fid'], status = rename_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = rename_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
@@ -1414,7 +1608,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1440,7 +1634,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00
 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1457,12 +1651,12 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendEnumSnapshots(create_message.tid, create_message.payload.fid)
+                sendEnumSnapshots(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
 
         def sendEnumSnapshots(tid, fid):
-            m = SMB2Message(SMB2IoctlRequest(fid,
+            m = SMB2Message(self, SMB2IoctlRequest(fid,
                                              ctlcode = 0x00144064,  # FSCTL_SRV_ENUMERATE_SNAPSHOTS
                                              flags = 0x0001,
                                              in_data = ''))
@@ -1484,7 +1678,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 closeFid(kwargs['tid'], kwargs['fid'], status = enum_message.status)
 
         def closeFid(tid, fid, status = None, results = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status, results = results)
@@ -1505,7 +1699,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1522,7 +1716,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Echo failed', messages_history))
 
-        m = SMB2Message(SMB2EchoRequest())
+        m = SMB2Message(self, SMB2EchoRequest())
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
         messages_history.append(m)
@@ -1598,9 +1792,38 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                 self._handleSessionChallenge(message, ntlm_token)
                         except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ), ex:
                             raise ProtocolError(str(ex), message.raw_data, message)
-                    elif message.status.internal_value == 0xc000006d:  # STATUS_LOGON_FAILURE
+                    elif (message.status.internal_value == 0xc000006d    # STATUS_LOGON_FAILURE
+                        or message.status.internal_value == 0xc0000064   # STATUS_NO_SUCH_USER
+                        or message.status.internal_value == 0xc000006a): # STATUS_WRONG_PASSWORD
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Please check username and password.')
+                        self.onAuthFailed()
+                    elif (message.status.internal_value == 0xc0000193    # STATUS_ACCOUNT_EXPIRED
+                        or message.status.internal_value == 0xC0000071): # STATUS_PASSWORD_EXPIRED
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account or password has expired.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account has been locked due to too many invalid logon attempts.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc0000072: # STATUS_ACCOUNT_DISABLED
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account has been disabled.')
+                        self.onAuthFailed()
+                    elif (message.status.internal_value == 0xc000006f    # STATUS_INVALID_LOGON_HOURS
+                        or message.status.internal_value == 0xc000015b   # STATUS_LOGON_TYPE_NOT_GRANTED
+                        or message.status.internal_value == 0xc0000070): # STATUS_INVALID_WORKSTATION
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Not allowed.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc000018c:  # STATUS_TRUSTED_DOMAIN_FAILURE
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Domain not trusted.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc000018d:  # STATUS_TRUSTED_RELATIONSHIP_FAILURE
                         self.has_authenticated = False
-                        self.log.info('Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.')
+                        self.log.info('Authentication (with extended security) failed. Workstation not trusted.')
                         self.onAuthFailed()
                     else:
                         raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status.internal_value,
@@ -1667,14 +1890,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                                      lm_challenge_response,
                                                      session_key,
                                                      self.username,
-                                                     self.domain)
+                                                     self.domain,
+                                                     self.my_name)
 
         if self.log.isEnabledFor(logging.DEBUG):
             self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
             self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
 
         blob = securityblob.generateAuthSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
+        self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
 
         if self.security_mode & NEGOTIATE_SECURITY_SIGNATURES_REQUIRE:
             self.log.info('Server requires all SMB messages to be signed')
@@ -1703,13 +1927,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         if message.hasExtendedSecurity or message.payload.supportsExtendedSecurity:
             ntlm_data = ntlm.generateNegotiateMessage()
             blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
-            self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
+            self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
         else:
             nt_password, _, _ = ntlm.generateChallengeResponseV1(self.password, message.payload.challenge, False)
             self.log.info('Performing NTLMv1 authentication (without extended security) with challenge "%s" and hashed password of "%s"',
                           binascii.hexlify(message.payload.challenge),
                           binascii.hexlify(nt_password))
-            self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
+            self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
                                                                                            self.username,
                                                                                            nt_password,
                                                                                            True,
@@ -1724,7 +1948,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def connectSrvSvc(tid):
-            m = SMBMessage(ComNTCreateAndxRequest('\\srvsvc',
+            m = SMBMessage(self, ComNTCreateAndxRequest('\\srvsvc',
                                                   flags = NT_CREATE_REQUEST_EXTENDED_RESPONSE,
                                                   access_mask = READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | FILE_WRITE_EA | FILE_READ_EA | FILE_APPEND_DATA | FILE_WRITE_DATA | FILE_READ_DATA,
                                                   share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1753,7 +1977,7 @@ b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00
 c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
 2b 10 48 60 02 00 00 00""".replace(' ', '').replace('\n', ''))
-                m = SMBMessage(ComTransactionRequest(max_params_count = 0,
+                m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
                                                      max_data_count = 4280,
                                                      max_setup_count = 0,
                                                      data_bytes = data_bytes,
@@ -1791,7 +2015,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-                m = SMBMessage(ComTransactionRequest(max_params_count = 0,
+                m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
                                                      max_data_count = 4280,
                                                      max_setup_count = 0,
                                                      data_bytes = data_bytes,
@@ -1850,7 +2074,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendReadRequest(tid, fid, data_bytes):
             read_count = min(4280, self.max_raw_size - 2)
-            m = SMBMessage(ComReadAndxRequest(fid = fid,
+            m = SMBMessage(self, ComReadAndxRequest(fid = fid,
                                               offset = 0,
                                               max_return_bytes_count = read_count,
                                               min_return_bytes_count = read_count))
@@ -1861,19 +2085,18 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def readCB(read_message, **kwargs):
             messages_history.append(read_message)
             if not read_message.status.hasError:
-                data_len = read_message.payload.data_length
                 data_bytes = read_message.payload.data
 
                 if ord(data_bytes[3]) & 0x02 == 0:
-                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
                 else:
-                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
             else:
                 closeFid(read_message.tid, kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -1886,7 +2109,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
 
-        m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
+        m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
         messages_history.append(m)
@@ -1906,17 +2129,17 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             setup_bytes = struct.pack('<H', 0x0001)  # TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1
             params_bytes = \
                 struct.pack('<HHHHI',
-                            search, # SearchAttributes
+                            search & 0xFFFF, # SearchAttributes (need to restrict the values due to introduction of SMB_FILE_ATTRIBUTE_INCL_NORMAL)
                             100,    # SearchCount
                             0x0006, # Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
                             0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
-                            0x0000) # SearchStorageType
+                            0x0000) # SearchStorageType (seems to be ignored by Windows)
             if support_dfs:
                 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
             else:
-                params_bytes += (path + pattern).encode('UTF-16LE')
+                params_bytes += (path + pattern + '\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -1950,9 +2173,16 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
                 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
                 short_name = short_name.decode('UTF-16LE')
-                results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
-                                          convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
-                                          file_size, alloc_size, file_attributes, short_name, filename))
+
+                accept_result = False
+                if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
+                    accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+                else:
+                    accept_result = (file_attributes & search) > 0
+                if accept_result:
+                    results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
+                                              convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                              file_size, alloc_size, file_attributes, short_name, filename))
 
                 if next_offset:
                     offset += next_offset
@@ -1992,11 +2222,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 elif end_of_search:
                     callback(results)
                 else:
-                    sendFindNext(find_message.tid, sid, last_name_offset, kwargs.get('support_dfs', False))
+                    sendFindNext(find_message.tid, sid, 0, results[-1].filename, kwargs.get('support_dfs', False))
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
+                if find_message.status.internal_value == 0xC000000F:  # [MS-ERREF]: STATUS_NO_SUCH_FILE
+                    # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
+                    callback([ ])
+                else:
+                    errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
 
-        def sendFindNext(tid, sid, resume_key, support_dfs=False):
+        def sendFindNext(tid, sid, resume_key, resume_file, support_dfs=False):
             setup_bytes = struct.pack('<H', 0x0002)  # TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1
             params_bytes = \
                 struct.pack('<HHHIH',
@@ -2004,13 +2238,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                             100,        # SearchCount
                             0x0104,     # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
                             resume_key, # ResumeKey
-                            0x000a)     # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
-            if support_dfs:
-                params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
-            else:
-                params_bytes += (path + pattern).encode('UTF-16LE')
+                            0x0006)     # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
+            params_bytes += (resume_file+'\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2054,7 +2285,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 elif end_of_search:
                     callback(results)
                 else:
-                    sendFindNext(find_message.tid, kwargs['sid'], last_name_offset, kwargs.get('support_dfs', False))
+                    sendFindNext(find_message.tid, kwargs['sid'], 0, results[-1].filename, kwargs.get('support_dfs', False))
             else:
                 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
 
@@ -2063,7 +2294,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             params_bytes = struct.pack('<H', 3)      # Max referral level 3
             params_bytes += ("\\" + self.remote_name + "\\" + service_name).encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2088,7 +2319,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2115,7 +2346,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                             0x0000) # Reserved
             params_bytes += (path + '\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 2,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 2,
                                                   max_data_count = 65535,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2132,9 +2363,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 info_size = struct.calcsize(info_format)
                 create_time, last_access_time, last_write_time, last_attr_change_time, \
                 file_attributes, _, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
+                filename = self._extractLastPathComponent(unicode(path))
 
-                info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
-                                  file_size, alloc_size, file_attributes, unicode(path), unicode(path))
+                info = SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time), convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                  file_size, alloc_size, file_attributes, filename, filename)
                 callback(info)
             else:
                 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
@@ -2148,13 +2380,16 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
         else:
             sendQuery(self.connected_trees[service_name])
 
+    def _getSecurity_SMB1(self, service_name, path_file_pattern, callback, errback, timeout = 30):
+        raise NotReadyError('getSecurity is not yet implemented for SMB1')
+
     def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
         return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0L, -1L, timeout)
 
@@ -2166,7 +2401,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0040,  # Sharing mode: Deny nothing to others
                                               open_mode = 0x0001,    # Failed if file does not exist
                                               search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
@@ -2189,7 +2424,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendRead(tid, fid, offset, file_attributes, read_len, remaining_len):
             read_count = self.max_raw_size - 2
-            m = SMBMessage(ComReadAndxRequest(fid = fid,
+            m = SMBMessage(self, ComReadAndxRequest(fid = fid,
                                               offset = offset,
                                               max_return_bytes_count = read_count,
                                               min_return_bytes_count = min(0xFFFF, read_count)))
@@ -2228,7 +2463,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to retrieve %s on %s: Read failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2242,7 +2477,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2260,7 +2495,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0041,  # Sharing mode: Deny nothing to others + Open for writing
                                               open_mode = 0x0012 if truncate else 0x0011,    # Create file if file does not exist. Overwrite or append depending on truncate parameter.
                                               search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
@@ -2283,7 +2518,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             data_bytes = file_obj.read(write_count)
             data_len = len(data_bytes)
             if data_len > 0:
-                m = SMBMessage(ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
+                m = SMBMessage(self, ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
                 m.tid = tid
                 self._sendSMBMessage(m)
                 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
@@ -2301,7 +2536,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2315,7 +2550,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2330,7 +2565,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendDelete(tid):
-            m = SMBMessage(ComDeleteRequest(filename_pattern = path,
+            m = SMBMessage(self, ComDeleteRequest(filename_pattern = path,
                                             search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
             m.tid = tid
             self._sendSMBMessage(m)
@@ -2353,7 +2588,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2371,7 +2606,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendCreate(tid):
-            m = SMBMessage(ComCreateDirectoryRequest(path))
+            m = SMBMessage(self, ComCreateDirectoryRequest(path))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
@@ -2393,7 +2628,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2408,7 +2643,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendDelete(tid):
-            m = SMBMessage(ComDeleteDirectoryRequest(path))
+            m = SMBMessage(self, ComDeleteDirectoryRequest(path))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback)
@@ -2430,7 +2665,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2446,7 +2681,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendRename(tid):
-            m = SMBMessage(ComRenameRequest(old_path = old_path,
+            m = SMBMessage(self, ComRenameRequest(old_path = old_path,
                                             new_path = new_path,
                                             search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
             m.tid = tid
@@ -2470,7 +2705,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2489,7 +2724,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         results = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0040,  # Sharing mode: Deny nothing to others
                                               open_mode = 0x0001,    # Failed if file does not exist
                                               search_attributes = 0,
@@ -2514,7 +2749,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                       fid,         # FID
                                       0x01,        # IsFctl
                                       0)           # IsFlags
-            m = SMBMessage(ComNTTransactRequest(function = 0x0002,  # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
+            m = SMBMessage(self, ComNTTransactRequest(function = 0x0002,  # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
                                                 max_params_count = 0,
                                                 max_data_count = 0xFFFF,
                                                 max_setup_count = 0,
@@ -2539,7 +2774,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to list snapshots on path' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2553,7 +2788,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2563,6 +2798,9 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
     def _echo_SMB1(self, data, callback, errback, timeout = 30):
         messages_history = [ ]
 
+        if not isinstance(data, type(b'')):
+            raise TypeError('Echo data must be %s not %s' % (type(b'').__name__, type(data).__name__))
+
         def echoCB(echo_message, **kwargs):
             messages_history.append(echo_message)
             if not echo_message.status.hasError:
@@ -2570,15 +2808,23 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Echo failed', messages_history))
 
-        m = SMBMessage(ComEchoRequest(echo_data = data))
+        m = SMBMessage(self, ComEchoRequest(echo_data = data))
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
         messages_history.append(m)
 
+    def _extractLastPathComponent(self, path):
+        return path.replace('\\', '/').split('/')[-1]
+
 
 class SharedDevice:
     """
     Contains information about a single shared device on the remote server.
+
+    The following attributes are available:
+
+    * name : An unicode string containing the name of the shared device
+    * comments : An unicode string containing the user description of the shared device
     """
 
     # The following constants are taken from [MS-SRVS]: 2.2.2.4
@@ -2634,18 +2880,32 @@ class SharedFile:
     If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
     to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
     one of these prohibited characters: "\/[]:+|<>=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).
+
+    The following attributes are available:
+
+    * create_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
+    * last_access_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
+    * last_write_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
+    * last_attr_change_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
+    * file_size : File size in number of bytes
+    * alloc_size : Total number of bytes allocated to store this file
+    * file_attributes : A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
+    * short_name : Unicode string containing the short name of this file (usually in 8.3 notation)
+    * filename : Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
+    * file_id : Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
     """
 
-    def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename):
+    def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename, file_id=None):
         self.create_time = create_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
         self.last_access_time = last_access_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
         self.last_write_time = last_write_time    #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
         self.last_attr_change_time = last_attr_change_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
         self.file_size = file_size   #: File size in number of bytes
         self.alloc_size = alloc_size #: Total number of bytes allocated to store this file
-        self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3
+        self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
         self.short_name = short_name #: Unicode string containing the short name of this file (usually in 8.3 notation)
         self.filename = filename     #: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
+        self.file_id = file_id       #: Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
 
     @property
     def isDirectory(self):
@@ -2657,6 +2917,16 @@ class SharedFile:
         """A convenient property to return True if this file resource is read-only on the remote server"""
         return bool(self.file_attributes & ATTR_READONLY)
 
+    @property
+    def isNormal(self):
+        """
+        A convenient property to return True if this is a normal file.
+
+        Note that pysmb defines a normal file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+        """
+        return (self.file_attributes==ATTR_NORMAL) or ((self.file_attributes & 0xff)==0)
+
     def __unicode__(self):
         return u'Shared file: %s (FileSize:%d bytes, isDirectory:%s)' % ( self.filename, self.file_size, self.isDirectory )
 
diff --git a/python2/smb/security_descriptors.py b/python2/smb/security_descriptors.py
new file mode 100644
index 00000000..9e6ebe14
--- /dev/null
+++ b/python2/smb/security_descriptors.py
@@ -0,0 +1,367 @@
+"""
+This module implements security descriptors, and the partial structures
+used in them, as specified in [MS-DTYP].
+"""
+
+import struct
+
+
+# Security descriptor control flags
+# [MS-DTYP]: 2.4.6
+SECURITY_DESCRIPTOR_OWNER_DEFAULTED = 0x0001
+SECURITY_DESCRIPTOR_GROUP_DEFAULTED = 0x0002
+SECURITY_DESCRIPTOR_DACL_PRESENT = 0x0004
+SECURITY_DESCRIPTOR_DACL_DEFAULTED = 0x0008
+SECURITY_DESCRIPTOR_SACL_PRESENT = 0x0010
+SECURITY_DESCRIPTOR_SACL_DEFAULTED = 0x0020
+SECURITY_DESCRIPTOR_SERVER_SECURITY = 0x0040
+SECURITY_DESCRIPTOR_DACL_TRUSTED = 0x0080
+SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED = 0x0100
+SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED = 0x0200
+SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED = 0x0400
+SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED = 0x0800
+SECURITY_DESCRIPTOR_DACL_PROTECTED = 0x1000
+SECURITY_DESCRIPTOR_SACL_PROTECTED = 0x2000
+SECURITY_DESCRIPTOR_RM_CONTROL_VALID = 0x4000
+SECURITY_DESCRIPTOR_SELF_RELATIVE = 0x8000
+
+# ACE types
+# [MS-DTYP]: 2.4.4.1
+ACE_TYPE_ACCESS_ALLOWED = 0x00
+ACE_TYPE_ACCESS_DENIED = 0x01
+ACE_TYPE_SYSTEM_AUDIT = 0x02
+ACE_TYPE_SYSTEM_ALARM = 0x03
+ACE_TYPE_ACCESS_ALLOWED_COMPOUND = 0x04
+ACE_TYPE_ACCESS_ALLOWED_OBJECT = 0x05
+ACE_TYPE_ACCESS_DENIED_OBJECT = 0x06
+ACE_TYPE_SYSTEM_AUDIT_OBJECT = 0x07
+ACE_TYPE_SYSTEM_ALARM_OBJECT = 0x08
+ACE_TYPE_ACCESS_ALLOWED_CALLBACK = 0x09
+ACE_TYPE_ACCESS_DENIED_CALLBACK = 0x0A
+ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0x0B
+ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0x0C
+ACE_TYPE_SYSTEM_AUDIT_CALLBACK = 0x0D
+ACE_TYPE_SYSTEM_ALARM_CALLBACK = 0x0E
+ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0x0F
+ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10
+ACE_TYPE_SYSTEM_MANDATORY_LABEL = 0x11
+ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE = 0x12
+ACE_TYPE_SYSTEM_SCOPED_POLICY_ID = 0x13
+
+# ACE flags
+# [MS-DTYP]: 2.4.4.1
+ACE_FLAG_OBJECT_INHERIT = 0x01
+ACE_FLAG_CONTAINER_INHERIT = 0x02
+ACE_FLAG_NO_PROPAGATE_INHERIT = 0x04
+ACE_FLAG_INHERIT_ONLY = 0x08
+ACE_FLAG_INHERITED = 0x10
+ACE_FLAG_SUCCESSFUL_ACCESS = 0x40
+ACE_FLAG_FAILED_ACCESS = 0x80
+
+# Pre-defined well-known SIDs
+# [MS-DTYP]: 2.4.2.4
+SID_NULL = "S-1-0-0"
+SID_EVERYONE = "S-1-1-0"
+SID_LOCAL = "S-1-2-0"
+SID_CONSOLE_LOGON = "S-1-2-1"
+SID_CREATOR_OWNER = "S-1-3-0"
+SID_CREATOR_GROUP = "S-1-3-1"
+SID_OWNER_SERVER = "S-1-3-2"
+SID_GROUP_SERVER = "S-1-3-3"
+SID_OWNER_RIGHTS = "S-1-3-4"
+SID_NT_AUTHORITY = "S-1-5"
+SID_DIALUP = "S-1-5-1"
+SID_NETWORK = "S-1-5-2"
+SID_BATCH = "S-1-5-3"
+SID_INTERACTIVE = "S-1-5-4"
+SID_SERVICE = "S-1-5-6"
+SID_ANONYMOUS = "S-1-5-7"
+SID_PROXY = "S-1-5-8"
+SID_ENTERPRISE_DOMAIN_CONTROLLERS = "S-1-5-9"
+SID_PRINCIPAL_SELF = "S-1-5-10"
+SID_AUTHENTICATED_USERS = "S-1-5-11"
+SID_RESTRICTED_CODE = "S-1-5-12"
+SID_TERMINAL_SERVER_USER = "S-1-5-13"
+SID_REMOTE_INTERACTIVE_LOGON = "S-1-5-14"
+SID_THIS_ORGANIZATION = "S-1-5-15"
+SID_IUSR = "S-1-5-17"
+SID_LOCAL_SYSTEM = "S-1-5-18"
+SID_LOCAL_SERVICE = "S-1-5-19"
+SID_NETWORK_SERVICE = "S-1-5-20"
+SID_COMPOUNDED_AUTHENTICATION = "S-1-5-21-0-0-0-496"
+SID_CLAIMS_VALID = "S-1-5-21-0-0-0-497"
+SID_BUILTIN_ADMINISTRATORS = "S-1-5-32-544"
+SID_BUILTIN_USERS = "S-1-5-32-545"
+SID_BUILTIN_GUESTS = "S-1-5-32-546"
+SID_POWER_USERS = "S-1-5-32-547"
+SID_ACCOUNT_OPERATORS = "S-1-5-32-548"
+SID_SERVER_OPERATORS = "S-1-5-32-549"
+SID_PRINTER_OPERATORS = "S-1-5-32-550"
+SID_BACKUP_OPERATORS = "S-1-5-32-551"
+SID_REPLICATOR = "S-1-5-32-552"
+SID_ALIAS_PREW2KCOMPACC = "S-1-5-32-554"
+SID_REMOTE_DESKTOP = "S-1-5-32-555"
+SID_NETWORK_CONFIGURATION_OPS = "S-1-5-32-556"
+SID_INCOMING_FOREST_TRUST_BUILDERS = "S-1-5-32-557"
+SID_PERFMON_USERS = "S-1-5-32-558"
+SID_PERFLOG_USERS = "S-1-5-32-559"
+SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP = "S-1-5-32-560"
+SID_TERMINAL_SERVER_LICENSE_SERVERS = "S-1-5-32-561"
+SID_DISTRIBUTED_COM_USERS = "S-1-5-32-562"
+SID_IIS_IUSRS = "S-1-5-32-568"
+SID_CRYPTOGRAPHIC_OPERATORS = "S-1-5-32-569"
+SID_EVENT_LOG_READERS = "S-1-5-32-573"
+SID_CERTIFICATE_SERVICE_DCOM_ACCESS = "S-1-5-32-574"
+SID_RDS_REMOTE_ACCESS_SERVERS = "S-1-5-32-575"
+SID_RDS_ENDPOINT_SERVERS = "S-1-5-32-576"
+SID_RDS_MANAGEMENT_SERVERS = "S-1-5-32-577"
+SID_HYPER_V_ADMINS = "S-1-5-32-578"
+SID_ACCESS_CONTROL_ASSISTANCE_OPS = "S-1-5-32-579"
+SID_REMOTE_MANAGEMENT_USERS = "S-1-5-32-580"
+SID_WRITE_RESTRICTED_CODE = "S-1-5-33"
+SID_NTLM_AUTHENTICATION = "S-1-5-64-10"
+SID_SCHANNEL_AUTHENTICATION = "S-1-5-64-14"
+SID_DIGEST_AUTHENTICATION = "S-1-5-64-21"
+SID_THIS_ORGANIZATION_CERTIFICATE = "S-1-5-65-1"
+SID_NT_SERVICE = "S-1-5-80"
+SID_USER_MODE_DRIVERS = "S-1-5-84-0-0-0-0-0"
+SID_LOCAL_ACCOUNT = "S-1-5-113"
+SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP = "S-1-5-114"
+SID_OTHER_ORGANIZATION = "S-1-5-1000"
+SID_ALL_APP_PACKAGES = "S-1-15-2-1"
+SID_ML_UNTRUSTED = "S-1-16-0"
+SID_ML_LOW = "S-1-16-4096"
+SID_ML_MEDIUM = "S-1-16-8192"
+SID_ML_MEDIUM_PLUS = "S-1-16-8448"
+SID_ML_HIGH = "S-1-16-12288"
+SID_ML_SYSTEM = "S-1-16-16384"
+SID_ML_PROTECTED_PROCESS = "S-1-16-20480"
+SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY = "S-1-18-1"
+SID_SERVICE_ASSERTED_IDENTITY = "S-1-18-2"
+SID_FRESH_PUBLIC_KEY_IDENTITY = "S-1-18-3"
+SID_KEY_TRUST_IDENTITY = "S-1-18-4"
+SID_KEY_PROPERTY_MFA = "S-1-18-5"
+SID_KEY_PROPERTY_ATTESTATION = "S-1-18-6"
+
+
+class SID(object):
+    """
+    A Windows security identifier. Represents a single principal, such a
+    user or a group, as a sequence of numbers consisting of the revision,
+    identifier authority, and a variable-length list of subauthorities.
+
+    See [MS-DTYP]: 2.4.2
+    """
+    def __init__(self, revision, identifier_authority, subauthorities):
+        #: Revision, should always be 1.
+        self.revision = revision
+        #: An integer representing the identifier authority.
+        self.identifier_authority = identifier_authority
+        #: A list of integers representing all subauthorities.
+        self.subauthorities = subauthorities
+
+    def __str__(self):
+        """
+        String representation, as specified in [MS-DTYP]: 2.4.2.1
+        """
+        if self.identifier_authority >= 2**32:
+            id_auth = '%#x' % (self.identifier_authority,)
+        else:
+            id_auth = self.identifier_authority
+        auths = [self.revision, id_auth] + self.subauthorities
+        return 'S-' + '-'.join(str(subauth) for subauth in auths)
+
+    def __repr__(self):
+        return 'SID(%r)' % (str(self),)
+
+    @classmethod
+    def from_bytes(cls, data, return_tail=False):
+        revision, subauth_count = struct.unpack('<BB', data[:2])
+        identifier_authority = struct.unpack('>Q', '\x00\x00' + data[2:8])[0]
+        subauth_data = data[8:]
+        subauthorities = [struct.unpack('<L', subauth_data[4 * i : 4 * (i+1)])[0]
+                          for i in range(subauth_count)]
+        sid = cls(revision, identifier_authority, subauthorities)
+        if return_tail:
+            return sid, subauth_data[4 * subauth_count :]
+        return sid
+
+
+class ACE(object):
+    """
+    Represents a single access control entry.
+
+    See [MS-DTYP]: 2.4.4
+    """
+    HEADER_FORMAT = '<BBH'
+
+    def __init__(self, type_, flags, mask, sid, additional_data):
+        #: An integer representing the type of the ACE. One of the
+        #: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field
+        #: from [MS-DTYP] 2.4.4.1.
+        self.type = type_
+        #: An integer bitmask with ACE flags, corresponds to the
+        #: ``AceFlags`` field.
+        self.flags = flags
+        #: An integer representing the ``ACCESS_MASK`` as specified in
+        #: [MS-DTYP] 2.4.3.
+        self.mask = mask
+        #: The :class:`SID` of a trustee.
+        self.sid = sid
+        #: A dictionary of additional fields present in the ACE, depending
+        #: on the type. The following fields can be present:
+        #:
+        #: * ``flags``
+        #: * ``object_type``
+        #: * ``inherited_object_type``
+        #: * ``application_data``
+        #: * ``attribute_data``
+        self.additional_data = additional_data
+
+    def __repr__(self):
+        return "ACE(type=%#04x, flags=%#04x, mask=%#010x, sid=%s)" % (
+            self.type, self.flags, self.mask, self.sid,
+        )
+
+    @property
+    def isInheritOnly(self):
+        """Convenience property which indicates if this ACE is inherit
+        only, meaning that it doesn't apply to the object itself."""
+        return bool(self.flags & ACE_FLAG_INHERIT_ONLY)
+
+    @classmethod
+    def from_bytes(cls, data):
+        header_size = struct.calcsize(cls.HEADER_FORMAT)
+        header = data[:header_size]
+        type_, flags, size = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert len(data) >= size
+
+        body = data[header_size:size]
+        additional_data = {}
+
+        # In all ACE types, the mask immediately follows the header.
+        mask = struct.unpack('<I', body[:4])[0]
+        body = body[4:]
+
+        # All OBJECT-type ACEs contain additional flags, and two GUIDs as
+        # the following fields.
+        if type_ in (ACE_TYPE_ACCESS_ALLOWED_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_OBJECT,
+                     ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
+            additional_data['flags'] = struct.unpack('<I', body[:4])[0]
+            additional_data['object_type'] = body[4:20]
+            additional_data['inherited_object_type'] = body[20:36]
+            body = body[36:]
+
+        # Then the SID in all types.
+        sid, body = SID.from_bytes(body, return_tail=True)
+
+        # CALLBACK-type ACEs (and for some obscure reason,
+        # SYSTEM_AUDIT_OBJECT) have a final tail of application data.
+        if type_ in (ACE_TYPE_ACCESS_ALLOWED_CALLBACK,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK,
+                     ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
+            additional_data['application_data'] = body
+
+        # SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.
+        if type_ == ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE:
+            additional_data['attribute_data'] = body
+
+        return cls(type_, flags, mask, sid, additional_data)
+
+
+class ACL(object):
+    """
+    Access control list, encapsulating a sequence of access control
+    entries.
+
+    See [MS-DTYP]: 2.4.5
+    """
+    HEADER_FORMAT = '<BBHHH'
+
+    def __init__(self, revision, aces):
+        #: Integer value of the revision.
+        self.revision = revision
+        #: List of :class:`ACE` instances.
+        self.aces = aces
+
+    def __repr__(self):
+        return "ACL(%r)" % (self.aces,)
+
+    @classmethod
+    def from_bytes(cls, data):
+        revision = None
+        aces = []
+
+        header_size = struct.calcsize(cls.HEADER_FORMAT)
+        header, remaining = data[:header_size], data[header_size:]
+        revision, sbz1, size, count, sbz2 = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert len(data) >= size
+
+        for i in range(count):
+            ace_size = struct.unpack('<H', remaining[2:4])[0]
+            ace_data, remaining = remaining[:ace_size], remaining[ace_size:]
+            aces.append(ACE.from_bytes(ace_data))
+
+        return cls(revision, aces)
+
+
+class SecurityDescriptor(object):
+    """
+    Represents a security descriptor.
+
+    See [MS-DTYP]: 2.4.6
+    """
+
+    HEADER_FORMAT = '<BBHIIII'
+
+    def __init__(self, flags, owner, group, dacl, sacl):
+        #: Integer bitmask of control flags. Corresponds to the
+        #: ``Control`` field in [MS-DTYP] 2.4.6.
+        self.flags = flags
+        #: Instance of :class:`SID` representing the owner user.
+        self.owner = owner
+        #: Instance of :class:`SID` representing the owner group.
+        self.group = group
+        #: Instance of :class:`ACL` representing the discretionary access
+        #: control list, which specifies access restrictions of an object.
+        self.dacl = dacl
+        #: Instance of :class:`ACL` representing the system access control
+        #: list, which specifies audit logging of an object.
+        self.sacl = sacl
+
+    @classmethod
+    def from_bytes(cls, data):
+        owner = None
+        group = None
+        dacl = None
+        sacl = None
+
+        header = data[:struct.calcsize(cls.HEADER_FORMAT)]
+        (revision, sbz1, flags, owner_offset, group_offset, sacl_offset,
+         dacl_offset) = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert revision == 1
+        assert flags & SECURITY_DESCRIPTOR_SELF_RELATIVE
+        for offset in (owner_offset, group_offset, sacl_offset, dacl_offset):
+            assert 0 <= offset < len(data)
+
+        if owner_offset:
+            owner = SID.from_bytes(data[owner_offset:])
+        if group_offset:
+            group = SID.from_bytes(data[group_offset:])
+        if dacl_offset:
+            dacl = ACL.from_bytes(data[dacl_offset:])
+        if sacl_offset:
+            sacl = ACL.from_bytes(data[sacl_offset:])
+
+        return cls(flags, owner, group, dacl, sacl)
diff --git a/python2/smb/smb2_constants.py b/python2/smb/smb2_constants.py
index 71ef74be..024ed2c4 100644
--- a/python2/smb/smb2_constants.py
+++ b/python2/smb/smb2_constants.py
@@ -50,9 +50,12 @@ SMB2_COMMAND_NAMES = {
 }
 
 # Values for dialect_revision field in SMB2NegotiateResponse class
-SMB2_DIALECT_2 = 0x0202
-SMB2_DIALECT_21 = 0x0210
-SMB2_DIALECT_2ALL = 0x02FF
+SMB2_DIALECT_2 = 0x0202  # 2.0.2 - First SMB2 version
+SMB2_DIALECT_21 = 0x0210  # 2.1 - Windows 7
+SMB2_DIALET_30 = 0x0300  # 3.0 - Windows 8
+SMB2_DIALECT_302 = 0x0302  # 3.0.2 - Windows 8.1
+SMB2_DIALECT_311 = 0x0311  # 3.1.1 - Windows 10
+SMB2_DIALECT_2ALL = 0x02FF  # Wildcard (for negotiation only)
 
 # Bit mask for SecurityMode field in SMB2NegotiateResponse class
 SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001
@@ -66,6 +69,17 @@ SMB2_SHARE_TYPE_PRINTER = 0x03
 # Bitmask for Capabilities in SMB2TreeConnectResponse class
 SMB2_SHARE_CAP_DFS = 0x0008
 
+
+# SMB 2.1 / 3 Capabilities flags
+SMB2_GLOBAL_CAP_DFS = 0x01
+SMB2_GLOBAL_CAP_LEASING = 0x02
+SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
+SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
+SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
+SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
+SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
+
+
 # Values for OpLockLevel field in SMB2CreateRequest class
 SMB2_OPLOCK_LEVEL_NONE = 0x00
 SMB2_OPLOCK_LEVEL_II = 0x01
diff --git a/python2/smb/smb2_structs.py b/python2/smb/smb2_structs.py
index 8a1eae81..2e13b491 100644
--- a/python2/smb/smb2_structs.py
+++ b/python2/smb/smb2_structs.py
@@ -1,5 +1,5 @@
 
-import os, sys, struct, types, logging, binascii, time
+import os, sys, struct, types, logging, binascii, time, uuid
 from StringIO import StringIO
 from smb_structs import ProtocolError
 from smb_constants import *
@@ -23,8 +23,15 @@ class SMB2Message:
     log = logging.getLogger('SMB.SMB2Message')
     protocol = 2
 
-    def __init__(self, payload = None):
+
+    def __init__(self, conn = None, payload = None):
+        """
+        Initialise a new SMB2 Message.
+        conn - reference to the connection, the SMB class
+        payload - the message payload, if any
+        """
         self.reset()
+        self.conn = conn
         if payload:
             self.payload = payload
             self.payload.initMessage(self)
@@ -60,6 +67,10 @@ class SMB2Message:
         self.pid = 0
         self.tid = 0
 
+        # credit related
+        self.credit_charge = 0
+        self.credit_request = 1
+
         # Not used in this class. Maintained for compatibility with SMBMessage class
         self.flags2 = 0
         self.uid = 0
@@ -69,18 +80,66 @@ class SMB2Message:
     def encode(self):
         """
         Encode this SMB2 message into a series of bytes suitable to be embedded with a NetBIOS session message.
+        AssertionError will be raised if this SMB message has not been initialized with an SMB instance
         AssertionError will be raised if this SMB message has not been initialized with a Payload instance
 
+        The header format is:
+        - Protocol ID
+        - Structure Size
+        - Credit Charge
+        - Status / Channel Sequence
+        - Command
+        - Credit Request / Credit Response
+        - Flags
+        - Next Compound
+        - MessageId
+        - Reserved
+        - TreeId
+        - Session ID
+        - Signature
+
         @return: a string containing the encoded SMB2 message
         """
         assert self.payload
+        assert self.conn
 
         self.pid = os.getpid()
         self.payload.prepare(self)
 
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        # This only applies to SMB2ReadRequest, SMB2WriteRequest, SMB2IoctlRequest and SMB2QueryDirectory
+        # See: MS-SMB2 3.2.4.1.5: For all other requests, the client MUST set CreditCharge to 1, even if the
+        # payload size of a request or the anticipated response is greater than 65536.
+        if self.conn.smb2_dialect != SMB2_DIALECT_2:
+            if self.conn.cap_multi_credit:
+                # self.credit_charge will be set by some commands if necessary (Read/Write/Ioctl/QueryDirectory)
+                # If not set, but dialect is SMB 2.1 or above, we must set it to 1
+                if self.credit_charge is 0:
+                    self.credit_charge = 1
+            else:
+                # If >= SMB 2.1, but server does not support multi credit operations we must set to 1
+                self.credit_charge = 1
+
+        if self.mid > 3:
+            self.credit_request = 127
+
         headers_data = struct.pack(self.HEADER_STRUCT_FORMAT,
-                                   '\xFESMB', self.HEADER_SIZE, 0, self.status, self.command, 0, self.flags) + \
-                       struct.pack(self.SYNC_HEADER_STRUCT_FORMAT, self.next_command_offset, self.mid, self.pid, self.tid, self.session_id, self.signature)
+                                   '\xFESMB',  # Protocol ID
+                                   self.HEADER_SIZE,  # Structure Size
+                                   self.credit_charge,  # Credit Charge
+                                   self.status,  # Status / Channel Sequence
+                                   self.command,  # Command
+                                   self.credit_request,  # Credit Request / Credit Response
+                                   self.flags, # Flags
+                                   ) + \
+                       struct.pack(self.SYNC_HEADER_STRUCT_FORMAT,
+                                    self.next_command_offset, # Next Compound
+                                    self.mid,  # Message ID
+                                    self.pid,  # Process ID
+                                    self.tid,  # Tree ID
+                                    self.session_id,  # Session ID
+                                    self.signature)  # Signature
         return headers_data + self.data
 
     def decode(self, buf):
@@ -106,7 +165,8 @@ class SMB2Message:
         self.reset()
 
         protocol, struct_size, self.credit_charge, self.status, \
-            self.command, self.credit_re, self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
+            self.command, self.credit_response, \
+            self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
 
         if protocol != '\xFESMB':
             raise ProtocolError('Invalid 4-byte SMB2 protocol field', buf)
@@ -189,6 +249,53 @@ class Structure:
         raise NotImplementedError
 
 
+class SMB2NegotiateRequest(Structure):
+    """
+    2.2.3 SMB2 NEGOTIATE Request
+    The SMB2 NEGOTIATE Request packet is used by the client to notify the server what dialects of the SMB 2 Protocol
+    the client understands. This request is composed of an SMB2 header, as specified in section 2.2.1,
+    followed by this request structure:
+
+    SMB2 Negotiate Request Packet structure:
+        StructureSize (2 bytes)
+        DialectCount (2 bytes)
+        SecurityMode (2 bytes)
+        Reserved (2 bytes)
+        Capabilities (4 bytes)
+        ClientGuid (16 bytes)
+        ClientStartTime (8 bytes):
+        ClientStartTime (8 bytes):
+        Dialects (variable): An array of one or more 16-bit integers
+
+    References:
+    ===========
+    - [MS-SMB2]: 2.2.3
+
+    """
+
+
+    STRUCTURE_FORMAT = "<HHHHI16sQHH"
+    STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
+
+    def initMessage(self, message):
+        Structure.initMessage(self, message)
+        message.command = SMB2_COM_NEGOTIATE
+
+    def prepare(self, message):
+        # TODO! Do we need to save the GUID and present it later in other requests?
+        # The SMB docs don't exactly explain what the guid is for
+        message.data = struct.pack(self.STRUCTURE_FORMAT,
+                                   36,           # Structure size. Must be 36 as mandated by [MS-SMB2] 2.2.3
+                                   2,            # DialectCount
+                                   0x01,         # Security mode
+                                   0,            # Reserved
+                                   0x00,         # Capabilities
+                                   uuid.uuid4().bytes, # Client GUID
+                                   0,            # Client start time
+                                   SMB2_DIALECT_2,
+                                   SMB2_DIALECT_21)
+
+
 class SMB2NegotiateResponse(Structure):
     """
     Contains information on the SMB2_NEGOTIATE response from server
@@ -223,6 +330,7 @@ class SMB2NegotiateResponse(Structure):
             self.server_start_time = convertFILETIMEtoEpoch(self.server_start_time)
             self.system_time = convertFILETIMEtoEpoch(self.system_time)
             self.security_blob = message.raw_data[security_buf_offset:security_buf_offset+security_buf_len]
+            message.conn.smb2_dialect = self.dialect_revision
 
 
 class SMB2SessionSetupRequest(Structure):
@@ -270,6 +378,14 @@ class SMB2SessionSetupResponse(Structure):
     STRUCTURE_FORMAT = "<HHHH"
     STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
 
+    @property
+    def isGuestSession(self):
+        return (self.session_flags & 0x0001) > 0   # SMB2_SESSION_FLAG_IS_GUEST
+
+    @property
+    def isAnonymousSession(self):
+        return (self.session_flags & 0x0002) > 0   # SMB2_SESSION_FLAG_IS_NULL
+
     def decode(self, message):
         assert message.command == SMB2_COM_SESSION_SETUP
 
@@ -465,6 +581,13 @@ class SMB2WriteRequest(Structure):
                                    0,  # WriteChannelInfoLength
                                    self.flags) + self.data
 
+        # MS-SMB2 3.2.4.7
+        # If a client requests writing to a file, Connection.Dialect is not "2.0.2", and if
+        # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
+        # to ( 1 + (Length - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (len(self.data) -1) / 65536)
+
 
 class SMB2WriteResponse(Structure):
     """
@@ -523,6 +646,13 @@ class SMB2ReadRequest(Structure):
                                    0     # ReadChannelInfoLength
                                   ) + '\0'
 
+        # MS-SMB2 3.2.4.6
+        # If a client requests reading from a file, Connection.Dialect is not "2.0.2", and if
+        # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
+        # to ( 1 + (Length - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (self.read_len -1) / 65536)
+
 
 class SMB2ReadResponse(Structure):
     """
@@ -579,6 +709,11 @@ class SMB2IoctlRequest(Structure):
                                    0    # Reserved
                                   ) + self.in_data
 
+        # If Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header
+        # SHOULD be set to (max(InputCount, MaxOutputResponse) - 1) / 65536 + 1
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int((max(len(self.in_data), self.max_out_size) - 1) / 65536 + 1)
+
 
 class SMB2IoctlResponse(Structure):
     """
@@ -687,6 +822,12 @@ class SMB2QueryDirectoryRequest(Structure):
                                    len(self.filename)*2,
                                    self.output_buf_len) + self.filename.encode('UTF-16LE')
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (self.output_buf_len -1) / 65536)
+
 
 class SMB2QueryDirectoryResponse(Structure):
     """
@@ -749,6 +890,12 @@ class SMB2QueryInfoRequest(Structure):
                                    self.fid                # FileId
                                   ) + self.input_buf
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + ((self.output_buf_len + len(self.input_buf)) -1) / 65536)
+
 
 class SMB2QueryInfoResponse(Structure):
     """
@@ -807,6 +954,12 @@ class SMB2SetInfoRequest(Structure):
                                    self.fid               # FileId
                                   ) + self.data
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (len(self.data) -1) / 65536)
+
 class SMB2SetInfoResponse(Structure):
     """
     References:
diff --git a/python2/smb/smb_constants.py b/python2/smb/smb_constants.py
index 79a7514c..99476802 100644
--- a/python2/smb/smb_constants.py
+++ b/python2/smb/smb_constants.py
@@ -115,6 +115,7 @@ FILE_APPEND_DATA = 0x04
 FILE_READ_EA = 0x08
 FILE_WRITE_EA = 0x10
 FILE_EXECUTE = 0x20
+FILE_DELETE_CHILD = 0x40
 FILE_READ_ATTRIBUTES = 0x80
 FILE_WRITE_ATTRIBUTES = 0x0100
 DELETE = 0x010000
@@ -225,9 +226,13 @@ SMB_FILE_ATTRIBUTE_NORMAL = 0x00
 SMB_FILE_ATTRIBUTE_READONLY = 0x01
 SMB_FILE_ATTRIBUTE_HIDDEN = 0x02
 SMB_FILE_ATTRIBUTE_SYSTEM = 0x04
-SMB_FILE_ATTRIBUTE_VOLUME = 0x08
+SMB_FILE_ATTRIBUTE_VOLUME = 0x08  # Unsupported for listPath() operations
 SMB_FILE_ATTRIBUTE_DIRECTORY = 0x10
 SMB_FILE_ATTRIBUTE_ARCHIVE = 0x20
+# SMB_FILE_ATTRIBUTE_INCL_NORMAL is a special placeholder to include normal files for
+# with other search attributes for listPath() operations. It is not defined in the MS-CIFS specs.
+SMB_FILE_ATTRIBUTE_INCL_NORMAL = 0x10000
+# Do not use the following values for listPath() operations as they are not supported for SMB2
 SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
 SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
 SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
@@ -237,3 +242,16 @@ SMB_SEARCH_ATTRIBUTE_ARCHIVE = 0x2000
 # Bitmask for OptionalSupport field in SMB_COM_TREE_CONNECT_ANDX response
 SMB_TREE_CONNECTX_SUPPORT_SEARCH = 0x0001
 SMB_TREE_CONNECTX_SUPPORT_DFS = 0x0002
+
+# Bitmask for security information fields, specified as
+# AdditionalInformation in SMB2
+# [MS-SMB]: 2.2.7.4
+# [MS-SMB2]: 2.2.37
+OWNER_SECURITY_INFORMATION = 0x00000001
+GROUP_SECURITY_INFORMATION = 0x00000002
+DACL_SECURITY_INFORMATION = 0x00000004
+SACL_SECURITY_INFORMATION = 0x00000008
+LABEL_SECURITY_INFORMATION = 0x00000010
+ATTRIBUTE_SECURITY_INFORMATION = 0x00000020
+SCOPE_SECURITY_INFORMATION = 0x00000040
+BACKUP_SECURITY_INFORMATION = 0x00010000
diff --git a/python2/smb/smb_structs.py b/python2/smb/smb_structs.py
index 8fab1d65..aa81ac9c 100644
--- a/python2/smb/smb_structs.py
+++ b/python2/smb/smb_structs.py
@@ -10,17 +10,20 @@ SUPPORT_EXTENDED_SECURITY = True
 # Set to True if you want to enable SMB2 protocol.
 SUPPORT_SMB2 = True
 
-# Supported dialects
-DIALECTS = [ ]
-for i, ( name, dialect ) in enumerate([ ( 'NT_LAN_MANAGER_DIALECT', 'NT LM 0.12' ), ]):
-    DIALECTS.append(dialect)
-    globals()[name] = i
+# Set to True if you want to enable SMB2.1 and above protocol.
+SUPPORT_SMB2x = True
 
-DIALECTS2 = [ ]
-for i, ( name, dialect ) in enumerate([ ( 'SMB2_DIALECT', 'SMB 2.002' ) ]):
-    DIALECTS2.append(dialect)
-    globals()[name] = i + len(DIALECTS)
+# Supported dialects
+NT_LAN_MANAGER_DIALECT = 0  # 'NT LM 0.12' is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)
 
+# Return the list of support SMB dialects based on the SUPPORT_x constants
+def init_dialects_list():
+    dialects = [ 'NT LM 0.12' ]
+    if SUPPORT_SMB2:
+        dialects.append('SMB 2.002')
+    if SUPPORT_SMB2x:
+        dialects.append('SMB 2.???')
+    return dialects
 
 class UnsupportedFeature(Exception):
     """
@@ -108,8 +111,9 @@ class SMBMessage:
     log = logging.getLogger('SMB.SMBMessage')
     protocol = 1
 
-    def __init__(self, payload = None):
+    def __init__(self, conn, payload = None):
         self.reset()
+        self.conn = conn
         if payload:
             self.payload = payload
             self.payload.initMessage(self)
@@ -290,10 +294,7 @@ class ComNegotiateRequest(Payload):
     def prepare(self, message):
         assert message.payload == self
         message.parameters_data = ''
-        if SUPPORT_SMB2:
-            message.data = ''.join(map(lambda s: '\x02'+s+'\x00', DIALECTS + DIALECTS2))
-        else:
-            message.data = ''.join(map(lambda s: '\x02'+s+'\x00', DIALECTS))
+        message.data = ''.join(map(lambda s: '\x02'+s+'\x00', init_dialects_list()))
 
 
 class ComNegotiateResponse(Payload):
@@ -1280,7 +1281,7 @@ class ComEchoRequest(Payload):
     - [MS-CIFS]: 2.2.4.39.1
     """
 
-    def __init__(self, echo_data = '', echo_count = 1):
+    def __init__(self, echo_data = b'', echo_count = 1):
         self.echo_count = echo_count
         self.echo_data = echo_data
 
diff --git a/python2/tests/DirectSMBConnectionTests/test_auth.py b/python2/tests/DirectSMBConnectionTests/test_auth.py
index 3af7843d..a213dc50 100644
--- a/python2/tests/DirectSMBConnectionTests/test_auth.py
+++ b/python2/tests/DirectSMBConnectionTests/test_auth.py
@@ -4,40 +4,69 @@ from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
 
-conn = None
+conn, conn2, conn3 = None, None, None
 
 def teardown_func():
-    global conn
-    conn.close()
+    global conn, conn2, conn3
+    if conn:
+        conn.close()
+    if conn2:
+        conn2.close()
+    if conn3:
+        conn3.close();
 
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
+
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
diff --git a/python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py b/python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
index 3cbcfe7b..38862b71 100644
--- a/python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+++ b/python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
@@ -2,6 +2,7 @@
 
 import os, time, random
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -10,18 +11,27 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -48,6 +58,25 @@ def test_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
@@ -82,6 +111,25 @@ def test_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
diff --git a/python2/tests/DirectSMBConnectionTests/test_echo.py b/python2/tests/DirectSMBConnectionTests/test_echo.py
index 33759727..f86f8ccf 100644
--- a/python2/tests/DirectSMBConnectionTests/test_echo.py
+++ b/python2/tests/DirectSMBConnectionTests/test_echo.py
@@ -9,7 +9,7 @@ conn = None
 def setup_func():
     global conn
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -22,4 +22,3 @@ def test_echo():
 
     data = '%d' % random.randint(1000, 9999)
     assert conn.echo(data) == data
-    
diff --git a/python2/tests/DirectSMBConnectionTests/test_listpath.py b/python2/tests/DirectSMBConnectionTests/test_listpath.py
index 9d706b57..bbc38e8e 100644
--- a/python2/tests/DirectSMBConnectionTests/test_listpath.py
+++ b/python2/tests/DirectSMBConnectionTests/test_listpath.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb_constants import *
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,16 +11,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -45,9 +55,29 @@ def test_listSubPath_SMB1():
     assert ( u'Test Folder', True ) in filenames
     assert ( u'子文件夹', True ) in filenames
 
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames)==999
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/')
     filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
     assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
@@ -59,8 +89,102 @@ def test_listPath_SMB2():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listSubPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
     filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
     assert ( u'Test File.txt', False ) in filenames
     assert ( u'Test Folder', True ) in filenames
     assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listSubPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/Test Folder with Long Name/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathWithManyFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames)==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForDirectory_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForDirectory_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterPattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterPattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterUnicodePattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterUnicodePattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
diff --git a/python2/tests/DirectSMBConnectionTests/test_listshares.py b/python2/tests/DirectSMBConnectionTests/test_listshares.py
index 67c83787..f5ee1e65 100644
--- a/python2/tests/DirectSMBConnectionTests/test_listshares.py
+++ b/python2/tests/DirectSMBConnectionTests/test_listshares.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,16 +9,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -33,5 +42,13 @@ def test_listshares_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listshares_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listShares()
+    assert 'smbtest' in map(lambda r: r.name.lower(), results)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listshares_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listShares()
     assert 'smbtest' in map(lambda r: r.name.lower(), results)
diff --git a/python2/tests/DirectSMBConnectionTests/test_listsnapshots.py b/python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
index dfc661c1..ba1890e0 100644
--- a/python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
+++ b/python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
@@ -10,14 +10,14 @@ def setup_func_SMB1():
     global conn
     smb_structs.SUPPORT_SMB2 = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
diff --git a/python2/tests/DirectSMBConnectionTests/test_rename.py b/python2/tests/DirectSMBConnectionTests/test_rename.py
index f9896fa6..677600ec 100644
--- a/python2/tests/DirectSMBConnectionTests/test_rename.py
+++ b/python2/tests/DirectSMBConnectionTests/test_rename.py
@@ -3,6 +3,7 @@
 import os, time, random
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,16 +12,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -53,6 +62,31 @@ def test_rename_english_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -99,6 +133,31 @@ def test_rename_unicode_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -145,6 +204,31 @@ def test_rename_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -191,6 +275,31 @@ def test_rename_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
     new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
diff --git a/python2/tests/DirectSMBConnectionTests/test_retrievefile.py b/python2/tests/DirectSMBConnectionTests/test_retrievefile.py
index 023d8cee..138d2950 100644
--- a/python2/tests/DirectSMBConnectionTests/test_retrievefile.py
+++ b/python2/tests/DirectSMBConnectionTests/test_retrievefile.py
@@ -3,6 +3,7 @@
 import os, tempfile
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -18,16 +19,27 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -52,6 +64,24 @@ def test_retr_multiplereads_SMB1():
 def test_retr_multiplereads_SMB2():
     # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
+    assert filesize == 158437
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_multiplereads_SMB2x():
+    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
 
@@ -80,6 +110,24 @@ def test_retr_longfilename_SMB1():
 def test_retr_longfilename_SMB2():
     # Test file retrieval that has a long English filename
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
+    assert filesize == 421269
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_longfilename_SMB2x():
+    # Test file retrieval that has a long English filename
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
 
@@ -108,6 +156,24 @@ def test_retr_unicodefilename_SMB1():
 def test_retr_unicodefilename_SMB2():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
+    assert filesize == 256000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_unicodefilename_SMB2x():
+    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
@@ -136,6 +202,24 @@ def test_retr_offset_SMB1():
 def test_retr_offset_SMB2():
     # Test file retrieval from offset to EOF
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
+    assert filesize == 156000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_SMB2x():
+    # Test file retrieval from offset to EOF
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
@@ -164,6 +248,24 @@ def test_retr_offset_and_biglimit_SMB1():
 def test_retr_offset_and_biglimit_SMB2():
     # Test file retrieval from offset with a big max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
+    assert filesize == 100000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_biglimit_SMB2x():
+    # Test file retrieval from offset with a big max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
@@ -192,6 +294,24 @@ def test_retr_offset_and_smalllimit_SMB1():
 def test_retr_offset_and_smalllimit_SMB2():
     # Test file retrieval from offset with a small max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
+    assert filesize == 10
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_smalllimit_SMB2x():
+    # Test file retrieval from offset with a small max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
@@ -220,6 +340,24 @@ def test_retr_offset_and_zerolimit_SMB1():
 def test_retr_offset_and_zerolimit_SMB2():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
+    assert filesize == 0
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_zerolimit_SMB2x():
+    # Test file retrieval from offset to EOF with max_length=0
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
diff --git a/python2/tests/DirectSMBConnectionTests/test_storefile.py b/python2/tests/DirectSMBConnectionTests/test_storefile.py
index a37c24b3..34b58b03 100644
--- a/python2/tests/DirectSMBConnectionTests/test_storefile.py
+++ b/python2/tests/DirectSMBConnectionTests/test_storefile.py
@@ -3,6 +3,7 @@
 import os, tempfile, random, time
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -22,18 +23,24 @@ TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
-
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
 
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -43,6 +50,7 @@ def teardown_func():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_long_filename_SMB1():
+    global conn
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -63,9 +71,58 @@ def test_store_long_filename_SMB1():
 
     conn.deleteFiles('smbtest', filename)
 
+@with_setup(setup_func_SMB1, teardown_func)
+def test_store_from_offset_SMB1():
+    global conn
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = StringIO('0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = StringIO('aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == '01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_long_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_long_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -89,6 +146,7 @@ def test_store_long_filename_SMB2():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_unicode_filename_SMB1():
+    global conn
     filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -112,6 +170,35 @@ def test_store_unicode_filename_SMB1():
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_unicode_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_unicode_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -131,3 +218,52 @@ def test_store_unicode_filename_SMB2():
     buf.close()
 
     conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_store_from_offset_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = StringIO('0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = StringIO('aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == '01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_from_offset_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = StringIO('0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = StringIO('aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    print(pos)
+    assert pos == 7
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == '01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
diff --git a/python2/tests/DirectSMBConnectionTests/util.py b/python2/tests/DirectSMBConnectionTests/util.py
index aa9eb415..12f82afa 100644
--- a/python2/tests/DirectSMBConnectionTests/util.py
+++ b/python2/tests/DirectSMBConnectionTests/util.py
@@ -10,7 +10,7 @@ def getConnectionInfo():
     info = {
         'server_name': cp.get('server', 'name'),
         'server_ip': cp.get('server', 'ip'),
-        'server_port': cp.getint('server', 'port'),
+        'server_port': cp.getint('server', 'direct_port'),
         'client_name': cp.get('client', 'name'),
         'user': cp.get('user', 'name'),
         'password': cp.get('user', 'password'),
diff --git a/python2/tests/README_1st.txt b/python2/tests/README_1st.txt
index aa06a7c9..7e918bf8 100644
--- a/python2/tests/README_1st.txt
+++ b/python2/tests/README_1st.txt
@@ -19,14 +19,14 @@ also need to prepare a shared folder on a remote server.
 pysmb has been tested against Samba 3.x, Windows XP SP3 and Windows Vista.
 The shared folder must be named "smbtest".
 
-3. Unzip smbtest.zip in the Shared Folder
-In the same folder where you are viewing this readme file, there should be a zip file
-called "smbtest.zip". Unzip the contents of this zip file in the shared folder.
+3. Download smbtest.zip from https://miketeo.net/files/Projects/pysmb/smbtest.zip
+Unzip the contents of this zip file in the shared folder.
 
 4. Update Connection Details in connection.ini
 In the same folder where you are viewing this readme file, there should be an ini file
 called "connection.ini". Edit this file's connection details to match the shared folder's
 access information.
 
-5. Run the Unit Tests
-Just run: nosetests
+5. Run the Unit Tests in the python2 folder
+Just run: nosetests -v tests
+or selectively: nosetests -v tests/SMBConnectionTests
diff --git a/python2/tests/SMBConnectionTests/test_auth.py b/python2/tests/SMBConnectionTests/test_auth.py
index 3d55f20b..b28e150c 100644
--- a/python2/tests/SMBConnectionTests/test_auth.py
+++ b/python2/tests/SMBConnectionTests/test_auth.py
@@ -4,40 +4,69 @@ from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
 
-conn = None
+conn, conn2, conn3 = None, None, None
 
 def teardown_func():
-    global conn
-    conn.close()
+    global conn, conn2, conn3
+    if conn:
+        conn.close()
+    if conn2:
+        conn2.close()
+    if conn3:
+        conn3.close();
 
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
+
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
diff --git a/python2/tests/SMBConnectionTests/test_createdeletedirectory.py b/python2/tests/SMBConnectionTests/test_createdeletedirectory.py
index 3cbcfe7b..6430f31e 100644
--- a/python2/tests/SMBConnectionTests/test_createdeletedirectory.py
+++ b/python2/tests/SMBConnectionTests/test_createdeletedirectory.py
@@ -2,6 +2,7 @@
 
 import os, time, random
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -10,7 +11,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -19,6 +20,15 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -48,6 +58,25 @@ def test_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
@@ -82,6 +111,25 @@ def test_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
diff --git a/python2/tests/SMBConnectionTests/test_deletepattern.py b/python2/tests/SMBConnectionTests/test_deletepattern.py
index 23b0774c..3cf5a267 100644
--- a/python2/tests/SMBConnectionTests/test_deletepattern.py
+++ b/python2/tests/SMBConnectionTests/test_deletepattern.py
@@ -3,6 +3,7 @@
 import os, time, random
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,7 +12,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -20,6 +21,15 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -71,6 +81,44 @@ def test_delete_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_delete_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    for filename in [ 'aaTest.txt', 'aaBest.txt', 'aaTest.bin', 'aaBest.bin', 'random.txt' ]:
+        conn.storeFile('smbtest', path+"/"+filename, StringIO("0123456789"))
+
+    results = conn.listPath('smbtest', path)
+    filenames = map(lambda r: r.filename, results)
+    assert 'aaTest.txt' in filenames
+    assert 'aaBest.txt' in filenames
+    assert 'aaTest.bin' in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+    conn.deleteFiles('smbtest', path+'/aa*.txt')
+
+    results = conn.listPath('smbtest', path)
+    filenames = map(lambda r: r.filename, results)
+    assert 'aaTest.txt' not in filenames
+    assert 'aaBest.txt' not in filenames
+    assert 'aaTest.bin' in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+    conn.deleteFiles('smbtest', path+'/aaTest.*')
+
+    results = conn.listPath('smbtest', path)
+    filenames = map(lambda r: r.filename, results)
+    assert 'aaTest.bin' not in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_delete_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
diff --git a/python2/tests/SMBConnectionTests/test_getattributes.py b/python2/tests/SMBConnectionTests/test_getattributes.py
index 738cb524..64185a56 100644
--- a/python2/tests/SMBConnectionTests/test_getattributes.py
+++ b/python2/tests/SMBConnectionTests/test_getattributes.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,7 +10,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -17,6 +19,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -24,33 +36,49 @@ def setup_func_SMB2():
 def teardown_func():
     global conn
     conn.close()
-    
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_getAttributes_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
+    assert info.isDirectory
+
+    info = conn.getAttributes('smbtest', '/rfc1001.txt')
+    assert not info.isDirectory
+    assert info.file_size == 158437
+    assert info.alloc_size == 159744
+
+    info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
+    assert info.isDirectory
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_getAttributes_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
     assert info.isDirectory
-    
+
     info = conn.getAttributes('smbtest', '/rfc1001.txt')
     assert not info.isDirectory
     assert info.file_size == 158437
     assert info.alloc_size == 159744
-    
+
     info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
     assert info.isDirectory
-    
+
 @with_setup(setup_func_SMB1, teardown_func)
 def test_getAttributes_SMB1():
     global conn
     info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
     assert info.isDirectory
-    
+
     info = conn.getAttributes('smbtest', '/rfc1001.txt')
     assert not info.isDirectory
     assert info.file_size == 158437
     assert info.alloc_size == 159744
-    
+
     info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
     assert info.isDirectory
-    
-    
\ No newline at end of file
diff --git a/python2/tests/SMBConnectionTests/test_listpath.py b/python2/tests/SMBConnectionTests/test_listpath.py
index 9d706b57..abfcb771 100644
--- a/python2/tests/SMBConnectionTests/test_listpath.py
+++ b/python2/tests/SMBConnectionTests/test_listpath.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb_constants import *
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,7 +11,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -17,6 +19,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -45,9 +55,29 @@ def test_listSubPath_SMB1():
     assert ( u'Test Folder', True ) in filenames
     assert ( u'子文件夹', True ) in filenames
 
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames)==999
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/')
     filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
     assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
@@ -59,8 +89,114 @@ def test_listPath_SMB2():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listSubPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
     filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
     assert ( u'Test File.txt', False ) in filenames
     assert ( u'Test Folder', True ) in filenames
     assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listSubPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/Test Folder with Long Name/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathWithManyFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames)==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForDirectory_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForDirectory_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterPattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterPattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterUnicodePattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterUnicodePattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterEmptyList_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterEmptyList_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
diff --git a/python2/tests/SMBConnectionTests/test_listshares.py b/python2/tests/SMBConnectionTests/test_listshares.py
index 67c83787..a5d4ae5e 100644
--- a/python2/tests/SMBConnectionTests/test_listshares.py
+++ b/python2/tests/SMBConnectionTests/test_listshares.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,7 +9,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -16,6 +17,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -33,5 +42,13 @@ def test_listshares_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listshares_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listShares()
+    assert 'smbtest' in map(lambda r: r.name.lower(), results)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listshares_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listShares()
     assert 'smbtest' in map(lambda r: r.name.lower(), results)
diff --git a/python2/tests/SMBConnectionTests/test_listsnapshots.py b/python2/tests/SMBConnectionTests/test_listsnapshots.py
index dfc661c1..788a23e2 100644
--- a/python2/tests/SMBConnectionTests/test_listsnapshots.py
+++ b/python2/tests/SMBConnectionTests/test_listsnapshots.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,7 +9,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -16,6 +18,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -33,5 +45,13 @@ def test_listsnapshots_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listsnapshots_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listSnapshots('smbtest', '/rfc1001.txt')
+    assert len(results) > 0
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listsnapshots_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listSnapshots('smbtest', '/rfc1001.txt')
     assert len(results) > 0
diff --git a/python2/tests/SMBConnectionTests/test_rename.py b/python2/tests/SMBConnectionTests/test_rename.py
index f9896fa6..2d61e9f7 100644
--- a/python2/tests/SMBConnectionTests/test_rename.py
+++ b/python2/tests/SMBConnectionTests/test_rename.py
@@ -3,6 +3,7 @@
 import os, time, random
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,7 +12,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -19,6 +20,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -53,6 +62,31 @@ def test_rename_english_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -99,6 +133,31 @@ def test_rename_unicode_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, StringIO('Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -145,6 +204,31 @@ def test_rename_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -191,6 +275,31 @@ def test_rename_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
     new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
diff --git a/python2/tests/SMBConnectionTests/test_retrievefile.py b/python2/tests/SMBConnectionTests/test_retrievefile.py
index 023d8cee..c47bdef7 100644
--- a/python2/tests/SMBConnectionTests/test_retrievefile.py
+++ b/python2/tests/SMBConnectionTests/test_retrievefile.py
@@ -3,6 +3,7 @@
 import os, tempfile
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -18,7 +19,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -26,6 +28,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -52,6 +64,24 @@ def test_retr_multiplereads_SMB1():
 def test_retr_multiplereads_SMB2():
     # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
+    assert filesize == 158437
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_multiplereads_SMB2x():
+    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
 
@@ -80,6 +110,24 @@ def test_retr_longfilename_SMB1():
 def test_retr_longfilename_SMB2():
     # Test file retrieval that has a long English filename
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
+    assert filesize == 421269
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_longfilename_SMB2x():
+    # Test file retrieval that has a long English filename
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
 
@@ -108,6 +156,24 @@ def test_retr_unicodefilename_SMB1():
 def test_retr_unicodefilename_SMB2():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
+    assert filesize == 256000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_unicodefilename_SMB2x():
+    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
@@ -136,6 +202,24 @@ def test_retr_offset_SMB1():
 def test_retr_offset_SMB2():
     # Test file retrieval from offset to EOF
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
+    assert filesize == 156000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_SMB2x():
+    # Test file retrieval from offset to EOF
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
@@ -164,6 +248,24 @@ def test_retr_offset_and_biglimit_SMB1():
 def test_retr_offset_and_biglimit_SMB2():
     # Test file retrieval from offset with a big max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
+    assert filesize == 100000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_biglimit_SMB2x():
+    # Test file retrieval from offset with a big max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
@@ -192,6 +294,24 @@ def test_retr_offset_and_smalllimit_SMB1():
 def test_retr_offset_and_smalllimit_SMB2():
     # Test file retrieval from offset with a small max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
+    assert filesize == 10
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_smalllimit_SMB2x():
+    # Test file retrieval from offset with a small max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
@@ -220,6 +340,24 @@ def test_retr_offset_and_zerolimit_SMB1():
 def test_retr_offset_and_zerolimit_SMB2():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = StringIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
+    assert filesize == 0
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_zerolimit_SMB2x():
+    # Test file retrieval from offset to EOF with max_length=0
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = StringIO()
     file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
diff --git a/python2/tests/SMBConnectionTests/test_security.py b/python2/tests/SMBConnectionTests/test_security.py
new file mode 100644
index 00000000..24966cc7
--- /dev/null
+++ b/python2/tests/SMBConnectionTests/test_security.py
@@ -0,0 +1,53 @@
+# -*- coding: utf-8 -*-
+
+import os, tempfile
+from StringIO import StringIO
+from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
+from util import getConnectionInfo
+from nose.tools import with_setup
+from smb import smb_structs
+
+try:
+    import hashlib
+    def MD5(): return hashlib.md5()
+except ImportError:
+    import md5
+    def MD5(): return md5.new()
+
+conn = None
+
+def setup_func_SMB2():
+    global conn
+    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def teardown_func():
+    global conn
+    conn.close()
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_security_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
+    attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_security_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
+    attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
diff --git a/python2/tests/SMBConnectionTests/test_storefile.py b/python2/tests/SMBConnectionTests/test_storefile.py
index d87b787f..3e9e5121 100644
--- a/python2/tests/SMBConnectionTests/test_storefile.py
+++ b/python2/tests/SMBConnectionTests/test_storefile.py
@@ -3,6 +3,7 @@
 import os, tempfile, random, time
 from StringIO import StringIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -22,8 +23,7 @@ TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
-
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -31,7 +31,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
 
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -43,6 +50,7 @@ def teardown_func():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_long_filename_SMB1():
+    global conn
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -65,6 +73,7 @@ def test_store_long_filename_SMB1():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_from_offset_SMB1():
+    global conn
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     buf = StringIO('0123456789')
@@ -85,6 +94,35 @@ def test_store_from_offset_SMB1():
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_long_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_long_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -108,6 +146,7 @@ def test_store_long_filename_SMB2():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_unicode_filename_SMB1():
+    global conn
     filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -131,6 +170,35 @@ def test_store_unicode_filename_SMB1():
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_unicode_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_unicode_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
@@ -151,8 +219,36 @@ def test_store_unicode_filename_SMB2():
 
     conn.deleteFiles('smbtest', filename)
 
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_from_offset_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = StringIO('0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = StringIO('aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = StringIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == '01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_from_offset_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     buf = StringIO('0123456789')
@@ -170,4 +266,3 @@ def test_store_from_offset_SMB2():
     buf.close()
 
     conn.deleteFiles('smbtest', filename)
-    
\ No newline at end of file
diff --git a/python2/tests/SMBConnectionTests/test_with_context.py b/python2/tests/SMBConnectionTests/test_with_context.py
new file mode 100644
index 00000000..58d95677
--- /dev/null
+++ b/python2/tests/SMBConnectionTests/test_with_context.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+
+from smb.SMBConnection import SMBConnection
+from .util import getConnectionInfo
+
+def test_context():
+    info = getConnectionInfo()
+    with SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True) as conn:
+        assert conn.connect(info['server_ip'], info['server_port'])
+
+    assert conn.sock is None
diff --git a/python2/tests/connection.ini b/python2/tests/connection.ini
index 96d2652d..d8d249de 100644
--- a/python2/tests/connection.ini
+++ b/python2/tests/connection.ini
@@ -3,6 +3,7 @@
 name = SERVER
 ip = 192.168.1.1
 port = 139
+direct_port = 445
 
 [client]
 name = TESTCLIENT
diff --git a/python2/tests/smbtest.7z b/python2/tests/smbtest.7z
deleted file mode 100644
index c5c9f42b..00000000
Binary files a/python2/tests/smbtest.7z and /dev/null differ
diff --git a/python2/tests/test_security_descriptors.py b/python2/tests/test_security_descriptors.py
new file mode 100644
index 00000000..f81be4ba
--- /dev/null
+++ b/python2/tests/test_security_descriptors.py
@@ -0,0 +1,139 @@
+import binascii
+
+from smb import security_descriptors as sd
+from smb import smb_constants as sc
+
+
+def test_sid_string_representation():
+    sid = sd.SID(1, 5, [2, 3, 4])
+    assert str(sid) == "S-1-5-2-3-4"
+    sid = sd.SID(1, 2**32 + 3, [])
+    assert str(sid) == "S-1-0x100000003"
+    sid = sd.SID(1, 2**32, [3, 2, 1])
+    assert str(sid) == "S-1-0x100000000-3-2-1"
+
+
+def test_sid_binary_parsing():
+    raw_sid = binascii.unhexlify("""
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  b1 04 00 00
+    """.translate(None, ' \n'))
+    assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    raw_sid += "garbage"
+    assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    sid, tail = sd.SID.from_bytes(raw_sid, return_tail=True)
+    assert str(sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert tail == "garbage"
+
+
+def test_ace_binary_parsing():
+    raw_ace = binascii.unhexlify("""
+        00 10 24 00 ff 01 1f 00  01 05 00 00 00 00 00 05
+        15 00 00 00 de 53 c1 2a  2a 4f da ca c1 79 a6 32
+        6e 04 00 00
+    """.translate(None, ' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1134"
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
+                        | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
+                        | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
+                        | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
+                        | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
+                        | sc.FILE_WRITE_ATTRIBUTES)
+    assert not ace.additional_data
+
+    raw_ace = binascii.unhexlify("""
+        00 13 18 00 a9 00 12 00  01 02 00 00 00 00 00 05
+        20 00 00 00 21 02 00 00
+    """.translate(None, ' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-32-545"
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert ace.flags == (sd.ACE_FLAG_INHERITED | sd.ACE_FLAG_CONTAINER_INHERIT
+                         | sd.ACE_FLAG_OBJECT_INHERIT)
+    assert ace.mask == (sc.SYNCHRONIZE | sc.READ_CONTROL | sc.FILE_READ_DATA
+                        | sc.FILE_READ_EA | sc.FILE_EXECUTE
+                        | sc.FILE_READ_ATTRIBUTES)
+    assert not ace.additional_data
+
+    raw_ace = binascii.unhexlify("""
+        01 03 24 00 a9 00 02 00  01 05 00 00 00 00 00 05
+        15 00 00 00 de 53 c1 2a  2a 4f da ca c1 79 a6 32
+        6c 04 00 00
+    """.translate(None, ' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1132"
+    assert ace.type == sd.ACE_TYPE_ACCESS_DENIED
+    assert ace.flags == (sd.ACE_FLAG_CONTAINER_INHERIT
+                         | sd.ACE_FLAG_OBJECT_INHERIT)
+    assert ace.mask == (sc.READ_CONTROL | sc.FILE_READ_DATA | sc.FILE_READ_EA
+                        | sc.FILE_EXECUTE | sc.FILE_READ_ATTRIBUTES)
+    assert not ace.additional_data
+
+
+def test_acl_binary_parsing():
+    raw_acl = binascii.unhexlify("""
+        02 00 70 00 04 00 00 00  00 10 18 00 89 00 10 00
+        01 02 00 00 00 00 00 05  20 00 00 00 21 02 00 00
+        00 10 14 00 ff 01 1f 00  01 01 00 00 00 00 00 05
+        12 00 00 00 00 10 18 00  ff 01 1f 00 01 02 00 00
+        00 00 00 05 20 00 00 00  20 02 00 00 00 10 24 00
+        ff 01 1f 00 01 05 00 00  00 00 00 05 15 00 00 00
+        de 53 c1 2a 2a 4f da ca  c1 79 a6 32 b1 04 00 00
+    """.translate(None, ' \n'))
+    acl = sd.ACL.from_bytes(raw_acl)
+    assert acl.revision == 2
+    assert len(acl.aces) == 4
+
+    ace = acl.aces[0]
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert str(ace.sid) == "S-1-5-32-545"
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.FILE_READ_DATA | sc.FILE_READ_EA
+                        | sc.FILE_READ_ATTRIBUTES)
+
+    ace = acl.aces[3]
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
+                        | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
+                        | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
+                        | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
+                        | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
+                        | sc.FILE_WRITE_ATTRIBUTES)
+
+
+def test_descriptor_binary_parsing():
+    raw_descriptor = binascii.unhexlify("""
+        01 00 04 84 14 00 00 00  30 00 00 00 00 00 00 00
+        4c 00 00 00 01 05 00 00  00 00 00 05 15 00 00 00
+        de 53 c1 2a 2a 4f da ca  c1 79 a6 32 b1 04 00 00
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  01 02 00 00 02 00 70 00
+        04 00 00 00 00 10 18 00  89 00 10 00 01 02 00 00
+        00 00 00 05 20 00 00 00  21 02 00 00 00 10 14 00
+        ff 01 1f 00 01 01 00 00  00 00 00 05 12 00 00 00
+        00 10 18 00 ff 01 1f 00  01 02 00 00 00 00 00 05
+        20 00 00 00 20 02 00 00  00 10 24 00 ff 01 1f 00
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  b1 04 00 00
+    """.translate(None, ' \n'))
+    descriptor = sd.SecurityDescriptor.from_bytes(raw_descriptor)
+    assert descriptor.flags == (sd.SECURITY_DESCRIPTOR_SELF_RELATIVE
+                                | sd.SECURITY_DESCRIPTOR_DACL_PRESENT
+                                | sd.SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED)
+    assert descriptor.dacl is not None
+    assert descriptor.sacl is None
+    assert str(descriptor.owner) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert str(descriptor.group) == "S-1-5-21-717312990-3403304746-849770945-513"
+
+    acl = descriptor.dacl
+    assert acl.revision == 2
+    assert len(acl.aces) == 4
+    assert str(acl.aces[0].sid) == sd.SID_BUILTIN_USERS
+    assert str(acl.aces[1].sid) == sd.SID_LOCAL_SYSTEM
+    assert str(acl.aces[2].sid) == sd.SID_BUILTIN_ADMINISTRATORS
+    assert str(acl.aces[3].sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
diff --git a/python3/nmb/base.py b/python3/nmb/base.py
index e161a18c..d792a861 100644
--- a/python3/nmb/base.py
+++ b/python3/nmb/base.py
@@ -77,6 +77,9 @@ class NMBSession:
             self.onNMBSessionOK()
         elif packet.type == NEGATIVE_SESSION_RESPONSE:
             self.onNMBSessionFailed()
+        elif packet.type == SESSION_KEEPALIVE:
+            # Discard keepalive packets - [RFC1002]: 5.2.2.1
+            pass
         else:
             self.log.warning('Unrecognized NMB session type: 0x%02x', packet.type)
 
diff --git a/python3/pysmb.egg-info/PKG-INFO b/python3/pysmb.egg-info/PKG-INFO
new file mode 100644
index 00000000..64f3cbe7
--- /dev/null
+++ b/python3/pysmb.egg-info/PKG-INFO
@@ -0,0 +1,26 @@
+Metadata-Version: 1.1
+Name: pysmb
+Version: 1.1.20
+Summary: pysmb is an experimental SMB/CIFS library written in Python to support file sharing between Windows and Linux machines
+Home-page: https://miketeo.net/projects/pysmb
+Author: Michael Teo
+Author-email: miketeo@miketeo.net
+License: zlib/libpng
+Description: pysmb is an experimental SMB/CIFS library written in Python. It implements the client-side SMB/CIFS protocol which allows your Python application to access and transfer files to/from SMB/CIFS shared folders like your Windows file sharing and Samba folders.
+Keywords: windows samba cifs sharing ftp smb linux
+Platform: UNKNOWN
+Classifier: Development Status :: 5 - Production/Stable
+Classifier: Environment :: Win32 (MS Windows)
+Classifier: Environment :: Console
+Classifier: License :: OSI Approved :: zlib/libpng License
+Classifier: Operating System :: Microsoft :: Windows
+Classifier: Operating System :: POSIX
+Classifier: Programming Language :: Python
+Classifier: Programming Language :: Python :: 2.4
+Classifier: Programming Language :: Python :: 2.5
+Classifier: Programming Language :: Python :: 2.6
+Classifier: Programming Language :: Python :: 2.7
+Classifier: Programming Language :: Python :: 3
+Classifier: Topic :: Communications :: File Sharing
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
+Classifier: Topic :: System :: Networking
diff --git a/python3/pysmb.egg-info/SOURCES.txt b/python3/pysmb.egg-info/SOURCES.txt
new file mode 100644
index 00000000..aa9ab76a
--- /dev/null
+++ b/python3/pysmb.egg-info/SOURCES.txt
@@ -0,0 +1,256 @@
+CHANGELOG
+LICENSE
+MANIFEST.in
+README.txt
+setup.py
+docs/doctrees/environment.pickle
+docs/doctrees/extending.doctree
+docs/doctrees/index.doctree
+docs/doctrees/api/nmb_NBNSProtocol.doctree
+docs/doctrees/api/nmb_NetBIOS.doctree
+docs/doctrees/api/smb_SMBConnection.doctree
+docs/doctrees/api/smb_SMBHandler.doctree
+docs/doctrees/api/smb_SMBProtocolFactory.doctree
+docs/doctrees/api/smb_SharedDevice.doctree
+docs/doctrees/api/smb_SharedFile.doctree
+docs/doctrees/api/smb_exceptions.doctree
+docs/html/.buildinfo
+docs/html/extending.html
+docs/html/genindex.html
+docs/html/index.html
+docs/html/objects.inv
+docs/html/search.html
+docs/html/searchindex.js
+docs/html/_modules/index.html
+docs/html/_modules/nmb/NetBIOS.html
+docs/html/_modules/nmb/NetBIOSProtocol.html
+docs/html/_modules/smb/SMBConnection.html
+docs/html/_modules/smb/SMBProtocol.html
+docs/html/_modules/smb/base.html
+docs/html/_modules/smb/smb_structs.html
+docs/html/_sources/extending.txt
+docs/html/_sources/index.txt
+docs/html/_sources/api/nmb_NBNSProtocol.txt
+docs/html/_sources/api/nmb_NetBIOS.txt
+docs/html/_sources/api/smb_SMBConnection.txt
+docs/html/_sources/api/smb_SMBHandler.txt
+docs/html/_sources/api/smb_SMBProtocolFactory.txt
+docs/html/_sources/api/smb_SharedDevice.txt
+docs/html/_sources/api/smb_SharedFile.txt
+docs/html/_sources/api/smb_exceptions.txt
+docs/html/_static/ajax-loader.gif
+docs/html/_static/basic.css
+docs/html/_static/comment-bright.png
+docs/html/_static/comment-close.png
+docs/html/_static/comment.png
+docs/html/_static/contents.png
+docs/html/_static/doctools.js
+docs/html/_static/down-pressed.png
+docs/html/_static/down.png
+docs/html/_static/file.png
+docs/html/_static/jquery.js
+docs/html/_static/minus.png
+docs/html/_static/navigation.png
+docs/html/_static/plus.png
+docs/html/_static/pygments.css
+docs/html/_static/searchtools.js
+docs/html/_static/sphinxdoc.css
+docs/html/_static/underscore.js
+docs/html/_static/up-pressed.png
+docs/html/_static/up.png
+docs/html/_static/websupport.js
+docs/html/api/nmb_NBNSProtocol.html
+docs/html/api/nmb_NetBIOS.html
+docs/html/api/smb_SMBConnection.html
+docs/html/api/smb_SMBHandler.html
+docs/html/api/smb_SMBProtocolFactory.html
+docs/html/api/smb_SharedDevice.html
+docs/html/api/smb_SharedFile.html
+docs/html/api/smb_exceptions.html
+python2/nmb/NetBIOS.py
+python2/nmb/NetBIOSProtocol.py
+python2/nmb/__init__.py
+python2/nmb/base.py
+python2/nmb/nmb_constants.py
+python2/nmb/nmb_structs.py
+python2/nmb/utils.py
+python2/smb/SMBConnection.py
+python2/smb/SMBHandler.py
+python2/smb/SMBProtocol.py
+python2/smb/__init__.py
+python2/smb/base.py
+python2/smb/ntlm.py
+python2/smb/security_descriptors.py
+python2/smb/securityblob.py
+python2/smb/smb2_constants.py
+python2/smb/smb2_structs.py
+python2/smb/smb_constants.py
+python2/smb/smb_structs.py
+python2/smb/utils/README.txt
+python2/smb/utils/U32.py
+python2/smb/utils/__init__.py
+python2/smb/utils/md4.py
+python2/smb/utils/pyDes.py
+python2/smb/utils/sha256.py
+python2/tests/README_1st.txt
+python2/tests/__init__.py
+python2/tests/connection.ini
+python2/tests/smbtest.7z
+python2/tests/test_ntlm.py
+python2/tests/test_security_descriptors.py
+python2/tests/test_securityblob.py
+python2/tests/DirectSMBConnectionTests/__init__.py
+python2/tests/DirectSMBConnectionTests/test_SMBHandler.py
+python2/tests/DirectSMBConnectionTests/test_auth.py
+python2/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+python2/tests/DirectSMBConnectionTests/test_echo.py
+python2/tests/DirectSMBConnectionTests/test_listpath.py
+python2/tests/DirectSMBConnectionTests/test_listshares.py
+python2/tests/DirectSMBConnectionTests/test_listsnapshots.py
+python2/tests/DirectSMBConnectionTests/test_rename.py
+python2/tests/DirectSMBConnectionTests/test_retrievefile.py
+python2/tests/DirectSMBConnectionTests/test_storefile.py
+python2/tests/DirectSMBConnectionTests/util.py
+python2/tests/DirectSMBTwistedTests/test_auth.py
+python2/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
+python2/tests/DirectSMBTwistedTests/test_echo.py
+python2/tests/DirectSMBTwistedTests/test_listpath.py
+python2/tests/DirectSMBTwistedTests/test_listshares.py
+python2/tests/DirectSMBTwistedTests/test_listsnapshots.py
+python2/tests/DirectSMBTwistedTests/test_rename.py
+python2/tests/DirectSMBTwistedTests/test_retrievefile.py
+python2/tests/DirectSMBTwistedTests/test_storefile.py
+python2/tests/DirectSMBTwistedTests/util.py
+python2/tests/NetBIOSTests/__init__.py
+python2/tests/NetBIOSTests/test_queryname.py
+python2/tests/NetBIOSTwistedTests/__init__.py
+python2/tests/NetBIOSTwistedTests/test_queryname.py
+python2/tests/SMBConnectionTests/__init__.py
+python2/tests/SMBConnectionTests/test_SMBHandler.py
+python2/tests/SMBConnectionTests/test_auth.py
+python2/tests/SMBConnectionTests/test_createdeletedirectory.py
+python2/tests/SMBConnectionTests/test_deletepattern.py
+python2/tests/SMBConnectionTests/test_echo.py
+python2/tests/SMBConnectionTests/test_getattributes.py
+python2/tests/SMBConnectionTests/test_listpath.py
+python2/tests/SMBConnectionTests/test_listshares.py
+python2/tests/SMBConnectionTests/test_listsnapshots.py
+python2/tests/SMBConnectionTests/test_rename.py
+python2/tests/SMBConnectionTests/test_retrievefile.py
+python2/tests/SMBConnectionTests/test_security.py
+python2/tests/SMBConnectionTests/test_storefile.py
+python2/tests/SMBConnectionTests/util.py
+python2/tests/SMBTwistedTests/__init__.py
+python2/tests/SMBTwistedTests/test_auth.py
+python2/tests/SMBTwistedTests/test_createdeletedirectory.py
+python2/tests/SMBTwistedTests/test_echo.py
+python2/tests/SMBTwistedTests/test_getattributes.py
+python2/tests/SMBTwistedTests/test_listpath.py
+python2/tests/SMBTwistedTests/test_listshares.py
+python2/tests/SMBTwistedTests/test_listsnapshots.py
+python2/tests/SMBTwistedTests/test_rename.py
+python2/tests/SMBTwistedTests/test_retrievefile.py
+python2/tests/SMBTwistedTests/test_storefile.py
+python2/tests/SMBTwistedTests/util.py
+python2/tests/SupportFiles/binary.dat
+python3/nmb/NetBIOS.py
+python3/nmb/NetBIOSProtocol.py
+python3/nmb/__init__.py
+python3/nmb/base.py
+python3/nmb/nmb_constants.py
+python3/nmb/nmb_structs.py
+python3/nmb/utils.py
+python3/pysmb.egg-info/PKG-INFO
+python3/pysmb.egg-info/SOURCES.txt
+python3/pysmb.egg-info/dependency_links.txt
+python3/pysmb.egg-info/requires.txt
+python3/pysmb.egg-info/top_level.txt
+python3/smb/SMBConnection.py
+python3/smb/SMBHandler.py
+python3/smb/SMBProtocol.py
+python3/smb/__init__.py
+python3/smb/base.py
+python3/smb/ntlm.py
+python3/smb/security_descriptors.py
+python3/smb/securityblob.py
+python3/smb/smb2_constants.py
+python3/smb/smb2_structs.py
+python3/smb/smb_constants.py
+python3/smb/smb_structs.py
+python3/smb/utils/U32.py
+python3/smb/utils/__init__.py
+python3/smb/utils/md4.py
+python3/smb/utils/pyDes.py
+python3/smb/utils/sha256.py
+python3/tests/__init__.py
+python3/tests/connection.ini
+python3/tests/smbtest.7z
+python3/tests/test_ntlm.py
+python3/tests/test_security_descriptors.py
+python3/tests/test_securityblob.py
+python3/tests/DirectSMBConnectionTests/__init__.py
+python3/tests/DirectSMBConnectionTests/test_auth.py
+python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+python3/tests/DirectSMBConnectionTests/test_echo.py
+python3/tests/DirectSMBConnectionTests/test_listpath.py
+python3/tests/DirectSMBConnectionTests/test_listshares.py
+python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
+python3/tests/DirectSMBConnectionTests/test_rename.py
+python3/tests/DirectSMBConnectionTests/test_retrievefile.py
+python3/tests/DirectSMBConnectionTests/test_storefile.py
+python3/tests/DirectSMBConnectionTests/util.py
+python3/tests/DirectSMBTwistedTests/test_auth.py
+python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
+python3/tests/DirectSMBTwistedTests/test_echo.py
+python3/tests/DirectSMBTwistedTests/test_listpath.py
+python3/tests/DirectSMBTwistedTests/test_listshares.py
+python3/tests/DirectSMBTwistedTests/test_listsnapshots.py
+python3/tests/DirectSMBTwistedTests/test_rename.py
+python3/tests/DirectSMBTwistedTests/test_retrievefile.py
+python3/tests/DirectSMBTwistedTests/test_storefile.py
+python3/tests/DirectSMBTwistedTests/util.py
+python3/tests/NetBIOSTests/__init__.py
+python3/tests/NetBIOSTests/test_queryname.py
+python3/tests/NetBIOSTwistedTests/__init__.py
+python3/tests/NetBIOSTwistedTests/test_queryname.py
+python3/tests/SMBConnectionTests/__init__.py
+python3/tests/SMBConnectionTests/test_SMBHandler.py
+python3/tests/SMBConnectionTests/test_auth.py
+python3/tests/SMBConnectionTests/test_createdeletedirectory.py
+python3/tests/SMBConnectionTests/test_deletepattern.py
+python3/tests/SMBConnectionTests/test_echo.py
+python3/tests/SMBConnectionTests/test_getattributes.py
+python3/tests/SMBConnectionTests/test_listpath.py
+python3/tests/SMBConnectionTests/test_listshares.py
+python3/tests/SMBConnectionTests/test_listsnapshots.py
+python3/tests/SMBConnectionTests/test_rename.py
+python3/tests/SMBConnectionTests/test_retrievefile.py
+python3/tests/SMBConnectionTests/test_storefile.py
+python3/tests/SMBConnectionTests/util.py
+python3/tests/SMBTwistedTests/__init__.py
+python3/tests/SMBTwistedTests/test_auth.py
+python3/tests/SMBTwistedTests/test_createdeletedirectory.py
+python3/tests/SMBTwistedTests/test_echo.py
+python3/tests/SMBTwistedTests/test_getattributes.py
+python3/tests/SMBTwistedTests/test_listpath.py
+python3/tests/SMBTwistedTests/test_listshares.py
+python3/tests/SMBTwistedTests/test_listsnapshots.py
+python3/tests/SMBTwistedTests/test_rename.py
+python3/tests/SMBTwistedTests/test_retrievefile.py
+python3/tests/SMBTwistedTests/test_storefile.py
+python3/tests/SMBTwistedTests/util.py
+python3/tests/SupportFiles/binary.dat
+sphinx/Makefile
+sphinx/make.bat
+sphinx/source/conf.py
+sphinx/source/extending.rst
+sphinx/source/index.rst
+sphinx/source/api/nmb_NBNSProtocol.rst
+sphinx/source/api/nmb_NetBIOS.rst
+sphinx/source/api/smb_SMBConnection.rst
+sphinx/source/api/smb_SMBHandler.rst
+sphinx/source/api/smb_SMBProtocolFactory.rst
+sphinx/source/api/smb_SharedDevice.rst
+sphinx/source/api/smb_SharedFile.rst
+sphinx/source/api/smb_exceptions.rst
+sphinx/source/api/smb_security_descriptors.rst
\ No newline at end of file
diff --git a/python3/pysmb.egg-info/dependency_links.txt b/python3/pysmb.egg-info/dependency_links.txt
new file mode 100644
index 00000000..8b137891
--- /dev/null
+++ b/python3/pysmb.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/python3/pysmb.egg-info/requires.txt b/python3/pysmb.egg-info/requires.txt
new file mode 100644
index 00000000..38fe4145
--- /dev/null
+++ b/python3/pysmb.egg-info/requires.txt
@@ -0,0 +1 @@
+pyasn1
diff --git a/python3/pysmb.egg-info/top_level.txt b/python3/pysmb.egg-info/top_level.txt
new file mode 100644
index 00000000..65ad1103
--- /dev/null
+++ b/python3/pysmb.egg-info/top_level.txt
@@ -0,0 +1,2 @@
+nmb
+smb
diff --git a/python3/smb/SMBConnection.py b/python3/smb/SMBConnection.py
index 172d2039..89afa6b0 100644
--- a/python3/smb/SMBConnection.py
+++ b/python3/smb/SMBConnection.py
@@ -71,6 +71,15 @@ class SMBConnection(SMB):
                 raise NotConnectedError('Server disconnected')
             total_sent = total_sent + sent
 
+    #
+    # Support for "with" context
+    #
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
     #
     # Misc Properties
     #
@@ -153,15 +162,23 @@ class SMBConnection(SMB):
         return results
 
     def listPath(self, service_name, path,
-                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
+                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
                  pattern = '*', timeout = 30):
         """
         Retrieve a directory listing of files/folders at *path*
 
+        For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+
+        Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
+        system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
+        and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
+        If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
+        SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
+
         :param string/unicode service_name: the name of the shared folder for the *path*
         :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
         :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
-                               The default *search* value will query for all read-only, hidden, system, archive files and directories.
         :param string/unicode pattern: the filter to apply to the results before returning to the client.
         :return: A list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
         """
@@ -252,6 +269,37 @@ class SMBConnection(SMB):
 
         return results[0]
 
+    def getSecurity(self, service_name, path, timeout = 30):
+        """
+        Retrieve the security descriptor of the file at *path* on the *service_name*.
+
+        :param string/unicode service_name: the name of the shared folder for the *path*
+        :param string/unicode path: Path of the file on the remote server. If the file cannot be opened for reading, an :doc:`OperationFailure<smb_exceptions>` will be raised.
+        :return: A :class:`smb.security_descriptors.SecurityDescriptor` instance containing the security information of the file.
+        """
+        if not self.sock:
+            raise NotConnectedError('Not connected to server')
+
+        results = [ ]
+
+        def cb(info):
+            self.is_busy = False
+            results.append(info)
+
+        def eb(failure):
+            self.is_busy = False
+            raise failure
+
+        self.is_busy = True
+        try:
+            self._getSecurity(service_name, path, cb, eb, timeout)
+            while self.is_busy:
+                self._pollForNetBIOSPacket(timeout)
+        finally:
+            self.is_busy = False
+
+        return results[0]
+
     def retrieveFile(self, service_name, path, file_obj, timeout = 30):
         """
         Retrieve the contents of the file at *path* on the *service_name* and write these contents to the provided *file_obj*.
@@ -384,7 +432,7 @@ class SMBConnection(SMB):
         It supports the use of wildcards in file names, allowing for unlocking of multiple files/folders in a single request.
         This function is very helpful when deleting files/folders that are read-only.
         Note: this function is currently only implemented for SMB2! Technically, it sets the FILE_ATTRIBUTE_NORMAL flag, therefore clearing all other flags. (See https://msdn.microsoft.com/en-us/library/cc232110.aspx for further information)
-        
+
         :param string/unicode service_name: Contains the name of the shared folder.
         :param string/unicode path_file_pattern: The pathname of the file(s) to be deleted, relative to the service_name.
                                                  Wildcards may be used in the filename component of the path.
@@ -496,7 +544,7 @@ class SMBConnection(SMB):
         """
         Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
 
-        :param string data: Data to send to the remote server.
+        :param bytes data: Data to send to the remote server. Must be a bytes object.
         :return: The *data* parameter
         """
         if not self.sock:
@@ -553,9 +601,18 @@ class SMBConnection(SMB):
                 else:
                     raise ex
 
-        type, flags, length = struct.unpack('>BBH', data)
-        if flags & 0x01:
-            length = length | 0x10000
+        type_, flags, length = struct.unpack('>BBH', data)
+        if type_ == 0x0:
+            # This is a Direct TCP packet
+            # The length is specified in the header from byte 8. (0-indexed)
+            # we read a structure assuming NBT, so to get the real length
+            # combine the length and flag fields together
+            length = length + (flags << 16)
+        else:
+            # This is a NetBIOS over TCP (NBT) packet
+            # The length is specified in the header from byte 16. (0-indexed)
+            if flags & 0x01:
+                length = length | 0x10000
 
         read_len = length
         while read_len > 0:
diff --git a/python3/smb/SMBProtocol.py b/python3/smb/SMBProtocol.py
index e0089c29..31b2e88a 100644
--- a/python3/smb/SMBProtocol.py
+++ b/python3/smb/SMBProtocol.py
@@ -178,15 +178,23 @@ class SMBProtocolFactory(ClientFactory):
         return d
 
     def listPath(self, service_name, path,
-                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE,
+                 search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_DIRECTORY | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL,
                  pattern = '*', timeout = 30):
         """
         Retrieve a directory listing of files/folders at *path*
 
+        For simplicity, pysmb defines a "normal" file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+
+        Note that the default search parameter will query for all read-only (SMB_FILE_ATTRIBUTE_READONLY), hidden (SMB_FILE_ATTRIBUTE_HIDDEN),
+        system (SMB_FILE_ATTRIBUTE_SYSTEM), archive (SMB_FILE_ATTRIBUTE_ARCHIVE), normal (SMB_FILE_ATTRIBUTE_INCL_NORMAL) files
+        and directories (SMB_FILE_ATTRIBUTE_DIRECTORY).
+        If you do not need to include "normal" files in the result, define your own search parameter without the SMB_FILE_ATTRIBUTE_INCL_NORMAL constant.
+        SMB_FILE_ATTRIBUTE_NORMAL should be used by itself and not be used with other bit constants.
+
         :param string/unicode service_name: the name of the shared folder for the *path*
         :param string/unicode path: path relative to the *service_name* where we are interested to learn about its files/sub-folders.
         :param integer search: integer value made up from a bitwise-OR of *SMB_FILE_ATTRIBUTE_xxx* bits (see smb_constants.py).
-                               The default *search* value will query for all read-only, hidden, system, archive files and directories.
         :param string/unicode pattern: the filter to apply to the results before returning to the client.
         :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
         :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with a list of :doc:`smb.base.SharedFile<smb_SharedFile>` instances.
@@ -369,7 +377,7 @@ class SMBProtocolFactory(ClientFactory):
         """
         Send an echo command containing *data* to the remote SMB/CIFS server. The remote SMB/CIFS will reply with the same *data*.
 
-        :param string data: Data to send to the remote server.
+        :param bytes data: Data to send to the remote server. Must be a bytes object.
         :param integer/float timeout: Number of seconds that pysmb will wait before raising *SMBTimeout* via the returned *Deferred* instance's *errback* method.
         :return: A *twisted.internet.defer.Deferred* instance. The callback function will be called with the *data* parameter.
         """
diff --git a/python3/smb/base.py b/python3/smb/base.py
index a1ec2715..69bb9658 100644
--- a/python3/smb/base.py
+++ b/python3/smb/base.py
@@ -5,6 +5,7 @@ from .smb_constants import *
 from .smb2_constants import *
 from .smb_structs import *
 from .smb2_structs import *
+from .security_descriptors import SecurityDescriptor
 from nmb.base import NMBSession
 from .utils import convertFILETIMEtoEpoch
 from . import ntlm, securityblob
@@ -58,8 +59,9 @@ class SMB(NMBSession):
         self.sign_options = sign_options
         self.is_direct_tcp = is_direct_tcp
         self.use_ntlm_v2 = use_ntlm_v2 #: Similar to LMAuthenticationPolicy and NTAuthenticationPolicy as described in [MS-CIFS] 3.2.1.1
-        self.smb_message = SMBMessage()
+        self.smb_message = SMBMessage(self)
         self.is_using_smb2 = False   #: Are we communicating using SMB2 protocol? self.smb_message will be a SMB2Message instance if this flag is True
+        self.async_requests = { }    #: AsyncID mapped to _PendingRequest instance
         self.pending_requests = { }  #: MID mapped to _PendingRequest instance
         self.connected_trees = { }   #: Share name mapped to TID
         self.next_rpc_call_id = 1    #: Next RPC callID value. Not used directly in SMB message. Usually encapsulated in sub-commands under SMB_COM_TRANSACTION or SMB_COM_TRANSACTION2 messages
@@ -90,6 +92,13 @@ class SMB(NMBSession):
         self.max_write_size = 0     #: Similar to MaxWriteSize as described in [MS-SMB2] 2.2.4
         self.max_transact_size = 0  #: Similar to MaxTransactSize as described in [MS-SMB2] 2.2.4
         self.session_id = 0         #: Similar to SessionID as described in [MS-SMB2] 2.2.4. This will be set in _updateState_SMB2 method
+        self.smb2_dialect = 0
+
+
+        # SMB 2.1 attributes
+        self.cap_leasing = False
+        self.cap_multi_credit = False
+        self.credits = 0   # how many credits we're allowed to spend per request
 
         self._setupSMB1Methods()
 
@@ -104,7 +113,7 @@ class SMB(NMBSession):
     #
 
     def onNMBSessionOK(self):
-        self._sendSMBMessage(SMBMessage(ComNegotiateRequest()))
+        self._sendSMBMessage(SMBMessage(self, ComNegotiateRequest()))
 
     def onNMBSessionFailed(self):
         pass
@@ -118,13 +127,31 @@ class SMB(NMBSession):
                 self.is_using_smb2 = True
                 self.mid = 0  # Must reset messageID counter, or else remote SMB2 server will disconnect
                 self._setupSMB2Methods()
-                self.smb_message = self._klassSMBMessage()
+                self.smb_message = self._klassSMBMessage(self)
                 i = self.smb_message.decode(data)
+                self.log.info('SMB2 dialect is 0x%04x', self.smb2_dialect)
 
             next_message_offset = 0
             if self.is_using_smb2:
                 next_message_offset = self.smb_message.next_command_offset
 
+                # update how many credits we're allowed to spend on requests
+                self.credits = self.smb_message.credit_response
+
+                # SMB2 CANCEL commands do not consume message IDs
+                if self.smb_message.command != SMB2_COM_CANCEL:
+                    self.log.debug('Received SMB2 packet from server - "%s" (command:0x%02X). Credit charge recv: %s',
+                                   SMB_COMMAND_NAMES.get(self.smb_message.command, '<unknown>'), self.smb_message.command, self.smb_message.credit_charge)
+                    if self.smb_message.credit_charge > 0:
+                        # Let's update the sequenceWindow based on the CreditsCharged
+                        # In the SMB 2.0.2 dialect, this field MUST NOT be used and MUST be reserved.
+                        # The sender MUST set this to 0, and the receiver MUST ignore it.
+                        # In all other dialects, this field indicates the number of credits that this request consumes.
+                        self.log.debug("Updating MID to add credit charge from server...")
+                        self.log.debug("*** Before: " + str(self.mid))
+                        self.mid = self.mid + (self.smb_message.credit_charge - 1)
+                        self.log.debug("*** After: " + str(self.mid))
+
             if i > 0:
                 if not self.is_using_smb2:
                     self.log.debug('Received SMB message "%s" (command:0x%2X flags:0x%02X flags2:0x%04X TID:%d UID:%d)',
@@ -136,7 +163,7 @@ class SMB(NMBSession):
                                    self.smb_message.command, self.smb_message.flags)
                 if self._updateState(self.smb_message):
                     # We need to create a new instance instead of calling reset() because the instance could be captured in the message history.
-                    self.smb_message = self._klassSMBMessage()
+                    self.smb_message = self._klassSMBMessage(self)
 
             if next_message_offset > 0:
                 data = data[next_message_offset:]
@@ -167,6 +194,7 @@ class SMB(NMBSession):
         self._listShares = self._listShares_SMB1
         self._listPath = self._listPath_SMB1
         self._listSnapshots = self._listSnapshots_SMB1
+        self._getSecurity = self._getSecurity_SMB1
         self._getAttributes = self._getAttributes_SMB1
         self._retrieveFile = self._retrieveFile_SMB1
         self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB1
@@ -189,6 +217,7 @@ class SMB(NMBSession):
         self._listShares = self._listShares_SMB2
         self._listPath = self._listPath_SMB2
         self._listSnapshots = self._listSnapshots_SMB2
+        self._getSecurity = self._getSecurity_SMB2
         self._getAttributes = self._getAttributes_SMB2
         self._retrieveFile = self._retrieveFile_SMB2
         self._retrieveFileFromOffset = self._retrieveFileFromOffset_SMB2
@@ -213,7 +242,7 @@ class SMB(NMBSession):
         if smb_message.mid == 0:
             smb_message.mid = self._getNextMID_SMB2()
 
-        if smb_message.command != SMB2_COM_NEGOTIATE and smb_message.command != SMB2_COM_ECHO:
+        if smb_message.command != SMB2_COM_NEGOTIATE:
             smb_message.session_id = self.session_id
 
         if self.is_signing_active:
@@ -235,10 +264,22 @@ class SMB(NMBSession):
         if message.isReply:
             if message.command == SMB2_COM_NEGOTIATE:
                 if message.status == 0:
-                    self.has_negotiated = True
-                    self.log.info('SMB2 dialect negotiation successful')
-                    self._updateServerInfo(message.payload)
-                    self._handleNegotiateResponse(message)
+                    if self.smb_message.payload.dialect_revision == SMB2_DIALECT_2ALL:
+                        # Dialects from SMB 2.1 must be negotiated in a second negotiate phase
+                        # We send a SMB2 Negotiate Request to accomplish this
+                        self._sendSMBMessage(SMB2Message(self, SMB2NegotiateRequest()))
+                    else:
+                        if self.smb_message.payload.dialect_revision == SMB2_DIALECT_21:
+                            # We negotiated SMB 2.1.
+                            # we must now send credit requests (MUST!)
+                            #self.send_credits_request = True
+                            pass
+
+                        self.has_negotiated = True
+                        self.log.info('SMB2 dialect negotiation successful')
+                        self.dialect = self.smb_message.payload.dialect_revision
+                        self._updateServerInfo(message.payload)
+                        self._handleNegotiateResponse(message)
                 else:
                     raise ProtocolError('Unknown status value (0x%08X) in SMB2_COM_NEGOTIATE' % message.status,
                                         message.raw_data, message)
@@ -250,6 +291,19 @@ class SMB(NMBSession):
                         if result == securityblob.RESULT_ACCEPT_COMPLETED:
                             self.has_authenticated = True
                             self.log.info('Authentication (on SMB2) successful!')
+
+                            # [MS-SMB2]: 3.2.5.3.1
+                            # If the security subsystem indicates that the session was established by an anonymous user,
+                            # Session.SigningRequired MUST be set to FALSE.
+                            # If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags field of the
+                            # SMB2 SESSION_SETUP Response and if Session.SigningRequired is TRUE, this indicates a SESSION_SETUP
+                            # failure and the connection MUST be terminated. If the SMB2_SESSION_FLAG_IS_GUEST bit is set in the SessionFlags
+                            # field of the SMB2 SESSION_SETUP Response and if RequireMessageSigning is FALSE, Session.SigningRequired
+                            # MUST be set to FALSE.
+                            if message.payload.isGuestSession or message.payload.isAnonymousSession:
+                                self.is_signing_active = False
+                                self.log.info('Signing disabled because session is guest/anonymous')
+
                             self.onAuthOK()
                         else:
                             raise ProtocolError('SMB2_COM_SESSION_SETUP status is 0 but security blob negResult value is %d' % result, message.raw_data, message)
@@ -263,18 +317,58 @@ class SMB(NMBSession):
                             self._handleSessionChallenge(message, ntlm_token)
                     except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ) as ex:
                         raise ProtocolError(str(ex), message.raw_data, message)
-                elif message.status == 0xc000006d:  # STATUS_LOGON_FAILURE
+                elif (message.status == 0xc000006d   # STATUS_LOGON_FAILURE
+                    or message.status == 0xc0000064  # STATUS_NO_SUCH_USER
+                    or message.status == 0xc000006a):# STATUS_WRONG_PASSWORD
                     self.has_authenticated = False
                     self.log.info('Authentication (on SMB2) failed. Please check username and password.')
                     self.onAuthFailed()
+                elif (message.status == 0xc0000193    # STATUS_ACCOUNT_EXPIRED
+                    or message.status == 0xC0000071): # STATUS_PASSWORD_EXPIRED
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account or password has expired.')
+                    self.onAuthFailed()
+                elif message.status == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account has been locked due to too many invalid logon attempts.')
+                    self.onAuthFailed()
+                elif message.status == 0xc0000072: # STATUS_ACCOUNT_DISABLED
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Account has been disabled.')
+                    self.onAuthFailed()
+                elif (message.status == 0xc000006f    # STATUS_INVALID_LOGON_HOURS
+                    or message.status == 0xc000015b   # STATUS_LOGON_TYPE_NOT_GRANTED
+                    or message.status == 0xc0000070): # STATUS_INVALID_WORKSTATION
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Not allowed.')
+                    self.onAuthFailed()
+                elif message.status == 0xc000018c:  # STATUS_TRUSTED_DOMAIN_FAILURE
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Domain not trusted.')
+                    self.onAuthFailed()
+                elif message.status == 0xc000018d:  # STATUS_TRUSTED_RELATIONSHIP_FAILURE
+                    self.has_authenticated = False
+                    self.log.info('Authentication (on SMB2) failed. Workstation not trusted.')
+                    self.onAuthFailed()
                 else:
                     raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status,
                                         message.raw_data, message)
 
-            req = self.pending_requests.pop(message.mid, None)
-            if req:
-                req.callback(message, **req.kwargs)
-                return True
+            if message.isAsync:
+                if message.status == 0x00000103:  # STATUS_PENDING
+                    req = self.pending_requests.pop(message.mid, None)
+                    if req:
+                        self.async_requests[message.async_id] = req
+                else: # All other status including SUCCESS
+                    req = self.async_requests.pop(message.async_id, None)
+                    if req:
+                        req.callback(message, **req.kwargs)
+                        return True
+            else:
+                req = self.pending_requests.pop(message.mid, None)
+                if req:
+                    req.callback(message, **req.kwargs)
+                    return True
 
 
     def _updateServerInfo_SMB2(self, payload):
@@ -285,11 +379,17 @@ class SMB(NMBSession):
         self.max_write_size = payload.max_write_size
         self.use_plaintext_authentication = False   # SMB2 never allows plaintext authentication
 
+        if (self.capabilities & SMB2_GLOBAL_CAP_LEASING) == SMB2_GLOBAL_CAP_LEASING:
+            self.cap_leasing = True
+
+        if (self.capabilities & SMB2_GLOBAL_CAP_LARGE_MTU) == SMB2_GLOBAL_CAP_LARGE_MTU:
+            self.cap_multi_credit = True
+
 
     def _handleNegotiateResponse_SMB2(self, message):
         ntlm_data = ntlm.generateNegotiateMessage()
         blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
+        self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
 
 
     def _handleSessionChallenge_SMB2(self, message, ntlm_token):
@@ -314,14 +414,15 @@ class SMB(NMBSession):
                                                      lm_challenge_response,
                                                      session_key,
                                                      self.username,
-                                                     self.domain)
+                                                     self.domain,
+                                                     self.my_name)
 
         if self.log.isEnabledFor(logging.DEBUG):
             self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
             self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
 
         blob = securityblob.generateAuthSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMB2Message(SMB2SessionSetupRequest(blob)))
+        self._sendSMBMessage(SMB2Message(self, SMB2SessionSetupRequest(blob)))
 
         if self.security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED:
             self.log.info('Server requires all SMB messages to be signed')
@@ -352,7 +453,7 @@ class SMB(NMBSession):
         messages_history = [ ]
 
         def connectSrvSvc(tid):
-            m = SMB2Message(SMB2CreateRequest('srvsvc',
+            m = SMB2Message(self, SMB2CreateRequest('srvsvc',
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -363,7 +464,7 @@ class SMB(NMBSession):
 
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectSrvSvcCB, errback, tid = tid)
             messages_history.append(m)
 
         def connectSrvSvcCB(create_message, **kwargs):
@@ -384,10 +485,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 2c 1c b7 6c 12 98 40 45 03 00 00 00 00 00 00 00
 01 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-                m = SMB2Message(SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
-                m.tid = create_message.tid
+                m = SMB2Message(self, SMB2WriteRequest(create_message.payload.fid, data_bytes, 0))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, fid = create_message.payload.fid)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcBindCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
                 messages_history.append(m)
             else:
                 errback(OperationFailure('Failed to list shares: Unable to locate Server Service RPC endpoint', messages_history))
@@ -395,13 +496,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def rpcBindCB(trans_message, **kwargs):
             messages_history.append(trans_message)
             if trans_message.status == 0:
-                m = SMB2Message(SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
-                m.tid = trans_message.tid
+                m = SMB2Message(self, SMB2ReadRequest(kwargs['fid'], read_len = 1024, read_offset = 0))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, fid = kwargs['fid'])
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, rpcReadCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
                 messages_history.append(m)
             else:
-                closeFid(trans_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
+                closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to read from Server Service RPC endpoint')
 
         def rpcReadCB(read_message, **kwargs):
             messages_history.append(read_message)
@@ -428,13 +529,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-                m = SMB2Message(SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
-                m.tid = read_message.tid
+                m = SMB2Message(self, SMB2IoctlRequest(kwargs['fid'], 0x0011C017, flags = 0x01, max_out_size = 8196, in_data = data_bytes))
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, listShareResultsCB, errback, tid = kwargs['tid'], fid = kwargs['fid'])
                 messages_history.append(m)
             else:
-                closeFid(read_message.tid, kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
+                closeFid(kwargs['tid'], kwargs['fid'], error = 'Failed to list shares: Unable to bind to Server Service RPC endpoint')
 
         def listShareResultsCB(result_message, **kwargs):
             messages_history.append(result_message)
@@ -443,13 +544,11 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 data_bytes = result_message.payload.out_data
 
                 if data_bytes[3] & 0x02 == 0:
-                    sendReadRequest(result_message.tid, kwargs['fid'], data_bytes)
+                    sendReadRequest(kwargs['tid'], kwargs['fid'], data_bytes)
                 else:
-                    decodeResults(result_message.tid, kwargs['fid'], data_bytes)
-            elif result_message.status == 0x0103:   # STATUS_PENDING
-                self.pending_requests[result_message.mid] = _PendingRequest(result_message.mid, expiry_time, listShareResultsCB, errback, fid = kwargs['fid'])
+                    decodeResults(kwargs['tid'], kwargs['fid'], data_bytes)
             else:
-                closeFid(result_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def decodeResults(tid, fid, data_bytes):
@@ -484,28 +583,27 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendReadRequest(tid, fid, data_bytes):
             read_count = min(4280, self.max_read_size)
-            m = SMB2Message(SMB2ReadRequest(fid, 0, read_count))
+            m = SMB2Message(self, SMB2ReadRequest(fid, 0, read_count))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
-                                                           fid = fid, data_bytes = data_bytes)
+                                                           tid = tid, fid = fid, data_bytes = data_bytes)
 
         def readCB(read_message, **kwargs):
             messages_history.append(read_message)
             if read_message.status == 0:
-                data_len = read_message.payload.data_length
                 data_bytes = read_message.payload.data
 
                 if data_bytes[3] & 0x02 == 0:
-                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    sendReadRequest(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
                 else:
-                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    decodeResults(kwargs['tid'], kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
             else:
-                closeFid(read_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def closeFid(tid, fid, results = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
@@ -526,7 +624,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), path )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
             messages_history.append(m)
@@ -555,7 +653,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -566,39 +664,44 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendQuery(create_message.tid, create_message.payload.fid, b'')
+                sendQuery(kwargs['tid'], create_message.payload.fid, b'')
             else:
                 errback(OperationFailure('Failed to list %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
 
         def sendQuery(tid, fid, data_buf):
-            m = SMB2Message(SMB2QueryDirectoryRequest(fid, pattern,
-                                                      info_class = 0x03,   # FileBothDirectoryInformation
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                output_buf_len = 64 * 1024 * (self.credits - 1)
+            else:
+                output_buf_len = self.max_transact_size
+
+            m = SMB2Message(self, SMB2QueryDirectoryRequest(fid, pattern,
+                                                      info_class = 0x25,   # FileIdBothDirectoryInformation
                                                       flags = 0,
-                                                      output_buf_len = self.max_transact_size))
+                                                      output_buf_len = output_buf_len))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, fid = fid, data_buf = data_buf)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = tid, fid = fid, data_buf = data_buf)
             messages_history.append(m)
 
         def queryCB(query_message, **kwargs):
             messages_history.append(query_message)
             if query_message.status == 0:
                 data_buf = decodeQueryStruct(kwargs['data_buf'] + query_message.payload.data)
-                sendQuery(query_message.tid, kwargs['fid'], data_buf)
+                sendQuery(kwargs['tid'], kwargs['fid'], data_buf)
             elif query_message.status == 0x80000006:  # STATUS_NO_MORE_FILES
-                closeFid(query_message.tid, kwargs['fid'], results = results)
+                closeFid(kwargs['tid'], kwargs['fid'], results = results)
             else:
-                closeFid(query_message.tid, kwargs['fid'], error = query_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
 
         def decodeQueryStruct(data_bytes):
-            # SMB_FIND_FILE_BOTH_DIRECTORY_INFO structure. See [MS-CIFS]: 2.2.8.1.7 and [MS-SMB]: 2.2.8.1.1
-            info_format = '<IIQQQQQQIIIBB24s'
+            # FileIdBothDirectoryInformation structure. See [MS-SMB]: 2.2.8.1.3 and [MS-FSCC]: 2.4.17
+            info_format = '<IIQQQQQQIIIBB24sHQ'
             info_size = struct.calcsize(info_format)
 
             data_length = len(data_bytes)
@@ -610,17 +713,24 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 next_offset, _, \
                 create_time, last_access_time, last_write_time, last_attr_change_time, \
                 file_size, alloc_size, file_attributes, filename_length, ea_size, \
-                short_name_length, _, short_name = struct.unpack(info_format, data_bytes[offset:offset+info_size])
+                short_name_length, _, short_name, _, file_id = struct.unpack(info_format, data_bytes[offset:offset+info_size])
 
                 offset2 = offset + info_size
                 if offset2 + filename_length > data_length:
                     return data_bytes[offset:]
 
                 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
-                short_name = short_name.decode('UTF-16LE')
-                results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
-                                          convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
-                                          file_size, alloc_size, file_attributes, short_name, filename))
+                short_name = short_name[:short_name_length].decode('UTF-16LE')
+
+                accept_result = False
+                if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
+                    accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+                else:
+                    accept_result = (file_attributes & search) > 0
+                if accept_result:
+                    results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
+                                              convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                              file_size, alloc_size, file_attributes, short_name, filename, file_id))
 
                 if next_offset:
                     offset += next_offset
@@ -629,7 +739,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             return b''
 
         def closeFid(tid, fid, results = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, results = results, error = error)
@@ -639,7 +749,11 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             if kwargs['results'] is not None:
                 callback(kwargs['results'])
             elif kwargs['error'] is not None:
-                errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
+                if kwargs['error'] == 0xC000000F:  # [MS-ERREF]: STATUS_NO_SUCH_FILE
+                    # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
+                    callback([ ])
+                else:
+                    errback(OperationFailure('Failed to list %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
 
         if service_name not in self.connected_trees:
             def connectCB(connect_message, **kwargs):
@@ -650,7 +764,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -678,7 +792,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -689,22 +803,23 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
                 p = create_message.payload
+                filename = self._extractLastPathComponent(path)
                 info = SharedFile(p.create_time, p.lastaccess_time, p.lastwrite_time, p.change_time,
                                   p.file_size, p.allocation_size, p.file_attributes,
-                                  path, path)
-                closeFid(create_message.tid, p.fid, info = info)
+                                  filename, filename)
+                closeFid(kwargs['tid'], p.fid, info = info)
             else:
                 errback(OperationFailure('Failed to get attributes for %s on %s: Unable to open remote file object' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid, info = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, info = info, error = error)
@@ -725,7 +840,93 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
+            messages_history.append(m)
+        else:
+            sendCreate(self.connected_trees[service_name])
+
+    def _getSecurity_SMB2(self, service_name, path, callback, errback, timeout = 30):
+        if not self.has_authenticated:
+            raise NotReadyError('SMB connection not authenticated')
+
+        expiry_time = time.time() + timeout
+        path = path.replace('/', '\\')
+        if path.startswith('\\'):
+            path = path[1:]
+        if path.endswith('\\'):
+            path = path[:-1]
+        messages_history = [ ]
+        results = [ ]
+
+        def sendCreate(tid):
+            m = SMB2Message(self, SMB2CreateRequest(path,
+                                              file_attributes = 0,
+                                              access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
+                                              share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
+                                              oplock = SMB2_OPLOCK_LEVEL_NONE,
+                                              impersonation = SEC_IMPERSONATE,
+                                              create_options = 0,
+                                              create_disp = FILE_OPEN))
+            m.tid = tid
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, createCB, errback, tid = tid)
+            messages_history.append(m)
+
+        def createCB(create_message, **kwargs):
+            messages_history.append(create_message)
+            if create_message.status == 0:
+                if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                    output_buf_len = 64 * 1024 * (self.credits - 1)
+                else:
+                    output_buf_len = self.max_transact_size
+
+                m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
+                                                     flags = 0,
+                                                     additional_info = OWNER_SECURITY_INFORMATION | GROUP_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
+                                                     info_type = SMB2_INFO_SECURITY,
+                                                     file_info_class = 0, # [MS-SMB2] 2.2.37, 3.2.4.12
+                                                     input_buf = '',
+                                                     output_buf_len = output_buf_len))
+                m.tid = kwargs['tid']
+                self._sendSMBMessage(m)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, queryCB, errback, tid = kwargs['tid'], fid = create_message.payload.fid)
+                messages_history.append(m)
+            else:
+                errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to open file or directory' % ( path, service_name ), messages_history))
+
+        def queryCB(query_message, **kwargs):
+            messages_history.append(query_message)
+            if query_message.status == 0:
+                security = SecurityDescriptor.from_bytes(query_message.payload.data)
+                closeFid(kwargs['tid'], kwargs['fid'], result = security)
+            else:
+                closeFid(kwargs['tid'], kwargs['fid'], error = query_message.status)
+
+        def closeFid(tid, fid, result = None, error = None):
+            m = SMB2Message(self, SMB2CloseRequest(fid))
+            m.tid = tid
+            self._sendSMBMessage(m)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, result = result, error = error)
+            messages_history.append(m)
+
+        def closeCB(close_message, **kwargs):
+            if kwargs['result'] is not None:
+                callback(kwargs['result'])
+            elif kwargs['error'] is not None:
+                errback(OperationFailure('Failed to get the security descriptor of %s on %s: Query failed with errorcode 0x%08x' % ( path, service_name, kwargs['error'] ), messages_history))
+
+        if service_name not in self.connected_trees:
+            def connectCB(connect_message, **kwargs):
+                messages_history.append(connect_message)
+                if connect_message.status == 0:
+                    self.connected_trees[service_name] = connect_message.tid
+                    sendCreate(connect_message.tid)
+                else:
+                    errback(OperationFailure('Failed to get the security descriptor of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
+
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -757,10 +958,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES | READ_CONTROL | SYNCHRONIZE,
-                                              share_access = FILE_SHARE_READ,
+                                              share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
                                               oplock = SMB2_OPLOCK_LEVEL_NONE,
                                               impersonation = SEC_IMPERSONATE,
                                               create_options = FILE_SEQUENTIAL_ONLY | FILE_NON_DIRECTORY_FILE,
@@ -774,20 +975,22 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                m = SMB2Message(SMB2QueryInfoRequest(create_message.payload.fid,
+                m = SMB2Message(self, SMB2QueryInfoRequest(create_message.payload.fid,
                                                      flags = 0,
                                                      additional_info = 0,
                                                      info_type = SMB2_INFO_FILE,
                                                      file_info_class = 0x16,  # FileStreamInformation [MS-FSCC] 2.4
                                                      input_buf = b'',
                                                      output_buf_len = 4096))
-                m.tid = create_message.tid
+                m.tid = kwargs['tid']
                 self._sendSMBMessage(m)
                 self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, infoCB, errback,
-                                                               fid = create_message.payload.fid, file_attributes = create_message.payload.file_attributes)
+                                                               tid = kwargs['tid'],
+                                                               fid = create_message.payload.fid,
+                                                               file_attributes = create_message.payload.file_attributes)
                 messages_history.append(m)
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to open file' % ( path, service_name ), messages_history))
+                errback(OperationFailure('Failed to retrieve %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def infoCB(info_message, **kwargs):
             messages_history.append(info_message)
@@ -802,17 +1005,22 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                         remaining_len = file_len
                     if starting_offset + remaining_len > file_len:
                         remaining_len = file_len - starting_offset
-                    sendRead(info_message.tid, kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
+                    sendRead(kwargs['tid'], kwargs['fid'], starting_offset, remaining_len, 0, kwargs['file_attributes'])
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
+                errback(OperationFailure('Failed to retrieve %s on %s: Unable to retrieve information on file' % ( path, service_name ), messages_history))
 
         def sendRead(tid, fid, offset, remaining_len, read_len, file_attributes):
             read_count = min(self.max_read_size, remaining_len)
-            m = SMB2Message(SMB2ReadRequest(fid, offset, read_count))
+
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                max_read_count = 64 * 1024 * (self.credits -1)
+                read_count = min(read_count, max_read_count)
+
+            m = SMB2Message(self, SMB2ReadRequest(fid, offset, read_count))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, readCB, errback,
-                                                           fid = fid, offset = offset,
+                                                           tid = tid, fid = fid, offset = offset,
                                                            remaining_len = remaining_len,
                                                            read_len = read_len,
                                                            file_attributes = file_attributes)
@@ -826,15 +1034,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 remaining_len = kwargs['remaining_len'] - data_len
 
                 if remaining_len > 0:
-                    sendRead(read_message.tid, kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
+                    sendRead(kwargs['tid'], kwargs['fid'], kwargs['offset'] + data_len, remaining_len, kwargs['read_len'] + data_len, kwargs['file_attributes'])
                 else:
-                    closeFid(read_message.tid, kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
+                    closeFid(kwargs['tid'], kwargs['fid'], ret = ( file_obj, kwargs['file_attributes'], kwargs['read_len'] + data_len ))
             else:
                 messages_history.append(read_message)
-                closeFid(read_message.tid, kwargs['fid'], error = read_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], error = read_message.status)
 
         def closeFid(tid, fid, ret = None, error = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, ret = ret, error = error)
@@ -855,7 +1063,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -888,7 +1096,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = ATTR_ARCHIVE,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | FILE_READ_EA | FILE_WRITE_EA | READ_CONTROL | SYNCHRONIZE,
                                               share_access = 0,
@@ -907,36 +1115,35 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             messages_history.append(create_message)
             if create_message.status == 0:
                 sendWrite(create_message.tid, create_message.payload.fid, starting_offset)
-            elif create_message.status == 0x0103:  # STATUS_PENDING
-                self.pending_requests[create_message.mid] = _PendingRequest(create_message.mid, expiry_time,
-                                                                          createCB, errback,
-                                                                            tid=kwargs['tid'])
             else:
                 errback(OperationFailure('Failed to store %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendWrite(tid, fid, offset):
-            write_count = self.max_write_size
+            if self.smb2_dialect != SMB2_DIALECT_2 and self.cap_multi_credit:
+                write_count = 64 * 1024 * (self.credits -1)
+            else:
+                write_count = self.max_write_size
             data = file_obj.read(write_count)
             data_len = len(data)
             if data_len > 0:
-                m = SMB2Message(SMB2WriteRequest(fid, data, offset))
+                m = SMB2Message(self, SMB2WriteRequest(fid, data, offset))
                 m.tid = tid
                 self._sendSMBMessage(m)
-                self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
+                self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, tid = tid, fid = fid, offset = offset+data_len)
             else:
                 closeFid(tid, fid, offset = offset)
 
         def writeCB(write_message, **kwargs):
             # To avoid crazy memory usage when saving large files, we do not save every write_message in messages_history.
             if write_message.status == 0:
-                sendWrite(write_message.tid, kwargs['fid'], kwargs['offset'])
+                sendWrite(kwargs['tid'], kwargs['fid'], kwargs['offset'])
             else:
                 messages_history.append(write_message)
-                closeFid(write_message.tid, kwargs['fid'])
+                closeFid(kwargs['tid'], kwargs['fid'])
                 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid, error = None, offset = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, fid = fid, offset = offset, error = error)
@@ -957,7 +1164,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -986,7 +1193,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1005,38 +1212,30 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             messages_history.append(open_message)
             if open_message.status == 0:
                 sendDelete(open_message.tid, open_message.payload.fid)
-            elif open_message.status == 0x0103:  # STATUS_PENDING
-                self.pending_requests[open_message.mid] = _PendingRequest(open_message.mid, expiry_time,
-                                                                          createCB, errback,
-                                                                          tid=kwargs['tid'])
             else:
                 errback(OperationFailure('Failed to delete %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendDelete(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0d,  # SMB2_FILE_DISPOSITION_INFO
                                                data = b'\x01'))
-            '''
-                Resources:
-                https://msdn.microsoft.com/en-us/library/cc246560.aspx
-                https://msdn.microsoft.com/en-us/library/cc232098.aspx
-            '''
+            # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4.11
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def deleteCB(delete_message, **kwargs):
             messages_history.append(delete_message)
             if delete_message.status == 0:
-                closeFid(delete_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
@@ -1057,7 +1256,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1086,7 +1285,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 51 46 69 64 00 00 00 00
 """.replace(' ', '').replace('\n', ''))
 
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_WRITE_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1103,37 +1302,31 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(open_message, **kwargs):
             messages_history.append(open_message)
             if open_message.status == 0:
-                sendReset(open_message.tid, open_message.payload.fid)
+                sendReset(kwargs['tid'], open_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to open file' % ( path, service_name ), messages_history))
 
         def sendReset(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 4,  # FileBasicInformation
                                                data = struct.pack('qqqqii',0,0,0,0,0x80,0))) # FILE_ATTRIBUTE_NORMAL
-            '''
-                Resources:
-                https://msdn.microsoft.com/en-us/library/cc246560.aspx
-                https://msdn.microsoft.com/en-us/library/cc232064.aspx
-                https://msdn.microsoft.com/en-us/library/cc232094.aspx
-                https://msdn.microsoft.com/en-us/library/cc232110.aspx
-            '''
+            # [MS-SMB2]: 2.2.39, [MS-FSCC]: 2.4, [MS-FSCC]: 2.4.7, [MS-FSCC]: 2.6
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, resetCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def resetCB(reset_message, **kwargs):
             messages_history.append(reset_message)
             if reset_message.status == 0:
-                closeFid(reset_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(reset_message.tid, kwargs['fid'], status = reset_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = reset_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback, status = status)
@@ -1154,7 +1347,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to reset attributes of %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1184,7 +1377,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_WRITE_DATA | FILE_READ_EA | FILE_WRITE_EA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES | READ_CONTROL | DELETE | SYNCHRONIZE,
                                               share_access = 0,
@@ -1195,18 +1388,18 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                               create_context_data = create_context_data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback, tid = tid)
             messages_history.append(m)
 
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                closeFid(create_message.tid, create_message.payload.fid)
+                closeFid(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to create directory %s on %s: Create failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, closeCB, errback)
@@ -1224,7 +1417,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1252,7 +1445,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1269,30 +1462,30 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(open_message, **kwargs):
             messages_history.append(open_message)
             if open_message.status == 0:
-                sendDelete(open_message.tid, open_message.payload.fid)
+                sendDelete(kwargs['tid'], open_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to delete %s on %s: Unable to open directory' % ( path, service_name ), messages_history))
 
         def sendDelete(tid, fid):
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0d,  # SMB2_FILE_DISPOSITION_INFO
                                                data = b'\x01'))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def deleteCB(delete_message, **kwargs):
             messages_history.append(delete_message)
             if delete_message.status == 0:
-                closeFid(delete_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(delete_message.tid, kwargs['fid'], status = delete_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = delete_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
@@ -1313,7 +1506,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1348,7 +1541,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 10 00 04 00 00 00 18 00 00 00 00 00
 51 46 69 64 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(old_path,
+            m = SMB2Message(self, SMB2CreateRequest(old_path,
                                               file_attributes = 0,
                                               access_mask = DELETE | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
@@ -1365,31 +1558,31 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendRename(create_message.tid, create_message.payload.fid)
+                sendRename(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to rename %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
 
         def sendRename(tid, fid):
             data = b'\x00'*16 + struct.pack('<I', len(new_path)*2) + new_path.encode('UTF-16LE')
-            m = SMB2Message(SMB2SetInfoRequest(fid,
+            m = SMB2Message(self, SMB2SetInfoRequest(fid,
                                                additional_info = 0,
                                                info_type = SMB2_INFO_FILE,
                                                file_info_class = 0x0a,  # SMB2_FILE_RENAME_INFO
                                                data = data))
             m.tid = tid
             self._sendSMBMessage(m)
-            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, fid = fid)
+            self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, renameCB, errback, tid = tid, fid = fid)
             messages_history.append(m)
 
         def renameCB(rename_message, **kwargs):
             messages_history.append(rename_message)
             if rename_message.status == 0:
-                closeFid(rename_message.tid, kwargs['fid'], status = 0)
+                closeFid(kwargs['tid'], kwargs['fid'], status = 0)
             else:
-                closeFid(rename_message.tid, kwargs['fid'], status = rename_message.status)
+                closeFid(kwargs['tid'], kwargs['fid'], status = rename_message.status)
 
         def closeFid(tid, fid, status = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status)
@@ -1410,7 +1603,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1436,7 +1629,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 00 00 00 00 00 00 00 00 00 00 00 00 10 00 04 00
 00 00 18 00 00 00 00 00 4d 78 41 63 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-            m = SMB2Message(SMB2CreateRequest(path,
+            m = SMB2Message(self, SMB2CreateRequest(path,
                                               file_attributes = 0,
                                               access_mask = FILE_READ_DATA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
                                               share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1453,12 +1646,12 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def createCB(create_message, **kwargs):
             messages_history.append(create_message)
             if create_message.status == 0:
-                sendEnumSnapshots(create_message.tid, create_message.payload.fid)
+                sendEnumSnapshots(kwargs['tid'], create_message.payload.fid)
             else:
                 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to open file/directory' % ( old_path, service_name ), messages_history))
 
         def sendEnumSnapshots(tid, fid):
-            m = SMB2Message(SMB2IoctlRequest(fid,
+            m = SMB2Message(self, SMB2IoctlRequest(fid,
                                              ctlcode = 0x00144064,  # FSCTL_SRV_ENUMERATE_SNAPSHOTS
                                              flags = 0x0001,
                                              in_data = b''))
@@ -1480,7 +1673,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 closeFid(kwargs['tid'], kwargs['fid'], status = enum_message.status)
 
         def closeFid(tid, fid, status = None, results = None):
-            m = SMB2Message(SMB2CloseRequest(fid))
+            m = SMB2Message(self, SMB2CloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, closeCB, errback, status = status, results = results)
@@ -1501,7 +1694,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMB2Message(SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
+            m = SMB2Message(self, SMB2TreeConnectRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name )))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -1518,7 +1711,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Echo failed', messages_history))
 
-        m = SMB2Message(SMB2EchoRequest())
+        m = SMB2Message(self, SMB2EchoRequest())
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
         messages_history.append(m)
@@ -1594,9 +1787,38 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                 self._handleSessionChallenge(message, ntlm_token)
                         except ( securityblob.BadSecurityBlobError, securityblob.UnsupportedSecurityProvider ) as ex:
                             raise ProtocolError(str(ex), message.raw_data, message)
-                    elif message.status.internal_value == 0xc000006d:  # STATUS_LOGON_FAILURE
+                    elif (message.status.internal_value == 0xc000006d    # STATUS_LOGON_FAILURE
+                        or message.status.internal_value == 0xc0000064   # STATUS_NO_SUCH_USER
+                        or message.status.internal_value == 0xc000006a): # STATUS_WRONG_PASSWORD
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Please check username and password.')
+                        self.onAuthFailed()
+                    elif (message.status.internal_value == 0xc0000193    # STATUS_ACCOUNT_EXPIRED
+                        or message.status.internal_value == 0xC0000071): # STATUS_PASSWORD_EXPIRED
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account or password has expired.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc0000234: # STATUS_ACCOUNT_LOCKED_OUT
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account has been locked due to too many invalid logon attempts.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc0000072: # STATUS_ACCOUNT_DISABLED
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Account has been disabled.')
+                        self.onAuthFailed()
+                    elif (message.status.internal_value == 0xc000006f    # STATUS_INVALID_LOGON_HOURS
+                        or message.status.internal_value == 0xc000015b   # STATUS_LOGON_TYPE_NOT_GRANTED
+                        or message.status.internal_value == 0xc0000070): # STATUS_INVALID_WORKSTATION
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Not allowed.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc000018c:  # STATUS_TRUSTED_DOMAIN_FAILURE
+                        self.has_authenticated = False
+                        self.log.info('Authentication (with extended security) failed. Domain not trusted.')
+                        self.onAuthFailed()
+                    elif message.status.internal_value == 0xc000018d:  # STATUS_TRUSTED_RELATIONSHIP_FAILURE
                         self.has_authenticated = False
-                        self.log.info('Authentication (with extended security) failed. Please check username and password. You may need to enable/disable NTLMv2 authentication.')
+                        self.log.info('Authentication (with extended security) failed. Workstation not trusted.')
                         self.onAuthFailed()
                     else:
                         raise ProtocolError('Unknown status value (0x%08X) in SMB_COM_SESSION_SETUP_ANDX (with extended security)' % message.status.internal_value,
@@ -1663,14 +1885,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                                      lm_challenge_response,
                                                      session_key,
                                                      self.username,
-                                                     self.domain)
+                                                     self.domain,
+                                                     self.my_name)
 
         if self.log.isEnabledFor(logging.DEBUG):
             self.log.debug('NT challenge response is "%s" (%d bytes)', binascii.hexlify(nt_challenge_response), len(nt_challenge_response))
             self.log.debug('LM challenge response is "%s" (%d bytes)', binascii.hexlify(lm_challenge_response), len(lm_challenge_response))
 
         blob = securityblob.generateAuthSecurityBlob(ntlm_data)
-        self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
+        self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(0, blob)))
 
         if self.security_mode & NEGOTIATE_SECURITY_SIGNATURES_REQUIRE:
             self.log.info('Server requires all SMB messages to be signed')
@@ -1699,13 +1922,13 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         if message.hasExtendedSecurity or message.payload.supportsExtendedSecurity:
             ntlm_data = ntlm.generateNegotiateMessage()
             blob = securityblob.generateNegotiateSecurityBlob(ntlm_data)
-            self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
+            self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__WithSecurityExtension(message.payload.session_key, blob)))
         else:
             nt_password, _, _ = ntlm.generateChallengeResponseV1(self.password, message.payload.challenge, False)
             self.log.info('Performing NTLMv1 authentication (without extended security) with challenge "%s" and hashed password of "%s"',
                           binascii.hexlify(message.payload.challenge),
                           binascii.hexlify(nt_password))
-            self._sendSMBMessage(SMBMessage(ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
+            self._sendSMBMessage(SMBMessage(self, ComSessionSetupAndxRequest__NoSecurityExtension(message.payload.session_key,
                                                                                            self.username,
                                                                                            nt_password,
                                                                                            True,
@@ -1720,7 +1943,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def connectSrvSvc(tid):
-            m = SMBMessage(ComNTCreateAndxRequest('\\srvsvc',
+            m = SMBMessage(self, ComNTCreateAndxRequest('\\srvsvc',
                                                   flags = NT_CREATE_REQUEST_EXTENDED_RESPONSE,
                                                   access_mask = READ_CONTROL | FILE_WRITE_ATTRIBUTES | FILE_READ_ATTRIBUTES | FILE_WRITE_EA | FILE_READ_EA | FILE_APPEND_DATA | FILE_WRITE_DATA | FILE_READ_DATA,
                                                   share_access = FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -1749,7 +1972,7 @@ b8 10 b8 10 00 00 00 00 01 00 00 00 00 00 01 00
 c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 03 00 00 00 04 5d 88 8a eb 1c c9 11 9f e8 08 00
 2b 10 48 60 02 00 00 00""".replace(b' ', b'').replace(b'\n', b''))
-                m = SMBMessage(ComTransactionRequest(max_params_count = 0,
+                m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
                                                      max_data_count = 4280,
                                                      max_setup_count = 0,
                                                      data_bytes = data_bytes,
@@ -1787,7 +2010,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 01 00 00 00 01 00 00 00 04 00 02 00 00 00 00 00
 00 00 00 00 ff ff ff ff 08 00 02 00 00 00 00 00
 """.replace(b' ', b'').replace(b'\n', b''))
-                m = SMBMessage(ComTransactionRequest(max_params_count = 0,
+                m = SMBMessage(self, ComTransactionRequest(max_params_count = 0,
                                                      max_data_count = 4280,
                                                      max_setup_count = 0,
                                                      data_bytes = data_bytes,
@@ -1846,7 +2069,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendReadRequest(tid, fid, data_bytes):
             read_count = min(4280, self.max_raw_size - 2)
-            m = SMBMessage(ComReadAndxRequest(fid = fid,
+            m = SMBMessage(self, ComReadAndxRequest(fid = fid,
                                               offset = 0,
                                               max_return_bytes_count = read_count,
                                               min_return_bytes_count = read_count))
@@ -1857,19 +2080,18 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         def readCB(read_message, **kwargs):
             messages_history.append(read_message)
             if not read_message.status.hasError:
-                data_len = read_message.payload.data_length
                 data_bytes = read_message.payload.data
 
                 if data_bytes[3] & 0x02 == 0:
-                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    sendReadRequest(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
                 else:
-                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:data_len-24])
+                    decodeResults(read_message.tid, kwargs['fid'], kwargs['data_bytes'] + data_bytes[24:])
             else:
                 closeFid(read_message.tid, kwargs['fid'])
                 errback(OperationFailure('Failed to list shares: Unable to retrieve shared device list', messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -1882,7 +2104,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Failed to list shares: Unable to connect to IPC$', messages_history))
 
-        m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
+        m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), path ), SERVICE_ANY, ''))
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = path)
         messages_history.append(m)
@@ -1902,17 +2124,17 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             setup_bytes = struct.pack('<H', 0x0001)  # TRANS2_FIND_FIRST2 sub-command. See [MS-CIFS]: 2.2.6.2.1
             params_bytes = \
                 struct.pack('<HHHHI',
-                            search, # SearchAttributes
+                            search & 0xFFFF, # SearchAttributes (need to restrict the values due to introduction of SMB_FILE_ATTRIBUTE_INCL_NORMAL)
                             100,    # SearchCount
                             0x0006, # Flags: SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
                             0x0104, # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
-                            0x0000) # SearchStorageType
+                            0x0000) # SearchStorageType (seems to be ignored by Windows)
             if support_dfs:
                 params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
             else:
-                params_bytes += (path + pattern).encode('UTF-16LE')
+                params_bytes += (path + pattern + '\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -1946,9 +2168,16 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
                 filename = data_bytes[offset2:offset2+filename_length].decode('UTF-16LE')
                 short_name = short_name.decode('UTF-16LE')
-                results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
-                                          convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
-                                          file_size, alloc_size, file_attributes, short_name, filename))
+
+                accept_result = False
+                if (file_attributes & 0xff) in ( 0x00, ATTR_NORMAL ): # Only the first 8-bits are compared. We ignore other bits like temp, compressed, encryption, sparse, indexed, etc
+                    accept_result = (search == SMB_FILE_ATTRIBUTE_NORMAL) or (search & SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+                else:
+                    accept_result = (file_attributes & search) > 0
+                if accept_result:
+                    results.append(SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time),
+                                              convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                              file_size, alloc_size, file_attributes, short_name, filename))
 
                 if next_offset:
                     offset += next_offset
@@ -1988,11 +2217,15 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 elif end_of_search:
                     callback(results)
                 else:
-                    sendFindNext(find_message.tid, sid, last_name_offset, kwargs.get('support_dfs', False))
+                    sendFindNext(find_message.tid, sid, 0, results[-1].filename, kwargs.get('support_dfs', False))
             else:
-                errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
+                if find_message.status.internal_value == 0xC000000F:  # [MS-ERREF]: STATUS_NO_SUCH_FILE
+                    # Remote server returns STATUS_NO_SUCH_FILE error so we assume that the search returns no matching files
+                    callback([ ])
+                else:
+                    errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
 
-        def sendFindNext(tid, sid, resume_key, support_dfs=False):
+        def sendFindNext(tid, sid, resume_key, resume_file, support_dfs):
             setup_bytes = struct.pack('<H', 0x0002)  # TRANS2_FIND_NEXT2 sub-command. See [MS-CIFS]: 2.2.6.3.1
             params_bytes = \
                 struct.pack('<HHHIH',
@@ -2000,13 +2233,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                             100,        # SearchCount
                             0x0104,     # InfoLevel: SMB_FIND_FILE_BOTH_DIRECTORY_INFO
                             resume_key, # ResumeKey
-                            0x000a)     # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS | SMB_FIND_RETURN_RESUME_KEYS
-            if support_dfs:
-                params_bytes += ("\\" + self.remote_name + "\\" + service_name + path + pattern + '\0').encode('UTF-16LE')
-            else:
-                params_bytes += (path + pattern).encode('UTF-16LE')
+                            0x0006)     # Flags: SMB_FIND_RETURN_RESUME_KEYS | SMB_FIND_CLOSE_AT_EOS
+            params_bytes += (resume_file+'\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2050,7 +2280,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 elif end_of_search:
                     callback(results)
                 else:
-                    sendFindNext(find_message.tid, kwargs['sid'], last_name_offset, kwargs.get('support_dfs', False))
+                    sendFindNext(find_message.tid, kwargs['sid'], 0, results[-1].filename, kwargs.get('support_dfs', False))
             else:
                 errback(OperationFailure('Failed to list %s on %s: Unable to retrieve file list' % ( path, service_name ), messages_history))
 
@@ -2059,7 +2289,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             params_bytes = struct.pack('<H', 3)      # Max referral level 3
             params_bytes += ("\\" + self.remote_name + "\\" + service_name).encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 10,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 10,
                                                   max_data_count = 16644,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2084,7 +2314,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2111,7 +2341,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                             0x0000) # Reserved
             params_bytes += (path + '\0').encode('UTF-16LE')
 
-            m = SMBMessage(ComTransaction2Request(max_params_count = 2,
+            m = SMBMessage(self, ComTransaction2Request(max_params_count = 2,
                                                   max_data_count = 65535,
                                                   max_setup_count = 0,
                                                   params_bytes = params_bytes,
@@ -2128,9 +2358,10 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 info_size = struct.calcsize(info_format)
                 create_time, last_access_time, last_write_time, last_attr_change_time, \
                 file_attributes, _, alloc_size, file_size = struct.unpack(info_format, query_message.payload.data_bytes[:info_size])
+                filename = self._extractLastPathComponent(path)
 
-                info = SharedFile(create_time, last_access_time, last_write_time, last_attr_change_time,
-                                  file_size, alloc_size, file_attributes, path, path)
+                info = SharedFile(convertFILETIMEtoEpoch(create_time), convertFILETIMEtoEpoch(last_access_time), convertFILETIMEtoEpoch(last_write_time), convertFILETIMEtoEpoch(last_attr_change_time),
+                                  file_size, alloc_size, file_attributes, filename, filename)
                 callback(info)
             else:
                 errback(OperationFailure('Failed to get attributes for %s on %s: Read failed' % ( path, service_name ), messages_history))
@@ -2144,13 +2375,16 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to get attributes for %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
         else:
             sendQuery(self.connected_trees[service_name])
 
+    def _getSecurity_SMB1(self, service_name, path_file_pattern, callback, errback, timeout = 30):
+        raise NotReadyError('getSecurity is not yet implemented for SMB1')
+
     def _retrieveFile_SMB1(self, service_name, path, file_obj, callback, errback, timeout = 30):
         return self._retrieveFileFromOffset(service_name, path, file_obj, callback, errback, 0, -1, timeout)
 
@@ -2162,7 +2396,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0040,  # Sharing mode: Deny nothing to others
                                               open_mode = 0x0001,    # Failed if file does not exist
                                               search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
@@ -2185,7 +2419,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
 
         def sendRead(tid, fid, offset, file_attributes, read_len, remaining_len):
             read_count = self.max_raw_size - 2
-            m = SMBMessage(ComReadAndxRequest(fid = fid,
+            m = SMBMessage(self, ComReadAndxRequest(fid = fid,
                                               offset = offset,
                                               max_return_bytes_count = read_count,
                                               min_return_bytes_count = min(0xFFFF, read_count)))
@@ -2224,7 +2458,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to retrieve %s on %s: Read failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2238,7 +2472,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to retrieve %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2256,7 +2490,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0041,  # Sharing mode: Deny nothing to others + Open for writing
                                               open_mode = 0x0012 if truncate else 0x0011,    # Create file if file does not exist. Overwrite or append depending on truncate parameter.
                                               search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM,
@@ -2279,7 +2513,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             data_bytes = file_obj.read(write_count)
             data_len = len(data_bytes)
             if data_len > 0:
-                m = SMBMessage(ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
+                m = SMBMessage(self, ComWriteAndxRequest(fid = fid, offset = offset, data_bytes = data_bytes))
                 m.tid = tid
                 self._sendSMBMessage(m)
                 self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, writeCB, errback, fid = fid, offset = offset+data_len)
@@ -2297,7 +2531,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to store %s on %s: Write failed' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2311,7 +2545,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to store %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2326,7 +2560,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendDelete(tid):
-            m = SMBMessage(ComDeleteRequest(filename_pattern = path,
+            m = SMBMessage(self, ComDeleteRequest(filename_pattern = path,
                                             search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
             m.tid = tid
             self._sendSMBMessage(m)
@@ -2349,7 +2583,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2367,7 +2601,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendCreate(tid):
-            m = SMBMessage(ComCreateDirectoryRequest(path))
+            m = SMBMessage(self, ComCreateDirectoryRequest(path))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, createCB, errback)
@@ -2389,7 +2623,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to create directory %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2404,7 +2638,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendDelete(tid):
-            m = SMBMessage(ComDeleteDirectoryRequest(path))
+            m = SMBMessage(self, ComDeleteDirectoryRequest(path))
             m.tid = tid
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, deleteCB, errback)
@@ -2426,7 +2660,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to delete %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2442,7 +2676,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         messages_history = [ ]
 
         def sendRename(tid):
-            m = SMBMessage(ComRenameRequest(old_path = old_path,
+            m = SMBMessage(self, ComRenameRequest(old_path = old_path,
                                             new_path = new_path,
                                             search_attributes = SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM))
             m.tid = tid
@@ -2466,7 +2700,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to rename %s on %s: Unable to connect to shared device' % ( old_path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2485,7 +2719,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
         results = [ ]
 
         def sendOpen(tid):
-            m = SMBMessage(ComOpenAndxRequest(filename = path,
+            m = SMBMessage(self, ComOpenAndxRequest(filename = path,
                                               access_mode = 0x0040,  # Sharing mode: Deny nothing to others
                                               open_mode = 0x0001,    # Failed if file does not exist
                                               search_attributes = 0,
@@ -2510,7 +2744,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                                       fid,         # FID
                                       0x01,        # IsFctl
                                       0)           # IsFlags
-            m = SMBMessage(ComNTTransactRequest(function = 0x0002,  # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
+            m = SMBMessage(self, ComNTTransactRequest(function = 0x0002,  # NT_TRANSACT_IOCTL. [MS-CIFS]: 2.2.7.2.1
                                                 max_params_count = 0,
                                                 max_data_count = 0xFFFF,
                                                 max_setup_count = 0,
@@ -2535,7 +2769,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 errback(OperationFailure('Failed to list snapshots %s on %s: Unable to list snapshots on path' % ( path, service_name ), messages_history))
 
         def closeFid(tid, fid):
-            m = SMBMessage(ComCloseRequest(fid))
+            m = SMBMessage(self, ComCloseRequest(fid))
             m.tid = tid
             self._sendSMBMessage(m)
             messages_history.append(m)
@@ -2549,7 +2783,7 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
                 else:
                     errback(OperationFailure('Failed to list snapshots %s on %s: Unable to connect to shared device' % ( path, service_name ), messages_history))
 
-            m = SMBMessage(ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
+            m = SMBMessage(self, ComTreeConnectAndxRequest(r'\\%s\%s' % ( self.remote_name.upper(), service_name ), SERVICE_ANY, ''))
             self._sendSMBMessage(m)
             self.pending_requests[m.mid] = _PendingRequest(m.mid, expiry_time, connectCB, errback, path = service_name)
             messages_history.append(m)
@@ -2559,6 +2793,9 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
     def _echo_SMB1(self, data, callback, errback, timeout = 30):
         messages_history = [ ]
 
+        if not isinstance(data, type(b'')):
+            raise TypeError('Echo data must be %s not %s' % (type(b'').__name__, type(data).__name__))
+
         def echoCB(echo_message, **kwargs):
             messages_history.append(echo_message)
             if not echo_message.status.hasError:
@@ -2566,15 +2803,23 @@ c8 4f 32 4b 70 16 d3 01 12 78 5a 47 bf 6e e1 88
             else:
                 errback(OperationFailure('Echo failed', messages_history))
 
-        m = SMBMessage(ComEchoRequest(echo_data = data))
+        m = SMBMessage(self, ComEchoRequest(echo_data = data))
         self._sendSMBMessage(m)
         self.pending_requests[m.mid] = _PendingRequest(m.mid, int(time.time()) + timeout, echoCB, errback)
         messages_history.append(m)
 
+    def _extractLastPathComponent(self, path):
+        return path.replace('\\', '/').split('/')[-1]
+
 
 class SharedDevice:
     """
     Contains information about a single shared device on the remote server.
+
+    The following attributes are available:
+
+    * name : An unicode string containing the name of the shared device
+    * comments : An unicode string containing the user description of the shared device
     """
 
     # The following constants are taken from [MS-SRVS]: 2.2.2.4
@@ -2630,18 +2875,32 @@ class SharedFile:
     If you encounter *SharedFile* instance where its short_name attribute is empty but the filename attribute contains a short name which does not correspond
     to any files/folders on your remote shared device, it could be that the original filename on the file/folder entry on the shared device contains
     one of these prohibited characters: "\/[]:+|<>=;?,* (see [MS-CIFS]: 2.2.1.1.1 for more details).
+
+    The following attributes are available:
+
+    * create_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
+    * last_access_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
+    * last_write_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
+    * last_attr_change_time : Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
+    * file_size : File size in number of bytes
+    * alloc_size : Total number of bytes allocated to store this file
+    * file_attributes : A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
+    * short_name : Unicode string containing the short name of this file (usually in 8.3 notation)
+    * filename : Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
+    * file_id : Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
     """
 
-    def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename):
+    def __init__(self, create_time, last_access_time, last_write_time, last_attr_change_time, file_size, alloc_size, file_attributes, short_name, filename, file_id=None):
         self.create_time = create_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of creation of this file resource on the remote server
         self.last_access_time = last_access_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last access of this file resource on the remote server
         self.last_write_time = last_write_time    #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last modification of this file resource on the remote server
         self.last_attr_change_time = last_attr_change_time  #: Float value in number of seconds since 1970-01-01 00:00:00 to the time of last attribute change of this file resource on the remote server
         self.file_size = file_size   #: File size in number of bytes
         self.alloc_size = alloc_size #: Total number of bytes allocated to store this file
-        self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3
+        self.file_attributes = file_attributes #: A SMB_EXT_FILE_ATTR integer value. See [MS-CIFS]: 2.2.1.2.3. You can perform bit-wise tests to determine the status of the file using the ATTR_xxx constants in smb_constants.py.
         self.short_name = short_name #: Unicode string containing the short name of this file (usually in 8.3 notation)
         self.filename = filename     #: Unicode string containing the long filename of this file. Each OS has a limit to the length of this file name. On Windows, it is 256 characters.
+        self.file_id = file_id       #: Long value representing the file reference number for the file. If the remote system does not support this field, this field will be None or 0. See [MS-FSCC]: 2.4.17
 
     @property
     def isDirectory(self):
@@ -2653,6 +2912,16 @@ class SharedFile:
         """A convenient property to return True if this file resource is read-only on the remote server"""
         return bool(self.file_attributes & ATTR_READONLY)
 
+    @property
+    def isNormal(self):
+        """
+        A convenient property to return True if this is a normal file.
+
+        Note that pysmb defines a normal file as a file entry that is not read-only, not hidden, not system, not archive and not a directory.
+        It ignores other attributes like compression, indexed, sparse, temporary and encryption.
+        """
+        return (self.file_attributes==ATTR_NORMAL) or ((self.file_attributes & 0xff)==0)
+
     def __unicode__(self):
         return 'Shared file: %s (FileSize:%d bytes, isDirectory:%s)' % ( self.filename, self.file_size, self.isDirectory )
 
diff --git a/python3/smb/ntlm.py b/python3/smb/ntlm.py
index bc5c7836..a2a3bdde 100644
--- a/python3/smb/ntlm.py
+++ b/python3/smb/ntlm.py
@@ -161,13 +161,13 @@ def generateChallengeResponseV2(password, user, server_challenge, server_info, d
     d = MD4()
     d.update(password.encode('UTF-16LE'))
     ntlm_hash = d.digest()   # The NT password hash
-    response_key = hmac.new(ntlm_hash, (user.upper() + domain).encode('UTF-16LE')).digest()  # The NTLMv2 password hash. In [MS-NLMP], this is the result of NTOWFv2 and LMOWFv2 functions
+    response_key = hmac.new(ntlm_hash, (user.upper() + domain).encode('UTF-16LE'), 'md5').digest()  # The NTLMv2 password hash. In [MS-NLMP], this is the result of NTOWFv2 and LMOWFv2 functions
     temp = b'\x01\x01' + b'\0'*6 + client_timestamp + client_challenge + b'\0'*4 + server_info
-    ntproofstr = hmac.new(response_key, server_challenge + temp).digest()
+    ntproofstr = hmac.new(response_key, server_challenge + temp, 'md5').digest()
 
     nt_challenge_response = ntproofstr + temp
-    lm_challenge_response = hmac.new(response_key, server_challenge + client_challenge).digest() + client_challenge
-    session_key = hmac.new(response_key, ntproofstr).digest()
+    lm_challenge_response = hmac.new(response_key, server_challenge + client_challenge, 'md5').digest() + client_challenge
+    session_key = hmac.new(response_key, ntproofstr, 'md5').digest()
 
     return nt_challenge_response, lm_challenge_response, session_key
 
diff --git a/python3/smb/security_descriptors.py b/python3/smb/security_descriptors.py
new file mode 100644
index 00000000..44a678f3
--- /dev/null
+++ b/python3/smb/security_descriptors.py
@@ -0,0 +1,367 @@
+"""
+This module implements security descriptors, and the partial structures
+used in them, as specified in [MS-DTYP].
+"""
+
+import struct
+
+
+# Security descriptor control flags
+# [MS-DTYP]: 2.4.6
+SECURITY_DESCRIPTOR_OWNER_DEFAULTED = 0x0001
+SECURITY_DESCRIPTOR_GROUP_DEFAULTED = 0x0002
+SECURITY_DESCRIPTOR_DACL_PRESENT = 0x0004
+SECURITY_DESCRIPTOR_DACL_DEFAULTED = 0x0008
+SECURITY_DESCRIPTOR_SACL_PRESENT = 0x0010
+SECURITY_DESCRIPTOR_SACL_DEFAULTED = 0x0020
+SECURITY_DESCRIPTOR_SERVER_SECURITY = 0x0040
+SECURITY_DESCRIPTOR_DACL_TRUSTED = 0x0080
+SECURITY_DESCRIPTOR_DACL_COMPUTED_INHERITANCE_REQUIRED = 0x0100
+SECURITY_DESCRIPTOR_SACL_COMPUTED_INHERITANCE_REQUIRED = 0x0200
+SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED = 0x0400
+SECURITY_DESCRIPTOR_SACL_AUTO_INHERITED = 0x0800
+SECURITY_DESCRIPTOR_DACL_PROTECTED = 0x1000
+SECURITY_DESCRIPTOR_SACL_PROTECTED = 0x2000
+SECURITY_DESCRIPTOR_RM_CONTROL_VALID = 0x4000
+SECURITY_DESCRIPTOR_SELF_RELATIVE = 0x8000
+
+# ACE types
+# [MS-DTYP]: 2.4.4.1
+ACE_TYPE_ACCESS_ALLOWED = 0x00
+ACE_TYPE_ACCESS_DENIED = 0x01
+ACE_TYPE_SYSTEM_AUDIT = 0x02
+ACE_TYPE_SYSTEM_ALARM = 0x03
+ACE_TYPE_ACCESS_ALLOWED_COMPOUND = 0x04
+ACE_TYPE_ACCESS_ALLOWED_OBJECT = 0x05
+ACE_TYPE_ACCESS_DENIED_OBJECT = 0x06
+ACE_TYPE_SYSTEM_AUDIT_OBJECT = 0x07
+ACE_TYPE_SYSTEM_ALARM_OBJECT = 0x08
+ACE_TYPE_ACCESS_ALLOWED_CALLBACK = 0x09
+ACE_TYPE_ACCESS_DENIED_CALLBACK = 0x0A
+ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT = 0x0B
+ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT = 0x0C
+ACE_TYPE_SYSTEM_AUDIT_CALLBACK = 0x0D
+ACE_TYPE_SYSTEM_ALARM_CALLBACK = 0x0E
+ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT = 0x0F
+ACE_TYPE_SYSTEM_ALARM_CALLBACK_OBJECT = 0x10
+ACE_TYPE_SYSTEM_MANDATORY_LABEL = 0x11
+ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE = 0x12
+ACE_TYPE_SYSTEM_SCOPED_POLICY_ID = 0x13
+
+# ACE flags
+# [MS-DTYP]: 2.4.4.1
+ACE_FLAG_OBJECT_INHERIT = 0x01
+ACE_FLAG_CONTAINER_INHERIT = 0x02
+ACE_FLAG_NO_PROPAGATE_INHERIT = 0x04
+ACE_FLAG_INHERIT_ONLY = 0x08
+ACE_FLAG_INHERITED = 0x10
+ACE_FLAG_SUCCESSFUL_ACCESS = 0x40
+ACE_FLAG_FAILED_ACCESS = 0x80
+
+# Pre-defined well-known SIDs
+# [MS-DTYP]: 2.4.2.4
+SID_NULL = "S-1-0-0"
+SID_EVERYONE = "S-1-1-0"
+SID_LOCAL = "S-1-2-0"
+SID_CONSOLE_LOGON = "S-1-2-1"
+SID_CREATOR_OWNER = "S-1-3-0"
+SID_CREATOR_GROUP = "S-1-3-1"
+SID_OWNER_SERVER = "S-1-3-2"
+SID_GROUP_SERVER = "S-1-3-3"
+SID_OWNER_RIGHTS = "S-1-3-4"
+SID_NT_AUTHORITY = "S-1-5"
+SID_DIALUP = "S-1-5-1"
+SID_NETWORK = "S-1-5-2"
+SID_BATCH = "S-1-5-3"
+SID_INTERACTIVE = "S-1-5-4"
+SID_SERVICE = "S-1-5-6"
+SID_ANONYMOUS = "S-1-5-7"
+SID_PROXY = "S-1-5-8"
+SID_ENTERPRISE_DOMAIN_CONTROLLERS = "S-1-5-9"
+SID_PRINCIPAL_SELF = "S-1-5-10"
+SID_AUTHENTICATED_USERS = "S-1-5-11"
+SID_RESTRICTED_CODE = "S-1-5-12"
+SID_TERMINAL_SERVER_USER = "S-1-5-13"
+SID_REMOTE_INTERACTIVE_LOGON = "S-1-5-14"
+SID_THIS_ORGANIZATION = "S-1-5-15"
+SID_IUSR = "S-1-5-17"
+SID_LOCAL_SYSTEM = "S-1-5-18"
+SID_LOCAL_SERVICE = "S-1-5-19"
+SID_NETWORK_SERVICE = "S-1-5-20"
+SID_COMPOUNDED_AUTHENTICATION = "S-1-5-21-0-0-0-496"
+SID_CLAIMS_VALID = "S-1-5-21-0-0-0-497"
+SID_BUILTIN_ADMINISTRATORS = "S-1-5-32-544"
+SID_BUILTIN_USERS = "S-1-5-32-545"
+SID_BUILTIN_GUESTS = "S-1-5-32-546"
+SID_POWER_USERS = "S-1-5-32-547"
+SID_ACCOUNT_OPERATORS = "S-1-5-32-548"
+SID_SERVER_OPERATORS = "S-1-5-32-549"
+SID_PRINTER_OPERATORS = "S-1-5-32-550"
+SID_BACKUP_OPERATORS = "S-1-5-32-551"
+SID_REPLICATOR = "S-1-5-32-552"
+SID_ALIAS_PREW2KCOMPACC = "S-1-5-32-554"
+SID_REMOTE_DESKTOP = "S-1-5-32-555"
+SID_NETWORK_CONFIGURATION_OPS = "S-1-5-32-556"
+SID_INCOMING_FOREST_TRUST_BUILDERS = "S-1-5-32-557"
+SID_PERFMON_USERS = "S-1-5-32-558"
+SID_PERFLOG_USERS = "S-1-5-32-559"
+SID_WINDOWS_AUTHORIZATION_ACCESS_GROUP = "S-1-5-32-560"
+SID_TERMINAL_SERVER_LICENSE_SERVERS = "S-1-5-32-561"
+SID_DISTRIBUTED_COM_USERS = "S-1-5-32-562"
+SID_IIS_IUSRS = "S-1-5-32-568"
+SID_CRYPTOGRAPHIC_OPERATORS = "S-1-5-32-569"
+SID_EVENT_LOG_READERS = "S-1-5-32-573"
+SID_CERTIFICATE_SERVICE_DCOM_ACCESS = "S-1-5-32-574"
+SID_RDS_REMOTE_ACCESS_SERVERS = "S-1-5-32-575"
+SID_RDS_ENDPOINT_SERVERS = "S-1-5-32-576"
+SID_RDS_MANAGEMENT_SERVERS = "S-1-5-32-577"
+SID_HYPER_V_ADMINS = "S-1-5-32-578"
+SID_ACCESS_CONTROL_ASSISTANCE_OPS = "S-1-5-32-579"
+SID_REMOTE_MANAGEMENT_USERS = "S-1-5-32-580"
+SID_WRITE_RESTRICTED_CODE = "S-1-5-33"
+SID_NTLM_AUTHENTICATION = "S-1-5-64-10"
+SID_SCHANNEL_AUTHENTICATION = "S-1-5-64-14"
+SID_DIGEST_AUTHENTICATION = "S-1-5-64-21"
+SID_THIS_ORGANIZATION_CERTIFICATE = "S-1-5-65-1"
+SID_NT_SERVICE = "S-1-5-80"
+SID_USER_MODE_DRIVERS = "S-1-5-84-0-0-0-0-0"
+SID_LOCAL_ACCOUNT = "S-1-5-113"
+SID_LOCAL_ACCOUNT_AND_MEMBER_OF_ADMINISTRATORS_GROUP = "S-1-5-114"
+SID_OTHER_ORGANIZATION = "S-1-5-1000"
+SID_ALL_APP_PACKAGES = "S-1-15-2-1"
+SID_ML_UNTRUSTED = "S-1-16-0"
+SID_ML_LOW = "S-1-16-4096"
+SID_ML_MEDIUM = "S-1-16-8192"
+SID_ML_MEDIUM_PLUS = "S-1-16-8448"
+SID_ML_HIGH = "S-1-16-12288"
+SID_ML_SYSTEM = "S-1-16-16384"
+SID_ML_PROTECTED_PROCESS = "S-1-16-20480"
+SID_AUTHENTICATION_AUTHORITY_ASSERTED_IDENTITY = "S-1-18-1"
+SID_SERVICE_ASSERTED_IDENTITY = "S-1-18-2"
+SID_FRESH_PUBLIC_KEY_IDENTITY = "S-1-18-3"
+SID_KEY_TRUST_IDENTITY = "S-1-18-4"
+SID_KEY_PROPERTY_MFA = "S-1-18-5"
+SID_KEY_PROPERTY_ATTESTATION = "S-1-18-6"
+
+
+class SID(object):
+    """
+    A Windows security identifier. Represents a single principal, such a
+    user or a group, as a sequence of numbers consisting of the revision,
+    identifier authority, and a variable-length list of subauthorities.
+
+    See [MS-DTYP]: 2.4.2
+    """
+    def __init__(self, revision, identifier_authority, subauthorities):
+        #: Revision, should always be 1.
+        self.revision = revision
+        #: An integer representing the identifier authority.
+        self.identifier_authority = identifier_authority
+        #: A list of integers representing all subauthorities.
+        self.subauthorities = subauthorities
+
+    def __str__(self):
+        """
+        String representation, as specified in [MS-DTYP]: 2.4.2.1
+        """
+        if self.identifier_authority >= 2**32:
+            id_auth = '%#x' % (self.identifier_authority,)
+        else:
+            id_auth = self.identifier_authority
+        auths = [self.revision, id_auth] + self.subauthorities
+        return 'S-' + '-'.join(str(subauth) for subauth in auths)
+
+    def __repr__(self):
+        return 'SID(%r)' % (str(self),)
+
+    @classmethod
+    def from_bytes(cls, data, return_tail=False):
+        revision, subauth_count = struct.unpack('<BB', data[:2])
+        identifier_authority = struct.unpack('>Q', b'\x00\x00' + data[2:8])[0]
+        subauth_data = data[8:]
+        subauthorities = [struct.unpack('<L', subauth_data[4 * i : 4 * (i+1)])[0]
+                          for i in range(subauth_count)]
+        sid = cls(revision, identifier_authority, subauthorities)
+        if return_tail:
+            return sid, subauth_data[4 * subauth_count :]
+        return sid
+
+
+class ACE(object):
+    """
+    Represents a single access control entry.
+
+    See [MS-DTYP]: 2.4.4
+    """
+    HEADER_FORMAT = '<BBH'
+
+    def __init__(self, type_, flags, mask, sid, additional_data):
+        #: An integer representing the type of the ACE. One of the
+        #: ``ACE_TYPE_*`` constants. Corresponds to the ``AceType`` field
+        #: from [MS-DTYP] 2.4.4.1.
+        self.type = type_
+        #: An integer bitmask with ACE flags, corresponds to the
+        #: ``AceFlags`` field.
+        self.flags = flags
+        #: An integer representing the ``ACCESS_MASK`` as specified in
+        #: [MS-DTYP] 2.4.3.
+        self.mask = mask
+        #: The :class:`SID` of a trustee.
+        self.sid = sid
+        #: A dictionary of additional fields present in the ACE, depending
+        #: on the type. The following fields can be present:
+        #:
+        #: * ``flags``
+        #: * ``object_type``
+        #: * ``inherited_object_type``
+        #: * ``application_data``
+        #: * ``attribute_data``
+        self.additional_data = additional_data
+
+    def __repr__(self):
+        return "ACE(type=%#04x, flags=%#04x, mask=%#010x, sid=%s)" % (
+            self.type, self.flags, self.mask, self.sid,
+        )
+
+    @property
+    def isInheritOnly(self):
+        """Convenience property which indicates if this ACE is inherit
+        only, meaning that it doesn't apply to the object itself."""
+        return bool(self.flags & ACE_FLAG_INHERIT_ONLY)
+
+    @classmethod
+    def from_bytes(cls, data):
+        header_size = struct.calcsize(cls.HEADER_FORMAT)
+        header = data[:header_size]
+        type_, flags, size = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert len(data) >= size
+
+        body = data[header_size:size]
+        additional_data = {}
+
+        # In all ACE types, the mask immediately follows the header.
+        mask = struct.unpack('<I', body[:4])[0]
+        body = body[4:]
+
+        # All OBJECT-type ACEs contain additional flags, and two GUIDs as
+        # the following fields.
+        if type_ in (ACE_TYPE_ACCESS_ALLOWED_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_OBJECT,
+                     ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
+            additional_data['flags'] = struct.unpack('<I', body[:4])[0]
+            additional_data['object_type'] = body[4:20]
+            additional_data['inherited_object_type'] = body[20:36]
+            body = body[36:]
+
+        # Then the SID in all types.
+        sid, body = SID.from_bytes(body, return_tail=True)
+
+        # CALLBACK-type ACEs (and for some obscure reason,
+        # SYSTEM_AUDIT_OBJECT) have a final tail of application data.
+        if type_ in (ACE_TYPE_ACCESS_ALLOWED_CALLBACK,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK,
+                     ACE_TYPE_ACCESS_ALLOWED_CALLBACK_OBJECT,
+                     ACE_TYPE_ACCESS_DENIED_CALLBACK_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_OBJECT,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK,
+                     ACE_TYPE_SYSTEM_AUDIT_CALLBACK_OBJECT):
+            additional_data['application_data'] = body
+
+        # SYSTEM_RESOURCE_ATTRIBUTE ACEs have a tail of attribute data.
+        if type_ == ACE_TYPE_SYSTEM_RESOURCE_ATTRIBUTE:
+            additional_data['attribute_data'] = body
+
+        return cls(type_, flags, mask, sid, additional_data)
+
+
+class ACL(object):
+    """
+    Access control list, encapsulating a sequence of access control
+    entries.
+
+    See [MS-DTYP]: 2.4.5
+    """
+    HEADER_FORMAT = '<BBHHH'
+
+    def __init__(self, revision, aces):
+        #: Integer value of the revision.
+        self.revision = revision
+        #: List of :class:`ACE` instances.
+        self.aces = aces
+
+    def __repr__(self):
+        return "ACL(%r)" % (self.aces,)
+
+    @classmethod
+    def from_bytes(cls, data):
+        revision = None
+        aces = []
+
+        header_size = struct.calcsize(cls.HEADER_FORMAT)
+        header, remaining = data[:header_size], data[header_size:]
+        revision, sbz1, size, count, sbz2 = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert len(data) >= size
+
+        for i in range(count):
+            ace_size = struct.unpack('<H', remaining[2:4])[0]
+            ace_data, remaining = remaining[:ace_size], remaining[ace_size:]
+            aces.append(ACE.from_bytes(ace_data))
+
+        return cls(revision, aces)
+
+
+class SecurityDescriptor(object):
+    """
+    Represents a security descriptor.
+
+    See [MS-DTYP]: 2.4.6
+    """
+
+    HEADER_FORMAT = '<BBHIIII'
+
+    def __init__(self, flags, owner, group, dacl, sacl):
+        #: Integer bitmask of control flags. Corresponds to the
+        #: ``Control`` field in [MS-DTYP] 2.4.6.
+        self.flags = flags
+        #: Instance of :class:`SID` representing the owner user.
+        self.owner = owner
+        #: Instance of :class:`SID` representing the owner group.
+        self.group = group
+        #: Instance of :class:`ACL` representing the discretionary access
+        #: control list, which specifies access restrictions of an object.
+        self.dacl = dacl
+        #: Instance of :class:`ACL` representing the system access control
+        #: list, which specifies audit logging of an object.
+        self.sacl = sacl
+
+    @classmethod
+    def from_bytes(cls, data):
+        owner = None
+        group = None
+        dacl = None
+        sacl = None
+
+        header = data[:struct.calcsize(cls.HEADER_FORMAT)]
+        (revision, sbz1, flags, owner_offset, group_offset, sacl_offset,
+         dacl_offset) = struct.unpack(cls.HEADER_FORMAT, header)
+
+        assert revision == 1
+        assert flags & SECURITY_DESCRIPTOR_SELF_RELATIVE
+        for offset in (owner_offset, group_offset, sacl_offset, dacl_offset):
+            assert 0 <= offset < len(data)
+
+        if owner_offset:
+            owner = SID.from_bytes(data[owner_offset:])
+        if group_offset:
+            group = SID.from_bytes(data[group_offset:])
+        if dacl_offset:
+            dacl = ACL.from_bytes(data[dacl_offset:])
+        if sacl_offset:
+            sacl = ACL.from_bytes(data[sacl_offset:])
+
+        return cls(flags, owner, group, dacl, sacl)
diff --git a/python3/smb/smb2_constants.py b/python3/smb/smb2_constants.py
index 71ef74be..024ed2c4 100644
--- a/python3/smb/smb2_constants.py
+++ b/python3/smb/smb2_constants.py
@@ -50,9 +50,12 @@ SMB2_COMMAND_NAMES = {
 }
 
 # Values for dialect_revision field in SMB2NegotiateResponse class
-SMB2_DIALECT_2 = 0x0202
-SMB2_DIALECT_21 = 0x0210
-SMB2_DIALECT_2ALL = 0x02FF
+SMB2_DIALECT_2 = 0x0202  # 2.0.2 - First SMB2 version
+SMB2_DIALECT_21 = 0x0210  # 2.1 - Windows 7
+SMB2_DIALET_30 = 0x0300  # 3.0 - Windows 8
+SMB2_DIALECT_302 = 0x0302  # 3.0.2 - Windows 8.1
+SMB2_DIALECT_311 = 0x0311  # 3.1.1 - Windows 10
+SMB2_DIALECT_2ALL = 0x02FF  # Wildcard (for negotiation only)
 
 # Bit mask for SecurityMode field in SMB2NegotiateResponse class
 SMB2_NEGOTIATE_SIGNING_ENABLED = 0x0001
@@ -66,6 +69,17 @@ SMB2_SHARE_TYPE_PRINTER = 0x03
 # Bitmask for Capabilities in SMB2TreeConnectResponse class
 SMB2_SHARE_CAP_DFS = 0x0008
 
+
+# SMB 2.1 / 3 Capabilities flags
+SMB2_GLOBAL_CAP_DFS = 0x01
+SMB2_GLOBAL_CAP_LEASING = 0x02
+SMB2_GLOBAL_CAP_LARGE_MTU = 0x04
+SMB2_GLOBAL_CAP_MULTI_CHANNEL = 0x08
+SMB2_GLOBAL_CAP_PERSISTENT_HANDLES = 0x10
+SMB2_GLOBAL_CAP_DIRECTORY_LEASING = 0x20
+SMB2_GLOBAL_CAP_ENCRYPTION = 0x40
+
+
 # Values for OpLockLevel field in SMB2CreateRequest class
 SMB2_OPLOCK_LEVEL_NONE = 0x00
 SMB2_OPLOCK_LEVEL_II = 0x01
diff --git a/python3/smb/smb2_structs.py b/python3/smb/smb2_structs.py
index 2fdcbb39..f396628a 100644
--- a/python3/smb/smb2_structs.py
+++ b/python3/smb/smb2_structs.py
@@ -1,5 +1,5 @@
 
-import os, sys, struct, types, logging, binascii, time
+import os, sys, struct, types, logging, binascii, time, uuid
 from io import StringIO
 from .smb_structs import ProtocolError
 from .smb_constants import *
@@ -23,8 +23,14 @@ class SMB2Message:
     log = logging.getLogger('SMB.SMB2Message')
     protocol = 2
 
-    def __init__(self, payload = None):
+    def __init__(self, conn = None, payload = None):
+        """
+        Initialise a new SMB2 Message.
+        conn - reference to the connection, the SMB class
+        payload - the message payload, if any
+        """
         self.reset()
+        self.conn = conn
         if payload:
             self.payload = payload
             self.payload.initMessage(self)
@@ -60,6 +66,10 @@ class SMB2Message:
         self.pid = 0
         self.tid = 0
 
+        # credit related
+        self.credit_charge = 0
+        self.credit_request = 1
+
         # Not used in this class. Maintained for compatibility with SMBMessage class
         self.flags2 = 0
         self.uid = 0
@@ -69,8 +79,24 @@ class SMB2Message:
     def encode(self):
         """
         Encode this SMB2 message into a series of bytes suitable to be embedded with a NetBIOS session message.
+        AssertionError will be raised if this SMB message has not been initialized with an SMB instance
         AssertionError will be raised if this SMB message has not been initialized with a Payload instance
 
+        The header format is:
+        - Protocol ID
+        - Structure Size
+        - Credit Charge
+        - Status / Channel Sequence
+        - Command
+        - Credit Request / Credit Response
+        - Flags
+        - Next Compound
+        - MessageId
+        - Reserved
+        - TreeId
+        - Session ID
+        - Signature
+
         @return: a string containing the encoded SMB2 message
         """
         assert self.payload
@@ -78,9 +104,40 @@ class SMB2Message:
         self.pid = os.getpid()
         self.payload.prepare(self)
 
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        # This only applies to SMB2ReadRequest, SMB2WriteRequest, SMB2IoctlRequest and SMB2QueryDirectory
+        # See: MS-SMB2 3.2.4.1.5: For all other requests, the client MUST set CreditCharge to 1, even if the
+        # payload size of a request or the anticipated response is greater than 65536.
+        if self.conn.smb2_dialect != SMB2_DIALECT_2:
+            if self.conn.cap_multi_credit:
+                # self.credit_charge will be set by some commands if necessary (Read/Write/Ioctl/QueryDirectory)
+                # If not set, but dialect is SMB 2.1 or above, we must set it to 1
+                if self.credit_charge is 0:
+                    self.credit_charge = 1
+            else:
+                # If >= SMB 2.1, but server does not support multi credit operations we must set to 1
+                self.credit_charge = 1
+
+        if self.mid > 3:
+            self.credit_request = 127
+
         headers_data = struct.pack(self.HEADER_STRUCT_FORMAT,
-                                   b'\xFESMB', self.HEADER_SIZE, 0, self.status, self.command, 0, self.flags) + \
-                       struct.pack(self.SYNC_HEADER_STRUCT_FORMAT, self.next_command_offset, self.mid, self.pid, self.tid, self.session_id, self.signature)
+                                   b'\xFESMB',  # Protocol ID
+                                   self.HEADER_SIZE,  # Structure Size
+                                   self.credit_charge,  # Credit Charge
+                                   self.status,  # Status / Channel Sequence
+                                   self.command,  # Command
+                                   self.credit_request,  # Credit Request / Credit Response
+                                   self.flags, # Flags
+                                   ) + \
+                       struct.pack(self.SYNC_HEADER_STRUCT_FORMAT,
+                                    self.next_command_offset, # Next Compound
+                                    self.mid,  # Message ID
+                                    self.pid,  # Process ID
+                                    self.tid,  # Tree ID
+                                    self.session_id,  # Session ID
+                                    self.signature)  # Signature
         return headers_data + self.data
 
     def decode(self, buf):
@@ -105,6 +162,9 @@ class SMB2Message:
 
         self.reset()
 
+        protocol, struct_size, self.credit_charge, self.status, \
+            self.command, self.credit_response, \
+            self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
         protocol, struct_size, self.credit_charge, self.status, \
             self.command, self.credit_re, self.flags = struct.unpack(self.HEADER_STRUCT_FORMAT, buf[:self.HEADER_STRUCT_SIZE])
 
@@ -189,6 +249,53 @@ class Structure:
         raise NotImplementedError
 
 
+class SMB2NegotiateRequest(Structure):
+    """
+    2.2.3 SMB2 NEGOTIATE Request
+    The SMB2 NEGOTIATE Request packet is used by the client to notify the server what dialects of the SMB 2 Protocol
+    the client understands. This request is composed of an SMB2 header, as specified in section 2.2.1,
+    followed by this request structure:
+
+    SMB2 Negotiate Request Packet structure:
+        StructureSize (2 bytes)
+        DialectCount (2 bytes)
+        SecurityMode (2 bytes)
+        Reserved (2 bytes)
+        Capabilities (4 bytes)
+        ClientGuid (16 bytes)
+        ClientStartTime (8 bytes):
+        ClientStartTime (8 bytes):
+        Dialects (variable): An array of one or more 16-bit integers
+
+    References:
+    ===========
+    - [MS-SMB2]: 2.2.3
+
+    """
+
+
+    STRUCTURE_FORMAT = "<HHHHI16sQHH"
+    STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
+
+    def initMessage(self, message):
+        Structure.initMessage(self, message)
+        message.command = SMB2_COM_NEGOTIATE
+
+    def prepare(self, message):
+        # TODO! Do we need to save the GUID and present it later in other requests?
+        # The SMB docs don't exactly explain what the guid is for
+        message.data = struct.pack(self.STRUCTURE_FORMAT,
+                                   36,           # Structure size. Must be 36 as mandated by [MS-SMB2] 2.2.3
+                                   2,            # DialectCount
+                                   0x01,         # Security mode
+                                   0,            # Reserved
+                                   0x00,         # Capabilities
+                                   uuid.uuid4().bytes, # Client GUID
+                                   0,            # Client start time
+                                   SMB2_DIALECT_2,
+                                   SMB2_DIALECT_21)
+
+
 class SMB2NegotiateResponse(Structure):
     """
     Contains information on the SMB2_NEGOTIATE response from server
@@ -223,6 +330,7 @@ class SMB2NegotiateResponse(Structure):
             self.server_start_time = convertFILETIMEtoEpoch(self.server_start_time)
             self.system_time = convertFILETIMEtoEpoch(self.system_time)
             self.security_blob = message.raw_data[security_buf_offset:security_buf_offset+security_buf_len]
+            message.conn.smb2_dialect = self.dialect_revision
 
 
 class SMB2SessionSetupRequest(Structure):
@@ -270,6 +378,14 @@ class SMB2SessionSetupResponse(Structure):
     STRUCTURE_FORMAT = "<HHHH"
     STRUCTURE_SIZE = struct.calcsize(STRUCTURE_FORMAT)
 
+    @property
+    def isGuestSession(self):
+        return (self.session_flags & 0x0001) > 0   # SMB2_SESSION_FLAG_IS_GUEST
+
+    @property
+    def isAnonymousSession(self):
+        return (self.session_flags & 0x0002) > 0   # SMB2_SESSION_FLAG_IS_NULL
+
     def decode(self, message):
         assert message.command == SMB2_COM_SESSION_SETUP
 
@@ -465,6 +581,13 @@ class SMB2WriteRequest(Structure):
                                    0,  # WriteChannelInfoLength
                                    self.flags) + self.data
 
+        # MS-SMB2 3.2.4.7
+        # If a client requests writing to a file, Connection.Dialect is not "2.0.2", and if
+        # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
+        # to ( 1 + (Length - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (len(self.data) -1) / 65536)
+
 
 class SMB2WriteResponse(Structure):
     """
@@ -523,6 +646,13 @@ class SMB2ReadRequest(Structure):
                                    0     # ReadChannelInfoLength
                                   ) + b'\0'
 
+        # MS-SMB2 3.2.4.6
+        # If a client requests reading from a file, Connection.Dialect is not "2.0.2", and if
+        # Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header MUST be set
+        # to ( 1 + (Length - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (self.read_len -1) / 65536)
+
 
 class SMB2ReadResponse(Structure):
     """
@@ -579,6 +709,11 @@ class SMB2IoctlRequest(Structure):
                                    0    # Reserved
                                   ) + self.in_data
 
+        # If Connection.SupportsMultiCredit is TRUE, the CreditCharge field in the SMB2 header
+        # SHOULD be set to (max(InputCount, MaxOutputResponse) - 1) / 65536 + 1
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int((max(len(self.in_data), self.max_out_size) - 1) / 65536 + 1)
+
 
 class SMB2IoctlResponse(Structure):
     """
@@ -687,6 +822,12 @@ class SMB2QueryDirectoryRequest(Structure):
                                    len(self.filename)*2,
                                    self.output_buf_len) + self.filename.encode('UTF-16LE')
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (self.output_buf_len -1) / 65536)
+
 
 class SMB2QueryDirectoryResponse(Structure):
     """
@@ -749,6 +890,12 @@ class SMB2QueryInfoRequest(Structure):
                                    self.fid                # FileId
                                   ) + self.input_buf
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + ((self.output_buf_len + len(self.input_buf)) -1) / 65536)
+
 
 class SMB2QueryInfoResponse(Structure):
     """
@@ -807,6 +954,13 @@ class SMB2SetInfoRequest(Structure):
                                    self.fid               # FileId
                                   ) + self.data
 
+        # MS-SMB2 3.2.4.17
+        # If Connection.Dialect is not "2.0.2" and if Connection.SupportsMultiCredit is TRUE, the
+        # CreditCharge field in the SMB2 header MUST be set to ( 1 + (OutputBufferLength - 1) / 65536 )
+        if message.conn.smb2_dialect != SMB2_DIALECT_2 and message.conn.cap_multi_credit:
+            message.credit_charge = int(1 + (len(self.data) -1) / 65536)
+
+
 class SMB2SetInfoResponse(Structure):
     """
     References:
diff --git a/python3/smb/smb_constants.py b/python3/smb/smb_constants.py
index 685ae684..de856520 100644
--- a/python3/smb/smb_constants.py
+++ b/python3/smb/smb_constants.py
@@ -115,6 +115,7 @@ FILE_APPEND_DATA = 0x04
 FILE_READ_EA = 0x08
 FILE_WRITE_EA = 0x10
 FILE_EXECUTE = 0x20
+FILE_DELETE_CHILD = 0x40
 FILE_READ_ATTRIBUTES = 0x80
 FILE_WRITE_ATTRIBUTES = 0x0100
 DELETE = 0x010000
@@ -225,9 +226,13 @@ SMB_FILE_ATTRIBUTE_NORMAL = 0x00
 SMB_FILE_ATTRIBUTE_READONLY = 0x01
 SMB_FILE_ATTRIBUTE_HIDDEN = 0x02
 SMB_FILE_ATTRIBUTE_SYSTEM = 0x04
-SMB_FILE_ATTRIBUTE_VOLUME = 0x08
+SMB_FILE_ATTRIBUTE_VOLUME = 0x08  # Unsupported for listPath() operations
 SMB_FILE_ATTRIBUTE_DIRECTORY = 0x10
 SMB_FILE_ATTRIBUTE_ARCHIVE = 0x20
+# SMB_FILE_ATTRIBUTE_INCL_NORMAL is a special placeholder to include normal files
+# with other search attributes for listPath() operations. It is not defined in the MS-CIFS specs.
+SMB_FILE_ATTRIBUTE_INCL_NORMAL = 0x10000
+# Do not use the following values for listPath() operations as they are not supported for SMB2
 SMB_SEARCH_ATTRIBUTE_READONLY = 0x0100
 SMB_SEARCH_ATTRIBUTE_HIDDEN = 0x0200
 SMB_SEARCH_ATTRIBUTE_SYSTEM = 0x0400
@@ -237,3 +242,16 @@ SMB_SEARCH_ATTRIBUTE_ARCHIVE = 0x2000
 # Bitmask for OptionalSupport field in SMB_COM_TREE_CONNECT_ANDX response
 SMB_TREE_CONNECTX_SUPPORT_SEARCH = 0x0001
 SMB_TREE_CONNECTX_SUPPORT_DFS = 0x0002
+
+# Bitmask for security information fields, specified as
+# AdditionalInformation in SMB2
+# [MS-SMB]: 2.2.7.4
+# [MS-SMB2]: 2.2.37
+OWNER_SECURITY_INFORMATION = 0x00000001
+GROUP_SECURITY_INFORMATION = 0x00000002
+DACL_SECURITY_INFORMATION = 0x00000004
+SACL_SECURITY_INFORMATION = 0x00000008
+LABEL_SECURITY_INFORMATION = 0x00000010
+ATTRIBUTE_SECURITY_INFORMATION = 0x00000020
+SCOPE_SECURITY_INFORMATION = 0x00000040
+BACKUP_SECURITY_INFORMATION = 0x00010000
diff --git a/python3/smb/smb_structs.py b/python3/smb/smb_structs.py
index 3583605c..c943d91a 100644
--- a/python3/smb/smb_structs.py
+++ b/python3/smb/smb_structs.py
@@ -10,16 +10,20 @@ SUPPORT_EXTENDED_SECURITY = True
 # Set to True if you want to enable SMB2 protocol.
 SUPPORT_SMB2 = True
 
+# Set to True if you want to enable SMB2.1 and above protocol.
+SUPPORT_SMB2x = True
+
 # Supported dialects
-DIALECTS = [ ]
-for i, ( name, dialect ) in enumerate([ ( 'NT_LAN_MANAGER_DIALECT', b'NT LM 0.12' ), ]):
-    DIALECTS.append(dialect)
-    globals()[name] = i
+NT_LAN_MANAGER_DIALECT = 0  # 'NT LM 0.12' is always the first element in the dialect list and must always be included (MS-SMB 2.2.4.5.1)
 
-DIALECTS2 = [ ]
-for i, ( name, dialect ) in enumerate([ ( 'SMB2_DIALECT', b'SMB 2.002' ) ]):
-    DIALECTS2.append(dialect)
-    globals()[name] = i + len(DIALECTS)
+# Return the list of support SMB dialects based on the SUPPORT_x constants
+def init_dialects_list():
+    dialects = [ b'NT LM 0.12' ]
+    if SUPPORT_SMB2:
+        dialects.append(b'SMB 2.002')
+    if SUPPORT_SMB2x:
+        dialects.append(b'SMB 2.???')
+    return dialects
 
 
 class UnsupportedFeature(Exception):
@@ -107,8 +111,9 @@ class SMBMessage:
     log = logging.getLogger('SMB.SMBMessage')
     protocol = 1
 
-    def __init__(self, payload = None):
+    def __init__(self, conn, payload = None):
         self.reset()
+        self.conn = conn
         if payload:
             self.payload = payload
             self.payload.initMessage(self)
@@ -143,6 +148,10 @@ class SMBMessage:
         self.data = b''
         self.payload = None
 
+    @property
+    def isAsync(self):
+        return bool(self.flags & SMB2_FLAGS_ASYNC_COMMAND)
+
     @property
     def isReply(self):
         return bool(self.flags & SMB_FLAGS_REPLY)
@@ -289,10 +298,7 @@ class ComNegotiateRequest(Payload):
     def prepare(self, message):
         assert message.payload == self
         message.parameters_data = b''
-        if SUPPORT_SMB2:
-            message.data = b''.join([b'\x02'+s+b'\x00' for s in DIALECTS + DIALECTS2])
-        else:
-            message.data = b''.join([b'\x02'+s+b'\x00' for s in DIALECTS])
+        message.data = b''.join(map(lambda s: b'\x02'+s+b'\x00', init_dialects_list()))
 
 
 class ComNegotiateResponse(Payload):
@@ -1279,7 +1285,7 @@ class ComEchoRequest(Payload):
     - [MS-CIFS]: 2.2.4.39.1
     """
 
-    def __init__(self, echo_data = '', echo_count = 1):
+    def __init__(self, echo_data = b'', echo_count = 1):
         self.echo_count = echo_count
         self.echo_data = echo_data
 
diff --git a/python3/smb/utils/md4.py b/python3/smb/utils/md4.py
index f4a7ad0f..49489045 100644
--- a/python3/smb/utils/md4.py
+++ b/python3/smb/utils/md4.py
@@ -82,16 +82,18 @@ class MD4:
         dest.C = self.C
         dest.D = self.D
         dest.count = self.count
-        for i in range(self.count):
+        for i in range(int(self.count)):
             dest.buf[i] = self.buf[i]
 
         return dest
 
     #-----------------------------------------------------
     def update(self, str):
+        if isinstance(str, bytes):
+            buf = list(str)
+        else:
+            buf = [ord(i) for i in str]
 
-        buf = []
-        for i in str: buf.append(ord(i))
         ilen = U32(len(buf))
 
         # check if the first length is out of range
@@ -227,7 +229,7 @@ class MD4:
         res[14]=(temp.D >> 16) & U32(0xFF)
         res[15]=(temp.D >> 24) & U32(0xFF)
 
-        return int_array2str(res)
+        return int_array2str(res).encode('UTF-16LE')
 
 #====================================================================
 # helpers
diff --git a/python3/tests/DirectSMBConnectionTests/test_auth.py b/python3/tests/DirectSMBConnectionTests/test_auth.py
index c3f1081d..5b63a9c6 100644
--- a/python3/tests/DirectSMBConnectionTests/test_auth.py
+++ b/python3/tests/DirectSMBConnectionTests/test_auth.py
@@ -4,40 +4,69 @@ from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
 
-conn = None
+conn, conn2, conn3 = None, None, None
 
 def teardown_func():
-    global conn
-    conn.close()
+    global conn, conn2, conn3
+    if conn:
+        conn.close()
+    if conn2:
+        conn2.close()
+    if conn3:
+        conn3.close();
 
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False, is_direct_tcp = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
+
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
diff --git a/python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py b/python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
index 814d89d1..684b4eaa 100644
--- a/python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
+++ b/python3/tests/DirectSMBConnectionTests/test_createdeletedirectory.py
@@ -2,6 +2,7 @@
 
 import os, time, random
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -10,18 +11,27 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -36,62 +46,100 @@ def test_english_directory_SMB1():
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_unicode_directory_SMB1():
     global conn
 
-    path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
-    path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
diff --git a/python3/tests/DirectSMBConnectionTests/test_echo.py b/python3/tests/DirectSMBConnectionTests/test_echo.py
index c81675d6..8159429e 100644
--- a/python3/tests/DirectSMBConnectionTests/test_echo.py
+++ b/python3/tests/DirectSMBConnectionTests/test_echo.py
@@ -9,7 +9,7 @@ conn = None
 def setup_func():
     global conn
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
diff --git a/python3/tests/DirectSMBConnectionTests/test_listpath.py b/python3/tests/DirectSMBConnectionTests/test_listpath.py
index c3b08a71..dee42175 100644
--- a/python3/tests/DirectSMBConnectionTests/test_listpath.py
+++ b/python3/tests/DirectSMBConnectionTests/test_listpath.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb_constants import *
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,16 +11,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -29,38 +39,159 @@ def teardown_func():
 def test_listPath_SMB1():
     global conn
     results = conn.listPath('smbtest', '/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-    assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-    assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-    assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-    assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_listSubPath_SMB1():
     global conn
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( 'Test File.txt', False ) in filenames
-    assert ( 'Test Folder', True ) in filenames
-    assert ( '子文件夹', True ) in filenames
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames)==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames))==999
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-    assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-    assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-    assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-    assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listSubPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/Test Folder with Long Name/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listSubPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
     filenames = [( r.filename, r.isDirectory ) for r in results]
     assert ( 'Test File.txt', False ) in filenames
     assert ( 'Test Folder', True ) in filenames
     assert ( '子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathWithManyFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames))==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForDirectory_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForDirectory_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterPattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterPattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterUnicodePattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterUnicodePattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
diff --git a/python3/tests/DirectSMBConnectionTests/test_listshares.py b/python3/tests/DirectSMBConnectionTests/test_listshares.py
index 23328ecd..1374cbdd 100644
--- a/python3/tests/DirectSMBConnectionTests/test_listshares.py
+++ b/python3/tests/DirectSMBConnectionTests/test_listshares.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,16 +9,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -28,10 +37,18 @@ def teardown_func():
 def test_listshares_SMB1():
     global conn
     results = conn.listShares()
-    assert 'smbtest' in [r.name.lower() for r in results]
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listshares_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listShares()
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listshares_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listShares()
-    assert 'smbtest' in [r.name.lower() for r in results]
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
diff --git a/python3/tests/DirectSMBConnectionTests/test_listsnapshots.py b/python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
index 551581fa..f6ce4e2d 100644
--- a/python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
+++ b/python3/tests/DirectSMBConnectionTests/test_listsnapshots.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,16 +9,27 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -33,5 +45,13 @@ def test_listsnapshots_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listsnapshots_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listSnapshots('smbtest', '/rfc1001.txt')
+    assert len(results) > 0
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listsnapshots_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listSnapshots('smbtest', '/rfc1001.txt')
     assert len(results) > 0
diff --git a/python3/tests/DirectSMBConnectionTests/test_rename.py b/python3/tests/DirectSMBConnectionTests/test_rename.py
index cb6d880c..3abb2a37 100644
--- a/python3/tests/DirectSMBConnectionTests/test_rename.py
+++ b/python3/tests/DirectSMBConnectionTests/test_rename.py
@@ -3,6 +3,7 @@
 import os, time, random
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,16 +12,24 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -37,14 +46,14 @@ def test_rename_english_file_SMB1():
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -53,6 +62,31 @@ def test_rename_english_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -60,14 +94,14 @@ def test_rename_english_file_SMB2():
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -77,20 +111,20 @@ def test_rename_english_file_SMB2():
 def test_rename_unicode_file_SMB1():
     global conn
 
-    old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
 
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -99,21 +133,46 @@ def test_rename_unicode_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
-    old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
 
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -129,14 +188,14 @@ def test_rename_english_directory_SMB1():
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -145,6 +204,31 @@ def test_rename_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -152,14 +236,14 @@ def test_rename_english_directory_SMB2():
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -169,20 +253,20 @@ def test_rename_english_directory_SMB2():
 def test_rename_unicode_directory_SMB1():
     global conn
 
-    old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
 
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -191,21 +275,46 @@ def test_rename_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
-    old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
 
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
diff --git a/python3/tests/DirectSMBConnectionTests/test_retrievefile.py b/python3/tests/DirectSMBConnectionTests/test_retrievefile.py
index e49ab8f8..8670d270 100644
--- a/python3/tests/DirectSMBConnectionTests/test_retrievefile.py
+++ b/python3/tests/DirectSMBConnectionTests/test_retrievefile.py
@@ -3,6 +3,7 @@
 import os, tempfile
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -18,16 +19,27 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -52,6 +64,24 @@ def test_retr_multiplereads_SMB1():
 def test_retr_multiplereads_SMB2():
     # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
+    assert filesize == 158437
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_multiplereads_SMB2x():
+    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
 
@@ -80,6 +110,24 @@ def test_retr_longfilename_SMB1():
 def test_retr_longfilename_SMB2():
     # Test file retrieval that has a long English filename
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
+    assert filesize == 421269
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_longfilename_SMB2x():
+    # Test file retrieval that has a long English filename
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
 
@@ -95,7 +143,7 @@ def test_retr_unicodefilename_SMB1():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFile('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh)
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -108,8 +156,26 @@ def test_retr_unicodefilename_SMB1():
 def test_retr_unicodefilename_SMB2():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFile('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh)
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
+    assert filesize == 256000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_unicodefilename_SMB2x():
+    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -123,7 +189,7 @@ def test_retr_offset_SMB1():
     # Test file retrieval from offset to EOF
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -136,8 +202,26 @@ def test_retr_offset_SMB1():
 def test_retr_offset_SMB2():
     # Test file retrieval from offset to EOF
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
+    assert filesize == 156000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_SMB2x():
+    # Test file retrieval from offset to EOF
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -151,7 +235,7 @@ def test_retr_offset_and_biglimit_SMB1():
     # Test file retrieval from offset with a big max_length
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -164,8 +248,26 @@ def test_retr_offset_and_biglimit_SMB1():
 def test_retr_offset_and_biglimit_SMB2():
     # Test file retrieval from offset with a big max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
+    assert filesize == 100000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_biglimit_SMB2x():
+    # Test file retrieval from offset with a big max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -179,7 +281,7 @@ def test_retr_offset_and_smalllimit_SMB1():
     # Test file retrieval from offset with a small max_length
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -192,8 +294,26 @@ def test_retr_offset_and_smalllimit_SMB1():
 def test_retr_offset_and_smalllimit_SMB2():
     # Test file retrieval from offset with a small max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
+    assert filesize == 10
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_smalllimit_SMB2x():
+    # Test file retrieval from offset with a small max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -207,7 +327,7 @@ def test_retr_offset_and_zerolimit_SMB1():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -220,8 +340,26 @@ def test_retr_offset_and_zerolimit_SMB1():
 def test_retr_offset_and_zerolimit_SMB2():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
+    assert filesize == 0
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_zerolimit_SMB2x():
+    # Test file retrieval from offset to EOF with max_length=0
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
     md = MD5()
     md.update(temp_fh.getvalue())
diff --git a/python3/tests/DirectSMBConnectionTests/test_storefile.py b/python3/tests/DirectSMBConnectionTests/test_storefile.py
index 80c804ce..80365d11 100644
--- a/python3/tests/DirectSMBConnectionTests/test_storefile.py
+++ b/python3/tests/DirectSMBConnectionTests/test_storefile.py
@@ -3,6 +3,7 @@
 import os, tempfile, random, time
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -22,18 +23,24 @@ TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
-
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
 
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
-    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True, is_direct_tcp = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
 def teardown_func():
@@ -43,13 +50,14 @@ def teardown_func():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_long_filename_SMB1():
+    global conn
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -63,16 +71,65 @@ def test_store_long_filename_SMB1():
 
     conn.deleteFiles('smbtest', filename)
 
+@with_setup(setup_func_SMB1, teardown_func)
+def test_store_from_offset_SMB1():
+    global conn
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = BytesIO(b'0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = BytesIO(b'aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == b'01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_long_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_long_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -89,13 +146,14 @@ def test_store_long_filename_SMB2():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_unicode_filename_SMB1():
-    filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+    global conn
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -112,13 +170,16 @@ def test_store_unicode_filename_SMB1():
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_unicode_filename_SMB2():
-    filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -131,3 +192,77 @@ def test_store_unicode_filename_SMB2():
     buf.close()
 
     conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_unicode_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_store_from_offset_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = BytesIO(b'0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = BytesIO(b'aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == b'01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_from_offset_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = BytesIO(b'0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = BytesIO(b'aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == b'01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
diff --git a/python3/tests/DirectSMBTwistedTests/test_auth.py b/python3/tests/DirectSMBTwistedTests/test_auth.py
deleted file mode 100644
index 967a1174..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_auth.py
+++ /dev/null
@@ -1,77 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class AuthFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        self.d.callback(True)
-
-    def onAuthFailed(self):
-        self.d.callback(False)
-
-
-@deferred(timeout=5.0)
-def test_NTLMv1_auth_SMB1():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = False
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv2_auth_SMB1():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = False
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv1_auth_SMB2():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = True
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv2_auth_SMB2():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = True
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py b/python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
deleted file mode 100644
index 8874da8a..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_createdeletedirectory.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, random, time
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class DirectoryFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = ''
-        self.path = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def createDone(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        names = [e.filename for e in entries]
-        assert os.path.basename(self.path.replace('/', os.sep)) in names
-
-        d = self.deleteDirectory(self.service_name, self.path)
-        d.addCallback(self.deleteDone)
-        d.addErrback(self.d.errback)
-
-    def deleteDone(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        names = [e.filename for e in entries]
-        assert os.path.basename(self.path.replace('/', os.sep)) not in names
-        self.d.callback(True)
-
-    def onAuthOK(self):
-        d = self.createDirectory(self.service_name, self.path)
-        d.addCallback(self.createDone)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_english_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_english_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_unicode_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_unicode_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_echo.py b/python3/tests/DirectSMBTwistedTests/test_echo.py
deleted file mode 100644
index b781eee1..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_echo.py
+++ /dev/null
@@ -1,39 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from .util import getConnectionInfo
-
-
-class EchoFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.echo_data = 'This is an echo test'
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(data):
-            assert data == self.echo_data
-            self.d.callback(True)
-
-        d = self.echo(self.echo_data)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_echo():
-    info = getConnectionInfo()
-    factory = EchoFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_listpath.py b/python3/tests/DirectSMBTwistedTests/test_listpath.py
deleted file mode 100644
index a827955b..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_listpath.py
+++ /dev/null
@@ -1,56 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListPathFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            filenames = [( r.filename, r.isDirectory ) for r in results]
-            assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-            assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-            assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-            assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-            assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
-
-            self.d.callback(True)
-
-        d = self.listPath('smbtest', '/', timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listPath_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listPath_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_listshares.py b/python3/tests/DirectSMBTwistedTests/test_listshares.py
deleted file mode 100644
index 9c35919e..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_listshares.py
+++ /dev/null
@@ -1,51 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListSharesFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            assert 'smbtest' in [r.name.lower() for r in results]
-            self.d.callback(True)
-            self.instance.transport.loseConnection()
-
-        d = self.listShares(timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listshares_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listshares_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_listsnapshots.py b/python3/tests/DirectSMBTwistedTests/test_listsnapshots.py
deleted file mode 100644
index 7c3a5b65..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_listsnapshots.py
+++ /dev/null
@@ -1,57 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListSnapshotsFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = None
-        self.path = None
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            assert len(results) > 0
-            self.d.callback(True)
-            self.instance.transport.loseConnection()
-
-        d = self.listSnapshots(self.service_name, self.path, timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listshares_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listshares_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_rename.py b/python3/tests/DirectSMBTwistedTests/test_rename.py
deleted file mode 100644
index 2658d79f..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_rename.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, random, time
-from io import StringIO
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class RenameFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service = ''
-        self.new_path = ''
-        self.old_path = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def pathCreated(self, result):
-        d = self.listPath(self.service, os.path.dirname(self.old_path.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.old_path.replace('/', os.sep)) in filenames
-        assert os.path.basename(self.new_path.replace('/', os.sep)) not in filenames
-
-        d = self.rename(self.service, self.old_path, self.new_path)
-        d.addCallback(self.renameComplete)
-        d.addErrback(self.d.errback)
-
-    def renameComplete(self, result):
-        d = self.listPath(self.service, os.path.dirname(self.new_path.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.new_path.replace('/', os.sep)) in filenames
-        assert os.path.basename(self.old_path.replace('/', os.sep)) not in filenames
-        self.cleanup()
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-class RenameFileFactory(RenameFactory):
-
-    def onAuthOK(self):
-        d = self.storeFile(self.service, self.old_path, StringIO('Rename file test'))
-        d.addCallback(self.pathCreated)
-        d.addErrback(self.d.errback)
-
-    def cleanup(self):
-        d = self.deleteFiles(self.service, self.new_path)
-        d.chainDeferred(self.d)
-
-
-class RenameDirectoryFactory(RenameFactory):
-
-    def onAuthOK(self):
-        d = self.createDirectory(self.service, self.old_path)
-        d.addCallback(self.pathCreated)
-        d.addErrback(self.d.errback)
-
-    def cleanup(self):
-        d = self.deleteDirectory(self.service, self.new_path)
-        d.chainDeferred(self.d)
-
-
-@deferred(timeout=30.0)
-def test_rename_english_file_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_file_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_file_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_file_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_retrievefile.py b/python3/tests/DirectSMBTwistedTests/test_retrievefile.py
deleted file mode 100644
index bbfc7d0a..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_retrievefile.py
+++ /dev/null
@@ -1,278 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, tempfile
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-try:
-    import hashlib
-    def MD5(): return hashlib.md5()
-except ImportError:
-    import md5
-    def MD5(): return md5.new()
-
-
-class RetrieveFileFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.temp_fh = tempfile.NamedTemporaryFile(prefix = 'pysmbtest-')
-        self.service = ''
-        self.path = ''
-        self.digest = ''
-        self.offset = 0
-        self.max_length = -1
-        self.filesize = 0
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def fileRetrieved(self, write_result):
-        file_obj, file_attributes, file_size = write_result
-        assert file_obj == self.temp_fh
-
-        md = MD5()
-        filesize = 0
-        self.temp_fh.seek(0)
-        while True:
-            s = self.temp_fh.read(8192)
-            if not s:
-                break
-            md.update(s)
-            filesize += len(s)
-
-        assert self.filesize == filesize
-        assert md.hexdigest() == self.digest
-
-        self.temp_fh.close()
-        self.d.callback(True)
-        self.instance.transport.loseConnection()
-
-    def onAuthOK(self):
-        assert self.service
-        assert self.path
-
-        d = self.retrieveFileFromOffset(self.service, self.path, self.temp_fh, self.offset, self.max_length, timeout = 15)
-        d.addCallback(self.fileRetrieved)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=30.0)
-def test_retr_multiplereads_SMB1():
-    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    factory.digest = '5367c2bbf97f521059c78eab65309ad3'
-    factory.filesize = 158437
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_multiplereads_SMB2():
-    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    factory.digest = '5367c2bbf97f521059c78eab65309ad3'
-    factory.filesize = 158437
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_longfilename_SMB1():
-    # Test file retrieval that has a long English filename
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/Implementing CIFS - SMB.html'
-    factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
-    factory.filesize = 421269
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_longfilename_SMB2():
-    # Test file retrieval that has a long English filename
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/Implementing CIFS - SMB.html'
-    factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
-    factory.filesize = 421269
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_unicodefilename_SMB1():
-    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '8a44c1e80d55e91c92350955cdf83442'
-    factory.filesize = 256000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_unicodefilename_SMB2():
-    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '8a44c1e80d55e91c92350955cdf83442'
-    factory.filesize = 256000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_SMB1():
-    # Test file retrieval from offset to EOF
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
-    factory.filesize = 156000
-    factory.offset = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_SMB2():
-    # Test file retrieval from offset to EOF
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
-    factory.filesize = 156000
-    factory.offset = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_biglimit_SMB1():
-    # Test file retrieval from offset with a big max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
-    factory.filesize = 100000
-    factory.offset = 100000
-    factory.max_length = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_biglimit_SMB2():
-    # Test file retrieval from offset with a big max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
-    factory.filesize = 100000
-    factory.offset = 100000
-    factory.max_length = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_smalllimit_SMB1():
-    # Test file retrieval from offset with a small max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '746f60a96b39b712a7b6e17ddde19986'
-    factory.filesize = 10
-    factory.offset = 100000
-    factory.max_length = 10
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_smalllimit_SMB2():
-    # Test file retrieval from offset with a small max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '746f60a96b39b712a7b6e17ddde19986'
-    factory.filesize = 10
-    factory.offset = 100000
-    factory.max_length = 10
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_zerolimit_SMB1():
-    # Test file retrieval from offset to EOF with max_length=0
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
-    factory.filesize = 0
-    factory.offset = 100000
-    factory.max_length = 0
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_zerolimit_SMB2():
-    # Test file retrieval from offset to EOF with max_length=0
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-    
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
-    factory.filesize = 0
-    factory.offset = 100000
-    factory.max_length = 0
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/test_storefile.py b/python3/tests/DirectSMBTwistedTests/test_storefile.py
deleted file mode 100644
index 0d5e6d03..00000000
--- a/python3/tests/DirectSMBTwistedTests/test_storefile.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, time, random
-from io import StringIO
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-try:
-    import hashlib
-    def MD5(): return hashlib.md5()
-except ImportError:
-    import md5
-    def MD5(): return md5.new()
-
-class StoreFilesFactory(SMBProtocolFactory):
-    """
-    A super test factory that tests store file, list files, retrieve file and delete file functionlities in sequence.
-    """
-
-    TEST_FILENAME = os.path.join(os.path.dirname(__file__), os.pardir, 'SupportFiles', 'binary.dat')
-    TEST_FILESIZE = 256000
-    TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = ''
-        self.filename = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def storeComplete(self, result):
-        file_obj, filesize = result
-        file_obj.close()
-        assert filesize == self.TEST_FILESIZE
-
-        d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.filename.replace('/', os.sep)) in filenames
-
-        for entry in entries:
-            if os.path.basename(self.filename.replace('/', os.sep)) == entry.filename:
-                # The following asserts will fail if the remote machine's time is not in sync with the test machine's time
-                assert abs(entry.create_time - time.time()) < 3
-                assert abs(entry.last_access_time - time.time()) < 3
-                assert abs(entry.last_write_time - time.time()) < 3
-                assert abs(entry.last_attr_change_time - time.time()) < 3
-                break
-
-        d = self.retrieveFile(self.service_name, self.filename, StringIO())
-        d.addCallback(self.retrieveComplete)
-        d.addErrback(self.d.errback)
-
-    def retrieveComplete(self, result):
-        file_obj, file_attributes, file_size = result
-
-        md = MD5()
-        md.update(file_obj.getvalue())
-        file_obj.close()
-
-        assert file_size == self.TEST_FILESIZE
-        assert md.hexdigest() == self.TEST_DIGEST
-
-        d = self.deleteFiles(self.service_name, self.filename)
-        d.addCallback(self.deleteComplete)
-        d.addErrback(self.d.errback)
-
-    def deleteComplete(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.filename.replace('/', os.sep)) not in filenames
-        self.d.callback(True)
-        self.instance.transport.loseConnection()
-
-    def onAuthOK(self):
-        d = self.storeFile(self.service_name, self.filename, open(self.TEST_FILENAME, 'rb'))
-        d.addCallback(self.storeComplete)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=30.0)
-def test_store_long_filename_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_long_filename_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_unicode_filename_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_unicode_filename_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/DirectSMBTwistedTests/util.py b/python3/tests/DirectSMBTwistedTests/util.py
deleted file mode 100644
index 12f82afa..00000000
--- a/python3/tests/DirectSMBTwistedTests/util.py
+++ /dev/null
@@ -1,19 +0,0 @@
-
-import os
-from ConfigParser import SafeConfigParser
-
-def getConnectionInfo():
-    config_filename = os.path.join(os.path.dirname(__file__), os.path.pardir, 'connection.ini')
-    cp = SafeConfigParser()
-    cp.read(config_filename)
-
-    info = {
-        'server_name': cp.get('server', 'name'),
-        'server_ip': cp.get('server', 'ip'),
-        'server_port': cp.getint('server', 'direct_port'),
-        'client_name': cp.get('client', 'name'),
-        'user': cp.get('user', 'name'),
-        'password': cp.get('user', 'password'),
-        'is_direct_tcp': True,
-    }
-    return info
diff --git a/python3/tests/NetBIOSTwistedTests/__init__.py b/python3/tests/NetBIOSTwistedTests/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/python3/tests/NetBIOSTwistedTests/test_queryname.py b/python3/tests/NetBIOSTwistedTests/test_queryname.py
deleted file mode 100644
index 43e45486..00000000
--- a/python3/tests/NetBIOSTwistedTests/test_queryname.py
+++ /dev/null
@@ -1,21 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from nmb.NetBIOSProtocol import NBNSProtocol
-from nose.tools import with_setup
-
-
-@deferred(timeout=15.0)
-def test_broadcast():
-    def cb(results):
-        assert results
-
-    def cleanup(r):
-        p.transport.stopListening()
-
-    p = NBNSProtocol()
-    d = p.queryName('MICHAEL-I5PC', timeout = 10)
-    d.addCallback(cb)
-    d.addBoth(cleanup)
-
-    return d
diff --git a/python3/tests/README_1st.txt b/python3/tests/README_1st.txt
new file mode 100644
index 00000000..82c2ac8a
--- /dev/null
+++ b/python3/tests/README_1st.txt
@@ -0,0 +1,26 @@
+
+Steps to Follow to Run the Unit Tests
+=====================================
+
+1. Install Nose Testing Framework
+All the unit tests here are designed to be conducted with the nose testing framework.
+You can install the latest nose testing framework by running: easy_install nose
+For more information on nose testing, please visit http://readthedocs.org/docs/nose/en/latest/
+
+2. Prepare a Shared Folder "smbtest" on a Remote Server
+To run the unit tests here, besides installing the nose testing framework, you will
+also need to prepare a shared folder on a remote server.
+pysmb has been tested against Samba 3.x, Windows XP SP3 and Windows Vista.
+The shared folder must be named "smbtest".
+
+3. Download smbtest.zip from https://miketeo.net/files/Projects/pysmb/smbtest.zip
+Unzip the contents of this zip file in the shared folder.
+
+4. Update Connection Details in connection.ini
+In the same folder where you are viewing this readme file, there should be an ini file
+called "connection.ini". Edit this file's connection details to match the shared folder's
+access information.
+
+5. Run the Unit Tests in the python2 folder
+Just run: nosetests3 -v tests
+or selectively: nosetests3 -v tests/SMBConnectionTests
diff --git a/python3/tests/SMBConnectionTests/test_auth.py b/python3/tests/SMBConnectionTests/test_auth.py
index 5e114b04..2ca4510e 100644
--- a/python3/tests/SMBConnectionTests/test_auth.py
+++ b/python3/tests/SMBConnectionTests/test_auth.py
@@ -4,40 +4,69 @@ from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
 
-conn = None
+conn, conn2, conn3 = None, None, None
 
 def teardown_func():
-    global conn
-    conn.close()
+    global conn, conn2, conn3
+    if conn:
+        conn.close()
+    if conn2:
+        conn2.close()
+    if conn3:
+        conn3.close();
 
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv1_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = False)
     assert conn.connect(info['server_ip'], info['server_port'])
 
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = False)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
+
 @with_setup(teardown = teardown_func)
 def test_NTLMv2_auth_SMB2():
     global conn
-    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], domain = info['domain'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
+
+    conn2 = SMBConnection(info['user'], 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn2.connect(info['server_ip'], info['server_port'])
+
+    conn3 = SMBConnection('INVALIDUSER', 'wrongPass', info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert not conn3.connect(info['server_ip'], info['server_port'])
diff --git a/python3/tests/SMBConnectionTests/test_createdeletedirectory.py b/python3/tests/SMBConnectionTests/test_createdeletedirectory.py
index 814d89d1..5e128b13 100644
--- a/python3/tests/SMBConnectionTests/test_createdeletedirectory.py
+++ b/python3/tests/SMBConnectionTests/test_createdeletedirectory.py
@@ -2,6 +2,7 @@
 
 import os, time, random
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -10,7 +11,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -19,6 +20,15 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -36,62 +46,100 @@ def test_english_directory_SMB1():
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
 
     path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_unicode_directory_SMB1():
     global conn
 
-    path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) in names
+
+    conn.deleteDirectory('smbtest', path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
+    names = map(lambda e: e.filename, entries)
+    assert os.path.basename(path.replace('/', os.sep)) not in names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
-    path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
+    path = os.sep + u'文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) in names
 
     conn.deleteDirectory('smbtest', path)
 
     entries = conn.listPath('smbtest', os.path.dirname(path.replace('/', os.sep)))
-    names = [e.filename for e in entries]
+    names = map(lambda e: e.filename, entries)
     assert os.path.basename(path.replace('/', os.sep)) not in names
diff --git a/python3/tests/SMBConnectionTests/test_deletepattern.py b/python3/tests/SMBConnectionTests/test_deletepattern.py
index a7d183d3..4e019654 100644
--- a/python3/tests/SMBConnectionTests/test_deletepattern.py
+++ b/python3/tests/SMBConnectionTests/test_deletepattern.py
@@ -3,6 +3,7 @@
 import os, time, random
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,7 +12,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -20,6 +21,15 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
 
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
@@ -71,6 +81,44 @@ def test_delete_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_delete_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
+    conn.createDirectory('smbtest', path)
+
+    for filename in [ 'aaTest.txt', 'aaBest.txt', 'aaTest.bin', 'aaBest.bin', 'random.txt' ]:
+        conn.storeFile('smbtest', path+"/"+filename, BytesIO(b"0123456789"))
+
+    results = conn.listPath('smbtest', path)
+    filenames = list(map(lambda r: r.filename, results))
+    assert 'aaTest.txt' in filenames
+    assert 'aaBest.txt' in filenames
+    assert 'aaTest.bin' in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+    conn.deleteFiles('smbtest', path+'/aa*.txt')
+
+    results = conn.listPath('smbtest', path)
+    filenames = list(map(lambda r: r.filename, results))
+    assert 'aaTest.txt' not in filenames
+    assert 'aaBest.txt' not in filenames
+    assert 'aaTest.bin' in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+    conn.deleteFiles('smbtest', path+'/aaTest.*')
+
+    results = conn.listPath('smbtest', path)
+    filenames = list(map(lambda r: r.filename, results))
+    assert 'aaTest.bin' not in filenames
+    assert 'aaBest.bin' in filenames
+    assert 'random.txt' in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_delete_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     path = os.sep + u'testDelete %d-%d' % ( time.time(), random.randint(0, 1000) )
     conn.createDirectory('smbtest', path)
diff --git a/python3/tests/SMBConnectionTests/test_getattributes.py b/python3/tests/SMBConnectionTests/test_getattributes.py
index c6e5d688..2ec57a52 100644
--- a/python3/tests/SMBConnectionTests/test_getattributes.py
+++ b/python3/tests/SMBConnectionTests/test_getattributes.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,7 +10,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -17,6 +19,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -24,33 +36,49 @@ def setup_func_SMB2():
 def teardown_func():
     global conn
     conn.close()
-    
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_getAttributes_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
+    assert info.isDirectory
+
+    info = conn.getAttributes('smbtest', '/rfc1001.txt')
+    assert not info.isDirectory
+    assert info.file_size == 158437
+    assert info.alloc_size == 159744
+
+    info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
+    assert info.isDirectory
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_getAttributes_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
     assert info.isDirectory
-    
+
     info = conn.getAttributes('smbtest', '/rfc1001.txt')
     assert not info.isDirectory
     assert info.file_size == 158437
     assert info.alloc_size == 159744
-    
+
     info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
     assert info.isDirectory
-    
+
 @with_setup(setup_func_SMB1, teardown_func)
 def test_getAttributes_SMB1():
     global conn
     info = conn.getAttributes('smbtest', '/Test Folder with Long Name/')
     assert info.isDirectory
-    
+
     info = conn.getAttributes('smbtest', '/rfc1001.txt')
     assert not info.isDirectory
     assert info.file_size == 158437
     assert info.alloc_size == 159744
-    
+
     info = conn.getAttributes('smbtest', u'/\u6d4b\u8bd5\u6587\u4ef6\u5939')
     assert info.isDirectory
-    
-    
\ No newline at end of file
diff --git a/python3/tests/SMBConnectionTests/test_listpath.py b/python3/tests/SMBConnectionTests/test_listpath.py
index c3b08a71..56e32a7f 100644
--- a/python3/tests/SMBConnectionTests/test_listpath.py
+++ b/python3/tests/SMBConnectionTests/test_listpath.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 
 from smb.SMBConnection import SMBConnection
+from smb.smb_constants import *
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -9,7 +11,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -17,6 +19,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -29,38 +39,171 @@ def teardown_func():
 def test_listPath_SMB1():
     global conn
     results = conn.listPath('smbtest', '/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-    assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-    assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-    assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-    assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_listSubPath_SMB1():
     global conn
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( 'Test File.txt', False ) in filenames
-    assert ( 'Test Folder', True ) in filenames
-    assert ( '子文件夹', True ) in filenames
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames)==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathWithManyFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames))==999
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/')
-    filenames = [( r.filename, r.isDirectory ) for r in results]
-    assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-    assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-    assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-    assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-    assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
+    assert ( u'Test Folder with Long Name', True ) in filenames      # Test long English folder names
+    assert ( u'TestDir1', True ) in filenames                        # Test short English folder names
+    assert ( u'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
+    assert ( u'rfc1001.txt', False ) in filenames                    # Test short English file names
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listSubPath_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listPath('smbtest', '/Test Folder with Long Name/')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listSubPath_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listPath('smbtest', '/Test Folder with Long Name/')
     filenames = [( r.filename, r.isDirectory ) for r in results]
     assert ( 'Test File.txt', False ) in filenames
     assert ( 'Test Folder', True ) in filenames
     assert ( '子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathWithManyFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive/')
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames))==999
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForDirectory_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForDirectory_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_DIRECTORY)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterForFiles_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterForFiles_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', search = SMB_FILE_ATTRIBUTE_READONLY | SMB_FILE_ATTRIBUTE_HIDDEN | SMB_FILE_ATTRIBUTE_SYSTEM | SMB_FILE_ATTRIBUTE_ARCHIVE | SMB_FILE_ATTRIBUTE_INCL_NORMAL)
+    filenames = map(lambda r: ( r.filename, r.isDirectory ), results)
+    assert len(list(filenames)) > 0
+    for f, isDirectory in filenames:
+        assert not isDirectory
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterPattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterPattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = 'Test*')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 2
+    assert ( u'Test File.txt', False ) in filenames
+    assert ( u'Test Folder', True ) in filenames
+    assert ( u'子文件夹', True ) not in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterUnicodePattern_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterUnicodePattern_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/Test Folder with Long Name', pattern = u'*件夹')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+    assert len(filenames) == 1
+    assert ( u'Test File.txt', False ) not in filenames
+    assert ( u'Test Folder', True ) not in filenames
+    assert ( u'子文件夹', True ) in filenames
+
+@with_setup(setup_func_SMB1, teardown_func)
+def test_listPathFilterEmptyList_SMB1():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_listPathFilterEmptyList_SMB2():
+    global conn
+    results = conn.listPath('smbtest', '/RFC Archive', pattern = '*.abc')
+    filenames = list(map(lambda r: ( r.filename, r.isDirectory ), results))
diff --git a/python3/tests/SMBConnectionTests/test_listshares.py b/python3/tests/SMBConnectionTests/test_listshares.py
index 23328ecd..b79d2f43 100644
--- a/python3/tests/SMBConnectionTests/test_listshares.py
+++ b/python3/tests/SMBConnectionTests/test_listshares.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,7 +9,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -16,6 +17,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -28,10 +37,18 @@ def teardown_func():
 def test_listshares_SMB1():
     global conn
     results = conn.listShares()
-    assert 'smbtest' in [r.name.lower() for r in results]
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listshares_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listShares()
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listshares_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listShares()
-    assert 'smbtest' in [r.name.lower() for r in results]
+    assert 'smbtest' in list(map(lambda r: r.name.lower(), results))
diff --git a/python3/tests/SMBConnectionTests/test_listsnapshots.py b/python3/tests/SMBConnectionTests/test_listsnapshots.py
index 551581fa..ebb5f3d8 100644
--- a/python3/tests/SMBConnectionTests/test_listsnapshots.py
+++ b/python3/tests/SMBConnectionTests/test_listsnapshots.py
@@ -1,5 +1,6 @@
 
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -8,7 +9,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -16,6 +18,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -33,5 +45,13 @@ def test_listsnapshots_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_listsnapshots_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    results = conn.listSnapshots('smbtest', '/rfc1001.txt')
+    assert len(results) > 0
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_listsnapshots_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
     results = conn.listSnapshots('smbtest', '/rfc1001.txt')
     assert len(results) > 0
diff --git a/python3/tests/SMBConnectionTests/test_rename.py b/python3/tests/SMBConnectionTests/test_rename.py
index cb6d880c..1aa07b53 100644
--- a/python3/tests/SMBConnectionTests/test_rename.py
+++ b/python3/tests/SMBConnectionTests/test_rename.py
@@ -3,6 +3,7 @@
 import os, time, random
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -11,7 +12,7 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -19,6 +20,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -37,14 +46,14 @@ def test_rename_english_file_SMB1():
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -53,6 +62,7 @@ def test_rename_english_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -60,14 +70,38 @@ def test_rename_english_file_SMB2():
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -77,20 +111,20 @@ def test_rename_english_file_SMB2():
 def test_rename_unicode_file_SMB1():
     global conn
 
-    old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
 
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -99,21 +133,46 @@ def test_rename_unicode_file_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_file_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
 
-    old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
 
     conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteFiles('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_file_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.storeFile('smbtest', old_path, BytesIO(b'Rename file test'))
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -129,14 +188,14 @@ def test_rename_english_directory_SMB1():
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -145,6 +204,31 @@ def test_rename_english_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_english_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+    new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_english_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
     old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
     new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
@@ -152,14 +236,14 @@ def test_rename_english_directory_SMB2():
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -169,20 +253,20 @@ def test_rename_english_directory_SMB2():
 def test_rename_unicode_directory_SMB1():
     global conn
 
-    old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
 
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
@@ -191,21 +275,46 @@ def test_rename_unicode_directory_SMB1():
 @with_setup(setup_func_SMB2, teardown_func)
 def test_rename_unicode_directory_SMB2():
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+
+    conn.createDirectory('smbtest', old_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
+
+    conn.rename('smbtest', old_path, new_path)
+
+    entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
+    filenames = list(map(lambda e: e.filename, entries))
+    assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
+    assert os.path.basename(new_path.replace('/', os.sep)) in filenames
+
+    conn.deleteDirectory('smbtest', new_path)
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_rename_unicode_directory_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
 
-    old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    old_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
+    new_path = u'/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
 
     conn.createDirectory('smbtest', old_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) not in filenames
 
     conn.rename('smbtest', old_path, new_path)
 
     entries = conn.listPath('smbtest', os.path.dirname(old_path.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = list(map(lambda e: e.filename, entries))
     assert os.path.basename(old_path.replace('/', os.sep)) not in filenames
     assert os.path.basename(new_path.replace('/', os.sep)) in filenames
 
diff --git a/python3/tests/SMBConnectionTests/test_retrievefile.py b/python3/tests/SMBConnectionTests/test_retrievefile.py
index e49ab8f8..537dadc0 100644
--- a/python3/tests/SMBConnectionTests/test_retrievefile.py
+++ b/python3/tests/SMBConnectionTests/test_retrievefile.py
@@ -3,6 +3,7 @@
 import os, tempfile
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -18,7 +19,8 @@ conn = None
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -26,6 +28,16 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -52,6 +64,24 @@ def test_retr_multiplereads_SMB1():
 def test_retr_multiplereads_SMB2():
     # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '5367c2bbf97f521059c78eab65309ad3'
+    assert filesize == 158437
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_multiplereads_SMB2x():
+    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/rfc1001.txt', temp_fh)
 
@@ -80,6 +110,24 @@ def test_retr_longfilename_SMB1():
 def test_retr_longfilename_SMB2():
     # Test file retrieval that has a long English filename
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '671c5700d279fcbbf958c1bba3c2639e'
+    assert filesize == 421269
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_longfilename_SMB2x():
+    # Test file retrieval that has a long English filename
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
     file_attributes, filesize = conn.retrieveFile('smbtest', '/Implementing CIFS - SMB.html', temp_fh)
 
@@ -95,7 +143,7 @@ def test_retr_unicodefilename_SMB1():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFile('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh)
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -108,8 +156,26 @@ def test_retr_unicodefilename_SMB1():
 def test_retr_unicodefilename_SMB2():
     # Test file retrieval that has a long non-English filename inside a folder with a non-English name
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFile('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh)
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '8a44c1e80d55e91c92350955cdf83442'
+    assert filesize == 256000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_unicodefilename_SMB2x():
+    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFile('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -123,7 +189,7 @@ def test_retr_offset_SMB1():
     # Test file retrieval from offset to EOF
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -136,8 +202,26 @@ def test_retr_offset_SMB1():
 def test_retr_offset_SMB2():
     # Test file retrieval from offset to EOF
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'a141bd8024571ce7cb5c67f2b0d8ea0b'
+    assert filesize == 156000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_SMB2x():
+    # Test file retrieval from offset to EOF
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -151,7 +235,7 @@ def test_retr_offset_and_biglimit_SMB1():
     # Test file retrieval from offset with a big max_length
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -164,8 +248,26 @@ def test_retr_offset_and_biglimit_SMB1():
 def test_retr_offset_and_biglimit_SMB2():
     # Test file retrieval from offset with a big max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '83b7afd7c92cdece3975338b5ca0b1c5'
+    assert filesize == 100000
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_biglimit_SMB2x():
+    # Test file retrieval from offset with a big max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 100000)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -179,7 +281,7 @@ def test_retr_offset_and_smalllimit_SMB1():
     # Test file retrieval from offset with a small max_length
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -192,8 +294,26 @@ def test_retr_offset_and_smalllimit_SMB1():
 def test_retr_offset_and_smalllimit_SMB2():
     # Test file retrieval from offset with a small max_length
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == '746f60a96b39b712a7b6e17ddde19986'
+    assert filesize == 10
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_smalllimit_SMB2x():
+    # Test file retrieval from offset with a small max_length
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 10)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -207,7 +327,7 @@ def test_retr_offset_and_zerolimit_SMB1():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
     md = MD5()
     md.update(temp_fh.getvalue())
@@ -220,8 +340,26 @@ def test_retr_offset_and_zerolimit_SMB1():
 def test_retr_offset_and_zerolimit_SMB2():
     # Test file retrieval from offset to EOF with max_length=0
     global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    temp_fh = BytesIO()
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+
+    md = MD5()
+    md.update(temp_fh.getvalue())
+    assert md.hexdigest() == 'd41d8cd98f00b204e9800998ecf8427e'
+    assert filesize == 0
+
+    temp_fh.close()
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_retr_offset_and_zerolimit_SMB2x():
+    # Test file retrieval from offset to EOF with max_length=0
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     temp_fh = BytesIO()
-    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', '/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
+    file_attributes, filesize = conn.retrieveFileFromOffset('smbtest', u'/测试文件夹/垃圾文件.dat', temp_fh, offset = 100000, max_length = 0)
 
     md = MD5()
     md.update(temp_fh.getvalue())
diff --git a/python3/tests/SMBConnectionTests/test_security.py b/python3/tests/SMBConnectionTests/test_security.py
new file mode 100644
index 00000000..d582f5c9
--- /dev/null
+++ b/python3/tests/SMBConnectionTests/test_security.py
@@ -0,0 +1,52 @@
+# -*- coding: utf-8 -*-
+
+import os, tempfile
+from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
+from .util import getConnectionInfo
+from nose.tools import with_setup
+from smb import smb_structs
+
+try:
+    import hashlib
+    def MD5(): return hashlib.md5()
+except ImportError:
+    import md5
+    def MD5(): return md5.new()
+
+conn = None
+
+def setup_func_SMB2():
+    global conn
+    smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
+
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
+
+def teardown_func():
+    global conn
+    conn.close()
+
+@with_setup(setup_func_SMB2, teardown_func)
+def test_security_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+    # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
+    attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_security_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+    # TODO: Need a way to setup the environment on the remote server and perform some verification on the returned results.
+    attributes = conn.getSecurity('smbtest', '/rfc1001.txt')
diff --git a/python3/tests/SMBConnectionTests/test_storefile.py b/python3/tests/SMBConnectionTests/test_storefile.py
index 2e8e0b8e..fd2c24a1 100644
--- a/python3/tests/SMBConnectionTests/test_storefile.py
+++ b/python3/tests/SMBConnectionTests/test_storefile.py
@@ -3,6 +3,7 @@
 import os, tempfile, random, time
 from io import BytesIO
 from smb.SMBConnection import SMBConnection
+from smb.smb2_constants import SMB2_DIALECT_2
 from .util import getConnectionInfo
 from nose.tools import with_setup
 from smb import smb_structs
@@ -22,8 +23,7 @@ TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
 
 def setup_func_SMB1():
     global conn
-    smb_structs.SUPPORT_SMB2 = False
-
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = False
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -31,7 +31,14 @@ def setup_func_SMB1():
 def setup_func_SMB2():
     global conn
     smb_structs.SUPPORT_SMB2 = True
+    smb_structs.SUPPORT_SMB2x = False
+    info = getConnectionInfo()
+    conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
+    assert conn.connect(info['server_ip'], info['server_port'])
 
+def setup_func_SMB2x():
+    global conn
+    smb_structs.SUPPORT_SMB2 = smb_structs.SUPPORT_SMB2x = True
     info = getConnectionInfo()
     conn = SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
     assert conn.connect(info['server_ip'], info['server_port'])
@@ -43,13 +50,14 @@ def teardown_func():
 
 @with_setup(setup_func_SMB1, teardown_func)
 def test_store_long_filename_SMB1():
+    global conn
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -63,16 +71,39 @@ def test_store_long_filename_SMB1():
 
     conn.deleteFiles('smbtest', filename)
 
+@with_setup(setup_func_SMB1, teardown_func)
+def test_store_from_offset_SMB1():
+    global conn
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = BytesIO(b'0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = BytesIO(b'aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == b'01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
 
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_long_filename_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -87,15 +118,18 @@ def test_store_long_filename_SMB2():
     conn.deleteFiles('smbtest', filename)
 
 
-@with_setup(setup_func_SMB1, teardown_func)
-def test_store_unicode_filename_SMB1():
-    filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_long_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -111,34 +145,41 @@ def test_store_unicode_filename_SMB1():
 
 
 @with_setup(setup_func_SMB1, teardown_func)
-def test_store_from_offset_SMB1():
-    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+def test_store_unicode_filename_SMB1():
+    global conn
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
-    buf = BytesIO(b'0123456789')
-    filesize = conn.storeFile('smbtest', filename, buf)
-    assert filesize == 10
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
 
-    buf = BytesIO(b'aa')
-    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
-    assert pos == 7
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
     file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
-    assert file_size == 10
-    assert buf.getvalue() == b'01234aa789'
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
     buf.close()
 
     conn.deleteFiles('smbtest', filename)
 
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_unicode_filename_SMB2():
-    filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
     assert filesize == TEST_FILESIZE
 
     entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
-    filenames = [e.filename for e in entries]
+    filenames = map(lambda e: e.filename, entries)
     assert os.path.basename(filename.replace('/', os.sep)) in filenames
 
     buf = BytesIO()
@@ -152,8 +193,62 @@ def test_store_unicode_filename_SMB2():
 
     conn.deleteFiles('smbtest', filename)
 
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_unicode_filename_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
+    filename = os.sep + u'上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    filesize = conn.storeFile('smbtest', filename, open(TEST_FILENAME, 'rb'))
+    assert filesize == TEST_FILESIZE
+
+    entries = conn.listPath('smbtest', os.path.dirname(filename.replace('/', os.sep)))
+    filenames = map(lambda e: e.filename, entries)
+    assert os.path.basename(filename.replace('/', os.sep)) in filenames
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == TEST_FILESIZE
+
+    md = MD5()
+    md.update(buf.getvalue())
+    assert md.hexdigest() == TEST_DIGEST
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
 @with_setup(setup_func_SMB2, teardown_func)
 def test_store_from_offset_SMB2():
+    global conn
+    assert conn.smb2_dialect == SMB2_DIALECT_2
+
+    filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
+
+    buf = BytesIO(b'0123456789')
+    filesize = conn.storeFile('smbtest', filename, buf)
+    assert filesize == 10
+
+    buf = BytesIO(b'aa')
+    pos = conn.storeFileFromOffset('smbtest', filename, buf, 5)
+    assert pos == 7
+
+    buf = BytesIO()
+    file_attributes, file_size = conn.retrieveFile('smbtest', filename, buf)
+    assert file_size == 10
+    assert buf.getvalue() == b'01234aa789'
+    buf.close()
+
+    conn.deleteFiles('smbtest', filename)
+
+
+@with_setup(setup_func_SMB2x, teardown_func)
+def test_store_from_offset_SMB2x():
+    global conn
+    assert conn.smb2_dialect != SMB2_DIALECT_2
+
     filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
 
     buf = BytesIO(b'0123456789')
@@ -171,4 +266,3 @@ def test_store_from_offset_SMB2():
     buf.close()
 
     conn.deleteFiles('smbtest', filename)
-    
\ No newline at end of file
diff --git a/python3/tests/SMBConnectionTests/test_with_context.py b/python3/tests/SMBConnectionTests/test_with_context.py
new file mode 100644
index 00000000..58d95677
--- /dev/null
+++ b/python3/tests/SMBConnectionTests/test_with_context.py
@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+
+from smb.SMBConnection import SMBConnection
+from .util import getConnectionInfo
+
+def test_context():
+    info = getConnectionInfo()
+    with SMBConnection(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True) as conn:
+        assert conn.connect(info['server_ip'], info['server_port'])
+
+    assert conn.sock is None
diff --git a/python3/tests/SMBTwistedTests/__init__.py b/python3/tests/SMBTwistedTests/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/python3/tests/SMBTwistedTests/test_auth.py b/python3/tests/SMBTwistedTests/test_auth.py
deleted file mode 100644
index 967a1174..00000000
--- a/python3/tests/SMBTwistedTests/test_auth.py
+++ /dev/null
@@ -1,77 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class AuthFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        self.d.callback(True)
-
-    def onAuthFailed(self):
-        self.d.callback(False)
-
-
-@deferred(timeout=5.0)
-def test_NTLMv1_auth_SMB1():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = False
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv2_auth_SMB1():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = False
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv1_auth_SMB2():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = True
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = False)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-
-@deferred(timeout=5.0)
-def test_NTLMv2_auth_SMB2():
-    def result(auth_passed):
-        assert auth_passed
-
-    smb_structs.SUPPORT_SMB2 = True
-    info = getConnectionInfo()
-    factory = AuthFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.d.addCallback(result)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_createdeletedirectory.py b/python3/tests/SMBTwistedTests/test_createdeletedirectory.py
deleted file mode 100644
index 8874da8a..00000000
--- a/python3/tests/SMBTwistedTests/test_createdeletedirectory.py
+++ /dev/null
@@ -1,99 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, random, time
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class DirectoryFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = ''
-        self.path = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def createDone(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        names = [e.filename for e in entries]
-        assert os.path.basename(self.path.replace('/', os.sep)) in names
-
-        d = self.deleteDirectory(self.service_name, self.path)
-        d.addCallback(self.deleteDone)
-        d.addErrback(self.d.errback)
-
-    def deleteDone(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.path.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        names = [e.filename for e in entries]
-        assert os.path.basename(self.path.replace('/', os.sep)) not in names
-        self.d.callback(True)
-
-    def onAuthOK(self):
-        d = self.createDirectory(self.service_name, self.path)
-        d.addCallback(self.createDone)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_english_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_english_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + 'TestDir %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_unicode_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_unicode_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = DirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = os.sep + '文件夹创建 %d-%d' % ( time.time(), random.randint(0, 1000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_echo.py b/python3/tests/SMBTwistedTests/test_echo.py
deleted file mode 100644
index b781eee1..00000000
--- a/python3/tests/SMBTwistedTests/test_echo.py
+++ /dev/null
@@ -1,39 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from .util import getConnectionInfo
-
-
-class EchoFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.echo_data = 'This is an echo test'
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(data):
-            assert data == self.echo_data
-            self.d.callback(True)
-
-        d = self.echo(self.echo_data)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_echo():
-    info = getConnectionInfo()
-    factory = EchoFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_getattributes.py b/python3/tests/SMBTwistedTests/test_getattributes.py
deleted file mode 100644
index f84450b6..00000000
--- a/python3/tests/SMBTwistedTests/test_getattributes.py
+++ /dev/null
@@ -1,100 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from util import getConnectionInfo
-
-
-class GetAttributesFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.path = ''
-        self.is_directory = False
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(info):
-            assert info.isDirectory == self.is_directory
-            self.d.callback(True)
-
-        d = self.getAttributes('smbtest', self.path, timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB1_test1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = '/Test Folder with Long Name/'
-    factory.is_directory = True
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB1_test2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = '/rfc1001.txt'
-    factory.is_directory = False
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB1_test3():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
-    factory.is_directory = True
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB2_test1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = '/Test Folder with Long Name/'
-    factory.is_directory = True
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB2_test2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = '/rfc1001.txt'
-    factory.is_directory = False
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_getAttributes_SMB2_test3():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = GetAttributesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.path = u'/\u6d4b\u8bd5\u6587\u4ef6\u5939'
-    factory.is_directory = True
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_listpath.py b/python3/tests/SMBTwistedTests/test_listpath.py
deleted file mode 100644
index a827955b..00000000
--- a/python3/tests/SMBTwistedTests/test_listpath.py
+++ /dev/null
@@ -1,56 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListPathFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            filenames = [( r.filename, r.isDirectory ) for r in results]
-            assert ( '\u6d4b\u8bd5\u6587\u4ef6\u5939', True ) in filenames  # Test non-English folder names
-            assert ( 'Test Folder with Long Name', True ) in filenames      # Test long English folder names
-            assert ( 'TestDir1', True ) in filenames                        # Test short English folder names
-            assert ( 'Implementing CIFS - SMB.html', False ) in filenames   # Test long English file names
-            assert ( 'rfc1001.txt', False ) in filenames                    # Test short English file names
-
-            self.d.callback(True)
-
-        d = self.listPath('smbtest', '/', timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listPath_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listPath_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListPathFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_listshares.py b/python3/tests/SMBTwistedTests/test_listshares.py
deleted file mode 100644
index 9c35919e..00000000
--- a/python3/tests/SMBTwistedTests/test_listshares.py
+++ /dev/null
@@ -1,51 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListSharesFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            assert 'smbtest' in [r.name.lower() for r in results]
-            self.d.callback(True)
-            self.instance.transport.loseConnection()
-
-        d = self.listShares(timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listshares_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listshares_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListSharesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_listsnapshots.py b/python3/tests/SMBTwistedTests/test_listsnapshots.py
deleted file mode 100644
index 7c3a5b65..00000000
--- a/python3/tests/SMBTwistedTests/test_listsnapshots.py
+++ /dev/null
@@ -1,57 +0,0 @@
-
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class ListSnapshotsFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = None
-        self.path = None
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def onAuthOK(self):
-        def cb(results):
-            assert len(results) > 0
-            self.d.callback(True)
-            self.instance.transport.loseConnection()
-
-        d = self.listSnapshots(self.service_name, self.path, timeout = 15)
-        d.addCallback(cb)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=15.0)
-def test_listshares_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=15.0)
-def test_listshares_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = ListSnapshotsFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_rename.py b/python3/tests/SMBTwistedTests/test_rename.py
deleted file mode 100644
index 2658d79f..00000000
--- a/python3/tests/SMBTwistedTests/test_rename.py
+++ /dev/null
@@ -1,174 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, random, time
-from io import StringIO
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-
-class RenameFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service = ''
-        self.new_path = ''
-        self.old_path = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def pathCreated(self, result):
-        d = self.listPath(self.service, os.path.dirname(self.old_path.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.old_path.replace('/', os.sep)) in filenames
-        assert os.path.basename(self.new_path.replace('/', os.sep)) not in filenames
-
-        d = self.rename(self.service, self.old_path, self.new_path)
-        d.addCallback(self.renameComplete)
-        d.addErrback(self.d.errback)
-
-    def renameComplete(self, result):
-        d = self.listPath(self.service, os.path.dirname(self.new_path.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.new_path.replace('/', os.sep)) in filenames
-        assert os.path.basename(self.old_path.replace('/', os.sep)) not in filenames
-        self.cleanup()
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-class RenameFileFactory(RenameFactory):
-
-    def onAuthOK(self):
-        d = self.storeFile(self.service, self.old_path, StringIO('Rename file test'))
-        d.addCallback(self.pathCreated)
-        d.addErrback(self.d.errback)
-
-    def cleanup(self):
-        d = self.deleteFiles(self.service, self.new_path)
-        d.chainDeferred(self.d)
-
-
-class RenameDirectoryFactory(RenameFactory):
-
-    def onAuthOK(self):
-        d = self.createDirectory(self.service, self.old_path)
-        d.addCallback(self.pathCreated)
-        d.addErrback(self.d.errback)
-
-    def cleanup(self):
-        d = self.deleteDirectory(self.service, self.new_path)
-        d.chainDeferred(self.d)
-
-
-@deferred(timeout=30.0)
-def test_rename_english_file_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_file_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_file_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_file_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d.txt' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_english_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/RenameTest %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_directory_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_rename_unicode_directory_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RenameDirectoryFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.old_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    factory.new_path = '/改名测试 %d-%d' % ( time.time(), random.randint(1000, 9999) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_retrievefile.py b/python3/tests/SMBTwistedTests/test_retrievefile.py
deleted file mode 100644
index bbfc7d0a..00000000
--- a/python3/tests/SMBTwistedTests/test_retrievefile.py
+++ /dev/null
@@ -1,278 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, tempfile
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-try:
-    import hashlib
-    def MD5(): return hashlib.md5()
-except ImportError:
-    import md5
-    def MD5(): return md5.new()
-
-
-class RetrieveFileFactory(SMBProtocolFactory):
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.temp_fh = tempfile.NamedTemporaryFile(prefix = 'pysmbtest-')
-        self.service = ''
-        self.path = ''
-        self.digest = ''
-        self.offset = 0
-        self.max_length = -1
-        self.filesize = 0
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def fileRetrieved(self, write_result):
-        file_obj, file_attributes, file_size = write_result
-        assert file_obj == self.temp_fh
-
-        md = MD5()
-        filesize = 0
-        self.temp_fh.seek(0)
-        while True:
-            s = self.temp_fh.read(8192)
-            if not s:
-                break
-            md.update(s)
-            filesize += len(s)
-
-        assert self.filesize == filesize
-        assert md.hexdigest() == self.digest
-
-        self.temp_fh.close()
-        self.d.callback(True)
-        self.instance.transport.loseConnection()
-
-    def onAuthOK(self):
-        assert self.service
-        assert self.path
-
-        d = self.retrieveFileFromOffset(self.service, self.path, self.temp_fh, self.offset, self.max_length, timeout = 15)
-        d.addCallback(self.fileRetrieved)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=30.0)
-def test_retr_multiplereads_SMB1():
-    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    factory.digest = '5367c2bbf97f521059c78eab65309ad3'
-    factory.filesize = 158437
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_multiplereads_SMB2():
-    # Test file retrieval using multiple ReadAndx calls (assuming each call will not reach more than 65534 bytes)
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/rfc1001.txt'
-    factory.digest = '5367c2bbf97f521059c78eab65309ad3'
-    factory.filesize = 158437
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_longfilename_SMB1():
-    # Test file retrieval that has a long English filename
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/Implementing CIFS - SMB.html'
-    factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
-    factory.filesize = 421269
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_longfilename_SMB2():
-    # Test file retrieval that has a long English filename
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/Implementing CIFS - SMB.html'
-    factory.digest = '671c5700d279fcbbf958c1bba3c2639e'
-    factory.filesize = 421269
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_unicodefilename_SMB1():
-    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '8a44c1e80d55e91c92350955cdf83442'
-    factory.filesize = 256000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_unicodefilename_SMB2():
-    # Test file retrieval that has a long non-English filename inside a folder with a non-English name
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '8a44c1e80d55e91c92350955cdf83442'
-    factory.filesize = 256000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_SMB1():
-    # Test file retrieval from offset to EOF
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
-    factory.filesize = 156000
-    factory.offset = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_SMB2():
-    # Test file retrieval from offset to EOF
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'a141bd8024571ce7cb5c67f2b0d8ea0b'
-    factory.filesize = 156000
-    factory.offset = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_biglimit_SMB1():
-    # Test file retrieval from offset with a big max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
-    factory.filesize = 100000
-    factory.offset = 100000
-    factory.max_length = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_biglimit_SMB2():
-    # Test file retrieval from offset with a big max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '83b7afd7c92cdece3975338b5ca0b1c5'
-    factory.filesize = 100000
-    factory.offset = 100000
-    factory.max_length = 100000
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_smalllimit_SMB1():
-    # Test file retrieval from offset with a small max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '746f60a96b39b712a7b6e17ddde19986'
-    factory.filesize = 10
-    factory.offset = 100000
-    factory.max_length = 10
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_smalllimit_SMB2():
-    # Test file retrieval from offset with a small max_length
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = '746f60a96b39b712a7b6e17ddde19986'
-    factory.filesize = 10
-    factory.offset = 100000
-    factory.max_length = 10
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_zerolimit_SMB1():
-    # Test file retrieval from offset to EOF with max_length=0
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
-    factory.filesize = 0
-    factory.offset = 100000
-    factory.max_length = 0
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_retr_offset_and_zerolimit_SMB2():
-    # Test file retrieval from offset to EOF with max_length=0
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-    
-    factory = RetrieveFileFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service = 'smbtest'
-    factory.path = '/测试文件夹/垃圾文件.dat'
-    factory.digest = 'd41d8cd98f00b204e9800998ecf8427e'
-    factory.filesize = 0
-    factory.offset = 100000
-    factory.max_length = 0
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/test_storefile.py b/python3/tests/SMBTwistedTests/test_storefile.py
deleted file mode 100644
index 0d5e6d03..00000000
--- a/python3/tests/SMBTwistedTests/test_storefile.py
+++ /dev/null
@@ -1,141 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import os, time, random
-from io import StringIO
-from nose.twistedtools import reactor, deferred
-from twisted.internet import defer
-from smb.SMBProtocol import SMBProtocolFactory
-from smb import smb_structs
-from .util import getConnectionInfo
-
-try:
-    import hashlib
-    def MD5(): return hashlib.md5()
-except ImportError:
-    import md5
-    def MD5(): return md5.new()
-
-class StoreFilesFactory(SMBProtocolFactory):
-    """
-    A super test factory that tests store file, list files, retrieve file and delete file functionlities in sequence.
-    """
-
-    TEST_FILENAME = os.path.join(os.path.dirname(__file__), os.pardir, 'SupportFiles', 'binary.dat')
-    TEST_FILESIZE = 256000
-    TEST_DIGEST = 'bb6303f76e29f354b6fdf6ef58587e48'
-
-    def __init__(self, *args, **kwargs):
-        SMBProtocolFactory.__init__(self, *args, **kwargs)
-        self.d = defer.Deferred()
-        self.d.addBoth(self.testDone)
-        self.service_name = ''
-        self.filename = ''
-
-    def testDone(self, r):
-        if self.instance:
-            self.instance.transport.loseConnection()
-        return r
-
-    def storeComplete(self, result):
-        file_obj, filesize = result
-        file_obj.close()
-        assert filesize == self.TEST_FILESIZE
-
-        d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
-        d.addCallback(self.listComplete)
-        d.addErrback(self.d.errback)
-
-    def listComplete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.filename.replace('/', os.sep)) in filenames
-
-        for entry in entries:
-            if os.path.basename(self.filename.replace('/', os.sep)) == entry.filename:
-                # The following asserts will fail if the remote machine's time is not in sync with the test machine's time
-                assert abs(entry.create_time - time.time()) < 3
-                assert abs(entry.last_access_time - time.time()) < 3
-                assert abs(entry.last_write_time - time.time()) < 3
-                assert abs(entry.last_attr_change_time - time.time()) < 3
-                break
-
-        d = self.retrieveFile(self.service_name, self.filename, StringIO())
-        d.addCallback(self.retrieveComplete)
-        d.addErrback(self.d.errback)
-
-    def retrieveComplete(self, result):
-        file_obj, file_attributes, file_size = result
-
-        md = MD5()
-        md.update(file_obj.getvalue())
-        file_obj.close()
-
-        assert file_size == self.TEST_FILESIZE
-        assert md.hexdigest() == self.TEST_DIGEST
-
-        d = self.deleteFiles(self.service_name, self.filename)
-        d.addCallback(self.deleteComplete)
-        d.addErrback(self.d.errback)
-
-    def deleteComplete(self, result):
-        d = self.listPath(self.service_name, os.path.dirname(self.filename.replace('/', os.sep)))
-        d.addCallback(self.list2Complete)
-        d.addErrback(self.d.errback)
-
-    def list2Complete(self, entries):
-        filenames = [e.filename for e in entries]
-        assert os.path.basename(self.filename.replace('/', os.sep)) not in filenames
-        self.d.callback(True)
-        self.instance.transport.loseConnection()
-
-    def onAuthOK(self):
-        d = self.storeFile(self.service_name, self.filename, open(self.TEST_FILENAME, 'rb'))
-        d.addCallback(self.storeComplete)
-        d.addErrback(self.d.errback)
-
-    def onAuthFailed(self):
-        self.d.errback('Auth failed')
-
-
-@deferred(timeout=30.0)
-def test_store_long_filename_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_long_filename_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + 'StoreTest %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_unicode_filename_SMB1():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = False
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
-
-@deferred(timeout=30.0)
-def test_store_unicode_filename_SMB2():
-    info = getConnectionInfo()
-    smb_structs.SUPPORT_SMB2 = True
-
-    factory = StoreFilesFactory(info['user'], info['password'], info['client_name'], info['server_name'], use_ntlm_v2 = True)
-    factory.service_name = 'smbtest'
-    factory.filename = os.sep + '上载测试 %d-%d.dat' % ( time.time(), random.randint(0, 10000) )
-    reactor.connectTCP(info['server_ip'], info['server_port'], factory)
-    return factory.d
diff --git a/python3/tests/SMBTwistedTests/util.py b/python3/tests/SMBTwistedTests/util.py
deleted file mode 100644
index 37ff2f2a..00000000
--- a/python3/tests/SMBTwistedTests/util.py
+++ /dev/null
@@ -1,19 +0,0 @@
-
-import os
-from configparser import SafeConfigParser
-
-def getConnectionInfo():
-    config_filename = os.path.join(os.path.dirname(__file__), os.path.pardir, 'connection.ini')
-    cp = SafeConfigParser()
-    cp.read(config_filename)
-
-    info = {
-        'server_name': cp.get('server', 'name'),
-        'server_ip': cp.get('server', 'ip'),
-        'server_port': cp.getint('server', 'port'),
-        'client_name': cp.get('client', 'name'),
-        'user': cp.get('user', 'name'),
-        'password': cp.get('user', 'password'),
-    }
-    return info
-
diff --git a/python3/tests/connection.ini b/python3/tests/connection.ini
index 96d2652d..d8d249de 100644
--- a/python3/tests/connection.ini
+++ b/python3/tests/connection.ini
@@ -3,6 +3,7 @@
 name = SERVER
 ip = 192.168.1.1
 port = 139
+direct_port = 445
 
 [client]
 name = TESTCLIENT
diff --git a/python3/tests/smbtest.7z b/python3/tests/smbtest.7z
deleted file mode 100644
index c5c9f42b..00000000
Binary files a/python3/tests/smbtest.7z and /dev/null differ
diff --git a/python3/tests/test_security_descriptors.py b/python3/tests/test_security_descriptors.py
new file mode 100644
index 00000000..7a87a849
--- /dev/null
+++ b/python3/tests/test_security_descriptors.py
@@ -0,0 +1,139 @@
+import binascii
+
+from smb import security_descriptors as sd
+from smb import smb_constants as sc
+
+
+def test_sid_string_representation():
+    sid = sd.SID(1, 5, [2, 3, 4])
+    assert str(sid) == "S-1-5-2-3-4"
+    sid = sd.SID(1, 2**32 + 3, [])
+    assert str(sid) == "S-1-0x100000003"
+    sid = sd.SID(1, 2**32, [3, 2, 1])
+    assert str(sid) == "S-1-0x100000000-3-2-1"
+
+
+def test_sid_binary_parsing():
+    raw_sid = binascii.unhexlify(b"""
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  b1 04 00 00
+    """.translate(None, b' \n'))
+    assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    raw_sid += b"garbage"
+    assert str(sd.SID.from_bytes(raw_sid)) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    sid, tail = sd.SID.from_bytes(raw_sid, return_tail=True)
+    assert str(sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert tail == b"garbage"
+
+
+def test_ace_binary_parsing():
+    raw_ace = binascii.unhexlify(b"""
+        00 10 24 00 ff 01 1f 00  01 05 00 00 00 00 00 05
+        15 00 00 00 de 53 c1 2a  2a 4f da ca c1 79 a6 32
+        6e 04 00 00
+    """.translate(None, b' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1134"
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
+                        | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
+                        | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
+                        | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
+                        | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
+                        | sc.FILE_WRITE_ATTRIBUTES)
+    assert not ace.additional_data
+
+    raw_ace = binascii.unhexlify(b"""
+        00 13 18 00 a9 00 12 00  01 02 00 00 00 00 00 05
+        20 00 00 00 21 02 00 00
+    """.translate(None, b' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-32-545"
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert ace.flags == (sd.ACE_FLAG_INHERITED | sd.ACE_FLAG_CONTAINER_INHERIT
+                         | sd.ACE_FLAG_OBJECT_INHERIT)
+    assert ace.mask == (sc.SYNCHRONIZE | sc.READ_CONTROL | sc.FILE_READ_DATA
+                        | sc.FILE_READ_EA | sc.FILE_EXECUTE
+                        | sc.FILE_READ_ATTRIBUTES)
+    assert not ace.additional_data
+
+    raw_ace = binascii.unhexlify(b"""
+        01 03 24 00 a9 00 02 00  01 05 00 00 00 00 00 05
+        15 00 00 00 de 53 c1 2a  2a 4f da ca c1 79 a6 32
+        6c 04 00 00
+    """.translate(None, b' \n'))
+    ace = sd.ACE.from_bytes(raw_ace)
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1132"
+    assert ace.type == sd.ACE_TYPE_ACCESS_DENIED
+    assert ace.flags == (sd.ACE_FLAG_CONTAINER_INHERIT
+                         | sd.ACE_FLAG_OBJECT_INHERIT)
+    assert ace.mask == (sc.READ_CONTROL | sc.FILE_READ_DATA | sc.FILE_READ_EA
+                        | sc.FILE_EXECUTE | sc.FILE_READ_ATTRIBUTES)
+    assert not ace.additional_data
+
+
+def test_acl_binary_parsing():
+    raw_acl = binascii.unhexlify(b"""
+        02 00 70 00 04 00 00 00  00 10 18 00 89 00 10 00
+        01 02 00 00 00 00 00 05  20 00 00 00 21 02 00 00
+        00 10 14 00 ff 01 1f 00  01 01 00 00 00 00 00 05
+        12 00 00 00 00 10 18 00  ff 01 1f 00 01 02 00 00
+        00 00 00 05 20 00 00 00  20 02 00 00 00 10 24 00
+        ff 01 1f 00 01 05 00 00  00 00 00 05 15 00 00 00
+        de 53 c1 2a 2a 4f da ca  c1 79 a6 32 b1 04 00 00
+    """.translate(None, b' \n'))
+    acl = sd.ACL.from_bytes(raw_acl)
+    assert acl.revision == 2
+    assert len(acl.aces) == 4
+
+    ace = acl.aces[0]
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert str(ace.sid) == "S-1-5-32-545"
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.FILE_READ_DATA | sc.FILE_READ_EA
+                        | sc.FILE_READ_ATTRIBUTES)
+
+    ace = acl.aces[3]
+    assert ace.type == sd.ACE_TYPE_ACCESS_ALLOWED
+    assert str(ace.sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert ace.flags == sd.ACE_FLAG_INHERITED
+    assert ace.mask == (sc.SYNCHRONIZE | sc.WRITE_OWNER | sc.WRITE_DAC
+                        | sc.READ_CONTROL | sc.DELETE | sc.FILE_READ_DATA
+                        | sc.FILE_WRITE_DATA | sc.FILE_APPEND_DATA
+                        | sc.FILE_READ_EA | sc.FILE_WRITE_EA | sc.FILE_EXECUTE
+                        | sc.FILE_DELETE_CHILD | sc.FILE_READ_ATTRIBUTES
+                        | sc.FILE_WRITE_ATTRIBUTES)
+
+
+def test_descriptor_binary_parsing():
+    raw_descriptor = binascii.unhexlify(b"""
+        01 00 04 84 14 00 00 00  30 00 00 00 00 00 00 00
+        4c 00 00 00 01 05 00 00  00 00 00 05 15 00 00 00
+        de 53 c1 2a 2a 4f da ca  c1 79 a6 32 b1 04 00 00
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  01 02 00 00 02 00 70 00
+        04 00 00 00 00 10 18 00  89 00 10 00 01 02 00 00
+        00 00 00 05 20 00 00 00  21 02 00 00 00 10 14 00
+        ff 01 1f 00 01 01 00 00  00 00 00 05 12 00 00 00
+        00 10 18 00 ff 01 1f 00  01 02 00 00 00 00 00 05
+        20 00 00 00 20 02 00 00  00 10 24 00 ff 01 1f 00
+        01 05 00 00 00 00 00 05  15 00 00 00 de 53 c1 2a
+        2a 4f da ca c1 79 a6 32  b1 04 00 00
+    """.translate(None, b' \n'))
+    descriptor = sd.SecurityDescriptor.from_bytes(raw_descriptor)
+    assert descriptor.flags == (sd.SECURITY_DESCRIPTOR_SELF_RELATIVE
+                                | sd.SECURITY_DESCRIPTOR_DACL_PRESENT
+                                | sd.SECURITY_DESCRIPTOR_DACL_AUTO_INHERITED)
+    assert descriptor.dacl is not None
+    assert descriptor.sacl is None
+    assert str(descriptor.owner) == "S-1-5-21-717312990-3403304746-849770945-1201"
+    assert str(descriptor.group) == "S-1-5-21-717312990-3403304746-849770945-513"
+
+    acl = descriptor.dacl
+    assert acl.revision == 2
+    assert len(acl.aces) == 4
+    assert str(acl.aces[0].sid) == sd.SID_BUILTIN_USERS
+    assert str(acl.aces[1].sid) == sd.SID_LOCAL_SYSTEM
+    assert str(acl.aces[2].sid) == sd.SID_BUILTIN_ADMINISTRATORS
+    assert str(acl.aces[3].sid) == "S-1-5-21-717312990-3403304746-849770945-1201"
diff --git a/setup.cfg b/setup.cfg
new file mode 100644
index 00000000..861a9f55
--- /dev/null
+++ b/setup.cfg
@@ -0,0 +1,5 @@
+[egg_info]
+tag_build = 
+tag_date = 0
+tag_svn_revision = 0
+
diff --git a/setup.py b/setup.py
index e9093d75..e746e949 100644
--- a/setup.py
+++ b/setup.py
@@ -8,7 +8,7 @@ pkgdir = { '': 'python%s' % sys.version_info[0] }
 
 setup(
     name = "pysmb",
-    version = "1.1.19",
+    version = "1.1.26",
     author = "Michael Teo",
     author_email = "miketeo@miketeo.net",
     license = "zlib/libpng",
@@ -27,9 +27,6 @@ setup(
         "Operating System :: Microsoft :: Windows",
         "Operating System :: POSIX",
         "Programming Language :: Python",
-        "Programming Language :: Python :: 2.4",
-        "Programming Language :: Python :: 2.5",
-        "Programming Language :: Python :: 2.6",
         "Programming Language :: Python :: 2.7",
         "Programming Language :: Python :: 3",
         "Topic :: Communications :: File Sharing",
diff --git a/sphinx/requirements.txt b/sphinx/requirements.txt
new file mode 100644
index 00000000..c14b1c83
--- /dev/null
+++ b/sphinx/requirements.txt
@@ -0,0 +1,2 @@
+twisted>=15.0.0
+pyasn1>=0.3.0
diff --git a/sphinx/source/api/smb_security_descriptors.rst b/sphinx/source/api/smb_security_descriptors.rst
new file mode 100644
index 00000000..0f048fe8
--- /dev/null
+++ b/sphinx/source/api/smb_security_descriptors.rst
@@ -0,0 +1,23 @@
+
+Security Descriptors
+====================
+
+.. module:: smb.security_descriptors
+   :synopsis: Data structures used in Windows security descriptors.
+
+This module implements security descriptors, and associated data
+structures, as specified in `[MS-DTYP]`_.
+
+.. autoclass:: SID
+   :members:
+
+.. autoclass:: ACE
+   :members:
+
+.. autoclass:: ACL
+   :members:
+
+.. autoclass:: SecurityDescriptor
+   :members:
+
+.. _[MS-DTYP]: https://msdn.microsoft.com/en-us/library/cc230273.aspx
diff --git a/sphinx/source/conf.py b/sphinx/source/conf.py
index 12ec1b9e..26accf46 100644
--- a/sphinx/source/conf.py
+++ b/sphinx/source/conf.py
@@ -42,16 +42,16 @@ master_doc = 'index'
 
 # General information about the project.
 project = u'pysmb'
-copyright = u'2001-2015, Michael Teo http://miketeo.net/'
+copyright = u'2001-2018, Michael Teo http://miketeo.net/'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
 # built documents.
 #
 # The short X.Y version.
-version = '1.1.18'
+version = '1.1.26'
 # The full version, including alpha/beta/rc tags.
-release = '1.1.18'
+release = '1.1.26'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.