RegisterClassEx в сборке - PullRequest
       13

RegisterClassEx в сборке

2 голосов
/ 25 октября 2010

Я пытаюсь вручную вызвать Windows API RegisterClassEx без использования структуры WNDCLASS в разделе .data, мне нужно создать эту структуру только с использованием инструкции push.

Может ли кто-нибудь помочь мне в этом, пожалуйста?

Большое спасибо

Ответы [ 3 ]

3 голосов
/ 25 октября 2010

На самом деле вы можете легко делать то, что вы хотите. Вам просто нужно быть осторожным, чтобы правильно рассчитать адреса каждого элемента структуры. Но это тоже легкая задача ...;)

Пожалуйста, проверьте код, который я сделал:

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

Вам просто нужно поместить это перед вызовом CreateWindow.

Любые сомнения просто кричат.

PS .: Помните, что WndProc является циклической процедурой вашей программы сборки

1 голос
/ 25 октября 2010
.data 
    wndclass WNDCLASS
.code
    push offset wndclass
    call RegisterClassEx 

Вы должны сдвинуть его смещение, а не саму структуру

Для локальной переменной нажмите ее адрес

 LOCAL wndclass:WNDCLASS
 lea edx, wndclass
 push edx
 call RegisterClassEx 
0 голосов
/ 25 октября 2010

Reverse push структура в стек, push эффективный адрес первого элемента, call RegisterClassEx, pop структура со стека.

...