Ir ao conteúdo

C++ o que está errado nessa função


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

deixa eu ver se entendir: o ModuleBaseAddress que não estou coneguindo imprimir na tela é o número que o seu programa mostra com o nome de pai?

porque a função GetProcessImageFileNameA só é reconhecida pelo visualstudio?

Postado
34 minutos atrás, Mayrinck Bernardo disse:

porque a função GetProcessImageFileNameA só é reconhecida pelo visualstudio

 

Onde entra o Visual Studio, um IDE, nessa história? Não entra.

 

É só uma função 

 

 

adicionado 3 minutos depois
43 minutos atrás, Mayrinck Bernardo disse:

ModuleBaseAddress que não estou coneguindo imprimir na tela é o número que o seu programa mostra com o nome de pai

 

O pai é apenas isso: um processo que gerou o Thread que criou a janela. E o nome não é o nome dele mas sim o nome do executável, o arquivo que gerou o processo. ModuleBaseAddress é, como imagina, um endereço.

adicionado 13 minutos depois

Para uma lista de módulos de um processo o caminho eu já te disse qual é: CreateToolhelp32Snapshot

HANDLE CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

E lá tem todos os módulos associados ao processo. E aí você chama GetModuleInformation

BOOL GetModuleInformation(
  HANDLE       hProcess,
  HMODULE      hModule,
  LPMODULEINFO lpmodinfo,
  DWORD        cb
);

 

Você rodou este programa que te mostrei?

Postado
20 horas atrás, arfneto disse:

Para uma lista de módulos de um processo o caminho eu já te disse qual é: CreateToolhelp32Snapshot


HANDLE CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

E lá tem todos os módulos associados ao processo. E aí você chama GetModuleInformation


BOOL GetModuleInformation(
  HANDLE       hProcess,
  HMODULE      hModule,
  LPMODULEINFO lpmodinfo,
  DWORD        cb
);

 

Você rodou este programa que te mostrei?

não conseguir tem como mostrar o programa completo ?

Postado
19 horas atrás, arfneto disse:

Você rodou este programa que te mostrei?

 

2 horas atrás, Mayrinck Bernardo disse:

não conseguir tem como mostrar o programa completo ?

?

 

Eu já te mostrei dois. Seguindo as janelas e criando o Snapshot 🤔

 

Rodou os dois? O que não conseguiu fazer?

Postado

eu consegui rodar o programa que voce postou mas nao sei escrever Para uma lista de módulos de um processo eu ainda nao consigo entender bem esses dados typedefs do windows pra mim é complicado saber o caminho e nao conseguir fazer

Postado
3 minutos atrás, Mayrinck Bernardo disse:

eu consegui rodar o programa que voce postou mas nao sei escrever

 

Rodou OS DOIS?

 

Há duas maneiras em geral de percorrer essas listas no Windows e eu te mostrei os dois casos.

 

CASO 1:


um tipo primeiro/próximo como está em 

int             get_process_count()
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    int total_processes = 0;

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        return(-1);
    }
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);
        return(-2);
    }
    do
        total_processes += 1;
    while (Process32Next(hProcessSnap, &pe32));
    CloseHandle(hProcessSnap);
    return(total_processes);
};  // get_process_count()

Essa função faz parte do primeiro programa. Serve apenas para contar quantos processos estão rodando. Mas a técnica é essa aí. No mesmo programa tem uma função
 

	Snapshot* build_snapshot(int estimativa);

que cria uma lista parecida com a que quer. Pode copiar de lá.
 

CASO 2:
 

Usando Callback: no segundo programa que te mostrei tem essa função

	int CALLBACK agente(HWND H, LPARAM P);

Que é usada nesse programa

int main(int argc, char** argv)
{
    DWORD flags = 0;
    int  inherit = 0;
    ACCESS_MASK access = READ_CONTROL;
    HDESK desktop = OpenInputDesktop(flags, inherit, access);
    if (desktop == NULL) return -1;
    EnumDesktopWindows(desktop, agente, 0);
    return 0;
};  // main()

E gera uma lista assim, como sabe se rodou o programa

Window thread:    11436 titulo: 'SP3OSD'
        pai:   11432    Exe: '3DxVirtualLCD.exe'
Window thread:     7008 pai:    7004    Exe: 'TeamViewer.exe'
ndow thread:     7008 pai:    7004    Exe: 'TeamViewer.exe'
Window thread:     9660 titulo: 'C:\Users\toninho\source\repos\chc20-0730-winexe\Debug\chc20-0730-winexe.exe'
        pai:   15156    Exe: 'VsDebugConsole.exe'

...


Window thread:    11388 titulo: 'chc20-0730-winexe - Microsoft Visual Studio'
        pai:    6760    Exe: 'devenv.exe'
Window thread:    11388 pai:    6760    Exe: 'devenv.exe'
indow thread:    15084 titulo: 'G'
        pai:   12252    Exe: 'vctip.exe'
Window thread:     5108 titulo: '.NET-BroadcastEventWindow.4.0.0.0.37a9c05.0'
        pai:   12252    Exe: 'vctip.exe'
WWindow thread:     9488 titulo: 'Microsoft Text Input Application'
        pai:   10852    Exe: 'WindowsInternal.ComposableShell.Experiences.TextInput.InputApp.exe'
Window thread:     9436 pai:    7260    Exe: 'chrome.exe'
Window thread:      568 pai:   11364    Exe: 'Skype.exe'
Window thread:     5212 pai:    3552    Exe: 'hamachi-2-ui.exe'
Window thread:     5212 titulo: 'LogMeIn Hamachi'
        pai:    3552    Exe: 'hamachi-2-ui.exe'
Window thread:    11712 pai:    5132    Exe: 'Plex Media Server.exe'
        pai:   11348    Exe: 'OneDrive.exe'


Onde tem todas as janelas do sistema, com o pai e o executável sempre que tiver um.

 

Não sei o que dizer se você não postar uma dúvida objetiva :( 

 

Em geral são essas as maneiras do Windows. E do Linux. Você vê a lista que quer na documentação. E aí deve cair em um desses dois casos.

Postado

aqui continua dando 0 

 

adicionado 1 minuto depois
#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <psapi.h>

#include "stdio.h"
#include "stdlib.h"
#include <iostream>

using namespace std;

int CALLBACK agente(HWND, LPARAM);
uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName);

int main(int argc, char** argv)
{
    DWORD flags = 0;
    int  inherit = 0;
    ACCESS_MASK access = READ_CONTROL;
    HDESK desktop = OpenInputDesktop(flags, inherit, access);
    if (desktop == NULL) return -1;
    EnumDesktopWindows(desktop, agente, 0);
    return 0;
};  // main()

int CALLBACK agente(HWND H, LPARAM P)
{
    char    buffer[512];
    DWORD   pai;
    LPDWORD pId = &pai;
    int n = GetWindowTextLengthA(H);
    char* titulo = (char*)malloc(1 + n);
    GetWindowTextA(H, titulo, 1 + n);
    DWORD   window_thread = GetWindowThreadProcessId(H, pId);
    ACCESS_MASK access =
        PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ;
    HANDLE hProcess = OpenProcess(access, FALSE, pai);
    if (hProcess == NULL) return -1;
    n = GetProcessImageFileNameA(hProcess, buffer, 512);
    if (n <= 0) return -2;
    char* p = buffer;
    for (int i = n; i > 1; i -= 1)
    {
        if (buffer[i] != '\\') continue;
        p = buffer + i + 1;
        break;
    }   // for()
    if (strlen(titulo) > 0) {
        uintptr_t  moduleBase = GetModuleBaseAddress(window_thread, (const wchar_t*)titulo);
        printf("Window thread: %8d\ntitulo: '%s'\npai:%8d\nExe: '%s'\n' ",
            window_thread, titulo, pai, p);
        std::cout << "base adress " << moduleBase << "\n\n" << std:: endl;
    }
    else {
        printf("Window thread: %8d\tpai:%8d\tExe: '%s'\n",
            window_thread, pai, p);
    }
    free(titulo);
    return 1;
};  // agente()


uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName) {
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp((const wchar_t*)modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

 

Postado

Não sei ao certo o que está tentando fazer, e acho que podia colocar isso dentro de algum contexto.

 

Mas acho que está quase certo.
 

	    uintptr_t  moduleBase = GetModuleBaseAddress(window_thread, (const wchar_t*)titulo);

Entenda que window_thread, como pode imaginar é um... thread. Eu uso nomes assim associados às coisas: é o número do thread que criou a janela. E assim não deve ter módulos associados a ele. E assim não é surpresa que as chamadas falhem. E como você não testa pra ver se elas falharam acaba nisso: um zero.

 

Você não testa nada do que chama. Em especial no caso dessas chamadas a API é um mal negócio: teste TODAS chamadas. E se der erro chame GetLastError() pra ver que m3rd@ foi. E FormatMessage() para ter uma descrição do erro se tiver uma. Em geral dão erro 5 quando dão: falta de privilégios, se me lembro bem.

 

Citação

Você simplesmente segue em frente no programa e assim nunca vai saber onde deu erro. Teste os retornos de TODAS as funções que chama


De volta ao programa


No entanto se a janela tem um pai esse sim deve uma lista de módulos, e cada um deve ter um endereço base e essas coisas descritas aqui:

typedef struct tagMODULEENTRY32W
{
    DWORD   dwSize;
    DWORD   th32ModuleID;       // This module
    DWORD   th32ProcessID;      // owning process
    DWORD   GlblcntUsage;       // Global usage count on the module
    DWORD   ProccntUsage;       // Module usage count in th32ProcessID's context
    BYTE  * modBaseAddr;        // Base address of module in th32ProcessID's context
    DWORD   modBaseSize;        // Size in bytes of module starting at modBaseAddr
    HMODULE hModule;            // The hModule of this module in th32ProcessID's context
    WCHAR   szModule[MAX_MODULE_NAME32 + 1];
    WCHAR   szExePath[MAX_PATH];
} MODULEENTRY32W;
typedef MODULEENTRY32W *  PMODULEENTRY32W;
typedef MODULEENTRY32W *  LPMODULEENTRY32W;

Isso

(const wchar_t*)titulo)

Não existe. Colocar um cast na frente não vai fazer titulo, que é uma string C, char*, virar outra coisa

 

adicionado 22 minutos depois

E não diga que eu não avisei: se você listar isso para todos os processos pode esperar algo da ordem de 10 a 15 mil linhas. 

 

Então faça como eu disse antes: use esses mecanismos para achar ANTES o processo que quer. E liste os módulos só desses que te interessam.

Postado
4 horas atrás, arfneto disse:

Isso


(const wchar_t*)titulo)

Não existe. Colocar um cast na frente não vai fazer titulo, que é uma string C, char*, virar outra coisa

pode me ajudar a fazer isso então?

não to conseguindo

 

#include <stdio.h>
#include <iostream>
#include <string.h>

int main(void)
{
    std::string myString = "Master James";
const char* sz = myString.c_str();
size_t origsizes = strlen(sz) + 1;
const size_t newsizes = 500;
size_t convertedCharP = 0;
wchar_t constTowchar[500];
mbstowcs(&convertedCharP, constTowchar, origsizes, sz, _TRUNCATE);
std::wcout << constTowchar << std::endl;
}

 

Postado

Mas precisa mesmo disso? Está passando o nome de um valor que você já tem para uma estrutura que não vai usar o nome 🤔 que você já tem aí... Não entendo.

 

E cada módulo vai ter seu nome e o nome do executável na estrutura. E o Windows só usa wchar nessas estruturas.

 

Se por alguma razão precisa converter isso, char* para wchar_t*, use algo como

#include <iostream>
#include <wchar.h>
#include <windows.h>
using namespace std;

/*
int MultiByteToWideChar(
    UINT                              CodePage,
    DWORD                             dwFlags,
    _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
    int                               cbMultiByte,
    LPWSTR                            lpWideCharStr,
    int                               cchWideChar
);
*/
using namespace std;
int main(void)
{
    const char* teste = "Valor qualquer";
    wchar_t vetor_wide[200];
    int res = MultiByteToWideChar(65001, MB_PRECOMPOSED,
        teste, -1, vetor_wide, sizeof(vetor_wide));
    cout << "Resultado da conversao " << res <<
        " (Se positivo indica o total de bytes convertidos)" <<
        endl;
    cout << "(char*) '" << 
        teste << "'" << endl;
    wcout << L"(wchar_t) Teste: '"
        << vetor_wide << L"'" << endl;
}

Uma linha só, na verdade.

 

 

Conseguiu listar os módulos afinal?

Postado
6 horas atrás, arfneto disse:

teste TODAS chamadas. E se der erro chame GetLastError() pra ver que m3rd@ foi. E FormatMessage() para ter uma descrição do erro se tiver uma.

tem um exemplo sobre isso?

4 horas atrás, arfneto disse:

Mas precisa mesmo disso? Está passando o nome de um valor que você já tem para uma estrutura que não vai usar o nome 🤔 que você já tem aí... Não entendo.

mas o nome está em char* 

 

gostei muito do conversor que postou mas o que fiz errado?

#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <psapi.h>

#include "stdio.h"
#include "stdlib.h"
#include <iostream>

using namespace std;

int CALLBACK agente(HWND, LPARAM);
uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName);
const wchar_t* converte( char* s);

int main(int argc, char** argv)
{
    DWORD flags = 0;
    int  inherit = 0;
    ACCESS_MASK access = READ_CONTROL;
    HDESK desktop = OpenInputDesktop(flags, inherit, access);
    if (desktop == NULL) return -1;
    EnumDesktopWindows(desktop, agente, 0);
    return 0;
};  // main()

int CALLBACK agente(HWND H, LPARAM P)
{
    char    buffer[512];
    DWORD   pai;
    LPDWORD pId = &pai;
    int n = GetWindowTextLengthA(H);
    char* titulo = (char*)malloc(1 + n);
    GetWindowTextA(H, titulo, 1 + n);
    DWORD   window_thread = GetWindowThreadProcessId(H, pId);
    ACCESS_MASK access =
        PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ;
    HANDLE hProcess = OpenProcess(access, FALSE, pai);
    if (hProcess == NULL) return -1;
    n = GetProcessImageFileNameA(hProcess, buffer, 512);
    if (n <= 0) return -2;
    char* p = buffer;
    for (int i = n; i > 1; i -= 1)
    {
        if (buffer[i] != '\\') continue;
        p = buffer + i + 1;
        break;
    }   // for()
    if (strlen(titulo) > 0) {
        uintptr_t  moduleBase = GetModuleBaseAddress(window_thread, converte(titulo));
        printf("Window thread: %8d\ntitulo: '%s'\npai:%8d\nExe: '%s'\n' ",
            window_thread, titulo, pai, p);
        std::cout << "base adress " << moduleBase << "\n\n" << std::endl;
    }
    else {
        printf("Window thread: %8d\tpai:%8d\tExe: '%s'\n",
            window_thread, pai, p);
    }
    free(titulo);
    return 1;
};  // agente()


uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName) {
    uintptr_t modBaseAddr = 0;
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry;
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

const wchar_t* converte( char* s) {
    wchar_t* vetor_wide;
    vetor_wide = (wchar_t*)malloc(200 * sizeof(char));
    int res = MultiByteToWideChar(65001, MB_PRECOMPOSED, s, -1, vetor_wide, sizeof(vetor_wide));
    return vetor_wide;
    free(vetor_wide);
}

 

Postado
2 horas atrás, Mayrinck Bernardo disse:

tem um exemplo sobre isso?

 

Tem um aí acima... Notou que agente() retorna -1 ou -2 ou 0 ?

 

Veja esse trecho de seu programa. E eu já te falei sobre isso antes
 

image.png.224a6250505920867836e0d3d6a7103c.png

 

FindWindow() retorna um Handle. Você deveria ter testado o que veio. Comparado com INVALID_HANDLE_VALUE para ver se encontrou de fato algo.

 

Mas não fez nada e passou esse valor, 😎 sem olhar, para GetWindowThreadProcessId(). Essa rotina retorna um número, ou zero se o handle for inválido. Só que você não testou e passou o valor direto para GetModuleBaseAddress() que retorna aparentemente um endereço. E a vida segue.

 

Não programe assim com a API do sistema. Só vai perder tempo. Programar com essas coisas do sistema é pouco criativo e bem chato eu acho. É como preencher formulário após formulário. Raramente a gente vai achar um problema nessas funções, ou nunca. Mas elas frequentemente vão achar problemas em nosso código. Quase sempre :( Para minimizar, siga as regras. 

 

GetLastError() retorna um número. Um int. DWORD. Não é porque deu erro. É diferente: é o número do último erro.

 

Se você pegar esse número tem que procurar nas tabelas e hoje em dia é fácil com a internet. Mas se passar o erro para FormatMessage() pode receber uma mensagem em texto, talvez até em seu idioma, explicando o erro. Pode ajudar, ou ao menos dar uma melhor impressão sobre a qualidade de seu programa, mesmo que a mensagem tenha vindo do próprio sistema.

 

Eis um exemplo, oferecido pela própria criadora

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <stdio.h>

void main(void)
{
    LPWSTR pMessage = L"%1!*.*s! %4 %5!*s!";
    DWORD_PTR pArgs[] = { (DWORD_PTR)4, (DWORD_PTR)2, (DWORD_PTR)L"Bill",  // %1!*.*s! refers back to the first insertion string in pMessage
         (DWORD_PTR)L"Bob",                                                // %4 refers back to the second insertion string in pMessage
         (DWORD_PTR)6, (DWORD_PTR)L"Bill" };                               // %5!*s! refers back to the third insertion string in pMessage
    const DWORD size = 100+1;
    WCHAR buffer[size];


    if (!FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY,
                       pMessage, 
                       0,
                       0,
                       buffer, 
                       size, 
                       (va_list*)pArgs))
    {
        wprintf(L"Format message failed with 0x%x\n", GetLastError());
        return;
    }

    // Buffer contains "  Bi Bob   Bill".
    wprintf(L"Formatted message: %s\n", buffer);
}

 

Porque quer passar esse texto para a função? Raramente responde às coisas que te pergunto, mas nesse caso vou perguntar de novo: O que isso vai acrescentar para a função que vai receber isso? Se precisa ver isso porque não grava ou põe na tela antes de ir listar os processos?

 

A função vai listar os módulos e cada um tem seu nome e executável.
 

2 horas atrás, Mayrinck Bernardo disse:

gostei muito do conversor que postou mas o que fiz errado?

 

const wchar_t* converte( char* s) {
    wchar_t* vetor_wide;
    vetor_wide = (wchar_t*)malloc(200 * sizeof(char));
    int res = MultiByteToWideChar(65001, MB_PRECOMPOSED, s, -1, vetor_wide, sizeof(vetor_wide));
    return vetor_wide;
    free(vetor_wide);
}

 

Copiou o que eu escrevi só que não prestou atenção ao que estava mudando.

 

Eu escrevi

    wchar_t vetor_wide[200];

Mas você resolveu alocar na hora...

    wchar_t* vetor_wide;
    vetor_wide = (wchar_t*)malloc(200 * sizeof(char));

Mas podia ter escrito 

    wchar_t* vetor_wide = (wchar_t*)malloc(200 * sizeof(char));

Na hora de chamar a rotina eu tinha escrito

    int res = MultiByteToWideChar(65001, MB_PRECOMPOSED,
        teste, -1, vetor_wide, sizeof(vetor_wide));

Em duas linhas, para não sumir na hora de ler se a janela for menor

Mas você resolveu que era melhor uma linha só

	    int res = MultiByteToWideChar(65001, MB_PRECOMPOSED,s, -1,vetor_wide, sizeof(vetor_wide));

E errou no final, onde não aparecia na minha janela porque vem aquela infame barra de scroll do forum :D que não tem opção de quebrar as linhas de código...

	sizeof(vetor_wide)

Sério? Mas como declarou vetor_wide?

    wchar_t* vetor_wide;

E qual o tamanho disso? 4 ou 8 bytes, o tamanho de um ponteiro... E qual foi o tamanho que declarou? (200 * sizeof(char) Pois é... Está errado

 

E resolveu alocar a string na hora. Então tinha que liberar a memória? Talvez. Mas escreveu:

    return vetor_wide; // ok: primeiro retorna
    free(vetor_wide); // e depois free(). Mas retornou...

Sério? Quando acha que vai rodar free() depois de return? Seu compilador não reclamou?

 

E se por acaso funcionasse que acha que ia acontecer com seu programa que usa esse ponteiro apontando para uma área liberada? E agora tem uma área perdida aí. E uma instrução perdida  também. E porque quer passar esse valor afinal?

 

E ao copiar apagou o comentário que deixei lá... Memorizou os parâmetros?

/*
int MultiByteToWideChar(
    UINT                              CodePage,
    DWORD                             dwFlags,
    _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
    int                               cbMultiByte,
    LPWSTR                            lpWideCharStr,
    int                               cchWideChar
);
*/

Eu não. :) 

 

Conseguiu listar os módulos afinal?

 

 

Postado
3 horas atrás, arfneto disse:

Sério? Quando acha que vai rodar free() depois de return? Seu compilador não reclamou?

meu compilador nem reclamou bem lembrado o return te que ser o ultimo argumento

 

3 horas atrás, arfneto disse:

Eu escrevi


    wchar_t vetor_wide[200];

Mas você resolveu alocar na hora...


    wchar_t* vetor_wide;
    vetor_wide = (wchar_t*)malloc(200 * sizeof(char));

eu entendir que precisava ser assim porcausa que o compilador pede com ponteiro

 

3 horas atrás, arfneto disse:

E ao copiar apagou o comentário que deixei lá... Memorizou os parâmetros?


/*
int MultiByteToWideChar(
    UINT                              CodePage,
    DWORD                             dwFlags,
    _In_NLS_string_(cbMultiByte)LPCCH lpMultiByteStr,
    int                               cbMultiByte,
    LPWSTR                            lpWideCharStr,
    int                               cchWideChar
);
*/

eu nunca usei essa função 

 

3 horas atrás, arfneto disse:

Conseguiu listar os módulos afinal?

infelizmente ainda não, sinto que estou proximo mas estou aprendendo ainda

 

3 horas atrás, arfneto disse:

E qual o tamanho disso? 4 ou 8 bytes, o tamanho de um ponteiro... E qual foi o tamanho que declarou? (200 * sizeof(char) Pois é... Está errado

então como seria o certo? não sou muito acostumado fazer isso

 

Postado
5 minutos atrás, Mayrinck Bernardo disse:

eu entendir que precisava ser assim porcausa que o compilador pede com ponteiro

 

Mas passou o tamanho errado. Entendeu isso?

E podia ter seguido o outro caminho: aloca na primeira função e passa o endereço para a segunda... Sabe aquele operador AddressOf... '&'...

 

6 minutos atrás, Mayrinck Bernardo disse:

então como seria o certo? não sou muito acostumado fazer isso

 

O certo é o que eu escrevi em negrito...

		vetor_wide = (wchar_t*)malloc(200 * sizeof(char));

Se usou esse comando para alocar, qual acha que é o tamanho? Sim, aquilo que está entre os parenteses e que eu repeti em negrito no post... o tamanho de vetor_wide é o tamanho de um ponteiro, mas o tamanho da área alocada foi você que determinou

 

9 minutos atrás, Mayrinck Bernardo disse:

eu nunca usei essa função 

 

Por isso eu deixei o comentário lá. E você, que nunca tinha usado a função, apagou...

 

Conseguiu ou não listar os módulos?

Vai contar porque quer tanto passar essa string para uma função que até onde eu sei não vai usar?

Postado
3 horas atrás, arfneto disse:

Conseguiu ou não listar os módulos?

me ajude aí, tem vários dias tentando...

posta uma solução.

 

3 horas atrás, arfneto disse:

Vai contar porque quer tanto passar essa string para uma função que até onde eu sei não vai usar?

porque nao usaria?

Postado
3 minutos atrás, Mayrinck Bernardo disse:

porque nao usaria?

 

Porque é só o nome do executável associado ao processo pai. Não percebeu que não tem uso para ele na função que está chamando? Você só precisa do número dele.

Postado
3 horas atrás, arfneto disse:

Porque é só o nome do executável associado ao processo pai. Não percebeu que não tem uso para ele na função que está chamando? Você só precisa do número dele.

então se eu a minha função parar de retornar 0 e retornar algo vai retornar o mesmo numero que está saindo na variavel pai? ahsahsha perguntei isso antes

Postado
2 minutos atrás, Mayrinck Bernardo disse:

então se eu a minha função parar de retornar 0 e retornar algo vai retornar o mesmo numero que está saindo na variavel pai? ahsahsha perguntei isso antes

 

Sei lá. Não sei onde começou a dar errado lá.

 

Rodou os DOIS programas que te mostrei? Uma coisa objetiva. Rodou ou não?

 

Se rodou o segundo viu uma lista das janelas e então sabe do que estou falando. Você precisa saber o número do processo pai da janela que está procurando. Só isso.

 

De posse desse número chama sua rotina para listar os módulos relacionados a esse processo. Se listar todos vai ter que procurar por esses em meio a pelo menos umas 5 000 linhas 

  • Curtir 1
Postado

os outros argumentos são como mesmo?

#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <psapi.h>

#include "stdio.h"
#include "stdlib.h"
#include <iostream>

using namespace std;
int             get_process_count()
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    int total_processes = 0;

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        return(-1);
    }
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);
        return(-2);
    }
    do
        total_processes += 1;
    while (Process32Next(hProcessSnap, &pe32))
    GetModuleInformation(hProcessSnap,);
    CloseHandle(hProcessSnap);
    return(total_processes);
};  // get_process_count()

int main()
{
    int a = get_process_count();
    printf("%d",a);
    
    return 0;
}

 

Postado

Não entendi

 

 

adicionado 0 minutos depois

Esse não é o programa que postei aqui

adicionado 2 minutos depois

Esse é só um exemplo da lista de snapshot. Não vai te dar a lista de processos. Deve rodar o que lista as janelas e os executáveis, claro. Com esse só vai conseguir um número: quantos processos estão rodando. E eu te expliquei isso...

Postado
3 horas atrás, arfneto disse:

Esse não é o programa que postei aqui

adicionado 2 minutos depois

Esse é só um exemplo da lista de snapshot. Não vai te dar a lista de processos. Deve rodar o que lista as janelas e os executáveis, claro. Com esse só vai conseguir um número: quantos processos estão rodando. E eu te expliquei isso...

ok vamos la entao

 

if (strlen(titulo) > 0) {
        uintptr_t  m = GetModuleInformation(hProcess);
        if (!m)std::cout << "fail ";
        printf("Window thread: %8d\ntitulo: '%s'\npai:%8d\nExe: '%s'\n' ",
            window_thread, titulo, pai, p);
    }

 

Postado
3 horas atrás, arfneto disse:

 Isso seria o que?

 

Eu te mostrei dois programas. Executáveis sem problemas no Windows. O segundo tinha essa lista de janelas e agora você postou um pedaço. Para que seria isso?

sim verdade mas seus 2 programas nehum printam na tela o module base adress voce so diz que tem o caminho mas nao mostra e eu estou tentando sair do 0 se é que voce entende.

Postado
41 minutos atrás, Mayrinck Bernardo disse:

sim verdade mas seus 2 programas nehum printam na tela o module base adress voce so diz que tem o caminho mas nao mostra e eu estou tentando sair do 0 se é que voce entende

 

Eu já te expliquei um certo número de vezes como fazer.

 

E como usar as ferramentas. E te mostrei dois programas que usam as técnicas. E até um exemplo da saída do segundo do programa pra ajudar a entender. O primeiro é iterativo e usa timers e cursor e cores e daria trabalho para mostrar e explicar aqui, mas te dei até um endereço para copiar o projeto compilável. Só acho que é um programa em C. As chamadas são as mesmas, no entanto.

 

De volta ao seu programa

 

Vou tentar de novo: você pega o programa que lista as janelas e roda em sua máquina. Acha lá o título ou o executável ou a maneira que der pra identificar o processo que te interessa. De volta ao programa usa essa informação para identificar esse processo. De posse do número dele chama a função que lista os módulos, a mesma, usando CreateToolhelp32Snapshot() com a opção de listar os módulos. E navega pela lista mostrando o conteúdo da estrutura MODULEENTRY32 que eu também mostrei pra você. Um dos dados lá é o endereço: modBaseAddr

Postado
11 horas atrás, arfneto disse:

você pega o programa que lista as janelas e roda em sua máquina. Acha lá o título ou o executável ou a maneira que der pra identificar o processo que te interessa. De volta ao programa usa essa informação para identificar esse processo. De posse do número dele chama a função que lista os módulos, a mesma, usando CreateToolhelp32Snapshot() com a opção de listar os módulos.

quando testei 

if (hSnap == INVALID_HANDLE_VALUE)printf("CreateToolhelp32Snapshot error\n\n");

descobrir que todos estão dando erros, mesmo executando como administrador não entendo porque não funciona comigo se fiz tudo certinho mas essa função não ajuda.

a saída:

image.png.02ae474b62b4f45ec6402844cd273172.png

o programa:

#pragma once

#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <psapi.h>

#include "stdio.h"
#include "stdlib.h"

int CALLBACK agente(HWND, LPARAM);

int main(int argc, char** argv)
{
    DWORD flags = 0;
    int  inherit = 0;
    ACCESS_MASK access = READ_CONTROL;
    HDESK desktop = OpenInputDesktop(flags, inherit, access);
    if (desktop == NULL) return -1;
    EnumDesktopWindows(desktop, agente, 0);
    return 0;
};  // main()

int CALLBACK agente(HWND H, LPARAM P)
{
    char    buffer[512];
    DWORD   pai;
    LPDWORD pId = &pai;
    int n = GetWindowTextLengthA(H);
    char* titulo = (char*)malloc(1 + n);
    GetWindowTextA(H, titulo, 1 + n);
    DWORD   window_thread = GetWindowThreadProcessId(H, pId);
    ACCESS_MASK access =
        PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ;
    HANDLE hProcess = OpenProcess(access, FALSE, pai);
    if (hProcess == NULL) return -1;
    n = GetProcessImageFileNameA(hProcess, buffer, 512);
    if (n <= 0) return -2;
    char* p = buffer;
    for (int i = n; i > 1; i -= 1)
    {
        if (buffer[i] != '\\') continue;
        p = buffer + i + 1;
        break;
    }   // for()
    if (strlen(titulo) > 0) {
        printf("Window thread: %8d\ntitulo: '%s'\npai:%8d\nExe: '%s'\n",window_thread, titulo, pai, p);
        HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, window_thread);
        if (hSnap == INVALID_HANDLE_VALUE)printf("CreateToolhelp32Snapshot error\n\n");
    }
    free(titulo);
    return 1;
};  // agente()

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...