public static void DumpConsoleInfo(TextWriter tw, string path)
        {
            var lnk  = new CoShellLink();
            var data = (IShellLinkDataList)lnk;
            var file = (IPersistFile)lnk;

            file.Load(path, (int)STGM.Read);

            IntPtr block;
            int    rc = data.CopyDataBlock(CoShellLink.NT_CONSOLE_PROPS_SIG, out block);

            if (rc != 0)
            {
                throw new Win32Exception("CopyDataBlock failed. " + rc.ToString("X"));
            }

            int size = Marshal.ReadInt32(block);
            var res  = Marshal.PtrToStructure <NT_CONSOLE_PROPS>(block);

            tw.WriteLine("Flags: {0}", GetFlags(path));

            DumpMember(tw, res, p => p.bAutoPosition);
            DumpMember(tw, res, p => p.bFullScreen);
            DumpMember(tw, res, p => p.bHistoryNoDup);
            DumpMember(tw, res, p => p.bInsertMode);
            DumpMember(tw, res, p => p.bQuickEdit);
            DumpMember(tw, res, p => p.nInputBufferSize);
            DumpMember(tw, res, p => p.uCursorSize);
            DumpMember(tw, res, p => p.FaceName, GetString(res.FaceName));
            DumpMember(tw, res, p => p.nFont);
            DumpMember(tw, res, p => p.uFontFamily);
            DumpMember(tw, res, p => p.uFontWeight);
            DumpMember(tw, res, p => p.dwFontSize);
            DumpMember(tw, res, p => p.uHistoryBufferSize);
            DumpMember(tw, res, p => p.uNumberOfHistoryBuffers);
            DumpMember(tw, res, p => p.wFilleAttribute);
            DumpMember(tw, res, p => p.wPopupFillAttribute);
            DumpMember(tw, res, p => p.dwScreenBufferSize);
            DumpMember(tw, res, p => p.dwWindowOrigin);
            DumpMember(tw, res, p => p.dwWindowSize);

            for (var i = 0; i < res.ColorTable.Length; i++)
            {
                tw.WriteLine("ColorTable[{0}]: RGB({1},{2},{3}), #{1:X}{2:X}{3:X}", i,
                             res.ColorTable[i].R, res.ColorTable[i].G, res.ColorTable[i].B);
            }

            Marshal.FreeHGlobal(block);
            Marshal.ReleaseComObject(data);
            Marshal.ReleaseComObject(file);
            Marshal.ReleaseComObject(lnk);
        }
        public static void RmProps(string path)
        {
            var lnk  = new CoShellLink();
            var data = (IShellLinkDataList)lnk;
            var file = (IPersistFile)lnk;

            file.Load(path, (int)STGM.Read);
            data.RemoveDataBlock(CoShellLink.NT_CONSOLE_PROPS_SIG);
            file.Save(path, true);
            Marshal.ReleaseComObject(data);
            Marshal.ReleaseComObject(file);
            Marshal.ReleaseComObject(lnk);
        }
        public static string GetFlags(string path)
        {
            var lnk  = new CoShellLink();
            var data = (IShellLinkDataList)lnk;
            var file = (IPersistFile)lnk;

            file.Load(path, (int)STGM.Read);

            var flags = data.GetFlags();

            Marshal.ReleaseComObject(data);
            Marshal.ReleaseComObject(file);
            Marshal.ReleaseComObject(lnk);

            return(flags.ToString());
        }