Simple SystemIconsHandler for ASP.NET

One of web projects I'm working on needed a web file explorer. There was one specific requirement for this explorer, files should be displayed with icons they have on server. I decided that the best way will be dedicated HttpHandler.

So first I needed to P/Invoke SHGetFileInfo and DestroyIcon functions:
/// <summary>
Retrieves information about an object in the file system, such as a file, folder, directory, or drive root
/// </summary>
/// <param name="pszPath">Contains the path and file name. Both absolute and relative paths are valid
/// <param name="dwFileAttributes">
A combination of one or more file attribute flags
/// <param name="psfi">
SHFILEINFO structure to receive the file information
/// <param name="cbSizeFileInfo">
The size, in bytes, of the SHFILEINFO structure
/// <param name="uFlags">
The flags that specify the file information to retrieve
/// <returns>
Meaning depends on the uFlags parameter</returns>
static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFileInfo psfi, uint cbSizeFileInfo, uint uFlags);
/// <summary>
Destroys an icon and frees any memory the icon occupied
/// </summary>
/// <param name="handle">
Handle to the icon to be destroyed
/// <returns>
If the function succeeds, the return value is nonzero</returns>
[DllImport("user32.dll", CharSet = CharSet.Auto)]
extern static bool DestroyIcon(IntPtr handle);

With those two functions getting icon for file looks like this:
Icon tempIcon;
SHFileInfo tempFileInfo = new SHFileInfo();
//Getting SHFileInfo for file (based on extension)
SHGetFileInfo(extension, 0, ref tempFileInfo, (uint)Marshal.SizeOf(tempFileInfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | (uint)iconSize);
//Creating Icon based on SHFileInfo
tempIcon = (Icon)Icon.FromHandle(tempFileInfo.hIcon);
//Making managed clone
Icon managedIcon = (Icon)tempIcon.Clone();
//Destroying unmanaged handle
return managedIcon;

There is only one difference when getting icon for folder:
//Getting SHFileInfo for folder
ref tempFileInfo, (uint)Marshal.SizeOf(tempFileInfo), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES | (uint)iconSize | (uint)folderType );

So having this done, all what is left is processing request:
public void ProcessRequest(HttpContext context)
  Icon systemIcon = null;
  //Ckecking parameters
  && !

    //Setting icon size
    IconSize size = IconSize.SHGFI_SMALLICON;
    if (context.Request.QueryString["size"].Equals("large"
      size =

    //Getting icon
    if (context.Request.QueryString["type"].Equals("dir"
      systemIcon = GetFolderIcon(size,

    else if(context.Request.QueryString["type"].Equals("file"
      systemIcon = GetExtensionIcon(
"ext"], size);

  if (systemIcon != null

    MemoryStream systemIconStream = new MemoryStream();

    //Converting icon to .png

[] systemIconBytes = systemIconStream.GetBuffer();

    //Setting the response
    context.Response.ContentType = "image/png"
    context.Response.BufferOutput =
    context.Response.OutputStream.Write(systemIconBytes, 0,

Simple example can be found here. Below you can see it's result.