Skip to content

Instantly share code, notes, and snippets.

View smourier's full-sized avatar

Simon Mourier smourier

View GitHub Profile
@smourier
smourier / ReadHeicFileThroughGdiPlusAndWic.cs
Created August 18, 2024 18:39
Use WIC component with GDI+ (version 3)
var hr = GdiplusStartup(out var token, StartupInputEx.GetDefault(), out var output);
using var img = new Bitmap(Environment.GetCommandLineArgs()[1]);
[DllImport("gdiplus")]
private static extern int GdiplusStartup(out nint token, in StartupInputEx input, out StartupOutput output);
private struct StartupInputEx
{
public int GdiplusVersion;
public nint DebugEventCallback;
@smourier
smourier / AuthenticodeSignature.cs
Created August 1, 2024 16:27
A C# utility to decode all authenticode signatures (primary and secondaries)
public class AuthenticodeSignature
{
private AuthenticodeSignature() { }
public int Index { get; private set; }
public string ProgramName { get; private set; }
public string PublisherLink { get; private set; }
public string MoreLink { get; private set; }
public string SerialNumber { get; private set; }
public X509Certificate2 Certificate { get; private set; }
public string HashAlgorithm { get; private set; }
@smourier
smourier / CreateWindowAndSwapChainCsWin32.cs
Created July 29, 2024 05:39
Create Window and Swapchain with CsWin32
using System;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using Microsoft.Win32.SafeHandles;
using Windows.Win32;
using Windows.Win32.Foundation;
using Windows.Win32.Graphics.Direct3D;
using Windows.Win32.Graphics.Direct3D11;
using Windows.Win32.Graphics.Dxgi;
using Windows.Win32.Graphics.Dxgi.Common;
@smourier
smourier / mallocspy.cs
Created April 10, 2024 12:55
C# implementation of IMallocSpy
public class ConsoleMallocSpy : MallocSpy
{
protected override void Log(object message, [CallerMemberName] string methodName = null) => Console.WriteLine(methodName + ": " + message);
private readonly ConcurrentDictionary<IntPtr, IntPtr> _blocks = new();
private IntPtr _allocRequest;
protected override IntPtr PreAlloc(IntPtr cbRequest)
{
@smourier
smourier / JobObject.cs
Created February 26, 2024 16:13
JobObject C# class with wait, support for ShellExecute, etc.
public class JobObject : IDisposable
{
private IntPtr _handle;
public JobObject(string name = null, bool terminateOnDispose = false)
{
Name = name;
TerminateOnDispose = terminateOnDispose;
_handle = CreateJobObject(IntPtr.Zero, name);
if (_handle == IntPtr.Zero)
@smourier
smourier / LoadNonloadedOverlayIdentifiers.cs
Last active February 3, 2024 10:40
Load Nonloaded Overlay Identifiers
[STAThread]
static void Main()
{
var mgr = (IShellIconOverlayManager)new CLSID_CFSIconOverlayManager();
Console.WriteLine(mgr.LoadNonloadedOverlayIdentifiers());
}
[ComImport, Guid("63B51F81-C868-11D0-999C-00C04FD655E1")]
public class CLSID_CFSIconOverlayManager { };
@smourier
smourier / SvgToPng
Created February 3, 2024 10:08
Converting SVG to PNG using WIC & Direct2D (through Wicnet & DirectN)
using System.Drawing;
using System.IO;
using DirectN;
using WicNet;
namespace ConsoleApp2
{
internal class Program
{
static void Main()
@smourier
smourier / ShellIconOverlayIdentifiers.cs
Created February 3, 2024 08:40
Dump the list of Shell Icon Overlay Identifiers
static void Main()
{
using (var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers", false))
{
foreach (var name in key.GetSubKeyNames())
{
Console.WriteLine("'" + name + "'");
using (var sub = key.OpenSubKey(name, false))
{
if (!(sub.GetValue(null) is string def) || !Guid.TryParse(def, out var clsid))
public static void RunAsDesktopUser(string fileName)
{
if (string.IsNullOrWhiteSpace(fileName))
throw new ArgumentException("Value cannot be null or whitespace.", nameof(fileName));
// To start process as shell user you will need to carry out these steps:
// 1. Enable the SeIncreaseQuotaPrivilege in your current token
// 2. Get an HWND representing the desktop shell (GetShellWindow)
// 3. Get the Process ID(PID) of the process associated with that window(GetWindowThreadProcessId)
// 4. Open that process(OpenProcess)
@smourier
smourier / ImmersiveSettingsCache.cs
Created January 5, 2024 15:46
Calling ImmersiveSettingsCache from C#
static void Main(string[] args)
{
var cache = (IImmersiveSettingsCache)new ImmersiveSettingsCache();
var hr = cache.OnSettingChanged(0);
}
[ComImport, Guid("a919ea73-490e-4d5c-9ba7-97cbc73119fe")] // CLSID_ImmersiveSettingsCache
public class ImmersiveSettingsCache
{
// don't put anything in there