private static IntPtr InitializeProcThreadAttributeList(int attributeCount) { const int reserved = 0; var size = IntPtr.Zero; bool wasInitialized = WinAPI.InitializeProcThreadAttributeList(IntPtr.Zero, attributeCount, reserved, ref size); if (wasInitialized || size == IntPtr.Zero) { throw new Exception(string.Format("Couldn't get the size of the attribute list for {0} attributes", attributeCount)); } IntPtr lpAttributeList = Marshal.AllocHGlobal(size); if (lpAttributeList == IntPtr.Zero) { throw new Exception("Couldn't reserve space for a new attribute list"); } wasInitialized = WinAPI.InitializeProcThreadAttributeList(lpAttributeList, attributeCount, reserved, ref size); if (!wasInitialized) { throw new Exception("Couldn't create new attribute list"); } return(lpAttributeList); }