2010-10-25 20 views
2

J'essaie d'appeler manuellement l'API Windows de RegisterClassEx sans utiliser de structure WNDCLASS dans la section .data. Je dois créer cette structure uniquement en utilisant l'instruction push.RegisterClassEx in Assembly

Quelqu'un pourrait-il m'aider s'il vous plaît?

Merci beaucoup

+0

Pourquoi avez-vous besoin d'un assemblage pour cela? – joni

+0

@joni: il n'a pas besoin d'assemblage pour le faire. Il a juste * envie * de le faire dans l'assemblage :) – jyz

+0

Comme l'un d'entre eux "Je suis cool parce que j'écris-win32/64-apps-dans-asm-juste-pour-fun-et-à- apprends quelque chose "-héros, il devrait être capable de comprendre par lui-même alors pour gagner la médaille: P – joni

Répondre

3

En fait, vous pouvez facilement faire ce que vous voulez. Vous devez juste faire attention à calculer correctement les adresses de chaque élément de la structure. Mais cela est aussi une tâche facile ...;)

S'il vous plaît vérifier le code que je l'ai fait:

WinMain: 
    push ebp 
    mov ebp, esp 
    add esp, -50h 

    push 7F00h 
    push 0h 
    call LoadIconA 

    mov ebx, eax 

    push 7F00h 
    push 0h 
    call LoadCursorA 
    ;eax = return of LoadCursorA 
    ;ebx = return of LoadIconA 

    mov dword ptr ss:[ebp-30h], 30h     ;WNDCLASSEX.cbSize,   dd WNDCLASSEX_size 
    mov dword ptr ss:[ebp-2Ch], 3h     ;WNDCLASSEX.style,   dd CS_VREDRAW + CS_HREDRAW 
    mov dword ptr ss:[ebp-28h], WndProc    ;WNDCLASSEX.lpfnWndProc,  dd WndProc 
    mov dword ptr ss:[ebp-24h], 0h     ;WNDCLASSEX.cbClsExtra,  dd NULL 
    mov dword ptr ss:[ebp-20h], 0h     ;WNDCLASSEX.cbWndExtra,  dd NULL 
    mov dword ptr ss:[ebp-1Ch], 0h     ;WNDCLASSEX.hInstance,  dd NULL 
    mov dword ptr ss:[ebp-18h], ebx     ;WNDCLASSEX.hIcon,   dd return of LoadIconA 
    mov dword ptr ss:[ebp-14h], eax     ;WNDCLASSEX.hIconSm,   dd return of LoadCursorA 
    mov dword ptr ss:[ebp-10h], 06h     ;WNDCLASSEX.hbrBackground, dd COLOR_BTNFACE + 1 
    mov dword ptr ss:[ebp-0Ch], 0h     ;WNDCLASSEX.lpszMenuName,  dd NULL 
    mov dword ptr ss:[ebp-08h], offset WndProc  ;WNDCLASSEX.lpszClassName, dd offset of ClassName 
    mov dword ptr ss:[ebp-04h], ebx     ;WNDCLASSEX.hCursor,   dd return of LoadIconA 

    lea eax,[ebp-30h] 
    push eax 
    call RegisterClassEx 

Vous avez juste besoin de mettre avant l'appel à CreateWindow.

Un doute suffit de crier. PS: Rappelez-vous que WndProc est la procédure en boucle de votre programme d'assemblage.

+0

'ss:' n'est pas nécessaire - c'est le registre de segment par défaut pour ebp. – Abyx

+0

@Abyx: oui je sais, juste pour clarification :) – jyz

0

inverse pousser la structure de la pile, poussée l'adresse effective au premier élément, appel RegisterClassEx, pop la structure de la pile.

1
.data 
    wndclass WNDCLASS 
.code 
    push offset wndclass 
    call RegisterClassEx 

Vous devez pousser son se structurer OFFSET, pas

Pour variable locale, pousser son adresse

LOCAL wndclass:WNDCLASS 
lea edx, wndclass 
push edx 
call RegisterClassEx