public SafePtr ToNullTermPtr() { var b = new SafePtr(); int i = 0; foreach (var s in this) { i += (s.Length + 1) * sizeof(char); } i += sizeof(char); b.Length = i; int idx = 0; foreach (var s in this) { b.SetString(idx, s); idx += (s.Length + 1) * sizeof(char); } return(b); }
/// <summary> /// Internally saves the icon to the specified stream. /// </summary> /// <param name="stream">Stream to save.</param> /// <returns>True if successful.</returns> /// <remarks></remarks> private bool _internalSaveToStream(Stream stream) { bool _internalSaveToStreamRet = default; var bl = new SafePtr(); int f = Marshal.SizeOf(_dir); int g = Marshal.SizeOf <ICONDIRENTRY>(); _dir.nImages = (short)_entries.Count; _dir.wIconType = IconImageType.Icon; _dir.wReserved = 0; // get the index to the first image's image data int offset = f + g * _dir.nImages; bl = bl + FileTools.StructToBytes(_dir); foreach (var e in _entries) { e._entry.dwOffset = offset; bl = bl + FileTools.StructToBytes(e._entry); offset += e._entry.dwImageSize; } foreach (var e in _entries) { bl = bl + e._image; } // write the icon file stream.Write((byte[])bl, 0, (int)bl.Length); stream.Close(); bl.Dispose(); _internalSaveToStreamRet = true; return(_internalSaveToStreamRet); }
public static bool DeleteFile(List <string> lstPaths, bool fShiftKey, IntPtr hwnd) { string s = MakeFILEOPPATHS(lstPaths); if (s.Length > 1) { using (SafePtr pFrom = new SafePtr(s)) { SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT { hwnd = hwnd, wFunc = 3, pFrom = pFrom, fFlags = fShiftKey ? ((short)0x4000) : ((short)0x40) }; try { if (PInvoke.SHFileOperation(ref lpFileOp) == 0) { return(!lpFileOp.fAnyOperationsAborted); } } catch (Exception exception) { QTUtility2.MakeErrorLog(exception); } } } return(false); }
/// <summary> /// Returns the BSTR preamble count of strings from the head of the memory buffer. /// </summary> /// <returns></returns> private long BCount() { if (SafePtr is null || SafePtr.handle == IntPtr.Zero) { return(0L); } switch (SizeDescriptorLength) { case 2: { return(SafePtr.get_UShortAt(0L)); } case 4: { return(SafePtr.get_UIntegerAt(0L)); } case 8: { return((long)SafePtr.get_ULongAt(0L)); } default: { return(0L); } } }
public static StringBlob FromNullTermPtr(IntPtr ptr) { var sb = new StringBlob(); var b = new SafePtr(ptr); sb.AddRange(b.GetStringArray(0)); return(sb); }
/// <summary> /// Internal load from bytes. /// </summary> /// <param name="bytes"></param> /// <returns></returns> /// <remarks></remarks> private bool _internalLoadFromBytes(byte[] bytes) { bool _internalLoadFromBytesRet = default; SafePtr mm = (SafePtr)bytes; _internalLoadFromBytesRet = _internalLoadFromPtr(mm); mm.Dispose(); return(_internalLoadFromBytesRet); }
public static bool PasteFile(string pathTarget, IntPtr hwnd) { try { List <string> paths = ClipboardGetFileDropList(hwnd); if (paths.Count == 0) { return(false); } string s = MakeFILEOPPATHS(paths); if (s.Length > 1) { bool flag; if (pathTarget.Length != 3) { pathTarget = pathTarget.TrimEnd(new char[] { '\\' }); } pathTarget = GetTargetIfFolderLink(new DirectoryInfo(pathTarget), out flag).FullName; if (flag) { bool prefferdDropEffect = GetPrefferdDropEffect(hwnd); short num = 0x40; if (IsTargetPathContained(paths, pathTarget)) { num = (short)(num | 8); } using (SafePtr pFrom = new SafePtr(s)) using (SafePtr pTo = new SafePtr(pathTarget + '\0')) { SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT { hwnd = hwnd, wFunc = prefferdDropEffect ? 1 : 2, pFrom = pFrom, pTo = pTo, fFlags = num }; try { if (PInvoke.SHFileOperation(ref lpFileOp) == 0) { return(!lpFileOp.fAnyOperationsAborted); } } catch (Exception exception) { QTUtility2.MakeErrorLog(exception); } } } } } catch (Exception exception2) { QTUtility2.MakeErrorLog(exception2, null); } return(false); }
/// <summary> /// Format a given system error, or the last system error by default. /// </summary> /// <param name="syserror">Format code to pass. GetLastError is used as by default.</param> /// <returns></returns> /// <remarks></remarks> public static string FormatLastError(uint syserror = 0U) { uint err = syserror == 0L ? (uint)User32.GetLastError() : syserror; var mm = new SafePtr(); string s; mm.Length = 1026L; mm.ZeroMemory(); User32.FormatMessage(0x1000, IntPtr.Zero, err, 0U, mm.handle, 512U, IntPtr.Zero); s = "Error &H" + err.ToString("X8") + ": " + mm.ToString(); mm.Dispose(); return(s); }
/// <summary> /// Create a bitmap structure with bits from this raw icon image. /// </summary> /// <returns>An array of bytes that represent data to create a bitmap.</returns> /// <remarks></remarks> private byte[] _makeBitmap() { byte[] _makeBitmapRet = default; if (!IsPngFormat) { _makeBitmapRet = _image; return(_makeBitmapRet); } IntPtr bmp = default; var hbmp = Resources.MakeDIBSection((Bitmap)ToImage(), ref bmp); var mm = new SafePtr(); var bm = new BITMAPINFOHEADER(); int maskSize; int w = _entry.cWidth; int h = _entry.cHeight; if (w == 0) { w = 256; } if (h == 0) { h = 256; } bm.biSize = 40; bm.biWidth = w; bm.biHeight = h * 2; bm.biPlanes = 1; bm.biBitCount = 32; bm.biSizeImage = w * h * 4; maskSize = (int)(Math.Max(w, 32) * h / 8d); mm.Alloc(bm.biSizeImage + 40 + maskSize); var ptr1 = mm.DangerousGetHandle() + 40; var ptr2 = mm.DangerousGetHandle() + 40 + bm.biSizeImage; Marshal.StructureToPtr(bm, mm.DangerousGetHandle(), false); Native.MemCpy(bmp, ptr1, bm.biSizeImage); bm = mm.ToStruct <BITMAPINFOHEADER>(); _setMask(ptr1, ptr2, w, h); _entry.dwImageSize = (int)mm.Length; _makeBitmapRet = (byte[])mm; mm.Free(); NativeShell.DeleteObject(hbmp); return(_makeBitmapRet); }
public static void ShowProperties(byte[] idl, IntPtr hwnd = default(IntPtr)) { using (SafePtr sptr = new SafePtr("properties")) using (IDLWrapper wrapper = new IDLWrapper(idl)) { if (wrapper.Available) { SHELLEXECUTEINFO structure = new SHELLEXECUTEINFO { hwnd = hwnd, fMask = 0x40C, lpVerb = sptr, lpIDList = wrapper.PIDL }; structure.cbSize = Marshal.SizeOf(structure); PInvoke.ShellExecuteEx(ref structure); } } }
/// <summary> /// Refresh the current monitor list. /// </summary> /// <returns></returns> /// <remarks></remarks> public bool Refresh() { bool ret; Clear(); var mm = new SafePtr(IntPtr.Size); mm.IntAt(0L) = 1; int i = mm.IntAt(0L); ret = EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, _enum, mm.handle); mm.Free(); return(ret); }
public static string GetMenuItemText(IntPtr hMenu, int itemId, bool byPos = true) { var mii = new MENUITEMINFO(); var mm = new SafePtr(); mii.cbSize = Marshal.SizeOf(mii); mii.cch = 0; mii.fMask = User32.MIIM_TYPE; User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii); mm.Length = (mii.cch + 1) * sizeof(char); mii.cch += 1; mii.dwTypeData = mm.handle; if (User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii) == 0) { int err = User32.GetLastError(); mm.Length = 1026L; mm.ZeroMemory(); User32.FormatMessage(0x1000U, IntPtr.Zero, (uint)err, 0U, mm.handle, 512U, IntPtr.Zero); mm.Dispose(); return(null); } if ((mii.fType & User32.MFT_SEPARATOR) == User32.MFT_SEPARATOR) { return("-"); } else { string s; s = mm.ToString(); mm.Dispose(); return(s); } }
public static bool DeleteFile(List<string> lstPaths, bool fShiftKey, IntPtr hwnd) { string s = MakeFILEOPPATHS(lstPaths); if(s.Length > 1) { using(SafePtr pFrom = new SafePtr(s)) { SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT { hwnd = hwnd, wFunc = 3, pFrom = pFrom, fFlags = fShiftKey ? ((short)0x4000) : ((short)0x40) }; try { if(PInvoke.SHFileOperation(ref lpFileOp) == 0) { return !lpFileOp.fAnyOperationsAborted; } } catch(Exception exception) { QTUtility2.MakeErrorLog(exception); } } } return false; }
public void StructOutput(Object _Outparams) { Outparams outpar = (Outparams)_Outparams; RichTextBox outp = outpar.ForOutForm.richTextBox1; OperProgress prbarform = outpar.prbarform; Link temp; int count = 0; int memory_size = 0; for (int j = 0; j < this.sizex; ++j) { if (!prbarform.IsDisposed) { prbarform.InvokeUI(() => { prbarform.progressBar1.Value = count; }); count++; } temp = this.columns[j]; while (temp.next != null) { memory_size += 12; var safeptr = SafePtr.Create(temp.next); outp.AppendText("Элемент " + temp.next.inf + " с координатами X:" + (j + 1) + " Y:" + (1 + temp.next.line_number) + " находится по адресу " + safeptr.IntPtr.ToString("x") + "\n"); temp = temp.next; } } if (!prbarform.IsDisposed) { prbarform.InvokeUI(() => { prbarform.Close(); }); } outp.AppendText("\nОбщий объём памяти, занимаемый матрицой: " + memory_size / 1024.0 + " Кбайт\n"); if (--this.count_readers == 0) { Fparent.names_collection[Fparent.names_collection.IndexOf(this.name + " (" + this.sizey.ToString() + "x" + this.sizex.ToString() + ") (чтение)")] = this.name + " (" + this.sizey.ToString() + "x" + this.sizex.ToString() + ")"; Program.fr2.InvokeUI(() => { Program.fr2.ComboRefresh(); }); } outpar.ForOutForm.ShowDialog(); }
public bool TxtOutputMemory(string path) { if (Path.GetExtension(path) != ".txt") { MessageBox.Show("Неверное расширение файла", "Ошибка"); return(false); } try { using (var outp = new StreamWriter(path)) { outp.WriteLine("Вывод расположения элементов в памяти матрицы " + this.name); Link temp; int memory_size = 0; for (int j = 0; j < this.sizex; ++j) { temp = this.columns[j]; while (temp.next != null) { memory_size += 12; var safeptr = SafePtr.Create(temp.next); outp.Write("Элемент " + temp.next.inf + " с координатами X:" + (j + 1) + " Y:" + (1 + temp.next.line_number) + " находится по адресу " + safeptr.IntPtr.ToString("x")); outp.WriteLine(); temp = temp.next; } } outp.WriteLine("\nОбщий объём памяти, занимаемый матрицой: " + memory_size / 1024.0 + " Кбайт"); } return(true); } catch (Exception ex) { MessageBox.Show("Неверно задан путь к файлу", "Ошибка"); return(false); } }
/// <summary> /// Copy a native hMenu and all its contents into a managed Menu object /// </summary> /// <param name="hMenu"></param> /// <param name="destItem"></param> /// <returns></returns> /// <remarks></remarks> public static bool MenuItemCopyToManaged(IntPtr hMenu, int itemId, ref ToolStripMenuItem destItem, bool byPos = true) { var mii = new MENUITEMINFO(); Bitmap bmp; var mm = new SafePtr(); if (destItem is null) { destItem = new ToolStripMenuItem(); } mii.cbSize = Marshal.SizeOf(mii); mii.cch = 0; mii.fMask = User32.MIIM_TYPE; User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii); mm.Length = (mii.cch + 1) * sizeof(char); mii.cch += 1; mii.dwTypeData = mm.handle; if (User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii) == 0) { int err = User32.GetLastError(); mm.Length = 1026L; mm.ZeroMemory(); User32.FormatMessage(0x1000U, IntPtr.Zero, (uint)err, 0U, mm.handle, 512U, IntPtr.Zero); mm.Dispose(); return(false); } if ((mii.fType & User32.MFT_SEPARATOR) == User32.MFT_SEPARATOR) { destItem.Text = "-"; } else { destItem.Text = mm.ToString(); } mm.Dispose(); mii.fMask = User32.MIIM_BITMAP; User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii); if (mii.hbmpItem != IntPtr.Zero) { bmp = Image.FromHbitmap(mii.hbmpItem); destItem.Image = bmp; } mii.fMask = User32.MIIM_STATE; User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii); if ((mii.fState & User32.MFS_CHECKED) == User32.MFS_CHECKED) { destItem.CheckState = CheckState.Checked; } if ((mii.fState & User32.MFS_DISABLED) == User32.MFS_DISABLED) { destItem.Enabled = false; } if ((mii.fState & User32.MFS_DEFAULT) == User32.MFS_DEFAULT) { destItem.Font = new Font(destItem.Font.Name, destItem.Font.Size, FontStyle.Bold); } mii.fMask = User32.MIIM_SUBMENU; User32.GetMenuItemInfo(hMenu, itemId, byPos, ref mii); if (mii.hSubMenu != IntPtr.Zero) { return(MenuItemsToManaged(mii.hSubMenu, destItem.DropDownItems)); } return(true); }
public static object BytesToEnum(byte[] b, Type t) { SafePtr sp = b; int x = Blob.BlobTypeSize(Blob.TypeToBlobType(t.GetEnumUnderlyingType())); switch (x) { case 1: { if (Native.Unsigned(t)) { return(Enum.ToObject(t, sp[0L])); } else { return(Enum.ToObject(t, sp.get_SByteAt(0L))); } break; } case 2: { if (Native.Unsigned(t)) { return(Enum.ToObject(t, sp.get_UShortAt(0L))); } else { return(Enum.ToObject(t, sp.get_ShortAt(0L))); } break; } case 4: { if (Native.Unsigned(t)) { return(Enum.ToObject(t, sp.get_UIntegerAt(0L))); } else { return(Enum.ToObject(t, sp.get_IntegerAt(0L))); } break; } case 8: { if (Native.Unsigned(t)) { return(Enum.ToObject(t, sp.get_ULongAt(0L))); } else { return(Enum.ToObject(t, sp.get_LongAt(0L))); } break; } } return(null); }
public static byte[] EnumToBytes(object val) { SafePtr sp = null; var t = val.GetType(); int x = Blob.BlobTypeSize(Blob.TypeToBlobType(t.GetEnumUnderlyingType())); switch (x) { case 1: { if (Native.Unsigned(t)) { sp = Conversions.ToByte(val); } else { sp = Conversions.ToSByte(val); } break; } case 2: { if (Native.Unsigned(t)) { sp = Conversions.ToUShort(val); } else { sp = Conversions.ToShort(val); } break; } case 4: { if (Native.Unsigned(t)) { sp = Conversions.ToUInteger(val); } else { sp = Conversions.ToInteger(val); } break; } case 8: { if (Native.Unsigned(t)) { sp = Conversions.ToULong(val); } else { sp = Conversions.ToLong(val); } break; } } return(sp); }
public static extern int GetIfTable( SafePtr pIfTable, ref int pdwSize, bool bOrder );
/// <summary> /// Creates a new StringBlob and initialize the data with the contents of a Blob object. /// </summary> /// <param name="blob"></param> public StringBlob(Blob blob) { _mem = new SafePtr(blob.Length); _mem.CopyFrom(blob.DangerousGetHandle(), (IntPtr)blob.Length); }
public static void ShowProperties(byte[] idl, IntPtr hwnd = default(IntPtr)) { using(SafePtr sptr = new SafePtr("properties")) using(IDLWrapper wrapper = new IDLWrapper(idl)) { if(wrapper.Available) { SHELLEXECUTEINFO structure = new SHELLEXECUTEINFO { hwnd = hwnd, fMask = 0x40C, lpVerb = sptr, lpIDList = wrapper.PIDL }; structure.cbSize = Marshal.SizeOf(structure); PInvoke.ShellExecuteEx(ref structure); } } }
public static bool PasteFile(string pathTarget, IntPtr hwnd) { try { List<string> paths = ClipboardGetFileDropList(hwnd); if(paths.Count == 0) { return false; } string s = MakeFILEOPPATHS(paths); if(s.Length > 1) { bool flag; if(pathTarget.Length != 3) { pathTarget = pathTarget.TrimEnd(new char[] { '\\' }); } pathTarget = GetTargetIfFolderLink(new DirectoryInfo(pathTarget), out flag).FullName; if(flag) { bool prefferdDropEffect = GetPrefferdDropEffect(hwnd); short num = 0x40; if(IsTargetPathContained(paths, pathTarget)) { num = (short)(num | 8); } using(SafePtr pFrom = new SafePtr(s)) using(SafePtr pTo = new SafePtr(pathTarget + '\0')) { SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT { hwnd = hwnd, wFunc = prefferdDropEffect ? 1 : 2, pFrom = pFrom, pTo = pTo, fFlags = num }; try { if(PInvoke.SHFileOperation(ref lpFileOp) == 0) { return !lpFileOp.fAnyOperationsAborted; } } catch(Exception exception) { QTUtility2.MakeErrorLog(exception); } } } } } catch(Exception exception2) { QTUtility2.MakeErrorLog(exception2, null); } return false; }
public void SetPointer(SafePtr another) { Pointer.IntPtr = another.Pointer.IntPtr; }