/// <summary>
 /// Marshals data from an object to an NDR-encoded byte array.
 /// </summary>
 /// <param name="obj">The pointer to an unmanaged block of memory
 /// which contains the content of object.</param>
 /// <param name="formatStringOffset">Format string offset of the data Type.</param>
 /// <returns>The byte array of NDR-encoded data.</returns>
 internal static byte[] NdrMarshal(IntPtr obj, int formatStringOffset)
 {
     using (PickleMarshaller marshaller = new PickleMarshaller(FormatString.Pac))
     {
         return(marshaller.Encode(obj, formatStringOffset));
     }
 }
 /// <summary>
 /// Unmarshals data from an NDR-encoded byte array to an object.
 /// </summary>
 /// <typeparam name="T">Type of the decoded object.</typeparam>
 /// <param name="buffer">The byte array containing NDR-encoded data.</param>
 /// <param name="index">Begin of encoded data.</param>
 /// <param name="count">Size of encoded data.</param>
 /// <param name="formatStringOffset">Format string offset of the data Type.</param>
 /// <returns>The object containing data in the byte array.</returns>
 internal static T NdrUnmarshal <T>(byte[] buffer, int index, int count, int formatStringOffset, bool force32Bit = true, int alignment = 4) where T : struct
 {
     using (PickleMarshaller marshaller = new PickleMarshaller(FormatString.Pac))
     {
         return(marshaller.Decode <T>(buffer, index, count, formatStringOffset, force32Bit, alignment));
     }
 }