PDA

Просмотр полной версии : [C++]Получение данных из оперативной памяти


h01der
13.06.2009, 17:17
Программа считывает матрицу из файла и записывает все данные в динамический массив.У кого нибудь есть ли идеи как получить эти данные(матрицу считанную из файла) из оперативной памяти?

.ATK
13.06.2009, 17:21
а что тут получать? у тебя есть имя массива. &array[0] - адрес на первый элемент массива в оперативной памяти) на второй ты догодываешься какой будет?

h01der
13.06.2009, 17:22
Я не знаю размерность массива.

Kaimi
13.06.2009, 17:35
А sizeof не помогает узнать размер?

Ra$cal
13.06.2009, 17:51
только в момент компиляции.

Irdis
13.06.2009, 18:13
А допустим я хочу прочитать какой-то определенный сектор памяти, и запихнуть его в массив.
Ни кто не знает как это сделать.
Ведь нельзя самому задавать адреса.

razb
13.06.2009, 18:20
Программа считывает матрицу из файла и записывает все данные в динамический массив.
Ну дк в чем проблема обратится к этому массиву?
Я не знаю размерность массива.
Что значит не знаю? Она же вычисляется каким то образом.

h01der
13.06.2009, 18:23
Ну вообще,все немного сложнее.Файл делится на несколько кусков,программа берет кусок из файла,записывает его в массив,потом я должен считать этот массив,в итоге я должен собрать все эти массивы в один.

Fata1ex
13.06.2009, 18:26
Динамические типы данных для этого и созданы. Разве нет?
Как получить динамические данные? Через указатель получаешь первый элемент, второй будет указатель + 1... сформулируй проблему точнее.

h01der
13.06.2009, 18:30
Нет,это я прекрасно понимаю)

h01der
13.06.2009, 18:52
Как определить размер массива в который я буду складывать куски,вот в чем вопрос.
Пока у меня одна идея,считать кол-во элементов файла.Может быть у вас есть другие идеи?

razb
13.06.2009, 19:01
Ну есть же прекрасный vector, чем он тебе не подходит? считал данные из файла загнал в вектор, потом обрабатываешь, зачем еще над чем то заморачиватся )

Chaak
13.06.2009, 19:03
int SizeOfFile(FILE * file)
{
int size;
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
return size;
}

h01der
13.06.2009, 19:16
Chaak,мою идею реализовал?

Fata1ex
13.06.2009, 19:22
Это извращение, зачем упрямо обходить преимущества языка. Смотри в сторону векторов.

Ra$cal
13.06.2009, 19:44
Ну вообще,все немного сложнее.Файл делится на несколько кусков,программа берет кусок из файла,записывает его в массив,потом я должен считать этот массив,в итоге я должен собрать все эти массивы в один.

у тебя что, отделены эти функции, и к первой ты не имеешь отношения? Т.е. ктото за тебя считывает кусок и грузит, а ты должен загруженный переформировать в массив? Если да, то задача уебищна по определению. Если нет - то перепиши все более логично, чтобы считывание делалось в массив или вектор, как уже отмечали. Работа с массивом, заданным чистым указателем все таки минное поле, которого лучше избегать.

ss88
13.06.2009, 19:59
Программа считывает матрицу из файла и записывает все данные в динамический массив.У кого нибудь есть ли идеи как получить эти данные(матрицу считанную из файла) из оперативной памяти?
Если ты это пишешь на С, то ты можеш обойтись стандартным размером буффера(заранее заданным),а, если твои данные в него не влезут, то сделать realloc твоего буффера и будет тебе счастье... Не понимаю, зачем создавать дл ятаких вопросов отдельные темы?

h01der
13.06.2009, 20:13
Обрати внимание на название темы и не ленись читать полностью тему,раз решил отписаться

Gar|k
14.06.2009, 14:39
2 Irdis
Чтение из памяти процесса.

#pragma comment(linker,"/MERGE:.rdata=.data")
#pragma comment( linker, "/MERGE:.text=.data" )
#pragma comment(linker,"/FILEALIGN:512 /SECTION:.text,EWR /IGNORE:4078")
#pragma comment(linker,"/ENTRY:New_WinMain")
#pragma comment(linker,"/NODEFAULTLIB") // раскоменть в релизе
#pragma comment(linker, "/SUBSYSTEM:WINDOWS" )
#pragma comment(linker, "/INCREMENTAL:NO" ) // раскоменть в релизе
#pragma optimize( "gsy", on )
#pragma comment(linker, "/opt:nowin98")

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


char szExE[]="magent.exe";
DWORD thPID=-1;
//DWORD BaseSize=0;
//DWORD BaseAddr;


// пишем функцию ищущую процесс по его имени
DWORD GetPIDbyNameExe(char *lpExe)
{
HANDLE hSH;
PROCESSENTRY32 pe32;

hSH=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

// закоменть потом после отладки
if(hSH==INVALID_HANDLE_VALUE)
{
MessageBox(0, "CreateToolhelp32Snapshot", NULL, MB_OK|MB_SETFOREGROUND);
return -1;
}

pe32.dwSize=sizeof(PROCESSENTRY32);
if( !Process32First( hSH, &pe32 ) )
{
MessageBox(0, "Process32First", NULL, MB_OK|MB_SETFOREGROUND);
goto closesh;
}

do{
if(!strcmp(pe32.szExeFile,lpExe))
{

CloseHandle(hSH);
return pe32.th32ProcessID;
}

}while(Process32Next(hSH,&pe32));



closesh:
CloseHandle(hSH);
return -1;
}

/* получает базовый адрес памяти экзешника и размер в памяти
BOOL SetImageBase( DWORD dwPID )
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;

hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwPID );
if( hModuleSnap == INVALID_HANDLE_VALUE ) { return( FALSE ); }

me32.dwSize = sizeof( MODULEENTRY32 );

if( !Module32First( hModuleSnap, &me32 ) )
{
CloseHandle( hModuleSnap );
return( FALSE );
}


BaseAddr=(DWORD)me32.modBaseAddr;
BaseSize=me32.modBaseSize;

CloseHandle( hModuleSnap );
return( TRUE );
}
*/


void New_WinMain(void)
{
unsigned char *mem;
DWORD st_addr=0x011B2000;
HANDLE hProcess;
HFILE f;

if((thPID=GetPIDbyNameExe((char *)&szExE))==-1){ExitProcess(1); }

hProcess=OpenProcess(PROCESS_VM_READ,FALSE,thPID);

mem=(unsigned char *)LocalAlloc(LPTR,4096);

ReadProcessMemory(hProcess,(LPCVOID)st_addr,mem,40 96,NULL);

f=_lcreat("d.txt", 0);
_lwrite(f,(LPCCH)mem,4096);
_lclose(f);

LocalFree(mem);
CloseHandle(hProcess);

ExitProcess(0);
}

_Great_
18.06.2009, 09:27
Говнокод детектед!

Gar|k
18.06.2009, 14:16
2 _Great_ ? чей.... если мой то как по правильному