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 éprouvé

    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
    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 averti
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    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 éprouvé

    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
    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 éprouvé

    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ 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