/// <summary>
        /// The NetrShareGetInfo method retrieves information about a particular shared resource on the server from the ShareList.
        /// </summary>
        /// <param name="ServerName">A string that identifies the server. If this parameter is NULL, the local computer is used.</param>
        /// <param name="NetName">The name of the share to return information for.</param>
        /// <param name="Level">Specifies the information level of the data. This parameter MUST be one of the following values.</param>
        /// <param name="InfoStruct">Its contents are determined by the value of the Level parameter, as shown in the preceding table.</param>
        /// <returns>The method returns 0x00000000 (NERR_Success) to indicate success; otherwise, it returns a nonzero error code.</returns>
        public uint NetrShareGetInfo(string ServerName, string NetName, SHARE_ENUM_STRUCT_LEVEL Level, out SHARE_INFO?InfoStruct)
        {
            /*
             * NET_API_STATUS NetrShareGetInfo(
             * [in, string, unique] SRVSVC_HANDLE ServerName,
             * [in, string] WCHAR* NetName,
             * [in] DWORD Level,
             * [out, switch_is(Level)] LPSHARE_INFO InfoStruct
             * );
             */
            Int3264[] paramList;
            uint      retVal = 0;

            InfoStruct = null;
            using (SafeIntPtr pServerName = Marshal.StringToHGlobalUni(ServerName), pNetName = Marshal.StringToHGlobalUni(NetName))
            {
                paramList = new Int3264[] {
                    pServerName,
                    pNetName,
                    (uint)Level,
                    IntPtr.Zero, // out value
                    IntPtr.Zero  // return value
                };
                using (RpceInt3264Collection outParamList = RpceCall(paramList, (ushort)SRVS_OPNUM.NetrShareGetInfo))
                {
                    retVal = outParamList[paramList.Length - 1].ToUInt32();
                    if (retVal == (uint)Win32ErrorCode_32.ERROR_SUCCESS)
                    {
                        InfoStruct = TypeMarshal.ToStruct <SHARE_INFO>(outParamList[3], Level, null, null);
                    }
                }
            }
            return(retVal);
        }
        /// <summary>
        /// The NetrShareSetInfo method sets the parameters of a shared resource in a ShareList.
        /// </summary>
        /// <param name="ServerName">A string that identifies the server. If this parameter is NULL, the local computer is used.</param>
        /// <param name="NetName">The name of the share to return information for.</param>
        /// <param name="Level">Specifies the information level of the data. This parameter MUST be one of the following values.</param>
        /// <param name="InfoStruct">Its contents are determined by the value of the Level parameter, as shown in the preceding table.
        /// This parameter MUST NOT contain a null value. </param>
        /// <param name="ParmErr">An integer value that receives the index of the first member of the share information
        /// structure that caused the ERROR_INVALID_PARAMETER error, if it occurs</param>
        /// <returns>The method returns 0x00000000 (NERR_Success) to indicate success; otherwise, it returns a nonzero error code.</returns>
        public uint NetrShareSetInfo(string ServerName, string NetName, SHARE_ENUM_STRUCT_LEVEL Level, SHARE_INFO InfoStruct, ref uint?ParmErr)
        {
            /*
             * NET_API_STATUS NetrShareSetInfo(
             *  [in, string, unique] SRVSVC_HANDLE ServerName,
             *  [in, string] WCHAR* NetName,
             *  [in] DWORD Level,
             *  [in, switch_is(Level)] LPSHARE_INFO ShareInfo,
             *  [in, out, unique] DWORD* ParmErr
             * );
             */

            Int3264[] paramList;
            uint      retVal = 0;

            using (SafeIntPtr pServerName = Marshal.StringToHGlobalUni(ServerName),
                   pNetName = Marshal.StringToHGlobalUni(NetName),
                   pShareInfo = TypeMarshal.ToIntPtr(InfoStruct, Level, null, null),
                   pParmErr = TypeMarshal.ToIntPtr(ParmErr))
            {
                paramList = new Int3264[] {
                    pServerName,
                    pNetName,
                    (uint)Level,
                    pShareInfo, // out value
                    pParmErr,
                    IntPtr.Zero // return value
                };
                using (RpceInt3264Collection outParamList = RpceCall(paramList, (ushort)SRVS_OPNUM.NetrShareSetInfo))
                {
                    retVal = outParamList[paramList.Length - 1].ToUInt32();
                    if (retVal == (uint)Win32ErrorCode_32.ERROR_INVALID_PARAMETER)
                    {
                        ParmErr = TypeMarshal.ToNullableStruct <uint>(outParamList[4]);
                    }
                }
            }
            return(retVal);
        }
        /// <summary>
        /// The NetrShareSetInfo method sets the parameters of a shared resource in a ShareList.
        /// </summary>
        /// <param name="ServerName">A string that identifies the server. If this parameter is NULL, the local computer is used.</param>
        /// <param name="NetName">The name of the share to return information for.</param>
        /// <param name="Level">Specifies the information level of the data. This parameter MUST be one of the following values.</param>
        /// <param name="InfoStruct">Its contents are determined by the value of the Level parameter, as shown in the preceding table.
        /// This parameter MUST NOT contain a null value. </param>
        /// <param name="ParmErr">An integer value that receives the index of the first member of the share information 
        /// structure that caused the ERROR_INVALID_PARAMETER error, if it occurs</param>
        /// <returns>The method returns 0x00000000 (NERR_Success) to indicate success; otherwise, it returns a nonzero error code.</returns>
        public uint NetrShareSetInfo(string ServerName, string NetName, SHARE_ENUM_STRUCT_LEVEL Level, SHARE_INFO InfoStruct, ref uint? ParmErr)
        {
            /*
            NET_API_STATUS NetrShareSetInfo(
                [in, string, unique] SRVSVC_HANDLE ServerName,
                [in, string] WCHAR* NetName,
                [in] DWORD Level,
                [in, switch_is(Level)] LPSHARE_INFO ShareInfo,
                [in, out, unique] DWORD* ParmErr
            );
             */

            Int3264[] paramList;
            uint retVal = 0;

            using (SafeIntPtr pServerName = Marshal.StringToHGlobalUni(ServerName),
                pNetName = Marshal.StringToHGlobalUni(NetName),
                pShareInfo = TypeMarshal.ToIntPtr(InfoStruct, Level, null, null),
                pParmErr = TypeMarshal.ToIntPtr(ParmErr))
            {
                paramList = new Int3264[]{
                    pServerName,
                    pNetName,
                    (uint)Level,
                    pShareInfo, // out value
                    pParmErr,
                    IntPtr.Zero // return value
                    };
                using (RpceInt3264Collection outParamList = RpceCall(paramList, (ushort)SRVS_OPNUM.NetrShareSetInfo))
                {
                    retVal = outParamList[paramList.Length - 1].ToUInt32();
                    if (retVal == (uint)Win32ErrorCode_32.ERROR_INVALID_PARAMETER)
                    {
                        ParmErr = TypeMarshal.ToNullableStruct<uint>(outParamList[4]);
                    }
                }
            }
            return retVal;
        }
 /// <summary>
 /// The NetrShareGetInfo method retrieves information about a particular shared resource on the server from the ShareList.
 /// </summary>
 /// <param name="ServerName">A string that identifies the server. If this parameter is NULL, the local computer is used.</param>
 /// <param name="NetName">The name of the share to return information for.</param>
 /// <param name="Level">Specifies the information level of the data. This parameter MUST be one of the following values.</param>
 /// <param name="InfoStruct">Its contents are determined by the value of the Level parameter, as shown in the preceding table.</param>
 /// <returns>The method returns 0x00000000 (NERR_Success) to indicate success; otherwise, it returns a nonzero error code.</returns>
 public uint NetrShareGetInfo(string ServerName, string NetName, SHARE_ENUM_STRUCT_LEVEL Level, out SHARE_INFO? InfoStruct)
 {
     /*
     NET_API_STATUS NetrShareGetInfo(
       [in, string, unique] SRVSVC_HANDLE ServerName,
       [in, string] WCHAR* NetName,
       [in] DWORD Level,
       [out, switch_is(Level)] LPSHARE_INFO InfoStruct
     );
      */
     Int3264[] paramList;
     uint retVal = 0;
     InfoStruct = null;
     using (SafeIntPtr pServerName = Marshal.StringToHGlobalUni(ServerName), pNetName = Marshal.StringToHGlobalUni(NetName))
     {
         paramList = new Int3264[]{
             pServerName,
             pNetName,
             (uint)Level,
             IntPtr.Zero, // out value
             IntPtr.Zero // return value
         };
         using (RpceInt3264Collection outParamList = RpceCall(paramList, (ushort)SRVS_OPNUM.NetrShareGetInfo))
         {
             retVal = outParamList[paramList.Length - 1].ToUInt32();
             if (retVal == (uint)Win32ErrorCode_32.ERROR_SUCCESS)
             {
                 InfoStruct = TypeMarshal.ToStruct<SHARE_INFO>(outParamList[3], Level, null, null);
             }
         }
     }
     return retVal;
 }