Pobieranie nazwy zmapowanego pliku po adresie

0

Napisałem sobie program, który ma za zadanie wykryć, zaalokowane strony, policzyć je, i wyświetlić nazwy zmapowanych plików jeżeli takie są.

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <Windows.h>
#include <Psapi.h>

using namespace std;

int main (int argc, char **argv)
{
	/*
	if (argc == 1)
	{
		fprintf (stderr, "Nie podales pid\n");
		system ("pause");
		return 1;
	}


	HANDLE proc = OpenProcess (PROCESS_VM_READ, false, atoi(argv[1]));

	if (proc == 0)
	{
		fprintf (stderr, "Nie ma takiego procesu\n");
		system ("pause");
		return 2;
	}

	*/

	HANDLE proc = OpenProcess (PROCESS_VM_READ, false, GetCurrentProcessId());

	cout << "Pid processu to: " << GetCurrentProcessId() << endl;
	system ("pause");

	int result;
	int pointer;
	char data[0x1000];
	int datar;
	MEMORY_BASIC_INFORMATION info;
	unsigned long int page_count_read = 0;
	for (pointer = 0; pointer<0xFFFFFFFF; pointer += 0x1000)
	{
		result = ReadProcessMemory (proc, (PVOID)pointer, data, 0x1000, (SIZE_T *)&datar);
		if (result == true && datar>0) {
		    ++page_count_read;
		    if (VirtualQuery ((PVOID)pointer, &info, sizeof(info)))
		    {
                if (info.Type == MEM_MAPPED)
                {
                    result = GetMappedFileNameA (proc, (LPVOID)pointer, data, 0x1000);
                    data[result] = '\0';
                    printf ("%s\r\n", data);
                } 
		    }
            }
		printf ("Przeczytano: powodzenie: %d Wszystkie: %d Czytam adres: 0x%x\r", page_count_read, (unsigned long int)(pointer/0x1000), pointer);


	}

	CloseHandle (proc);

	system ("pause");
	return 0;
}

I tu pojawia się problem. Mianowicie, jakoś nie widzę, żeby ani jednego nie było zmapowanego pliku (albo gdzieś popełniam błąd), ale nawet sama binarka pliku powinna być zmapowana i wyświetlona. Co jest nie tak w moim kodzie?

0

Po pierwsze program nigdy nie wyjdzie z pętli, test <0xffffffff nie przejdzie tylko dla wartości -1. Po drugie nie używaj printf("\r\n"), powoduje to wypisanie w systemie windows znaków "\r\r\n", '\n' zawsze jest znakiem nowej linii i wypisywany jest w postaci odpowiedniej dla danego systemu. Choć dlaczego nie działa to nie wiem bo nawet przetestować nie mogę.

0

MEMORY_BASIC_INFORMATION.Type to suma flag bitowych, nie pojedyncza flaga (a przynajmniej nie zawsze), polecam dokumentację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1