Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   CreateWindowEx stack overrun? (https://www.delphipraxis.net/169173-createwindowex-stack-overrun.html)

sansimarkus 3. Jul 2012 14:51

CreateWindowEx stack overrun?
 
Moin,

es geht um folgenden Code:
Delphi-Quellcode:
ZeroMemory(@wcex,sizeof(wcex));
 with wcex do
  begin
   cbSize       := SizeOf(wcex);
   style        := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
   lpfnWndProc  := @wndproc;
   hInstance    := SysInit.HInstance;
   hCursor      := LoadCursor(0,IDC_ARROW);
   lpszClassName := PChar(settings.sWindowClassName);
   hbrBackground := 1;
  end;
 if RegisterClassEx(wcex) = 0 then
  raise EREGISTERCLASSEX.create({$IFDEF DEBUG}'RegisterClassEx(wcex) failed '+inttostr(getlasterror)+'(GLE)'{$ENDIF});

 case settings.rResolution.rScreenMode of  // = smWINDOWEDREGULAR
  smFSCRN:
    ;
  smWINDOWEDREGULAR:
   begin
    dwExStyle:=WS_EX_APPWINDOW or WS_EX_WINDOWEDGE;
    dwStyle:=WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;
    AdjustWindowRectEx(WindowRect,dwStyle,false,dwExStyle);
   end;
  smWINDOWEDNOBORDER:
   ;
  smFSCRNWINDOWED:
   ;
 end;


 asm
   int 3 // bis hierhin komme ich
 end;
 // mit F7 springt er dann weiter in die winapi.pas
 _hWnd:=CreateWindowEx(dwExStyle,
                       PChar(settings.sWindowClassName),
                       PChar(settings.sWindowCaption),
                       dwStyle,
                       WindowRect.Left,
                       WindowRect.Top,
                       WindowRect.Width,
                       WindowRect.Bottom,
                       0,0,HInstance,nil);
 // bis hierhin kommt er nicht mehr, im debuglog von XE2 steht ein fehler siehe unten
 if _hWnd = 0 then
  raise ECREATEWND.create({$IFDEF DEBUG}'CreateWindowEx failed '+inttostr(getlasterror)+'(GLE)'{$ENDIF});
 ShowWindow(_hWnd, SW_SHOW);
 SetForegroundWindow(_hWnd);
 asm
   int 3
 end;
Der Debug Output:

Code:
Non-user Breakpoint at $0048B82D. // der int3 breakpoint vor createwindowex
STATUS_STACK_BUFFER_OVERRUN encountered

Process dx11test.exe (1456)
Non-user Breakpoint at $7546FF9A.
Die addresse vom letzten Breakpoint zeigt er mir auch im debugger an:
7546FF9A C745FCFEFFFFFF mov [ebp-$04],$fffffffe

Das ganze ist in einem try..except block, aber bis zum except kommt er auch nicht.

Wenn ich es schaffe mit F7 nicht automatisch im CPU-Viewer zu landen (scheint glückssache zu sein ob der CPUviewer aufgeht oder nicht) dann hängt sich mein DelphiXE2 bei meiner WndProc funktion auf, bis die er steppt nachdem er aus der winapi.pas raus kommt. Die WndProc funktion sieht so aus:

Delphi-Quellcode:
implementation
var
 myclassinstance: TMyClass;

function WndProc(i_hWnd:HWND;i_Message:LongWord;i_wParam:WPARAM;i_lParam:LPARAM):LResult;
begin
  result := myclassintance.WndProcEx(i_hWnd, i_Message, i_wParam, i_lParam);
end;

function TMyClass.WndProcEx(i_hWnd:HWND;i_Message:LongWord;i_wParam:WPARAM;i_lParam:LPARAM):LResult;
begin
  result := DefWindowProc(i_hWnd, i_Message, i_wParam, i_lParam);
end;
Selbes Resultat wenn ich die funktionen einfach leer lasse.


Jetzt das interessante: wenn ich als 64Bit kompiliere geht es einwandfrei ohne jegliche Änderung oder irgendwelchen {$IFDEF WIN64}'s (die int 3's mal außen vor).

Ich bin völlig ratlos.

EWeiss 3. Jul 2012 15:29

AW: CreateWindowEx stack overrun?
 
Blicke durch deinen Code nicht durch..
Aber die Meldung sagt ja schon das ein Stack Überlauf aufgetreten ist.

Also ruft sich irgend etwas bei deiner Window erstellung immer wieder selbst auf.
So das du in einer Endlosschleife hängst.

Aber die Namensgebung ist sowas außerhalb der norm das ich mich in deinem Code nicht wirklich
zurechtfinde .. Zu Anstrengend das zu lesen.

gruss

sansimarkus 3. Jul 2012 15:58

AW: CreateWindowEx stack overrun?
 
mal den code abgespeckt (und createwindowex durch createwindow ersetzt)

Delphi-Quellcode:
unit CoreWndObj;

interface

uses
  System.SysUtils,
  System.Classes,
  system.Types,

  Winapi.Windows,
  Winapi.Messages;


type
 TCoreWnd = class(TObject)
   private
     myhWnd:     HWND;
   public
      constructor   create();
 end;




implementation

function WndProc(i_hWnd:HWND;i_Message:LongWord;i_wParam:WPARAM;i_lParam:LPARAM):LResult;
begin
  result := DefWindowProc(i_hWnd, i_Message, i_wParam, i_lParam);
end;


constructor TCoreWnd.create();
var
 wcex:      TWndClassEx;
 dwStyle:   dword;
 x,y: string;
begin

 inherited create;

 x := 'blablub';
 y := 'blblbl';

 ZeroMemory(@wcex,sizeof(wcex));
 with wcex do
  begin
   cbSize       := SizeOf(wcex);
   style        := CS_HREDRAW or CS_VREDRAW or CS_OWNDC;
   lpfnWndProc  := @wndproc;
   hInstance    := SysInit.HInstance;
   hCursor      := LoadCursor(0,IDC_ARROW);
   lpszClassName := PChar(x);
   hbrBackground := 1;
  end;

 if RegisterClassEx(wcex) = 0 then
  writeln('error');

 dwStyle  := WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN;


 myhWnd := CreateWindow( PChar(x),
                         PChar(y),
                         dwStyle,
                         120,
                         120,
                         1280,
                         768,
                         0,0,SysInit.HInstance,nil);
 if myhWnd = 0 then
  Writeln('error');

 ShowWindow(myhWnd, SW_SHOW);
 SetForegroundWindow(myhWnd);

end;

end.
gleicher Fehler, und trotzdem funktionierts einwandfrei als 64bit version.

p80286 3. Jul 2012 16:00

AW: CreateWindowEx stack overrun?
 
Ich hab da etwas gefunden, was vielleicht weiterhilft:
http://msdn.microsoft.com/de-de/magazine/cc163311.aspx
Vor allem den Hinweis auf den int3 fand ich interessant, könnte aber sein, daß ich vollkommen falsch liege.

Gruß
K-H

sansimarkus 3. Jul 2012 16:19

AW: CreateWindowEx stack overrun?
 
Was hat denn die Analyse angreifbarer Abstürze mit meinem stack buffer overrun zu tun?

Also die Windowsapi scheint von außerhalb der Delphiunits unendlich oft WndProc zu callen, wenn ich da mit dem debugger reinsteppe hängt sich allerdings wie gesagt mein XE2 auf (100% cpu auslastung im debugger thread). Warum er das nun als 64Bit Version nicht macht ist mir genauso ein Rätsel. :stupid:



Edit: eigentlich erster Schritt bei solchen Fehlern, aber ich hab grade das ganze mal in einem neuen projekt ausprobiert, gleicher Fehler.

sansimarkus 3. Jul 2012 16:29

AW: CreateWindowEx stack overrun?
 
Ok. Erschlag mich wer.

stdcall bei der wndproc vergessen.

EWeiss 3. Jul 2012 18:20

AW: CreateWindowEx stack overrun?
 
Zitat:

Zitat von sansimarkus (Beitrag 1173357)
Ok. Erschlag mich wer.

stdcall bei der wndproc vergessen.

Warum ?
Du solltest eher mich erschlagen hätte das eigentlich sehen müssen ;)
Aber wie gesagt die ganzen i_ vor jeden Namen vielleicht hat das mich abgelenkt.

Aber jeder wie er will.

gruss

himitsu 3. Jul 2012 18:21

AW: CreateWindowEx stack overrun?
 
Unter Win64 wurde auch so Einiges an den Aufrufkonventionen geändert.

sansimarkus 4. Jul 2012 16:30

AW: CreateWindowEx stack overrun?
 
Zitat:

Unter Win64 wurde auch so Einiges an den Aufrufkonventionen geändert.
Mir stellt sich nun die Frage, ob ich für Win64 das stdcall weglassen sollte - geht mit und ohne gleichermaßen.

Luckie 4. Jul 2012 16:32

AW: CreateWindowEx stack overrun?
 
Zitat:

Zitat von himitsu (Beitrag 1173371)
Unter Win64 wurde auch so Einiges an den Aufrufkonventionen geändert.

Auch bei den dokumentierten API Funktionen? Die haben, soweit ich weiß, immer stdcall als Aufrufkonvention.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz