Другое С/С++ Вопрос - Ответ

Gabriel__

Известный
Проверенный
411
181
Почему не работает!!!
Это все изза дибильной функции stricmp которая не сравнивает две строки если они одинаковые. (код отлаживал)
Код:
#include <Windows.h>
#include <TlHelp32.h>
....
DWORD GetPID(const char * m_pName)
{
        DWORD m_pID = 0;
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 pInfo;
        pInfo.dwSize = sizeof(PROCESSENTRY32);

        if (Process32First(snapshot, &pInfo))
        {
                while (Process32Next(snapshot, &pInfo))
                {
                        if ( !stricmp( (const char *) m_pName,  (const char *) pInfo.szExeFile) )
                        {
                                m_pID = pInfo.th32ProcessID;
                                CloseHandle(snapshot);
                                return m_pID;
                        }
                }
        }
        CloseHandle(snapshot);
        return m_pID;
}
....
GetPID("smss.exe");
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
И что именно не работает? Я скомпилил, норм всё.
 

Vasiliy77

Известный
22
1
Почему не работает!!!
Это все изза дибильной функции stricmp которая не сравнивает две строки если они одинаковые. (код отлаживал)
Код:
#include <Windows.h>
#include <TlHelp32.h>
....
DWORD GetPID(const char * m_pName)
{
        DWORD m_pID = 0;
        HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
        PROCESSENTRY32 pInfo;
        pInfo.dwSize = sizeof(PROCESSENTRY32);
.................
Код:
void GetPID()
{
    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pInfo;// тут хранится запись о текущем процессе
    pInfo.dwSize = sizeof(PROCESSENTRY32);// размер структуры записи текущего процесса

    if (Process32First(snapshot, &pInfo))
    {
        while (Process32Next(snapshot, &pInfo))
        {
            if (_stricmp(m_pName, pInfo.szExeFile) == 0)
            {
                m_pID = pInfo.th32ProcessID;
                CloseHandle(snapshot);
                return;
            }
        }
    }
    CloseHandle(snapshot);
    m_pID = 0;
}
void Open(DWORD accessRights)
{
    GetPID();
    m_hProc = OpenProcess(accessRights, false, m_pID);
}
DWORD getPID(){ return m_pID; }
 

Vasiliy77

Известный
22
1
@Vasiliy77, тебе нужно получить базовый адрес модуля в процессе.
это можно сделать с помощью такой функции:
C++:
#include <string.h>
#include <TlHelp32.h>

HMODULE getModuleHandleRemote(DWORD processId, const char* moduleName)
{
   HANDLE snap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);
   if (snap == INVALID_HANDLE_VALUE)
     return NULL;
   MODULEENTRY32 moduleEntry;
   moduleEntry.dwSize = sizeof(moduleEntry);
   bool found = Module32First(snap, &moduleEntry) == TRUE;
   while (found)
   {
     if (stricmp(moduleEntry.szModule, moduleName) == 0)
       return CloseHandle(snap), moduleEntry.hModule;
     found = Module32Next(snap, &moduleEntry) == TRUE;
   }
   CloseHandle(snap);
   return NULL;
}
Спасибо, все получилось. А как можно узнать какие клео скрипты уже загружены в память? В каком участке памяти это есть? Нужны особенно те скрипты, которые делают WriteMemory в процесс.
 

Goldfish

Известный
106
22
подскажите плиз где найти задачки с примерами среднего уровня по ООП C++
 

Gabriel__

Известный
Проверенный
411
181
И что именно не работает? Я скомпилил, норм всё.
Сказал же _stricmp нихрена не работает! Строки одинаковые но выдает что они разные!
d77b4138d112.jpg

Наверное это все изза вот такого преобразования
_stricmp(m_pName, (char *) pInfo.szExeFile) == 0
Без вот этого ---
Ошибка компиляции.
error C2664: _stricmp: невозможно преобразовать параметр 2 из "WCHAR [260]" в "const char *"
Код:
DWORD GetPID()
{
    DWORD m_pID = 0;
    char * m_pName = "smss.exe";

    HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pInfo;// тут хранится запись о текущем процессе
    pInfo.dwSize = sizeof(PROCESSENTRY32);// размер структуры записи текущего процесса

    if (Process32First(snapshot, &pInfo))
    {
        while (Process32Next(snapshot, &pInfo))
        {
            if (_stricmp(m_pName, (char *) pInfo.szExeFile) == 0)
            {
                m_pID = pInfo.th32ProcessID;
                CloseHandle(snapshot);
                return m_pID;
            }
        }
    }
    CloseHandle(snapshot);
    return m_pID;
}
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
В свойствах проекта установи набор символов из многобайтовой кодировки.
 
  • Нравится
Реакции: Gabriel__

Gabriel__

Известный
Проверенный
411
181
Как проверить что хендл или указатель рабочие ? Тоесть на что они указывают существует.
 

01EG

Известный
Проверенный
631
344
Извините прям, ну вот совсем за такой уебанский вопрос. Что нужно добавлять в исходник кода, чтоб консоль не закрывалась сразу после выполнения кода. Т.е. даже самый простой пример, я вывожу текст Hello, World ! И даже не успеваю его прочитать, как консоль закрывается. Или считаю числа и не успеваю посмотреть ответ между подсчетами. Короче сабж.
Пример кода:
C++:
#include "stdafx.h"
#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The sum of " << v1 << " and " << v2
              << " is " << v1 + v2 << std::endl;
    return 0;
}
Код все норм дебажится и запускается консоль.
Вот кстати код дебага:
Код:
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Users\Oleg\Documents\Visual Studio 2013\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe'. Symbols loaded.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcp120d.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcr120d.dll'. Cannot find or open the PDB file.
The program '[3384] ConsoleApplication1.exe' has exited with code 0 (0x0).

P.S. Microsoft Visual Studio 2013 (последний Pack)
 

BlackKnigga

Известный
BH Team
922
443
Извините прям, ну вот совсем за такой уебанский вопрос. Что нужно добавлять в исходник кода, чтоб консоль не закрывалась сразу после выполнения кода. Т.е. даже самый простой пример, я вывожу текст Hello, World ! И даже не успеваю его прочитать, как консоль закрывается. Или считаю числа и не успеваю посмотреть ответ между подсчетами. Короче сабж.
Пример кода:
C++:
#include "stdafx.h"
#include <iostream>

int main()
{
    std::cout << "Enter two numbers:" << std::endl;
    int v1 = 0, v2 = 0;
    std::cin >> v1 >> v2;
    std::cout << "The sum of " << v1 << " and " << v2
              << " is " << v1 + v2 << std::endl;
    return 0;
}
Код все норм дебажится и запускается консоль.
Вот кстати код дебага:
Код:
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Users\Oleg\Documents\Visual Studio 2013\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe'. Symbols loaded.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\ntdll.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\kernel32.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\KernelBase.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcp120d.dll'. Cannot find or open the PDB file.
'ConsoleApplication1.exe' (Win32): Loaded 'C:\Windows\System32\msvcr120d.dll'. Cannot find or open the PDB file.
The program '[3384] ConsoleApplication1.exe' has exited with code 0 (0x0).

P.S. Microsoft Visual Studio 2013 (последний Pack)
Инклудь cstdlib и в конец System("Pause");
 
  • Нравится
Реакции: 01EG

01EG

Известный
Проверенный
631
344
Инклудь cstdlib и в конец System("Pause");
Бесит, что в учебнике не сказано, так делать. После таких глупостей, просто хочеться плюнуть в лицо автору учебника. Просто после таких ошибок, ты сидишь и думаешь, какого фига консоль закрывается ? Вроде бы все хорошо написал в коде, но бац тут такая фигня, автор учебника просто забыл сказать это. Учебник 2013.
В любом случаи спасибо за помощь.
 

Gabriel__

Известный
Проверенный
411
181
_getch() - Файл conio.h
system("pause") - Файл iostream для VS
system("pause") - Файл cstdlib для GCC
 
  • Нравится
Реакции: 81x08