IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

Lire les items d'une SyslistView32 d'un autre process


Sujet :

Windows

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut Lire les items d'une SyslistView32 d'un autre process
    Bonjour,

    J'ai trouvé le code suivant qui permet de faire ce que je veut (http://mail.python.org/pipermail/pyt.../004691.html):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #define WIN32_LEAN_AND_MEAN
    #include <stdio.h>
    #include <windows.h>
    #include <commctrl.h>
    
    int main(void) {
     HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
     HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);
    
     int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
     int i;
    
     LVITEM lvi, *_lvi;
     char item[512], subitem[512];
     char *_item, *_subitem;
     unsigned long pid;
     HANDLE process;
    
     GetWindowThreadProcessId(listview, &pid);
     process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
                         PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);
    
     _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
                                  MEM_COMMIT, PAGE_READWRITE);
     _item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
                                 PAGE_READWRITE);
     _subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
                                    PAGE_READWRITE);
    
     lvi.cchTextMax=512;
    
     for(i=0; i<count; i++) {
      lvi.iSubItem=0;
      lvi.pszText=_item;
      WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
      SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
    
      lvi.iSubItem=1;
      lvi.pszText=_subitem;
      WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
      SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);
    
      ReadProcessMemory(process, _item, item, 512, NULL);
      ReadProcessMemory(process, _subitem, subitem, 512, NULL);
    
      printf("%s - %s\n", item, subitem);
     }
    
     VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
     VirtualFreeEx(process, _item, 0, MEM_RELEASE);
     VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);
    
     return 0;
    }
    Je l'ai retranscris en python et cela fonctionne sans problemes. Mais quand j'essaie de l'utiliser ds un programme en C++ cela ne marche pas : je n'ai que la premiere lettre du texte ! Est-ce que qqn sait d'ou cela vient ? une piste ou qqch ?

    Pour info j'utilise la version express de Visual C++ 2005.

    Merci d'avance.

  2. #2
    mat.M
    Invité(e)
    Par défaut
    A tout hasard mettre 512+1 à ReadProcessMemory...c'est parfois des trucs bêtes comme cela parce que le buffer est juste suffisant

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    comme par hasard j'étais sur le même problème donc voici une portion du code qui fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     HANDLE hProcess;
     LVITEM* pLVITEM;
     LPTSTR pszText;
     LPTSTR pcLocalText[MAX_PATH];
    
     SIZE_T ExchangedSize;
        SIZE_T MaxTextSize=MAX_PATH;
    DWORD dwProcessId = 0;
    
    DWORD dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
    //Debug
    {
    	DWORD dwThisProcessId = GetCurrentProcessId();
    	DWORD dwThisThreadId = GetCurrentThreadId();
    }
    
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId);
    if(hProcess==NULL)
    	MessageBox(NULL,TEXT("Process not open"),TEXT(""),MB_OK);
    
    
    pLVITEM=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
        if (!pLVITEM)
    	{	_tprintf(_T("Error Virtual VirtualAllocEx LVITEM"));
            CloseHandle(hProcess);
            }
    
        pszText=(LPTSTR)VirtualAllocEx(hProcess, NULL, MaxTextSize, MEM_COMMIT, PAGE_READWRITE);
        if (!pszText)
        {_tprintf(_T("Error Virtual VirtualAllocEx MaxTextSize"));
            VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);
            CloseHandle(hProcess);
        }
    
    	BYTE* pb=new BYTE[sizeof(LVITEM)];
        memset(pb,0,sizeof(LVITEM));
    
    	WriteProcessMemory(hProcess, pLVITEM,pb, sizeof(LVITEM), &ExchangedSize);
    	    
    	//pLVITEM->cchTextMax=Size;
        WriteProcessMemory(hProcess, &(pLVITEM->cchTextMax),(LPCVOID)&MaxTextSize, sizeof(int), &ExchangedSize);
    
        // pLVITEM->pszText=pszText;
        WriteProcessMemory(hProcess, &(pLVITEM->pszText),&pszText, sizeof(char*), &ExchangedSize);
    int SubItemIndex=0;
    int iNbRow=ListView_GetItemCount(hwnd);
    
    for (int ItemIndex=0;ItemIndex<iNbRow;ItemIndex++)
        {
     WriteProcessMemory(hProcess, &(pLVITEM->iSubItem),(LPCVOID)&SubItemIndex, sizeof(int), &ExchangedSize);
    
    	LRESULT lResult;
    	LONG LRet;
    	lResult=SendMessage(hwnd,      // handle to destination control
                (UINT) LVM_GETITEMTEXT,   // message ID
                (WPARAM) ItemIndex,       // = (WPARAM) (int) iItem;
                (LPARAM) pLVITEM          // = (LPARAM) (LPLVITEM) pitem;
                );  
    
       
     if (lResult>0)
                {
    				///////////////////////////////////////////////////////////////////
                    // read remote process memory containing data
                    ///////////////////////////////////////////////////////////////////
    				int sizelocaltext=60;
    				if (ReadProcessMemory(hProcess,pszText,pcLocalText, 100,&ExchangedSize))
                    {
                        LPTSTR gt=(LPTSTR)pcLocalText;
    					wprintf(gt);
    					wprintf(_T("\n"));
    						}
    				else
    				{LRet=GetLastError();
    				wprintf(_T("Read Error, Error Code:%d,   ",LRet));
    				}
    				} 
     else
    	 _tprintf(_T("Nein"));
    	}
       VirtualFreeEx(hProcess,pLVITEM,0,MEM_RELEASE);
        VirtualFreeEx(hProcess,pszText,0,MEM_RELEASE);
        CloseHandle(hProcess);
    J'en profite pour présenter mon problème actuel puisque c'est dans le même contexte. La listview a une imagelist, je veux la changer par man imagelist, quelqu'un peut m'aider.

  4. #4
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    Et bien merci beaucoup
    Ca fonctionne :d
    par contre jcomprend pas pkoi mon portage en python lui fonctionne et pas le code original ^^.

    Par contre aucune idée pour ton soucis :s.
    Ouvre un autre topic ptet stu veux que qqn vois ta question

  5. #5
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 121
    Points : 127
    Points
    127
    Par défaut
    En fait jai remarqué que ça provenait du type de la chaine de caractere dans laquelle ReadProcessMemory ecris ^^.
    En fait c'est une chaine wchar_t ce qui explique qu'avec un printf tout bete on n'ai que la premiere lettre.
    avec wprintf c'est ok.

    Pour transformer le wchar_t en char j'ai trouvé cette fonction qui fonctionne parfaitement :
    void strcpy_wc(char *Dest, wchar_t *Src)
    {
    while (*Src)
    {
    *Dest++ = *Src++;
    }
    *Dest = 0;
    }

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ceci ne marche que pour le charset ISO-8859-1 (souvent employé sous *nix). Les caractères spécifiques au charset Windows-1252 (comme le symbole Euro) seront perdus (remplaçés par d'autres)...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment lire les propriétés d'une imprimante ?
    Par zidenne dans le forum Langage
    Réponses: 18
    Dernier message: 06/08/2010, 11h26
  2. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  3. changer l'imagelist d'une SyslistView32 d'un autre process
    Par foued_scorpion dans le forum Windows
    Réponses: 5
    Dernier message: 03/11/2006, 10h42
  4. lire les indexes dans une stringGrid
    Par zidenne dans le forum Composants VCL
    Réponses: 1
    Dernier message: 01/12/2005, 15h15
  5. [VB+Lotus Notes] Lire les données d'une DB Lotus
    Par kenn dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 25/08/2005, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo