views:

55

answers:

3

Hi guys,

I'm trying to manually call RegisterClassEx Windows API without using a WNDCLASS structure on .data section, I need to create this structure only using push instruction.

Could someone help me on that please?

Thanks a lot

A: 

Reverse push the structure to the stack, push the effective address to the first item, call RegisterClassEx, pop the structure off the stack.

Jens Björnhager
+1  A: 
.data 
    wndclass WNDCLASS
.code
    push offset wndclass
    call RegisterClassEx 

You should push its offset, not structure itself

For local variable, push its address

 LOCAL wndclass:WNDCLASS
 lea edx, wndclass
 push edx
 call RegisterClassEx 
Abyx
+3  A: 

In fact you can easily do what you want. You just need to be careful to correctly calculate the addresses of each element of the structure. But this is also an easy task... ;)

Please check out the code I did:

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

You just need to put this before the call to CreateWindow.

Any doubt just shout.

PS.: Remember that WndProc is the loop procedure of your Assembly program

jyzuz