File: MS\Internal\Documents\Application\NativeDirectoryServicesQueryAPIs.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\PresentationUI\PresentationUI_1t4s4vdm_wpftmp.csproj (PresentationUI)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
// Description: NativeDirectoryServicesQueryAPIs contains managed wrappers 
//              for native calls related to Directory Services query APIs
//              and helper methods necessary to make use of them.
 
using System;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
 
namespace MS.Internal.Documents
{
    internal partial class PeoplePickerWrapper
    {
        /// <summary>
        /// NativeDirectoryServices contains managed wrappers 
        /// for native calls related to Directory Services query APIs
        /// and helper methods necessary to make use of them.
        /// </summary>
        internal static class UnsafeNativeMethods
        {
            ///<summary>
            /// Managed interface definition for the Active Directory ICommonQuery interface
            /// defined in cmnquery.h as having the following method:
            /// 
            ///  HRESULT OpenQueryWindow(
            ///     HWND hwdnParent,
            ///     LPOPENQUERYWINDOW* pQueryWnd,
            ///     IDataObject** ppDataObj
            ///  );
            /// See also: 
            /// https://docs.microsoft.com/en-us/windows/desktop/api/cmnquery/nn-cmnquery-icommonquery
            /// and
            /// https://docs.microsoft.com/en-us/windows/desktop/api/cmnquery/nf-cmnquery-icommonquery-openquerywindow
            /// </summary>
            [Guid("ab50dec0-6f1d-11d0-a1c4-00aa00c16e65")]
            [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
            [ComImport]
            internal interface ICommonQuery
            {
                [PreserveSig]
                UInt32 OpenQueryWindow(
                    [In] IntPtr hwndParent,
                    [In] ref OpenQueryWindowParams pQueryWnd,
                    [Out] out IDataObject ppDataObj
                    );
            }
 
            /// <summary>
            /// Managed wrapper for the OPENQUERYWINDOW struct defined in
            /// cmnquery.h as:
            /// typedef struct {
            ///     DWORD cbStruct;
            ///     DWORD dwFlags;
            ///     CLSID clsidHandler;
            ///     LPVOID pHandlerParameters;
            ///     CLSID clsidDefaultForm;
            ///     IPersistQuery* pPersistQuery;
            ///     union {
            ///         void* pFormParameters;
            ///         IPropertyBag* ppbFormParameters
            ///     };
            /// } OPENQUERYWINDOW;
            /// 
            /// See also:
            /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/openquerywindow.asp
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            internal struct OpenQueryWindowParams
            {
                public UInt32 cbStruct;
                public UInt32 dwFlags;
                public Guid clsidHandler;
                public IntPtr pHandlerParameters;
                public Guid clsidDefaultForm;
                public IntPtr pPersistQuery;      // Originally an IPersistQuery (not an IntPtr), which we do not use.
                public IntPtr pFormParameters;    // Originally a union in the COM definition;
            }                                     // but because we do not use this field we leave this
            // as a single field to avoid 64-bit layout issues.
 
            /// <summary>
            /// Managed wrapper for the DSQUERYINITPARAMS struct defined in
            /// dsquery.h as:
            /// typedef struct {
            ///     DWORD cbStruct;
            ///     DWORD dwFlags;
            ///     LPWSTR pDefaultScope;
            ///     LPWSTR pDefaultSaveLocation;
            ///     LPWSTR pUserName;
            ///     LPWSTR pPassword;
            ///     LPWSTR pServer
            /// } DSQUERYINITPARAMS;
            /// 
            /// See also:
            /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/dsqueryinitparams.asp
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            internal struct QueryInitParams
            {
                public uint cbStruct;
                public uint dwFlags;
                [MarshalAs(UnmanagedType.LPWStr)]
                public String pDefaultScope;
 
                [MarshalAs(UnmanagedType.LPWStr)]
                public String pDefaultSaveLocation;
 
                [MarshalAs(UnmanagedType.LPWStr)]
                public String pUserName;
 
                [MarshalAs(UnmanagedType.LPWStr)]
                public String pPassword;
 
                [MarshalAs(UnmanagedType.LPWStr)]
                public String pServer;
            }
 
            /// <summary>
            /// Managed wrapper for the DSOBJECT struct defined in
            /// dsclient.h as:
            /// typedef struct {
            ///     DWORD dwFlags;
            ///     DWORD dwProviderFlags;
            ///     DWORD offsetName;
            ///     DWORD offsetClass;
            /// } DSOBJECT;
            /// 
            /// See also:
            /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/dsobject.asp
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            internal struct DsObject
            {
                public UInt32 dwFlags;
                public UInt32 dwProviderFlags;
                public UInt32 offsetName;
                public UInt32 offsetClass;
            }
 
            /// <summary>
            /// Managed wrapper for the DSOBJECTNAMES struct defined in
            /// dsclient.h as:
            /// typedef struct {
            ///     CLSID clsidNamespace;
            ///     UINT cItems;
            ///     DSOBJECT aObjects[1];
            /// } DSOBJECTNAMES;
            /// 
            /// See also:
            /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ad/ad/dsobjectnames.asp
            /// </summary>
            [StructLayout(LayoutKind.Sequential)]
            internal struct DsObjectNames
            {
                public Guid clsidNamespace;
                public UInt32 cItems;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst=1)]
                public DsObject[] aObjects;
            }
 
            // CLSIDs for objects we're concerned with (from cmnquery.h and dsquery.h)
            internal static readonly Guid CLSID_CommonQuery = new Guid(0x83bc5ec0, 0x6f2a, 0x11d0, 0xa1, 0xc4, 0x00, 0xaa, 0x00, 0xc1, 0x6e, 0x65);
            internal static readonly Guid CLSID_DsQuery = new Guid(0x08a23e65e, 0x31c2, 0x11d0, 0x89, 0x1c, 0x00, 0xa0, 0x24, 0xab, 0x2d, 0xbb);
            internal static readonly Guid CLSID_DsFindPeople = new Guid(0x83ee3fe2, 0x57d9, 0x11d0, 0xb9, 0x32, 0x0, 0xa0, 0x24, 0xab, 0x2d, 0xbb);
 
            // CommonQuery parameters (from cmnquery.h) used in OpenQueryWindowParams to define the
            // state of the People Picker when invoked.
            internal static readonly uint OQWF_OKCANCEL = 0x00000001; // = 1 => Provide OK/Cancel buttons
            internal static readonly uint OQWF_DEFAULTFORM = 0x00000002; // = 1 => clsidDefaultQueryForm is valid        
            internal static readonly uint OQWF_SINGLESELECT = 0x00000004; // = 1 => allow single selection only
            internal static readonly uint OQWF_REMOVEFORMS = 0x00000020; // = 1 => remove form picker from dialog
            internal static readonly uint OQWF_SHOWOPTIONAL = 0x00000080; // = 1 => list optional forms by default
            internal static readonly uint OQWF_HIDEMENUS = 0x00000400; // = 1 => no menu bar displayed
 
            // Clipboard formats (from winuser.h)
            internal static readonly String CFSTR_DSOBJECTNAMES = "DsObjectNames";
 
            // Success/Failure codes
            internal static readonly uint S_OK = 0x00000000;
            internal static readonly uint S_FALSE = 0x00000001;
            internal static readonly uint E_FAIL = 0x80000008;
 
        }
    }
}