![]() |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
Zitat:
sprich von dir definierter Datenbereich, falls du mehrere CallBack-Methoden hast und die richtige wiederfinden willst. Ich würde einfach mal nen PInteger erzeugen und übergeben. Ich befürchte aber, dass der Fehler damit nicht behoben ist. Zeig doch noch mal den relevanten Code, besonders die Definition der CallBack-Methode und der Aufruf von SetCallBack. Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
In der Unit mit dem Formular:
Delphi-Quellcode:
Und in der Class TShrinkTo5:
function CallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer;
begin beep; end; ... ShrinkTo5.CallBack := CallBack; ...
Delphi-Quellcode:
So sieht die Procedure aus. Bin jetzt auf die Idee gekommen, das Projekt in OllyDebug (v2.0.0k von heute) anzusehen. Da steht dann
type
... TFNCallBack = function(alert, param: Integer; pTransfer, pUser: Pointer): Integer; stdcall; TFNSetCallBack = procedure(pCallBack, pUser: Pointer); stdcall; type TShrinkTo5 = Class private fCallBack : TFNCallBack; pUser : Pointer; ... public property CallBack : TFNCallBack write FCallBack; ... end; function TShrinkTo5.GetExecute: Integer; {******************************************************************************* * Den Transfer beginnen. } type TThreadParams = record FNTransferPath : TFNTransferPath; TransferPath : String; end; PThreadParams = ^TThreadParams; var ThreadParams : PThreadParams; hThread : THandle; ThreadID : Cardinal; lResult : Cardinal; function Thread(p: PThreadParams): Cardinal; var PTransferPath : PChar; PstopFlag : PChar; FNTransferPath : TFNTransferPath; lResult : Integer; begin PTransferPath := PChar(PThreadParams(p)^.TransferPath); PstopFlag := PChar('0'); FNTransferPath := PThreadParams(p)^.FNTransferPath; lResult := FNTransferPath(PTransferPath, PstopFlag); FreeMem(p, sizeof(TThreadParams)); if lResult < 0 then Result := $0FFFFFFF - lResult else Result := lResult; end; begin Result := 0; if DirectoryExists(fTransferPath) and Assigned(FNTransferPath) then try { * Das Callback setzen } pUser := nil; FNSetCallBack(@FCallBack, pUser); { * Den Arbeitsthread erstellen } GetMem(ThreadParams, sizeof(TThreadParams)); ThreadParams.FNTransferPath := FNTransferPath; ThreadParams.TransferPath := fTransferPath; hThread := BeginThread(nil, 0, @Thread, ThreadParams, 0, ThreadID); if hThread <> INVALID_HANDLE_VALUE then begin while WaitForSingleObject(hThread, 300) = WAIT_TIMEOUT do Application.ProcessMessages; { * return codes for TransferPath * >0 success - number of MegaBytes written * 0 user aborted (stopFlag == 1) * -2 if stream is scrambled and either descrambling failed or is disabled * -5 source was not opened with "Open" * -6 cannot authorize driveend; } end; finally GetExitCodeThread(hThread, lResult); end; if lResult > $0FFFfff0 then Result := lResult - $0FFFFFFF else Result := lResult; end;
Code:
Bei EAX steht 0000030. Was dann die Zugriffsverletzung darstellt.
1000D23D | 8038 01 | CMP Byte PTR DS: [EAX], 1
Ich finde es irritierend, dass der Parameter pUser nicht mitgegeben wird. pUser als PInteger zu deklarieren, bringt keine Änderung. |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
function CallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer; Wo ist das stdcall ? Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Oh, das habe ich übersehen, als ich es hier rein kopiert habe.
Delphi-Quellcode:
function CallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer; stdcall;
implementation {$R *.dfm} function CallBack(alert, param: Integer; pTransfer, pUser: Pointer): Integer; begin beep; end; |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Es hängt wohl doch nicht am Callback. Der Fehler tritt mit und ohne Callback immer an der selben Stelle mit der selben Fehlermeldung auf. Irgendwie sollte sich herausfinden lassen, was die Original GUI anders macht!?
Nachtrag: Anscheinend wird bei der Original GUI auch kein Callback zugewiesen. Die Breakpoints scheinen bei Ollydbg nur bei statischen DLL zu funktionieren... |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
was macht die denn anders ? Der Link in Thread #1 zeigt mir keine Download-Möglichkeit. Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Zitat:
![]() ![]() Ich habe mir die Original GUI mit OllyDbg angesehen. Die Einsprungpunkte, welche ich für meine dynamischen DLL hole, werden garnicht angesprungen. Es geht immer zu den anderen, welche bei diesen angegeben sind, zum Beispiel ?TransferPath@Transfer@@UAEHPAD0@Z. Da ich davon noch keine Ahnung habe, weiß ich nicht ob die von der GUI oder nur innerhalb der DLL angesprungen werden. Vielleicht sind auch nur meine Deklarationen falsch. Zuerst
Delphi-Quellcode:
Jetzt:
TFNTransferPath = function(targetPath, stopFlag: PChar): Integer; stdcall;
Delphi-Quellcode:
Vielleicht ist es ja immernoch falsch!?
TFNTransferPath = function(targetPath, stopFlag: PAnsiChar): Integer cdecl; stdcall;
Die übergebenen Pfade zeigt OllyDbg bei der Zugriffsverletzung richtig an. :wall: Werde mein Projekt jetzt erstmal auf statische Einbindung der DLL ändern. Vielleicht sehe ich dann mehr. |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Hallo,
noch mal drübergeflogen ... FNTransferPath(PChar(srcPath), PChar('0')); hmmmmmm .... srcPath : String -> OK, ist kompatibel mit PChar PChar('0') das würde ich ändern, var sFlag: String = '0'; PChar(Flag) Hast du vielleicht noch irgendwelche Return-Strings, die due paar PChar(StringVar) übergibst (ohne SetLength), dann geht der Schreibzugriff ins Nirvana. Früher habe ich immer array[0..XXX] of Char benutzt + die explizite Umformung von Strng nach PChar (SrrPas usw.) Heiko |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Liste der Anhänge anzeigen (Anzahl: 1)
Den Aufruf habe ich zwischenzeitlich in einen Thread ausgelagert:
Delphi-Quellcode:
Was ich nicht verstehe ist, dass ich die Struktur der DVD auslesen kann und der Unterordner VIDEO_TS im Zielordner angelegt wird.
PTransferPath := PAnsiChar(PThreadParams(p)^.TransferPath);
PstopFlag := PAnsiChar('0'); FNTransferPath := PThreadParams(p)^.FNTransferPath; lResult := FNTransferPath(PTransferPath, PstopFlag); FreeMem(p, sizeof(TThreadParams)); |
Re: Wie DVD Transfer mit ShrinkTo5.DLL?
Liste der Anhänge anzeigen (Anzahl: 1)
So, jetzt habe ich die DLL statisch eingebunden. Es tritt - wie eigentlich zu erwarten war - der selbe Fehler auf. Mal sehen, ob etwas in OllyDbg zu sehen ist.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz