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

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by h01der, 13 Jun 2009.

  1. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Программа считывает матрицу из файла и записывает все данные в динамический массив.У кого нибудь есть ли идеи как получить эти данные(матрицу считанную из файла) из оперативной памяти?
     
  2. .ATK

    .ATK Active Member

    Joined:
    20 Feb 2009
    Messages:
    143
    Likes Received:
    111
    Reputations:
    9
    а что тут получать? у тебя есть имя массива. &array[0] - адрес на первый элемент массива в оперативной памяти) на второй ты догодываешься какой будет?
     
  3. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Я не знаю размерность массива.
     
  4. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    811
    Reputations:
    231
    А sizeof не помогает узнать размер?
     
    _________________________
  5. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    только в момент компиляции.
     
  6. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    А допустим я хочу прочитать какой-то определенный сектор памяти, и запихнуть его в массив.
    Ни кто не знает как это сделать.
    Ведь нельзя самому задавать адреса.
     
    1 person likes this.
  7. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Ну дк в чем проблема обратится к этому массиву?
    Что значит не знаю? Она же вычисляется каким то образом.
     
  8. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Ну вообще,все немного сложнее.Файл делится на несколько кусков,программа берет кусок из файла,записывает его в массив,потом я должен считать этот массив,в итоге я должен собрать все эти массивы в один.
     
  9. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Динамические типы данных для этого и созданы. Разве нет?
    Как получить динамические данные? Через указатель получаешь первый элемент, второй будет указатель + 1... сформулируй проблему точнее.
     
  10. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Нет,это я прекрасно понимаю)
     
  11. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Как определить размер массива в который я буду складывать куски,вот в чем вопрос.
    Пока у меня одна идея,считать кол-во элементов файла.Может быть у вас есть другие идеи?
     
  12. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Ну есть же прекрасный vector, чем он тебе не подходит? считал данные из файла загнал в вектор, потом обрабатываешь, зачем еще над чем то заморачиватся )
     
    1 person likes this.
  13. Chaak

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    PHP:
    int SizeOfFile(FILE file)
    {
        
    int size;                
        
    fseek(file,0,SEEK_END);    
        
    size ftell(file);    
        
    rewind(file);
        return 
    size;
    }
     
  14. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Chaak,мою идею реализовал?
     
  15. Fata1ex

    Fata1ex Elder - Старейшина

    Joined:
    12 Dec 2006
    Messages:
    703
    Likes Received:
    300
    Reputations:
    38
    Это извращение, зачем упрямо обходить преимущества языка. Смотри в сторону векторов.
     
  16. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    у тебя что, отделены эти функции, и к первой ты не имеешь отношения? Т.е. ктото за тебя считывает кусок и грузит, а ты должен загруженный переформировать в массив? Если да, то задача уебищна по определению. Если нет - то перепиши все более логично, чтобы считывание делалось в массив или вектор, как уже отмечали. Работа с массивом, заданным чистым указателем все таки минное поле, которого лучше избегать.
     
  17. ss88

    ss88 Banned

    Joined:
    27 Nov 2008
    Messages:
    160
    Likes Received:
    44
    Reputations:
    5
    Если ты это пишешь на С, то ты можеш обойтись стандартным размером буффера(заранее заданным),а, если твои данные в него не влезут, то сделать realloc твоего буффера и будет тебе счастье... Не понимаю, зачем создавать дл ятаких вопросов отдельные темы?
     
  18. h01der

    h01der New Member

    Joined:
    17 Feb 2009
    Messages:
    12
    Likes Received:
    2
    Reputations:
    0
    Обрати внимание на название темы и не ленись читать полностью тему,раз решил отписаться
     
  19. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    2 Irdis
    Чтение из памяти процесса.

    Code:
    #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,4096,NULL);
    
    f=_lcreat("d.txt", 0);
    _lwrite(f,(LPCCH)mem,4096);
    _lclose(f);
    
    LocalFree(mem);
    CloseHandle(hProcess);
    
    ExitProcess(0); 
    }
     
    _________________________
  20. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Говнокод детектед!