VirtualAllocEx — резервирование памяти не возвращает базовый адресC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 VirtualAllocEx — резервирование памяти не возвращает базовый адрес

Сообщение Anonymous »

В настоящее время я работаю над небольшим проектом C# по сохранению названий значков на рабочем столе в текстовом файле.
Чтобы начать работу, я использовал эти две статьи:
Манипулирование значками на рабочем столе — как получить дескриптор SysListView32, когда включены темы с вращением изображений
Получение текста ярлыков на рабочем столе для всех окон
Используя FindWindow, FindWindowEx и SendMessage, мне удалось успешно определить количество значков на рабочем столе (да, действительно 115 :-)) и с помощью GetWindowThreadProcessId идентификатор процесса потока . OpenProcess также возвращает значение.
Проблема в том, что VirtualAllocEx всегда возвращает значение 0.

Согласно VirtualAllocEx — возвращаемое значение, память адрес должен быть возвращен, если функция завершилась успешно:

Если функция завершилась успешно, возвращаемым значением является базовый адрес выделенной области страниц. Если функция завершается неудачно, возвращаемое значение равно NULL.

GetLastError не возвращает ошибку.
Я читал на различных веб-сайтах, что обработка управления памятью изменилась со времен Windows Vista и что некоторые параметры доступа уже не так просты в использовании. .
Может ли это быть причиной?
Большое спасибо за помощь
Йоланда

Системная среда
  • Windows 10 22H2
  • Визуальная Studio 17.11.4 (C#-Tools 4.11.0)
  • .NET 8.0
Код
using System.Runtime.InteropServices;

namespace DesktopIcon
{
partial class DesktopIcon
{
internal const int LVM_GETITEMCOUNT = 0x00001000 + 4;
internal const int LVIF_TEXT = 0x00000001;
internal const int PROCESS_VM_OPERATION = 0x00000008;
internal const int PROCESS_VM_READ = 0x00000010;
internal const int PROCESS_VM_WRITE = 0x00000020;
internal const int MEM_RESERVE = 0x00002000;
internal const int MEM_COMMIT = 0x00001000;
internal const int PAGE_READWRITE = 0x00001000;

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern uint GetLastError();

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern void SetLastError(uint dwErrorCode);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.DLL", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern int GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);

[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr OpenProcess(uint processAccess, bool bInheritHandle, uint processId);

[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

static void Main(string[] args)
{
GetDesktopIcons();
}

public static void GetDesktopIcons()
{
// Reset last error
SetLastError(0);

// This buffer size will be enough.
const int BUFFER_SIZE = 0x110;
uint vProcessId = 0;

try
{
// Find window handles via process names.
IntPtr vHandle = FindWindow("Progman", "Program Manager");
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SHELLDLL_DefView", null);
vHandle = FindWindowEx(vHandle, IntPtr.Zero, "SysListView32", "FolderView");
Console.WriteLine($"vHandle: {vHandle}");

// Count subwindows of desktop => count of icons.
int vIconCount = SendMessage(vHandle, LVM_GETITEMCOUNT, 0, 0);
Console.WriteLine($"Count desktop icons (vIconCount): {vIconCount}");

// Get the desktop window's process to enumerate child windows.
int threadProcessId = GetWindowThreadProcessId(vHandle, out vProcessId);
Console.WriteLine($"ThreadProcessId: {threadProcessId}");

IntPtr vProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, false, vProcessId);
Console.WriteLine($"vProcess: {vProcess}");

// Allocate memory in the desktop process.
IntPtr vPointer = VirtualAllocEx(vProcess, IntPtr.Zero, BUFFER_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
Console.WriteLine($"vPointer: {vPointer}");
}
catch (Exception)
{
throw;
}
Console.WriteLine($"GetLastError: {GetLastError()}");
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... se-address
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • VirtualAllocEx — резервирование памяти не возвращает базовый адрес
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Std:: Flat_map, std:: Flat_set и резервирование памяти?
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • HTML5 – резервирование для дальнейшего использования
    Anonymous » » в форуме CSS
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Как справиться с платой за неявку за резервирование ресторана SaaS за пределами 7-дневного лимита авторизации?
    Anonymous » » в форуме Python
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как получить базовый адрес памяти сборки С#, загруженной в другой домен приложения
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»