HemersonKl Ответов: 1

C# как узнать, является ли PID браузера 32-битным или 64-битным?


<pre>public void comboBox1_TextChanged(object sender, EventArgs e)
        {
            if (this.comboBox1.Text == "Chrome")
            {
                int pid = browser.Chrome();
                if (pid > 0)
                {
                    Aobscan.OpenProcessid(pid);
                    label1.Text = "Attached To Chrome Pid :" + pid;
                }
                else
                {
                    label1.Text = "Failed To Attached";
                    Aobscan.processhandle = IntPtr.Zero;
                }
            }


Что я уже пробовал:

Привет, ребята. Я хотел бы иметь возможность видеть его на этикетке, если браузер, который нашел PID, является 32-битным chrome или 64-битным chrome. Как я могу это сделать?
Что-то вроде

Если PID браузер 64bits label1. text = ("chrome 64bits")
Else label1. text = ("chrome 32bits") большое вам спасибо за помощь

Suvendu Shekhar Giri

Проверьте следующее-
Is64BitOperatingSystem и Is64BitProcess в .NET 4.0[^]

Dave Kreskowiak

Это не то, что ищет ОП. Ваш код спрашивает, является ли текущий O/S 64-разрядным или нет, и если процесс, в котором находится этот код, выполняется как 64-разрядный или нет. Он ничего не делает, чтобы определить, является ли внешний процесс Chrome 64-разрядным.

1 Ответов

Рейтинг:
10

Dave Kreskowiak

PID - это идентификатор процесса. Это просто число, и оно ничего не говорит вам о процессе.

Вы должны получить объект процесса с помощью Процесс.Метод GetProcessById (Int32) (System.Диагностика)[^]. Когда у вас есть объект процесса, вы вызываете приведенный ниже код, чтобы определить, является ли он 64-разрядным или нет.

Вам понадобится немного кода, чтобы сделать вызов Windows...

internal static class NativeMethods
{
    // see https://msdn.microsoft.com/en-us/library/windows/desktop/ms684139%28v=vs.85%29.aspx
    public static bool Is64Bit(Process process)
    {
        if (Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86")
            return false;

        bool isWow64;
        if (!IsWow64Process(process.Handle, out isWow64))
            throw new Win32Exception();
        return !isWow64;
    }

    [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
    [return: MarshalAs(UnmanagedType.Bool)]
    private static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);
}


И вы называете это так:
int pid = browser.Chrome();
Process process = Process.GetProcessById(pid);
bool is64Bit = NativeMethods.Is64Bit(process);


HemersonKl

Привет, Дэйв. У меня есть эта функция в Aobscaner.cs как я могу вызвать ее в form1. cs? Так что при поиске браузера он показывает в метке, что браузер 32x или 64x. Извините за невежество, я ученик.

<pre>[DllImport("kernel32.dll")]
        static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, uint dwLength);

        private static IntPtr OpenProcess(Process proc, ProcessAccessFlags flags)
        {
            return OpenProcess(ProcessAccessFlags.All, false, proc.Id);
        }

        public static bool Is64Bit(Process process)
        {
            if (Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "x86")
                return false;

            bool isWow64;
            if (!IsWow64Process(process.Handle, out isWow64))
                throw new System.ComponentModel.Win32Exception();
            return !isWow64;
        }

        [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool IsWow64Process([In] IntPtr process, [Out] out bool wow64Process);

        public void ReadAOB(string Scancode)
        {
            if ((int)processhandle > 0)
            {
                IntPtr bytesRead = IntPtr.Zero;
                long MaxAddress = 0;
                if(isbit64)
                     MaxAddress = 0x7fffffffffffffff;
                else
                    MaxAddress = 0x7fffffff;
                long address = 0;
                addresses.Clear();
                do
                {
                    MEMORY_BASIC_INFORMATION m;
                    int result = VirtualQueryEx(processhandle, (IntPtr)address, out m, (uint)Marshal.SizeOf(typeof(MEMORY_BASIC_INFORMATION)));

                    if (m.Protect == AllocationProtectEnum.PAGE_READWRITE)
                    {
                        byte[] buffer = new byte[(int)m.RegionSize];
                        // IntPtr buffer = IntPtr.Zero;
                        ReadProcessMemory(processhandle, m.BaseAddress, buffer, (int)m.RegionSize, out bytesRead);
                        BoyerAlgo(m.BaseAddress, buffer, Scancode, ref addresses);
                    }
                    if (address == (long)m.BaseAddress + (long)m.RegionSize)
                        break;
                    address = (long)m.BaseAddress + (long)m.RegionSize;
                } while (address <= MaxAddress);
            }
        }

Dave Kreskowiak

Недостаточно информации, чтобы рассказать, но я уже привел вам пример того, как сделать что-то очень похожее.

Вот почему вы не должны копировать и вставлять код из интернета. У вас нет знаний, чтобы понять, что делает код, как он это делает, как интегрировать его в свой собственный код и использовать его, и самое главное, как его отлаживать.

HemersonKl

Привет. У меня источник работает правильно. С занятиями и всем прочим. Мне просто нужно, чтобы все было закончено. Make появляется, если браузер 32x или 64x.

Dave Kreskowiak

И я уже говорил вам, как вызывать методы в этом коде. Я не знаю, находится ли этот код в другом проекте Вашего решения, в каком классе он находится,..., ничего.

Мне все равно, сколько раз вы повторяете: "мне нужно, чтобы он появился, если браузер 32x или 64x". Это никогда не изменит моего ответа. Вы не предоставляете достаточно информации, чтобы ответить на вопрос "как это назвать".

Как я уже сказал, я уже приводил вам пример того, как вызывать статические методы в классе. Ты просто предпочитаешь не обращать на это внимания.

О, и это "x86 "или" x64", а не" 32x "или"64x".

HemersonKl

Я понимаю. Не знаю, как лучше объяснить. Разве что в приведенном вами примере он уже есть в исходнике моей программы, просто не знаю, как его использовать для того, что я хочу. = /

Dave Kreskowiak

Я уже говорил вам, в разделе " и вы называете это так:".

Как уже было сказано, у вас нет знаний, чтобы использовать код, скопированный из интернета. Это вещи базового уровня, которые вы не понимаете. Я бы посоветовал взять книгу для начинающих по C# и сначала пройти через нее.

Dave Kreskowiak

Неужели вы действительно думаете, что кто-то собирается скачать неизвестный код из ненадежного источника и "исправить его" для вас? Этого не случится...

HemersonKl

если я сделаю консоль.WriteLine(isbit64); в этой строке в консоли отображается true или false, когда это браузер x86 или 64x. Я хочу, чтобы это значение true или false появилось в текстовом поле. Только я не могу. = /



public void OpenProcessid(int Pid)
{
isbit64 = Is64Bit(Process.GetProcessById(Pid));
processhandle = OpenProcess(процесс.GetProcessById (Pid), ProcessAccessFlags.Все);
Приставка.WriteLine(isbit64);
}

Dave Kreskowiak

Вы не можете присвоить значение свойству Text текстового поля?

Учитывая, что приложение Windows Forms не имеет консоли для записи, я не удивлен, что вы не можете получить это значение в текстовом поле.

HemersonKl

Я не знаю, почему я не могу вызвать текстовое поле в форме для этого. Об ошибке. Я думаю, что попробую использовать

использование системы;
используя системы.Текст;
использование системы.ИО;
использование системы.Окна.Формы;

consoleredirection пространства имен
{
открытый класс TextBoxStreamWriter : TextWriter
{
Текстовое поле _output = нуль;

public TextBoxStreamWriter(вывод текстового поля)
{
_output = выход;
}

public override void Write(char value)
{
база.Запись (значение);
_выход.AppendText(значение.Метод toString());

}

общественного переопределить кодировку кодировки
{
вам { система возврата.Текст.Кодирование.Кодировке utf8; }
}
}
}
Но это тоже класс. Могу ли я выполнять функции этого класса непосредственно в моей форме.cs? Без необходимости использовать этот файл класса? Извините, я знаю, что почти ничего не понимаю. = / но так как нет более простого способа.

Dave Kreskowiak

Вам вообще не нужен этот класс или его код.

Вам просто нужно что-то вроде TextBoxName.Text = "whatever";.

HemersonKl

Ошибка 1 имя "TextBox1" не существует в текущем контексте
Я не могу этого сделать, потому что код находится в классе. cs

Dave Kreskowiak

Вы не должны касаться каких-либо элементов управления пользовательским интерфейсом из ваших неформальных классов.

HemersonKl

ОК. Спасибо за объяснения. Я получил то, что хотел, используя класс, который отображает consolewriteLine в textbox.text content. Возможно, не самый лучший и не самый простой, но он сработал. Так что если браузер 32 бит он показывает False в текстовом поле и следовательно я это делаю =) Я знаю, что, должно быть, усложнил что-то, что может быть намного проще. Но именно так я его и нашел. Благодарю вас. Если есть другой более простой способ, я тоже благодарю вас.


частная BIT64_TextChanged недействительным(объект отправителя, EventArgs в электронной)
{
if (BIT64.Text = = " True")
{

БИТ64.Текст = "64 разрядный";
}

if (BIT64.Текст = = " Ложь")
{

БИТ64.Text = " 32Bits";
}

Dave Kreskowiak

Вау. Это плохо.

HemersonKl

Потому что?

Dave Kreskowiak

С какой стати вы устанавливаете текст на " True "только для того, чтобы код изменил его на" 64bit " в обработчике событий? Почему бы просто не установить текст один раз в более подходящем методе:

    if (is64Bit == true)
    {
        BIT64.Text = "64bit";
    }
    else
    {
        BIT64.Text = "32bit";
    }

Сделано.

Таким образом, вы дважды устанавливаете свойство Text и дважды вызываете событие TextChanged.

HemersonKl

понял. Да, это потому, что textbox. text будет начинаться с текста уже что-то вроде "browser bit", но так как я не буду его использовать, я сделаю так, как вы показали. =)

HemersonKl

Аааа я вспомнила. Я не могу использовать его таким образом. Потому что, когда он не находит ни одного браузера, он не может быть ни 32x, ни 64 ^^ them textbox. text="";

Dave Kreskowiak

Ну и что? Добавьте еще одно заявление if вокруг блока, который я опубликовал.