[shibboleth-sp2] 20/82: SSPCPP-604 IIS7 Native Support for IIS7

Etienne Dysli Metref edm-guest at moszumanska.debian.org
Thu Nov 16 08:16:21 UTC 2017


This is an automated email from the git hooks/post-receive script.

edm-guest pushed a commit to branch master
in repository shibboleth-sp2.

commit 3213eb919ef6a7631beb9537ff0b43dca7227d50
Author: Rod Widdowson <rdw at steadingsoftware.com>
Date:   Thu Apr 20 15:13:03 2017 +0100

    SSPCPP-604 IIS7 Native Support for IIS7
    
    https://issues.shibboleth.net/jira/browse/SSPCPP-694
    
    This initial commit captures all the work described in the case notes to date.
    This has to be hand installed and all the DLLs colocated in the IIS directory.
    
    It is reasonably fully functional but there are several todos in the code
    and significant further test and nature study is required.
---
 Projects/vc14/Shibboleth.sln                      |  15 +
 Projects/vc14/iis7_shib/iis7_shib.vcxproj         | 230 +++++++++++
 Projects/vc14/iis7_shib/iis7_shib.vcxproj.filters |  47 +++
 iis7_shib/NativeRequest.cpp                       | 451 ++++++++++++++++++++++
 iis7_shib/ShibHttpModule.cpp                      | 135 +++++++
 iis7_shib/ShibUser.cpp                            |  96 +++++
 iis7_shib/headers/IIS7_shib.hpp                   | 107 +++++
 iis7_shib/headers/NativeRequest.hpp               |  87 +++++
 iis7_shib/headers/ShibHttpModule.hpp              |  69 ++++
 iis7_shib/headers/ShibUser.hpp                    |  88 +++++
 iis7_shib/iis7_shib.rc                            | Bin 0 -> 2668 bytes
 iis7_shib/register.cpp                            | 192 +++++++++
 iis7_shib/resource.h                              |  20 +
 util/message.mc                                   |  56 +++
 14 files changed, 1593 insertions(+)

diff --git a/Projects/vc14/Shibboleth.sln b/Projects/vc14/Shibboleth.sln
index e143c51..6aef8ea 100644
--- a/Projects/vc14/Shibboleth.sln
+++ b/Projects/vc14/Shibboleth.sln
@@ -183,6 +183,11 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shib_20", "apache\mod_s
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mod_shib_22", "apache\mod_shib22.vcxproj", "{B44C0852-83B8-4FB2-A86E-097C9C8256D0}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "iis7_shib", "iis7_shib\iis7_shib.vcxproj", "{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}"
+	ProjectSection(ProjectDependencies) = postProject
+		{303291A1-C542-49E4-80B3-9304B7B6F8BC} = {303291A1-C542-49E4-80B3-9304B7B6F8BC}
+	EndProjectSection
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
@@ -355,6 +360,15 @@ Global
 		{B44C0852-83B8-4FB2-A86E-097C9C8256D0}.Release|Win32.Build.0 = Release|Win32
 		{B44C0852-83B8-4FB2-A86E-097C9C8256D0}.Release|x64.ActiveCfg = Release|x64
 		{B44C0852-83B8-4FB2-A86E-097C9C8256D0}.Release|x64.Build.0 = Release|x64
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Debug|Win32.ActiveCfg = Debug|Win32
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Debug|Win32.Build.0 = Debug|Win32
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Debug|x64.ActiveCfg = Debug|x64
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Debug|x64.Build.0 = Debug|x64
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Debug|x64.Deploy.0 = Debug|x64
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Release|Win32.ActiveCfg = Release|Win32
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Release|Win32.Build.0 = Release|Win32
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Release|x64.ActiveCfg = Release|x64
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}.Release|x64.Build.0 = Release|x64
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -379,5 +393,6 @@ Global
 		{D243B43E-728E-4F32-BDFF-B3A897037C6D} = {26BA8F84-6E42-41FA-9B13-5D3F4B5B2050}
 		{68E9568B-476C-4289-B93C-893432378ADC} = {26BA8F84-6E42-41FA-9B13-5D3F4B5B2050}
 		{B44C0852-83B8-4FB2-A86E-097C9C8256D0} = {26BA8F84-6E42-41FA-9B13-5D3F4B5B2050}
+		{CEE84E04-6A19-4F93-8FE5-98F9D22526DD} = {26BA8F84-6E42-41FA-9B13-5D3F4B5B2050}
 	EndGlobalSection
 EndGlobal
diff --git a/Projects/vc14/iis7_shib/iis7_shib.vcxproj b/Projects/vc14/iis7_shib/iis7_shib.vcxproj
new file mode 100644
index 0000000..ad02cd8
--- /dev/null
+++ b/Projects/vc14/iis7_shib/iis7_shib.vcxproj
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{CEE84E04-6A19-4F93-8FE5-98F9D22526DD}</ProjectGuid>
+    <WindowsTargetPlatformVersion>10.0.14393.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>DynamicLibrary</ConfigurationType>
+    <CharacterSet>MultiByte</CharacterSet>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <!--    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" /> -->
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsofto.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC71.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <Import Project="..\..\..\..\BuildPath.props" />
+  <Import Project="$(ParentRoot)\Versions.props" />
+  <Import Project="$(ParentRoot)\Includes.props" />
+  <PropertyGroup>
+    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)\..\..\Build\VC14\$(Platform)\$(Configuration)\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)\..\..\Build\VC14\$(Platform)\$(Configuration)\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)\..\..\Build\VC14\\$(Configuration)\</OutDir>
+    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)\..\..\Build\VC14\\$(Configuration)\</OutDir>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)..\..\Build\VC14\$(projectName)\$(Platform)\$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)..\..\Build\VC14\$(projectName)\$(Platform)\$(Configuration)\</IntDir>
+    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <IntDir>$(SolutionDir)..\..\Build\VC14\$(projectName)\$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <IntDir>$(SolutionDir)..\..\Build\VC14\$(projectName)\$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\..\iis7_shib\headers;..\..\..\;..\..\..\..\cpp-xmltooling;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>NDEBUG;WIN32;_WINDOWS;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <BrowseInformation>true</BrowseInformation>
+      <WarningLevel>Level3</WarningLevel>
+      <DisableSpecificWarnings>4275</DisableSpecificWarnings>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalOptions>/export:GetExtensionVersion /export:GetFilterVersion /export:TerminateExtension /export:TerminateFilter /export:HttpFilterProc /export:HttpExtensionProc %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalDependencies>xerces-c_3.lib;xmltooling-lite1.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\cpp-xmltooling\Build\VC14\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <Optimization>MaxSpeed</Optimization>
+      <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+      <AdditionalIncludeDirectories>..\..\..\iis7_shib\headers\;..\..\..\;..\..\..\..\cpp-xmltooling;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>NDEBUG;WIN32;_WINDOWS;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <StringPooling>true</StringPooling>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <BrowseInformation>true</BrowseInformation>
+      <WarningLevel>Level3</WarningLevel>
+      <DisableSpecificWarnings>4275</DisableSpecificWarnings>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalOptions>/export:GetExtensionVersion /export:GetFilterVersion /export:TerminateExtension /export:TerminateFilter /export:HttpFilterProc /export:HttpExtensionProc %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalDependencies>xerces-c_3.lib;xmltooling-lite1.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\cpp-xmltooling\Build\VC14\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>..\..\..\iis7_shib\headers\;..\..\..\;..\..\..\..\cpp-xmltooling;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_WINDOWS;WIN32;_DEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <BrowseInformation>true</BrowseInformation>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+      <DisableSpecificWarnings>4275</DisableSpecificWarnings>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalOptions>/export:GetExtensionVersion /export:GetFilterVersion /export:TerminateExtension /export:TerminateFilter /export:HttpFilterProc /export:HttpExtensionProc %(AdditionalOptions)</AdditionalOptions>
+      <AdditionalDependencies>xerces-c_3D.lib;xmltooling-lite1D.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\cpp-xmltooling\Build\VC14\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <Optimization>Disabled</Optimization>
+      <AdditionalIncludeDirectories>..\..\..\iis7_shib\headers\;..\..\..\;..\..\..\..\cpp-xmltooling;$(OutDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <PreprocessorDefinitions>_WINDOWS;WIN32;_DEBUG;WIN32_LEAN_AND_MEAN;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <BrowseInformation>true</BrowseInformation>
+      <WarningLevel>Level3</WarningLevel>
+      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+      <DisableSpecificWarnings>4275</DisableSpecificWarnings>
+    </ClCompile>
+    <ResourceCompile>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <Culture>0x0409</Culture>
+    </ResourceCompile>
+    <Link>
+      <AdditionalOptions>
+      </AdditionalOptions>
+      <AdditionalDependencies>xerces-c_3D.lib;xmltooling-lite1D.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalLibraryDirectories>..\..\..\..\cpp-xmltooling\Build\VC14\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <RandomizedBaseAddress>false</RandomizedBaseAddress>
+      <DataExecutionPrevention>
+      </DataExecutionPrevention>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\..\iis7_shib\NativeRequest.cpp" />
+    <ClCompile Include="..\..\..\iis7_shib\register.cpp" />
+    <ClCompile Include="..\..\..\iis7_shib\ShibHttpModule.cpp" />
+    <ClCompile Include="..\..\..\iis7_shib\ShibUser.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="..\..\..\Iis7_Shib\iis7_shib.rc">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\..\Projects\VC14\shibsp\shibsp-lite.vcxproj">
+      <Project>{81f0f7a6-dc36-46ef-957f-f9e81d4403f7}</Project>
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\..\iis7_shib\headers\IIS7_shib.hpp" />
+    <ClInclude Include="..\..\..\iis7_shib\headers\NativeRequest.hpp" />
+    <ClInclude Include="..\..\..\iis7_shib\headers\ShibHttpModule.hpp" />
+    <ClInclude Include="..\..\..\iis7_shib\headers\ShibUser.hpp" />
+    <ClInclude Include="..\..\..\iis7_shib\resource.h" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/Projects/vc14/iis7_shib/iis7_shib.vcxproj.filters b/Projects/vc14/iis7_shib/iis7_shib.vcxproj.filters
new file mode 100644
index 0000000..d11897f
--- /dev/null
+++ b/Projects/vc14/iis7_shib/iis7_shib.vcxproj.filters
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{1a7db8d4-8abc-48e8-b411-cc6f181cfc81}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{64273d29-cfb8-4b1d-9f41-ef07b7305074}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\..\..\iis7_shib\register.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\iis7_shib\ShibUser.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\iis7_shib\NativeRequest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\..\iis7_shib\ShibHttpModule.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="..\..\..\Iis7_Shib\iis7_shib.rc">
+      <Filter>Source Files</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\..\..\iis7_shib\resource.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\iis7_shib\headers\NativeRequest.hpp">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\iis7_shib\headers\IIS7_shib.hpp">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\iis7_shib\headers\ShibHttpModule.hpp">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\..\iis7_shib\headers\ShibUser.hpp">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/iis7_shib/NativeRequest.cpp b/iis7_shib/NativeRequest.cpp
new file mode 100644
index 0000000..b4a505d
--- /dev/null
+++ b/iis7_shib/NativeRequest.cpp
@@ -0,0 +1,451 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#include "IIS7_shib.hpp"
+
+#include <boost/algorithm/string.hpp>
+
+#include <xercesc/util/Base64.hpp>
+#include <xmltooling/util/NDC.h>
+
+#include <shibsp/exceptions.h>
+
+#include <codecvt>
+#include "NativeRequest.hpp"
+#include "ShibHttpModule.hpp"
+#include "ShibUser.hpp"
+
+using namespace Config;
+
+NativeRequest::NativeRequest(_In_ IHttpContext *pHttpContext, _In_ IHttpEventProvider *pEventProvider,  const _In_ site_t site) : AbstractSPRequest(SHIBSP_LOGCAT ".NATIVE"),
+    m_ctx(pHttpContext), m_request(pHttpContext->GetRequest()), m_response(pHttpContext->GetResponse()),
+    m_firsttime(true), m_useHeaders(g_bUseHeaders), m_useVariables(g_bUseVariables), m_gotBody(false), m_event(pEventProvider)
+{
+    DWORD len;
+
+    // ServerVariable SERVER_NAME is what the client sent.  So use the IIS site name (which needs to have been set to something sensible)
+    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
+    m_hostname = converter.to_bytes(m_ctx->GetSite()->GetSiteName());
+    to_lower(m_hostname);
+
+    setRequestURI(converter.to_bytes(m_ctx->GetScriptName()).c_str());
+
+    PCSTR port;
+    HRESULT hr = m_ctx->GetServerVariable("SERVER_PORT_SECURE", &port, &len);
+
+    if (SUCCEEDED(hr)) {
+        if (len) {
+            int secure = lexical_cast<int>(port);
+            m_SSL = (0 != secure)? true:false;
+        }
+        else {
+            m_SSL = (nullptr == m_request->GetRawHttpRequest()->pSslInfo);
+        }
+    }
+    else {
+        throwError("Get Server Secure", hr);
+    }
+
+    // Port may come from IIS or from site def.
+    // NOTE getting the port from m_request->GetLocalAddress() doesn't work (we get the used port)
+    // TODO Is SERVER_PORT secure?
+    // TODO default from type, add site for virtualization.
+    if (!g_bNormalizeRequest || (m_SSL && site.m_sslport.empty()) || (!m_SSL && site.m_port.empty())) {
+        hr = m_ctx->GetServerVariable("SERVER_PORT", &port, &len);
+        if (SUCCEEDED(hr)) {
+            m_port = lexical_cast<int>(port);
+        }
+        else if (m_SSL) {
+            m_port = 443;
+        }
+        else {
+            m_port = 80;
+        }
+    }
+    else if (m_SSL) {
+        m_port = lexical_cast<int>(site.m_sslport);
+    }
+    else {
+        m_port = lexical_cast<int>(site.m_port);
+    }
+
+    PCSTR ru;
+    hr = m_ctx->GetServerVariable("REMOTE_USER", &ru, &len);
+    if (SUCCEEDED(hr)) {
+        if (len) {
+            m_remoteUser = ru;
+        }
+        else {
+            m_remoteUser = "";
+        }
+    }
+    else {
+        throwError("Get remote user", hr);
+    }
+
+}
+
+void NativeRequest::setHeader(const char* name, const char* value)
+{
+    if (m_useHeaders) {
+        const string hdr = g_bSafeHeaderNames ? makeSafeHeader(name) : (string(name) + ':');
+        const HRESULT hr (m_request->SetHeader(hdr.c_str(), value, static_cast<USHORT>(strlen(value)), true));
+        if (FAILED(hr)) {
+            throwError("setHeader (Header)", hr);
+        }
+    }
+    if (m_useVariables) {
+        const auto_ptr_XMLCh widen(value); // TODO : use a converter?
+        const HRESULT hr(m_ctx->SetServerVariable(const_cast<char*>(name), widen.get()));
+        if (FAILED(hr)) {
+            throwError("setHeader (Variable)", hr);
+        }
+    }
+}
+
+void NativeRequest::setRemoteUser(const char* user)
+{
+
+    m_remoteUser = user;
+    if (m_useVariables) {
+        HRESULT hr;
+        if (user) {
+            hr = m_request->SetHeader("REMOTE_USER", user, static_cast<USHORT>(strlen(user)), true);
+        }
+        else {
+            hr = m_request->DeleteHeader("REMOTE_USER");
+        }
+        if (FAILED(hr)) {
+            throwError("setRemoteUser (Variable)", hr);
+        }
+    }
+    if (m_useVariables) {
+        auto_ptr_XMLCh widen(user);
+        IAuthenticationProvider *auth = dynamic_cast<IAuthenticationProvider*>(m_event);
+
+        if (auth) {
+            auth->SetUser(new ShibUser(user));
+        }
+
+/*            const HRESULT hr(m_ctx->SetServerVariable("REMOTE_USER", widen.get())); 
+            if (FAILED(hr)) {
+                throwError("setRemoteUser (Header)", hr);
+            }
+        }*/
+    }
+}
+
+const vector<string>& NativeRequest::getClientCertificates() const
+// TODO test - all the calls are commented out.
+{
+    if (m_certs.empty()) {
+        HTTP_SSL_CLIENT_CERT_INFO *certInfo = NULL;
+        BOOL negotiated;
+        HRESULT hr = m_request->GetClientCertificate(&certInfo, &negotiated);
+        if (HRESULT_FROM_WIN32(ERROR_NOT_FOUND) == hr) {
+            return m_certs;
+        }
+        else if (FAILED(hr)) {
+            throwError("GetClientCertificate", hr);
+        }
+        if (nullptr == certInfo) {
+            return m_certs;
+        }
+        xsecsize_t outlen;
+        XMLByte* serialized = Base64::encode(reinterpret_cast<XMLByte*>(certInfo->pCertEncoded), certInfo->CertEncodedSize, &outlen);
+        m_certs.push_back(reinterpret_cast<char*>(serialized));
+#ifdef SHIBSP_XERCESC_HAS_XMLBYTE_RELEASE
+        XMLString::release(&serialized);
+#else
+        XMLString::release((char**)&serialized);
+#endif
+    }
+    return m_certs;
+}
+
+const char* NativeRequest::getMethod() const
+{
+    return m_request->GetHttpMethod();
+}
+
+void NativeRequest::clearHeader(const char* rawname, const char* cginame)
+{
+    if (m_useHeaders) {
+        if (g_checkSpoofing && m_firsttime) {
+            if (m_allhttp.empty()) {
+                PCSTR all = m_request->GetHeader("ALL_HTTP");
+                m_allhttp =  (nullptr == all) ? "" : all;
+            }
+            if (!m_allhttp.empty()) {
+                string hdr = g_bSafeHeaderNames ? ("HTTP_" + makeSafeHeader(cginame + 5)) : (string(cginame) + ':');
+                if (strstr(m_allhttp.c_str(), hdr.c_str())) {
+                    throw opensaml::SecurityPolicyException("Attempt to spoof header ($1) was detected.", params(1, hdr.c_str()));
+                }
+            }
+        }
+        if (g_bSafeHeaderNames) {
+            string hdr = makeSafeHeader(rawname);
+            HRESULT hr = m_request->SetHeader(hdr.c_str(), g_unsetHeaderValue.c_str(), static_cast<USHORT>(g_unsetHeaderValue.length()), TRUE);
+            if (FAILED(hr)) {
+                throwError("clearHeader", hr);
+            }
+        }
+    }
+}
+
+long NativeRequest::returnDecline()
+{
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
+long NativeRequest::returnOK()
+{
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
+void NativeRequest::log(SPLogLevel level, const string& msg) const
+{
+    AbstractSPRequest::log(level, msg);
+    if (level >= SPCrit)
+        LogEvent(nullptr, EVENTLOG_ERROR_TYPE, SHIB_NATIVE_CRITICAL, nullptr, msg.c_str());
+}
+
+string NativeRequest::getRemoteAddr() const
+{
+    string ret = AbstractSPRequest::getRemoteAddr();
+    if (ret.empty()) {
+        PCSTR addr;
+        DWORD len;
+        HRESULT hr = m_ctx->GetServerVariable("REMOTE_ADDR", &addr, &len);
+        if (SUCCEEDED(hr)) {
+            ret = addr;
+        }
+    }
+    return ret;
+}
+
+string NativeRequest::getSecureHeader(const char* name) const
+{
+    string hdr = g_bSafeHeaderNames ? makeSafeHeader(name) : (string(name) + ':');
+    PCSTR p = m_request->GetHeader(hdr.c_str());
+    return (nullptr == p) ? "" : p;
+}
+//
+// XMLTooling::GenericRequest
+//
+const char* NativeRequest::getScheme() const
+{
+    return m_SSL ? "https" : "http";
+}
+
+const char* NativeRequest::getHostname() const
+{
+    return m_hostname.c_str();
+}
+
+int NativeRequest::getPort() const
+{
+    return m_port;
+}
+
+string NativeRequest::getContentType() const
+{
+    PCSTR type;
+    DWORD len;
+    HRESULT hr = m_ctx->GetServerVariable("CONTENT_TYPE", &type, &len);
+    if (SUCCEEDED(hr)) {
+        return string(type);
+    }
+    return "";
+}
+
+long NativeRequest::getContentLength() const
+{
+    PCSTR length;
+    DWORD len;
+    HRESULT hr = m_ctx->GetServerVariable("CONTENT_LENGTH", &length, &len);
+    if (SUCCEEDED(hr)) {
+        return lexical_cast<int>(length);
+    }
+    return 0;
+}
+
+string NativeRequest::getRemoteUser() const
+{
+    if (!m_remoteUser.empty()) {
+        return m_remoteUser;
+    }
+    PCSTR p = m_request->GetHeader("REMOTE_USER");
+    m_remoteUser = (nullptr == p) ? "" : p;
+    return m_remoteUser;
+}
+
+const char* NativeRequest::getRequestBody() const
+{
+    if (m_gotBody) {
+        return m_body.c_str();
+    }
+    DWORD totalBytesLeft = m_request->GetRemainingEntityBytes();
+    if (totalBytesLeft > 1024 * 1024) {
+        throw opensaml::SecurityPolicyException("Size of request body exceeded 1M size limit.");
+    }
+/*        else if (m_lpECB->cbTotalBytes > m_lpECB->cbAvailable) {
+        m_gotBody=true;
+        DWORD datalen=m_lpECB->cbTotalBytes;
+        if (m_lpECB->cbAvailable > 0) {
+        m_body.assign(reinterpret_cast<char*>(m_lpECB->lpbData), m_lpECB->cbAvailable);
+        datalen-=m_lpECB->cbAvailable;
+    }
+    */
+    while (totalBytesLeft) {
+        char buf[8192];
+        DWORD bytesRead;
+        HRESULT hr = m_request->ReadEntityBody(buf, sizeof(buf), FALSE, &bytesRead);
+        if (FAILED(hr)) {
+            throwError("request->ReadEntityBody", hr);
+        }
+        m_body.append(buf, bytesRead);
+        if (totalBytesLeft < bytesRead) {
+            totalBytesLeft = 0;
+        } 
+        else {
+            totalBytesLeft -= bytesRead;
+        }
+    }
+    m_gotBody = true;
+
+    return m_body.c_str();
+}
+
+//
+// XMLTooing:: HTTPRequest
+//
+const char* NativeRequest::getQueryString() const
+{
+    PCSTR qs;
+    DWORD len;
+    HRESULT hr = m_ctx->GetServerVariable("QUERY_STRING", &qs, &len);
+    if (SUCCEEDED(hr)) {
+        return qs;
+    }
+    return "";
+}
+
+string NativeRequest::getHeader(const char* name) const
+{
+    PCSTR p = m_request->GetHeader(name);
+    return  (nullptr == p) ? "" : p;
+}
+
+// XMLTooing:: HTTPResponse, GenericResponse
+long NativeRequest::sendResponse(istream& in, long status)
+{
+    const char* codestr="200 OK";
+    switch (status) {
+    case XMLTOOLING_HTTP_STATUS_NOTMODIFIED:    codestr="304 Not Modified"; break;
+    case XMLTOOLING_HTTP_STATUS_UNAUTHORIZED:   codestr="401 Authorization Required"; break;
+    case XMLTOOLING_HTTP_STATUS_FORBIDDEN:      codestr="403 Forbidden"; break;
+    case XMLTOOLING_HTTP_STATUS_NOTFOUND:       codestr="404 Not Found"; break;
+    case XMLTOOLING_HTTP_STATUS_ERROR:          codestr="500 Server Error"; break;
+    }
+
+    HRESULT hr = m_response->SetStatus(static_cast<USHORT>(status), codestr);
+    if (FAILED(hr)) {
+        logFatal("Response->SetStatus", hr);
+        m_ctx->SetRequestHandled();
+        return RQ_NOTIFICATION_FINISH_REQUEST;
+    }
+
+    while (in) {
+        char buf[1024];
+        in.read(buf, sizeof(buf));
+
+        HTTP_DATA_CHUNK chunk;
+        chunk.DataChunkType = HTTP_DATA_CHUNK_TYPE::HttpDataChunkFromMemory;
+        chunk.FromMemory.BufferLength = static_cast<ULONG>(in.gcount());
+        chunk.FromMemory.pBuffer = buf;
+
+        DWORD sent;
+        hr = m_response->WriteEntityChunks(&chunk, 1, FALSE, in.eof()? FALSE: TRUE, &sent);
+        if (FAILED(hr)) {
+            logFatal("Response->WriteEntityChunks", hr);
+            m_ctx->SetRequestHandled();
+            return RQ_NOTIFICATION_FINISH_REQUEST;
+        }
+    }
+    m_ctx->SetRequestHandled();
+    return RQ_NOTIFICATION_FINISH_REQUEST;
+}
+
+// XMLTooing:: HTTPResponse
+void NativeRequest::setResponseHeader(const char* name, const char* value)
+{
+    HTTPResponse::setResponseHeader(name, value);
+
+    size_t sz = strlen(value);
+
+    if (sz > USHRT_MAX) {
+        // TODO Do this elsewhere?
+        log(SPWarn, "Header value overflow");
+        sz = USHRT_MAX;
+    }
+
+    HRESULT hr = m_response->SetHeader(name, value,  static_cast<USHORT>(sz), TRUE);
+    if (FAILED(hr)) {
+        throwError("setResponseHeader", hr);
+    }
+}
+
+long NativeRequest::sendRedirect(const char* url)
+{
+    HTTPResponse::sendRedirect(url);
+    HRESULT hr = m_response->Redirect(url);
+    if (FAILED(hr)) {
+        logFatal("Redirect", hr);
+    }
+    m_ctx->SetRequestHandled();
+    return RQ_NOTIFICATION_FINISH_REQUEST;
+}
+
+string NativeRequest::makeSafeHeader(const char* rawname) const
+{
+    string hdr;
+    for (; *rawname; ++rawname) {
+        if (isalnum(*rawname))
+            hdr += *rawname;
+    }
+    return (hdr + ':');
+}
+
+// TODO We need a strategy for what is logged, what is fatal and how.
+void NativeRequest::logFatal(const string& operation, HRESULT hr) const
+{
+    string msg(operation + " failed: " + lexical_cast<string>(hr));
+    LogEvent(nullptr, EVENTLOG_ERROR_TYPE, SHIB_NATIVE_CRITICAL, nullptr, msg.c_str());
+    if (m_response) {
+        (void)m_response->SetStatus(static_cast<USHORT>(XMLTOOLING_HTTP_STATUS_ERROR), "Fatal Server Error", 0, hr);
+    }
+}
+
+void NativeRequest::throwError(const string& operation, HRESULT hr) const
+{
+    string msg(operation + " failed: " + lexical_cast<string>(hr));
+    throw IOException(msg.c_str());
+}
diff --git a/iis7_shib/ShibHttpModule.cpp b/iis7_shib/ShibHttpModule.cpp
new file mode 100644
index 0000000..a7d7902
--- /dev/null
+++ b/iis7_shib/ShibHttpModule.cpp
@@ -0,0 +1,135 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#include "IIS7_shib.hpp"
+
+#include <process.h>
+
+#include <xmltooling/util/NDC.h>
+#include "ShibHttpModule.hpp"
+#include "NativeRequest.hpp"
+
+using namespace Config;
+
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::DoHandler(
+    _In_ IHttpContext *         pHttpContext,
+    _In_ IHttpEventProvider *   pProvider
+)
+{
+    IHttpRequest *req(pHttpContext->GetRequest());
+    map<string, site_t>::const_iterator map_i = g_Sites.find(lexical_cast<string>(req->GetSiteId()));
+    if (map_i == g_Sites.end()) {
+        return RQ_NOTIFICATION_CONTINUE;
+    }
+
+    string threadid("[");
+    threadid += lexical_cast<string>(_getpid()) + "] native_shib";
+    xmltooling::NDC ndc(threadid.c_str());
+
+    NativeRequest handler(pHttpContext, pProvider, map_i->second);
+
+    pair<bool, long> res = handler.getServiceProvider().doHandler(handler);
+
+    if (res.first) {
+        return static_cast<REQUEST_NOTIFICATION_STATUS>(res.second);
+    }
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::DoFilter(
+    _In_ IHttpContext *             pHttpContext,
+    _In_ IHttpEventProvider *  pProvider
+)
+{
+    IHttpRequest *req(pHttpContext->GetRequest());
+    map<string, site_t>::const_iterator map_i = g_Sites.find(lexical_cast<string>(req->GetSiteId()));
+    if (map_i == g_Sites.end()) {
+        return RQ_NOTIFICATION_CONTINUE;
+    }
+
+    string threadid("[");
+    threadid += lexical_cast<string>(_getpid()) + "] native_shib";
+    xmltooling::NDC ndc(threadid.c_str());
+
+    // TODO Different class?
+    NativeRequest filter(pHttpContext, pProvider, map_i->second);
+
+    pair<bool, long> res = filter.getServiceProvider().doAuthentication(filter);
+    if (res.first) {
+        return static_cast<REQUEST_NOTIFICATION_STATUS>(res.second);
+    }
+
+    if (!g_spoofKey.empty()) {
+        pHttpContext->GetRequest()->SetHeader("ShibSpoofCheck:", const_cast<PCSTR>(g_spoofKey.c_str()), static_cast<USHORT>(g_spoofKey.length()), TRUE);
+    }
+    res = filter.getServiceProvider().doExport(filter);
+    if (res.first) {
+        return static_cast<REQUEST_NOTIFICATION_STATUS>(res.second);
+    }
+
+    res = filter.getServiceProvider().doAuthorization(filter);
+    if (res.first) {
+        return static_cast<REQUEST_NOTIFICATION_STATUS>(res.second);
+    }
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
+// RQ_BEGIN_REQUEST
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::OnBeginRequest(
+    _In_ IHttpContext *         pHttpContext,
+    _In_ IHttpEventProvider *   pProvider
+)
+{
+    return DoHandler(pHttpContext, pProvider);
+}
+
+// RQ_AUTHENTICATE_REQUEST 
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::OnAuthenticateRequest(
+    _In_ IHttpContext *             pHttpContext,
+    _In_ IAuthenticationProvider *  pProvider
+)
+{
+    return DoFilter(pHttpContext, pProvider);
+}
+
+// RQ_AUTHENTICATE_REQUEST 
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::OnPostAuthenticateRequest(
+    _In_ IHttpContext *             pHttpContext,
+    _In_ IHttpEventProvider *       pProvider
+)
+{
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
+// RQ_PRE_EXECUTE_REQUEST_HANDLER
+REQUEST_NOTIFICATION_STATUS
+ShibHttpModule::OnPreExecuteRequestHandler(
+    _In_ IHttpContext *         pHttpContext,
+    _In_ IHttpEventProvider *   pProvider
+)
+{
+    return RQ_NOTIFICATION_CONTINUE;
+}
+
diff --git a/iis7_shib/ShibUser.cpp b/iis7_shib/ShibUser.cpp
new file mode 100644
index 0000000..53025d4
--- /dev/null
+++ b/iis7_shib/ShibUser.cpp
@@ -0,0 +1,96 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#include "IIS7_shib.hpp"
+#include "ShibUser.hpp"
+
+ShibUser::ShibUser(std::string name) : m_refCount(1), m_widen(name.c_str())
+{
+    ;
+}
+
+PCWSTR
+ShibUser::GetRemoteUserName(VOID)
+{
+    return m_widen.get();
+}
+
+PCWSTR
+ShibUser::GetUserName(VOID)
+{
+    return m_widen.get();
+}
+
+PCWSTR
+ShibUser::GetAuthenticationType(VOID)
+{
+    return L"Shibboleth";
+}
+
+PCWSTR
+ShibUser::GetPassword(VOID)
+{
+    return nullptr;
+}
+
+HANDLE
+ShibUser::GetImpersonationToken(VOID)
+{
+    return nullptr;
+}
+
+HANDLE
+ShibUser::GetPrimaryToken(VOID)
+{
+    return nullptr;
+}
+
+VOID
+ShibUser::ReferenceUser(VOID)
+{
+    InterlockedIncrement(&m_refCount);
+}
+
+VOID
+ShibUser::DereferenceUser(VOID)
+{
+    unsigned int  i = InterlockedDecrement(&m_refCount);
+    if (0 == i) {
+        delete this;
+    }
+}
+
+BOOL
+ShibUser::SupportsIsInRole(VOID)
+{
+    return FALSE;
+}
+
+HRESULT
+ShibUser::IsInRole(_In_  PCWSTR  pszRoleName, _Out_ BOOL *  pfInRole)
+{
+    return E_NOTIMPL;
+}
+PVOID
+ShibUser::GetUserVariable(_In_ PCSTR    pszVariableName)
+{
+    return  nullptr;
+}
+
diff --git a/iis7_shib/headers/IIS7_shib.hpp b/iis7_shib/headers/IIS7_shib.hpp
new file mode 100644
index 0000000..f6dc545
--- /dev/null
+++ b/iis7_shib/headers/IIS7_shib.hpp
@@ -0,0 +1,107 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+#pragma once
+
+// Windows
+#include <Windows.h>
+#include <http.h>
+#include "httpserv.h"
+
+//
+// Miscelanea
+//
+#include <set>
+#include <boost/lexical_cast.hpp>
+#include <string>
+
+// Load Santurio with a bracketed warning off
+#pragma warning(push)
+#pragma warning(disable:4005)
+#include <xsec\framework\XSECDefs.hpp>
+#pragma warning(pop)
+
+// Shibboleth
+#define SHIBSP_LITE
+#include "config_win32.h"
+#include <shibsp/SPConfig.h>
+#include <shibsp/ServiceProvider.h>
+#include <shibsp/util/PropertySet.h>
+
+#include <xmltooling/util/XMLHelper.h>
+#include <xmltooling/Lockable.h>
+
+#include <message.h>
+
+using namespace shibsp;
+using namespace xmltooling;
+using namespace xercesc;
+using namespace boost;
+using namespace std;
+// globals
+namespace Config {
+    static const XMLCh path[] =             UNICODE_LITERAL_4(p, a, t, h);
+    static const XMLCh validate[] =         UNICODE_LITERAL_8(v, a, l, i, d, a, t, e);
+    static const XMLCh name[] =             UNICODE_LITERAL_4(n, a, m, e);
+    static const XMLCh port[] =             UNICODE_LITERAL_4(p, o, r, t);
+    static const XMLCh sslport[] =          UNICODE_LITERAL_7(s, s, l, p, o, r, t);
+    static const XMLCh scheme[] =           UNICODE_LITERAL_6(s, c, h, e, m, e);
+    static const XMLCh id[] =               UNICODE_LITERAL_2(i, d);
+    static const XMLCh Alias[] =            UNICODE_LITERAL_5(A, l, i, a, s);
+    static const XMLCh Site[] =             UNICODE_LITERAL_4(S, i, t, e);
+
+    struct site_t {
+        site_t(const DOMElement* e)
+            : m_name(XMLHelper::getAttrString(e, "", name)),
+            m_scheme(XMLHelper::getAttrString(e, "", scheme)),
+            m_port(XMLHelper::getAttrString(e, "", port)),
+            m_sslport(XMLHelper::getAttrString(e, "", sslport))
+        {
+            e = XMLHelper::getFirstChildElement(e, Alias);
+            while (e) {
+                if (e->hasChildNodes()) {
+                    auto_ptr_char alias(e->getTextContent());
+                    m_aliases.insert(alias.get());
+                }
+                e = XMLHelper::getNextSiblingElement(e, Alias);
+            }
+        }
+        string m_scheme, m_port, m_sslport, m_name;
+        set<string> m_aliases;
+    };
+
+    extern HINSTANCE g_hinstDLL;
+    extern SPConfig* g_Config;
+    extern map<string, site_t> g_Sites;
+    extern bool g_bNormalizeRequest;
+    extern string g_unsetHeaderValue, g_spoofKey;
+    extern bool g_checkSpoofing;
+    extern bool g_catchAll;
+    extern bool g_bSafeHeaderNames;
+    extern bool g_bUseHeaders;
+    extern bool g_bUseVariables;
+    extern vector<string> g_NoCerts;
+}
+
+BOOL LogEvent(
+    LPCSTR  lpUNCServerName,
+    WORD  wType,
+    DWORD  dwEventID,
+    PSID  lpUserSid,
+    LPCSTR  message);
\ No newline at end of file
diff --git a/iis7_shib/headers/NativeRequest.hpp b/iis7_shib/headers/NativeRequest.hpp
new file mode 100644
index 0000000..044731e
--- /dev/null
+++ b/iis7_shib/headers/NativeRequest.hpp
@@ -0,0 +1,87 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+#pragma once
+
+#include <shibsp/AbstractSPRequest.h>
+
+class NativeRequest : public AbstractSPRequest {
+
+private:
+    IHttpContext  *m_ctx;
+    IHttpRequest  *m_request;
+    IHttpResponse  *m_response;
+    IHttpEventProvider *m_event;
+    bool m_firsttime;
+    // TODO
+    int m_port;
+    string m_hostname;
+    bool m_SSL;
+    const bool m_useVariables;
+    const bool m_useHeaders;
+    mutable string m_remoteUser;
+    mutable vector<string> m_certs;
+    mutable string m_body;
+    mutable bool m_gotBody;
+    string m_allhttp;
+
+public:
+    NativeRequest(_In_ IHttpContext *pHttpContext, _In_ IHttpEventProvider *pEventProvider, const _In_ Config::site_t site);
+
+protected:
+    //
+    // AbstractSP
+    //
+    void setHeader(const char* name, const char* value);
+    void setRemoteUser(const char* user);
+    const vector<string>& getClientCertificates() const;
+    const char* getMethod() const;
+    void  clearHeader(const char* rawname, const char* cginame);
+    long  returnDecline();
+    long  returnOK();
+    void  log(SPLogLevel level, const string& msg) const;
+    string getRemoteAddr() const;
+    string getSecureHeader(const char* name) const;
+    //
+    // XMLTooling::GenericRequest
+    //
+    const char* getScheme() const;
+    const char* getHostname() const;
+    int getPort() const;
+    string getContentType() const;
+    long getContentLength() const;
+    string getRemoteUser() const;
+    const char* getRequestBody() const;
+    //
+    // XMLTooing:: HTTPRequest
+    //
+    const char* getQueryString() const;
+    string getHeader(const char* name) const;
+
+    // XMLTooing:: HTTPResponse, GenericResponse
+    long sendResponse(istream& in, long status);
+    void setResponseHeader(const char* name, const char* value);
+    long sendRedirect(const char* url);
+
+private:
+    string makeSafeHeader(const char* rawname) const;
+    void logFatal(const string& operation, HRESULT hr) const;
+    void throwError(const string& operation, HRESULT hr) const;
+
+};
diff --git a/iis7_shib/headers/ShibHttpModule.hpp b/iis7_shib/headers/ShibHttpModule.hpp
new file mode 100644
index 0000000..ce4264d
--- /dev/null
+++ b/iis7_shib/headers/ShibHttpModule.hpp
@@ -0,0 +1,69 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#pragma once
+#include "IIS7_shib.hpp"
+
+class ShibHttpModule : public CHttpModule {
+public:
+    ShibHttpModule()
+    {}
+
+    ~ShibHttpModule()
+    {};
+
+    REQUEST_NOTIFICATION_STATUS
+        OnBeginRequest(
+            _In_ IHttpContext *         pHttpContext,
+            _In_ IHttpEventProvider *   pProvider
+        );
+    REQUEST_NOTIFICATION_STATUS
+        OnPreExecuteRequestHandler(
+            _In_ IHttpContext *         pHttpContext,
+            _In_ IHttpEventProvider *   pProvider
+        );
+
+    // RQ_AUTHENTICATE_REQUEST descriptor
+    REQUEST_NOTIFICATION_STATUS
+        OnAuthenticateRequest(
+            _In_ IHttpContext *             pHttpContext,
+            _In_ IAuthenticationProvider *  pProvider
+        );
+
+    REQUEST_NOTIFICATION_STATUS
+        OnPostAuthenticateRequest(
+            _In_ IHttpContext *             pHttpContext,
+            _In_ IHttpEventProvider *       pProvider
+        );
+
+private:
+    REQUEST_NOTIFICATION_STATUS
+        DoHandler(
+            _In_ IHttpContext *         pHttpContext,
+            _In_ IHttpEventProvider *   pProvider
+        );
+
+    REQUEST_NOTIFICATION_STATUS
+        DoFilter(
+            _In_ IHttpContext *         pHttpContext,
+            _In_ IHttpEventProvider *   pProvider
+        );
+};
+
diff --git a/iis7_shib/headers/ShibUser.hpp b/iis7_shib/headers/ShibUser.hpp
new file mode 100644
index 0000000..5a63fcc
--- /dev/null
+++ b/iis7_shib/headers/ShibUser.hpp
@@ -0,0 +1,88 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#pragma once
+
+class ShibUser : public IHttpUser {
+
+public:
+    ShibUser(std::string username);
+            
+    PCWSTR
+    GetRemoteUserName(
+        VOID
+    );
+
+    PCWSTR
+    GetUserName(
+        VOID
+    );
+
+    PCWSTR
+    GetAuthenticationType(
+        VOID
+    );
+
+    PCWSTR
+    GetPassword(
+        VOID
+    );
+
+    HANDLE
+    GetImpersonationToken(
+        VOID
+    );
+
+    HANDLE
+    GetPrimaryToken(
+        VOID
+    );
+
+    VOID
+    ReferenceUser(
+        VOID
+    );
+
+    VOID
+    DereferenceUser(
+        VOID
+    );
+
+    BOOL
+    SupportsIsInRole(
+        VOID
+    );
+
+    HRESULT
+    IsInRole(
+        _In_  PCWSTR  pszRoleName,
+        _Out_ BOOL *  pfInRole
+    );
+
+    PVOID
+    GetUserVariable(
+        _In_ PCSTR    pszVariableName
+    );
+
+private:
+    const auto_ptr_XMLCh m_widen;
+    volatile unsigned int m_refCount;
+
+};
\ No newline at end of file
diff --git a/iis7_shib/iis7_shib.rc b/iis7_shib/iis7_shib.rc
new file mode 100644
index 0000000..4108ad9
Binary files /dev/null and b/iis7_shib/iis7_shib.rc differ
diff --git a/iis7_shib/register.cpp b/iis7_shib/register.cpp
new file mode 100644
index 0000000..af2b383
--- /dev/null
+++ b/iis7_shib/register.cpp
@@ -0,0 +1,192 @@
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
+
+#define _CRT_RAND_S
+
+// Project
+#include "IIS7_shib.hpp"
+#include "ShibHttpModule.hpp"
+
+namespace Config {
+    HINSTANCE g_hinstDLL;
+    SPConfig* g_Config = nullptr;
+    map<string, site_t> g_Sites;
+    bool g_bNormalizeRequest = true;
+    string g_unsetHeaderValue, g_spoofKey;
+    bool g_checkSpoofing = true;
+    bool g_catchAll = false;
+    bool g_bSafeHeaderNames = false;
+    bool g_bUseHeaders = false;
+    bool g_bUseVariables = true;
+    vector<string> g_NoCerts;
+}
+
+using namespace Config;
+
+static void _my_invalid_parameter_handler(
+    const wchar_t * expression,
+    const wchar_t * function,
+    const wchar_t * file,
+    unsigned int line,
+    uintptr_t pReserved
+)
+{
+    return;
+}
+
+class ShibModuleFactory : public IHttpModuleFactory {
+public:
+    ShibModuleFactory() {};
+    virtual HRESULT GetHttpModule(
+        _Outptr_ CHttpModule **  ppModule,
+        _In_ IModuleAllocator *     pAllocator
+    )
+    {
+        *ppModule = new ShibHttpModule();
+        return S_OK;
+    }
+
+    virtual VOID Terminate()
+    {
+        delete this;
+    }
+};
+
+extern "C"
+_declspec(dllexport)
+HRESULT
+__stdcall
+RegisterModule(
+    DWORD                           dwServerVersion,
+    IHttpModuleRegistrationInfo *   pModuleInfo,
+    IHttpServer *                   pHttpServer
+)
+{
+    if (g_Config) {
+        LogEvent(nullptr, EVENTLOG_WARNING_TYPE, SHIB_NATIVE_REENTRANT_INIT, nullptr,
+                 "Reentrant filter initialization, ignoring...");
+        return S_OK;
+    }
+
+    g_Config = &SPConfig::getConfig();
+    g_Config->setFeatures(
+        SPConfig::Listener |
+        SPConfig::Caching |
+        SPConfig::RequestMapping |
+        SPConfig::InProcess |
+        SPConfig::Logging |
+        SPConfig::Handlers
+    );
+    if (!g_Config->init()) {
+        g_Config = nullptr;
+        LogEvent(nullptr, EVENTLOG_ERROR_TYPE, SHIB_NATIVE_STARTUP_FAILED, nullptr,
+                 "Filter startup failed during library initialization, check native log for help.");
+        return E_FAIL;
+    }
+
+    try {
+        if (!g_Config->instantiate(nullptr, true))
+            throw runtime_error("unknown error");
+    } catch (std::exception& ex) {
+        g_Config->term();
+        g_Config=nullptr;
+        LogEvent(nullptr, EVENTLOG_ERROR_TYPE, SHIB_NATIVE_STARTUP_FAILED_EXCEPTION, nullptr, ex.what());
+        return FALSE;
+    }
+
+    // Access implementation-specifics and site mappings.
+    ServiceProvider* sp = g_Config->getServiceProvider();
+    Locker locker(sp);
+    const PropertySet* props = sp->getPropertySet("InProcess");
+    if (props) {
+        pair<bool, bool> flag = props->getBool("checkSpoofing");
+        g_checkSpoofing = !flag.first || flag.second;
+        flag = props->getBool("catchAll");
+        g_catchAll = flag.first && flag.second;
+
+        pair<bool, const char*> unsetValue = props->getString("unsetHeaderValue");
+        if (unsetValue.first)
+            g_unsetHeaderValue = unsetValue.second;
+        if (g_checkSpoofing) {
+            unsetValue = props->getString("spoofKey");
+            if (unsetValue.first)
+                g_spoofKey = unsetValue.second;
+            else {
+                _invalid_parameter_handler old = _set_invalid_parameter_handler(_my_invalid_parameter_handler);
+                unsigned int randkey=0, randkey2=0, randkey3=0, randkey4=0;
+                if (rand_s(&randkey) == 0 && rand_s(&randkey2) == 0 && rand_s(&randkey3) == 0 && rand_s(&randkey4) == 0) {
+                    _set_invalid_parameter_handler(old);
+                    g_spoofKey = lexical_cast<string>(randkey) + lexical_cast<string>(randkey2) +
+                        lexical_cast<string>(randkey3) + lexical_cast<string>(randkey4);
+                }
+                else {
+                    _set_invalid_parameter_handler(old);
+                    LogEvent(nullptr, EVENTLOG_ERROR_TYPE, SHIB_NATIVE_CANNOT_CREATE_ANTISPOOF, nullptr,
+                             "Filter failed to generate a random anti-spoofing key (if this is Windows 2000 set one manually).");
+                    locker.assign();    // pops lock on SP config
+                    g_Config->term();
+                    g_Config = nullptr;
+                    return FALSE;
+                }
+            }
+        }
+
+        props = props->getPropertySet("ISAPI");
+        if (props) {
+            flag = props->getBool("normalizeRequest");
+            g_bNormalizeRequest = !flag.first || flag.second;
+            flag = props->getBool("safeHeaderNames");
+            g_bSafeHeaderNames = flag.first && flag.second;
+            const DOMElement* child = XMLHelper::getFirstChildElement(props->getElement(), Site);
+            while (child) {
+                string id(XMLHelper::getAttrString(child, "", id));
+                if (!id.empty())
+                    g_Sites.insert(make_pair(id, site_t(child)));
+                child = XMLHelper::getNextSiblingElement(child, Site);
+            }
+        }
+    }
+
+    HRESULT hr = pModuleInfo->SetRequestNotifications(new ShibModuleFactory(), 
+                                                      RQ_BEGIN_REQUEST | RQ_AUTHENTICATE_REQUEST | RQ_PRE_EXECUTE_REQUEST_HANDLER,
+                                                      RQ_AUTHENTICATE_REQUEST);
+
+    if (SUCCEEDED(hr))
+    LogEvent(nullptr, EVENTLOG_INFORMATION_TYPE, SHIB_NATIVE_INITIALIZED, nullptr, "Filter initialized...");
+
+    return hr;
+}
+
+BOOL LogEvent(
+    LPCSTR  lpUNCServerName,
+    WORD  wType,
+    DWORD  dwEventID,
+    PSID  lpUserSid,
+    LPCSTR  message)
+{
+    LPCSTR  messages[] ={ message, nullptr };
+    DWORD gle = GetLastError();
+
+    HANDLE hElog = RegisterEventSource(lpUNCServerName, "Shibboleth NATIVE Filter");
+    BOOL res = ReportEvent(hElog, wType, CATEGORY_NATIVE, dwEventID, lpUserSid, 1, sizeof(DWORD), messages, &gle);
+    return (DeregisterEventSource(hElog) && res);
+}
+
+
diff --git a/iis7_shib/resource.h b/iis7_shib/resource.h
new file mode 100644
index 0000000..7950a85
--- /dev/null
+++ b/iis7_shib/resource.h
@@ -0,0 +1,20 @@
+#pragma once
+/**
+* Licensed to the University Corporation for Advanced Internet
+* Development, Inc. (UCAID) under one or more contributor license
+* agreements. See the NOTICE file distributed with this work for
+* additional information regarding copyright ownership.
+*
+* UCAID licenses this file to you under the Apache License,
+* Version 2.0 (the "License"); you may not use this file except
+* in compliance with the License. You may obtain a copy of the
+* License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing,
+* software distributed under the License is distributed on an
+* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
+* either express or implied. See the License for the specific
+* language governing permissions and limitations under the License.
+*/
diff --git a/util/message.mc b/util/message.mc
index 4ecde34..e468e77 100644
--- a/util/message.mc
+++ b/util/message.mc
@@ -14,6 +14,12 @@ Language=Neutral
 Shibboleth Daemon ISAPI plugin
 .
 
+MessageId=
+SymbolicName=CATEGORY_NATIVE
+Language=Neutral
+Shibboleth Daemon Ntaive IIS plugin
+.
+
 
 MessageIdTypedef=DWORD
 
@@ -25,6 +31,7 @@ SeverityNames=(Success=0x0:STATUS_SEVERITY_SUCCESS
 
 FacilityNames=(Shibboleth=0x231:FACILITY_SYSTEM
                ShibbolethISAPI=0x232:FACILITY_RUNTIME
+               ShibbolethNative=0x233:FACILITY_RUNTIME
                )
 
 
@@ -181,3 +188,52 @@ SymbolicName=SHIB_ISAPI_UNKNOWN_EXCEPTION
 Language=Neutral
 Shibboleth ISAPI filter: Caught an Unknown Exception.
 .
+
+MessageId=
+Severity=Warning
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_REENTRANT_INIT
+Language=Neutral
+Shibboleth Native filter: Reentrant filter initialization, ignoring...
+.
+
+MessageId=
+Severity=Error
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_STARTUP_FAILED
+Language=Neutral
+Shibboleth Native filter: Startup failed during library initialization, check native log for help.
+.
+
+MessageId=
+Severity=Error
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_STARTUP_FAILED_EXCEPTION
+Language=Neutral
+Shibboleth Native filter: Startup failed during library initialization: %1!s!, check native log for help.
+.
+
+MessageId=
+Severity=Error
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_CANNOT_CREATE_ANTISPOOF
+Language=Neutral
+Shibboleth Native filter: Failed to generate a random anti-spoofing key (if this is Windows 2000 set one manually).
+.
+
+MessageId=
+Severity=Informational
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_INITIALIZED
+Language=Neutral
+Shibboleth ISAPI filter: Initialized...
+.
+
+MessageId=
+Severity=Error
+Facility=ShibbolethNative
+SymbolicName=SHIB_NATIVE_CRITICAL
+Language=Neutral
+Shibboleth ISAPI filter: Critical Error: %0!s!
+.
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-shibboleth/shibboleth-sp2.git



More information about the Pkg-shibboleth-devel mailing list