File: System\ServiceModel\Activation\WebHostUnsafeNativeMethods.cs
Project: ndp\cdf\src\WCF\SMSvcHost\SMSvcHost.csproj (SMSvcHost)
//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation.  All rights reserved.
//-----------------------------------------------------------------------------
 
namespace System.ServiceModel.Activation
{
    using System;
    using System.Runtime.InteropServices;
    using System.Security;
    using System.Runtime.ConstrainedExecution;
    using System.Runtime.Versioning;
    using Microsoft.Win32.SafeHandles;
 
    [SuppressUnmanagedCodeSecurityAttribute()]
    // functions in %windir%\system32\inetsrv\wbhstipm.dll
    // headers in //depot/devdiv/private/webnetorcas/ndp/iis/iisrearc/core/inc/wbhst_entry.h
    // implementation in //depot/devdiv/private/webnetorcas/ndp/iis/iisrearc/core/ap/wbhstipm/dll/clientprotocol.cxx
    static class WebHostUnsafeNativeMethods
    {
        const string KERNEL32 = "kernel32.dll";
 
        internal const int LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008;
        internal delegate int WebhostGetVersion(out int major, out int minor);
        internal delegate void WebhostListenerApplicationAppPoolChanged(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appKey, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId);
        internal delegate void WebhostListenerApplicationBindingsChanged(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appKey, IntPtr bindingsMultiSz, int numberOfBindings);
        internal delegate void WebhostListenerApplicationCreated(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appKey, [MarshalAs(UnmanagedType.LPWStr)] string path, int siteId, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, IntPtr bindingsMultiSz, int numberOfBindings, bool requestsBlocked);
        internal delegate void WebhostListenerApplicationDeleted(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appKey);
        internal delegate void WebhostListenerApplicationPoolAllListenerChannelInstancesStopped(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, int listenerChannelId);
        internal delegate void WebhostListenerApplicationPoolCanOpenNewListenerChannelInstance(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, int listenerChannelId);
        internal delegate void WebhostListenerApplicationPoolCreated(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, IntPtr sid);
        internal delegate void WebhostListenerApplicationPoolDeleted(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId);
        internal delegate void WebhostListenerApplicationPoolIdentityChanged(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, IntPtr sid);
        internal delegate void WebhostListenerApplicationPoolStateChanged(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, bool isEnabled);
        internal delegate void WebhostListenerApplicationRequestsBlockedChanged(IntPtr context, [MarshalAs(UnmanagedType.LPWStr)] string appKey, bool requestsBlocked);
 
        internal delegate void WebhostListenerConfigManagerConnected(IntPtr context);
        internal delegate void WebhostListenerConfigManagerConnectRejected(IntPtr context, int hresult);
        internal delegate void WebhostListenerConfigManagerDisconnected(IntPtr context, int hresult);
        internal delegate void WebhostListenerConfigManagerInitializationCompleted(IntPtr context);
        internal delegate int WebhostRegisterProtocol([MarshalAs(UnmanagedType.LPWStr)] string protocolId, ref WebhostListenerCallbacks listenerCallbacks, IntPtr context, out int protocolHandle);
        internal delegate int WebhostOpenListenerChannelInstance(int protocolHandle, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, int listenerChannelId, byte[] queueBlob, int queueBlobByteCount);
        internal delegate int WebhostCloseAllListenerChannelInstances(int protocolHandle, [MarshalAs(UnmanagedType.LPWStr)] string appPoolId, int listenerChannelId);
        internal delegate int WebhostUnregisterProtocol(int protocolHandle);
 
        [DllImport(KERNEL32, CharSet = CharSet.Ansi, SetLastError = true, BestFitMapping = false, ThrowOnUnmappableChar = true)]
        [ResourceExposure(ResourceScope.None)]
        internal static extern IntPtr GetProcAddress(
            [In] SafeFreeLibrary hModule,
            [In] string lpProcName
            );
 
        [DllImport(KERNEL32, CharSet = CharSet.Unicode, SetLastError = true)]
        [ResourceExposure(ResourceScope.Process)]
        internal static extern SafeFreeLibrary LoadLibraryEx(
            [In] string lpFileName,
            [In] IntPtr hFile,
            [In] int dwFlags
            );
 
        [StructLayout(LayoutKind.Sequential)]
        internal struct WebhostListenerCallbacks
        {
            internal int dwBytesInCallbackStructure;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerConfigManagerConnected webhostListenerConfigManagerConnected;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerConfigManagerDisconnected webhostListenerConfigManagerDisconnected;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerConfigManagerInitializationCompleted webhostListenerConfigManagerInitializationCompleted;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolCreated webhostListenerApplicationPoolCreated;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolDeleted webhostListenerApplicationPoolDeleted;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolIdentityChanged webhostListenerApplicationPoolIdentityChanged;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolStateChanged webhostListenerApplicationPoolStateChanged;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolCanOpenNewListenerChannelInstance webhostListenerApplicationPoolCanOpenNewListenerChannelInstance;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationPoolAllListenerChannelInstancesStopped webhostListenerApplicationPoolAllListenerChannelInstancesStopped;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationCreated webhostListenerApplicationCreated;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationDeleted webhostListenerApplicationDeleted;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationBindingsChanged webhostListenerApplicationBindingsChanged;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationAppPoolChanged webhostListenerApplicationAppPoolChanged;
            [MarshalAs(UnmanagedType.FunctionPtr)]
            internal WebhostListenerApplicationRequestsBlockedChanged webhostListenerApplicationRequestsBlockedChanged;
        }
 
        internal sealed class SafeFreeLibrary : SafeHandleZeroOrMinusOneIsInvalid
        {
            const string KERNEL32 = "kernel32.dll";
 
            internal SafeFreeLibrary()
                : base(true)
            {
            }
 
            [DllImport(KERNEL32, SetLastError = true), SuppressUnmanagedCodeSecurity]
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            [ResourceExposure(ResourceScope.None)]
            private static extern bool FreeLibrary(IntPtr hModule);
 
            protected override bool ReleaseHandle()
            {
                return FreeLibrary(handle);
            }
        }
    }
}