AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?
Thema durchsuchen
Ansicht
Themen-Optionen

Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

Ein Thema von Luckie · begonnen am 2. Mai 2005 · letzter Beitrag vom 3. Jun 2005
Antwort Antwort
Seite 7 von 14   « Erste     567 89     Letzte »    
MathiasSimmack
(Gast)

n/a Beiträge
 
#61

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 17:03
Zitat von Mephistopheles:
Zitat von NicoDE:
Viel Spaß mit APIs, die nicht mehr funktionieren
Wie kommst du an den ersten Parameter? Da konnte ich keinen Hinweis zu finden! Und vor allem, warum dokumentiert MS das nicht, wenn sie doch die Funktion ansonsten dokumentieren.
Wahrscheinlich, weil sich die Syntax geändert hat. Nehme ich den 1. Parameter dazu, erhalte ich eine Zugriffsverletzung. Es wäre aber auch möglich, dass das nur daran liegt, weil ich nicht weiß, welchen Wert man dort angeben muss. @Nico:


PS: Habe auch noch was:
Delphi-Quellcode:
function SHRestrictedMessageBox(wnd: HWND): integer; stdcall;
  external 'shlwapi.dllindex 384;
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#62

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 17:12
Zitat von Mephistopheles:
Wie kommst du an den ersten Parameter?
Disassembler. Die Parameter machen nur Sinn wenn sie um eins vorschoben sind. Allerdings ist bei einer Deklaration mit 7 Parametern der Stack im Eimer (Crash). Also entweder handelt sich um eine ungewöhnliche Aufrufkonvention, oder die Funktion ist einfach nicht mehr funktionstüchtig...
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#63

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 17:13
Zitat von MathiasSimmack:
Delphi-Quellcode:
function SHRestrictedMessageBox(wnd: HWND): integer; stdcall;
  external 'shlwapi.dllindex 384;
Guck mal hier noch mehr so'n Quark.

Zitat von NicoDE:
Zitat von Mephistopheles:
Wie kommst du an den ersten Parameter?
Disassembler. Die Parameter machen nur Sinn wenn sie um eins vorschoben sind. Allerdings ist bei einer Deklaration mit 7 Parametern der Stack im Eimer (Crash). Also entweder handelt sich um eine ungewöhnliche Aufrufkonvention, oder die Funktion ist einfach nicht mehr funktionstüchtig...
Ich tippe auf letzteres. Warum sollten die eine Aufrufkonvention benutzen, die keiner kennt. Auch das Problem an sich scheint nicht wet bekannt zu sein, selbst wenn man mit Google probiert. Habe da eine russische Newsgroup aufgetrieben, wo die unsere besagte Funktion problemlos unter XP mithilfe eines VB-Programmes aufgerufen haben.

Du meinst sicher wegen ...
Code:
-0000001C SomeStruct     InternalMessageBoxCheckStruct ?
+00000000  r             db 4 dup(?)
+00000004 unknown        db 4 dup(?) [color=red]<--- ... dem hier?![/color]
+00000008 hwnd           dd ?
+0000000C pszText        dd ?
+00000010 pszTitle       dd ?
+00000014 uType          dd ?
+00000018 iDefault       dd ?
+0000001C pszRegVal      dd ?
+00000020
+00000020 ; end of stack variables
Normalerweise wären dort die gePUSHten Registerwerte zu finden. Wenn das nicht der Fall ist, existiert immer diese 4-Byte-Lücke.

Auch die Funktion selber gibt eigentlich keinen Hinweis drauf, außer vielleicht das RET am Ende
Code:
.text:70ABFA2F ; Exported entry 191.
.text:70ABFA2F
.text:70ABFA2F ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:70ABFA2F
.text:70ABFA2F ; Attributes: bp-based frame
.text:70ABFA2F
.text:70ABFA2F                public Ordinal191
.text:70ABFA2F Ordinal191      proc near              ; CODE XREF: Ordinal185+9Ep
.text:70ABFA2F
.text:70ABFA2F SomeStruct     = InternalMessageBoxCheckStruct ptr -1Ch
[color=blue].text:70ABFA2F unknown        = byte ptr 4[/color]
[color=green].text:70ABFA2F hwnd           = dword ptr 8
.text:70ABFA2F pszText        = dword ptr 0Ch
.text:70ABFA2F pszTitle       = dword ptr 10h
.text:70ABFA2F uType          = dword ptr 14h
.text:70ABFA2F iDefault       = dword ptr 18h
.text:70ABFA2F pszRegVal      = dword ptr 1Ch[/color]
.text:70ABFA2F
.text:70ABFA2F                mov    eax, eax
.text:70ABFA31                 push   ebp
.text:70ABFA32                 mov    ebp, esp
.text:70ABFA34                 sub    esp, 1Ch
.text:70ABFA37                 push   esi
.text:70ABFA38                 push   edi            ; End of prologue
.text:70ABFA39                 mov    edi, [ebp+pszRegVal]
.text:70ABFA3C                push   TRUE           ; fDefault
.text:70ABFA3E                push   FALSE          ; fIgnoreHKCU
.text:70ABFA40                 push   edi            ; pszValue
.text:70ABFA41                 mov    esi, offset aDontShowMeThisDialogAgain ; "Software\\Microsoft\\Windows\\CurrentVersi"...
.text:70ABFA46                 push   esi            ; pszSubKey
.text:70ABFA47                 call   SHRegGetBoolUSValueW
.text:70ABFA4C                test   eax, eax       ; BOOL returned (either fDefault or from reg)
.text:70ABFA4E                jnz    short ShowMessageBox
.text:70ABFA50                 mov    eax, [ebp+iDefault]
.text:70ABFA53                 jmp    short ExitThis
.text:70ABFA55 ; ---------------------------------------------------------------------------
.text:70ABFA55
.text:70ABFA55 ShowMessageBox:                        ; CODE XREF: Ordinal191+1Fj
.text:70ABFA55                 mov    eax, [ebp+pszText]
.text:70ABFA58                 mov    [ebp+SomeStruct.pszText], eax
.text:70ABFA5B                mov    eax, [ebp+pszTitle]
.text:70ABFA5E                mov    [ebp+SomeStruct.pszTitle], eax
.text:70ABFA61                 mov    eax, [ebp+uType]
.text:70ABFA64                 mov    [ebp+SomeStruct.uType], eax
.text:70ABFA67                 lea    eax, [ebp+SomeStruct]
.text:70ABFA6A                mov    [ebp+SomeStruct.SelfPtr], eax
.text:70ABFA6D                lea    eax, [ebp+pszRegVal] ; lpCookie for activation context
.text:70ABFA70                 push   eax            ; The only parameter for CreateAndActivateContext()
.text:70ABFA71                 mov    [ebp+SomeStruct.pszRegistryPath], esi
.text:70ABFA74                 mov    [ebp+SomeStruct.pszRegVal], edi
.text:70ABFA77                 mov    [ebp+SomeStruct.pfnDlgFunc], offset OtherDialogFunc
.text:70ABFA7E                call   CreateAndActivateContext
.text:70ABFA83                 mov    esi, eax       ; hActivationContext
.text:70ABFA85                 lea    eax, [ebp+SomeStruct]
.text:70ABFA88                 push   eax            ; 5th param == Pointer to struct on stack
.text:70ABFA89                 push   offset DlgFunc ; 4th param == DialogFunc
.text:70ABFA8E                push   [ebp+hwnd]     ; 3rd param == hwnd
.text:70ABFA91                 push   1200h          ; 2nd param == Dialog template
.text:70ABFA96                 push   hInstance      ; 1st param == hInstance
.text:70ABFA9C                call   DialogBoxParamW_Wrapper
.text:70ABFAA1                 push   [ebp+pszRegVal]
.text:70ABFAA4                 mov    edi, eax
.text:70ABFAA6                 push   esi            ; hActivationContext
.text:70ABFAA7                 call   DeactivateAndReleaseContext
.text:70ABFAAC                mov    eax, edi       ; Return result of DialogBoxParamW_Wrapper()
.text:70ABFAAE
.text:70ABFAAE ExitThis:                              ; CODE XREF: Ordinal191+24j
.text:70ABFAAE                pop    edi
.text:70ABFAAF                pop    esi
.text:70ABFAB0                 leave
[color=red].text:70ABFAB1                 retn   18h[/color]
.text:70ABFAB1 Ordinal191      endp ; [b][color=red]sp = 4[/color][/b]
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#64

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 17:29
das retn 18h sagt ja wohl eindeutig aus das es sich um 6 parameter handelt.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#65

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 18:28
Zitat von brechi:
das retn 18h sagt ja wohl eindeutig aus das es sich um 6 parameter handelt.
Daß das nie eindeutig ist, sollte dir klar sein. Es ist, das stimmt, ein Anhaltspunkt. Aber es war noch nie eine Garantie. Und ich bin schon über gegenteilige Beispiele gestolpert.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#66

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 18:50
mir is noch nie nen anderer fall vorgekommen wo bei einer stdcall funktion nicht der stack retunr div 4 die anzahl der parameter waren. und ich kenne auch keinen compiler der das anders macht, also kanns nur vorkommen wenn der progreammierer das direkt in assembler geschieben und sich dann vertan hat.
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#67

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 20:09
brechi schrieb (ich korrigierte):
und ich kenne auch keinen compiler der das anders macht, also kanns nur vorkommen wenn der progreammierer das direkt in assembler geschieben undoder sich dann vertan hat.
"Was ich nicht kenne, gibt es nicht!"

Meines Erachtens nach liegt der Wurm bei unserer Funktion sowieso woanders.

Nochmal zum Code. In dem was ich als "unknown" gekennzeichnet habe, dürfte EBP gespeichert sein, oder? Wenn ich mir das so angucke?! Ist doch eine EBP-based stack-frame.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#68

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 21:23
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TFNSHMessageBoxCheck = function(hWnd: HWND; pszText, pszTitle: PChar; uType: UINT;
    iDefault: Integer; pszRegVal: PChar): Integer; stdcall;
var
  SHMessageBoxCheck: TFNSHMessageBoxCheck;
  hLibMod: HMODULE;
begin

  hLibMod := LoadLibrary('shlwapi.dll');
  if hLibMod <> 0 then
  begin
    SHMessageBoxCheck := GetProcAddress(hLibMod, MakeIntResource(185));
    if Assigned(SHMessageBoxCheck) then
      SHMessageBoxCheck(Self.Handle, 'Text', 'Title', MB_OK, 0, '{7C5B82F2-B02E-40DB-AEA4-38B37E6A2591}');
    FreeLibrary(hLibMod);
  end;

end;
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#69

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 21:43
Ähem, ja und? Kommt da jetzt noch was als Erklärung? Du bietest eine Variation des Codes von weiter oben an, der auf meiner Konfiguration (die der von "Blutiger Anfänger" zu gleichen scheint) ebenso nicht funktioniert. Und das ohne Kommentar? Wo ist der Sinn?

Oder habe ich was überlesen?
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#70

Re: Wo ist oder wie heißt die Funktion: SHMessageBoxCheck?

  Alt 4. Mai 2005, 22:29
Zitat von Mephistopheles:
Ähem, ja und? Kommt da jetzt noch was als Erklärung?
Nö.

Zitat:
Du bietest eine Variation des Codes von weiter oben an, der auf meiner Konfiguration (die der von "Blutiger Anfänger" zu gleichen scheint) ebenso nicht funktioniert.
Warum sollte mein Beispiel nicht funktionieren?

Zitat:
Und das ohne Kommentar? Wo ist der Sinn?
Ein direkter Aufruf von SHMessageBoxCheckA ist auf meinem Windows XP SP2 System auch nicht möglich, da dieser Funktionsname in meiner DLL nicht vorhanden ist.

Hab dir nur eine Möglichkeit gezeigt wie du es benutzen kannst. Ob du es so machst, das überlasse ich dir.
Ich selber werde diese Funktion nicht benutzen, da meine Programme grundsätzlich auf einem frisch installierten Windows 95 laufen müssen.

Und es gibt noch eine weitere lauffähige Variante. Aber sieht für mich nicht so aus, als würdest du daran interesse haben.


Edit: \\ Das hier Beispiele mit GetProcAddress und Ordinal 185 gepostet worden sind, habe ich überlesen.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 14   « Erste     567 89     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:07 Uhr.
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