Win32APIのSHGetFileInfoで256x256アイコンを取得しているのですが、CDドライブでCDが256x256アイコンを持っていない場合、次のように左上に偏った画像のアイコンが取得されてしまい、表示上問題があります。

CD-Drive Icons

次のようなコードで取得しています。

// (NativeMethods省略)
// var bitmaps = CreateFileIconCollectionExtra("F:\\", NativeMethods.FILE_ATTRIBUTE.FILE_ATTRIBUTE_DIRECTORY, 0); で呼び出し
//
public static List<BitmapSource> CreateFileIconCollectionExtra(string filename, NativeMethods.FILE_ATTRIBUTE attribute, ativeMethods.SHGFI flags)
{
    NativeMethods.SHFILEINFO shinfo = new NativeMethods.SHFILEINFO();
    shinfo.szDisplayName = string.Empty;
    shinfo.szTypeName = string.Empty;
    IntPtr hImg = NativeMethods.SHGetFileInfo(filename, attribute, out shinfo, (uint)Marshal.SizeOf(typeof(NativeMethods.SHFILEINFO)), NativeMethods.SHGFI.SHGFI_SYSICONINDEX | flags);
    var bitmaps = new List<BitmapSource>();
    var shils = Enum.GetValues(typeof(NativeMethods.SHIL)).Cast<NativeMethods.SHIL>();
    foreach (var shil in shils)
    {
        int hResult = NativeMethods.SHGetImageList(shil, ref NativeMethods.IID_IImageList, out NativeMethods.IImageList imglist);
        if (hResult == NativeMethods.S_OK)
        {
            IntPtr hicon = IntPtr.Zero;
            imglist.GetIcon(shinfo.iIcon, (int)NativeMethods.ImageListDrawItemConstants.ILD_TRANSPARENT, ref hicon);
            if (hicon != IntPtr.Zero)
            {
                BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHIcon(hicon, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                bitmapSource?.Freeze();
                NativeMethods.DestroyIcon(hicon);
                bitmaps.Add(bitmapSource);
            }
        }
    }
    return bitmaps;
}

Q1. 256x256リソースがない場合には256x256アイコンを取得できないようにしたいのですが、256x256のアイコンリソースが存在するかを判別するにはどうしたらよいのでしょうか。

Q2. 今回の用途はドライブ限定ですので、既定のドライブアイコン(CDを入れていないときのアイコン)を取得することでも表示上の問題は回避できます。規定のドライブアイコンを取得する方法はありますでしょうか。


Windows10
VisualStudio 2017 (15.9.6)
.NET Framework 4.6.2