2017-06-09 7 views
0

Je travaille sur un programme et n'arrive pas à imprimer l'ID de processus du processus. J'ai réussi à récupérer le nom du processus mais lorsque j'imprime l'ID de processus. Ça se montre tout de même. Voici mon code.MASM32 Comment imprimer l'ID de processus à l'aide de PROCESSENTRY32

include \masm32\include\masm32rt.inc 

.data 
    cFmt db "%d",0 
    cfr db 1024 dup(?) 

.code 
ProcessSearch proc 
LOCAL sHndl :DWORD 

    push 0 
    push TH32CS_SNAPPROCESS 
    call CreateToolhelp32Snapshot 

    mov sHndl, eax 

    mov pData.dwSize, sizeof pData 

    push offset pData 
    push sHndl 
    call Process32First 

    push offset pData 
    push sHndl 
    call Process32Next 

    process: 

    push offset pData.th32ProcessID 
    push offset cFmt 
    push offset cfr 
    call wsprintf 

    push offset cfr 
    call StdOut 

    push offset pData 
    push sHndl 
    call Process32Next 
    cmp eax, 0 
    jg process 

    push sHndl 
    call CloseHandle 

    ret 

    ProcessSearch endp 
start: 
     call ProcessSearch 
     call ExitProcess 
end start 

Je n'arrive pas à comprendre pourquoi je ne peux pas imprimer l'ID de processus.

+1

Même si nous le voulions, nous ne pourrions pas déboguer ce code pour vous parce qu'il ne représente pas un [mcve]. Que sont 'cFmt' et' cfr', par exemple? On ne sait pas non plus ce que l'on entend par: * "Cela se manifeste tout de même." * Avez-vous essayé d'utiliser un débogueur pour parcourir le code et voir où il se fourvoie? Visual Studio inclut un excellent débogueur. Ou il y a dans WinDbg inclus gratuitement avec le SDK. Vous ne savez pas si MASM32 est livré avec un débogueur; c'est probablement le cas, vous ne pouvez pas faire de développement d'assemblage sans un! –

+0

Puisque vous utilisez masm, pourquoi n'utilisez-vous pas 'invoke' au lieu de' push/call'? Cela simplifierait beaucoup le code. – Michael

+0

J'ai mis à jour le code avec les valeurs de repsective de cFmt et cfr. Je suis bien conscient de la façon dont invoke peut simplifier mon code. Cependant, j'avais besoin de pratiquer ce genre de style de codage pour les bases. – Pentagon

Répondre

0

Ce serait bien si vous nous avez montré le code complet afin que nous puissions vérifier que vos chaînes/données sont correctes. Même sans cela, je peux voir quelques problèmes:

Process32First récupère des données pour le premier processus, vous devez 1) vérifier la valeur de retour, et 2) imprimer les données, avant d'appeler Process32Next.

wsprintf n'est pas stdcall, vous devriez probablement restaurer la pile avec quelque chose comme lea esp,[esp+12] après l'avoir appelé.

+0

Quand j'utilise stdout dans mon programme. Il ne produit pas ce que je voulais qu'il produise. Cependant, en utilisant wsprintf, je peux spécifier le type de données que j'attends. Je crois que c'est un DWORD mais je n'arrive toujours pas à comprendre comment cela se fait. – Pentagon