Question

I have an ISAPI filter written for IIS6. I now need to write a wrapper for IIS7 to wrap the IIS6 filter. I plan to write HTTP module in C# and Pinvoke the unmanaged dll methods.

I need C# representation of the following code,

DWORD WINAPI HttpFilterProc(
   PHTTP_FILTER_CONTEXT pfc,
   DWORD notificationType,
   LPVOID pvNotification
);

    typedef struct _HTTP_FILTER_CONTEXT HTTP_FILTER_CONTEXT {
       DWORD cbSize;
       DWORD Revision;
       PVOID ServerContext;
       DWORD ulReserved;
       BOOL fIsSecurePort;
       PVOID pFilterContext;
       BOOL GetServerVariable;
       BOOL AddResponseHeaders;
       BOOL WriteClient;
       VOID * AllocMem;
       BOOL ServerSupportFunction;
    } HTTP_FILTER_CONTEXT, * PHTTP_FILTER_CONTEXT;

I tried using PInvoke Assistant from codeplex but i am not able to make it work. Has anyone done anything like this before? Can anyone provide a solution to the above?

Correction: Correct structure added

Was it helpful?

Solution

Building on the code in your answer you need to use the following:

[DllImport(@"XyzISAPI.dll")]
public static extern uint HttpFilterProc(
    ref HttpFilterContext pfc, 
    uint notificationType, 
    IntPtr pvNotification
);

The native code is passed a pointer to the context struct and passing the struct by ref is the easy way to match that. The final parameter is LPVOID, which is void* and that is plain IntPtr in managed code.

As for HTTP_FILTER_ACCESS_DENIED, define it like this:

[StructLayout(LayoutKind.Sequential)]
public struct HttpFilterAccessDenied
{
    IntPtr URL;
    IntPtr PhysicalPath;
    uint Reason;
}

You can then obtain one of those like this:

HttpFilterAccessDenied hfad = (HttpFilterAccessDenied)Marshal.PtrToStructure(
    pvNotification, typeof(HttpFilterAccessDenied));

And then you can get hold of the string values from the struct with Marshal.PtrToStringUni or Marshal.PtrToStringAnsi.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top