![]() |
SecureZeroMemory vermisst
Bin ich nur blind, oder warum kann ich diese Prozedur nicht finden?
Delphi-Quellcode:
da soll sie ja angeblich sein (vermutlich ntdll.dll, oder eventuell auch kernel32.dll / user32.dll),
Procedure SecureZeroMemory(Destination: Pointer; Length: LongInt); StdCall;
External '???' Name 'RtlSecureZeroMemory'; aber nichts ... nirgends ... im gesamten WinXP nicht :shock: ![]() |
Re: SecureZeroMemory vermisst
|
Re: SecureZeroMemory vermisst
Die OSR-Seite kannte ich schon ... dat is ja eine der weingen Seiten, die Goole liefert, allerdings wäre diese wohl besser
![]() Selbst in den JEDI's ist es nicht drin, bis auf so'nen TODO Eintrag. |
Re: SecureZeroMemory vermisst
Zitat:
Zitat:
![]() Zitat:
|
Re: SecureZeroMemory vermisst
Gut, dann wa ich wohl irgendwie blid :wall:
aber wie bekomm ich jetzt das FORCEINLINE und volatile nach Delphi?
Code:
Der Rest ist leicht ... beziehungsweise ich hab da auch 'ne ASM-Version :roll:
FORCEINLINE
PVOID RtlSecureZeroMemory( IN PVOID ptr, IN SIZE_T cnt ) { [b]volatile[/b] char *vptr = ([b]volatile[/b] char *)ptr; while (cnt) { *vptr = 0; vptr++; cnt--; } return ptr; } [edit] OK, FORCEINLINE ist wohl sows wie INLINE in Delphi, also erstmal egal. |
Re: SecureZeroMemory vermisst
Zitat:
Zitat:
Zweite Alternative: Soweit ich weiß kann der Delphi-Linker auch C-Objects einbinden. Wie das genau geht, weiß ich nicht, aber du könntest die Funktion in C schreiben, in eine lib kompilieren und sie irgendwie dem DCC unterjubeln. |
Re: SecureZeroMemory vermisst
Asoooooo :shock:
hatte das im MSDN so verstanden, daß Windows dazu veranlasst wird es nicht zu optimieren, also z.B. den Speicher nich in irgend 'ner Cache zu lassen, sondern den Speicherbereich wirklich zu überschreiben ... na dann isses ja "sinnlos" dieses nach Delphi zu holen, weil wenn man ZeroMemory als DelphiFunktion aufruft, dann wird diese Funktion ja vom Compiler nicht wegoptimiert -.-'' Da such ich jetzt seit letzter Woche danach und dann sowas ... blödes C++ :roll: In Delphi gibt's ja kein INLINE mehr, also wird die Funktion nicht integriert und deren Inhalt kann demnach nicht wegoptimiert werden. |
Re: SecureZeroMemory vermisst
Zitat:
![]() |
Re: SecureZeroMemory vermisst
Zitat:
ZeroMemory() und SecureZeroMemory() sind aber inline-Funktionen, das heißt ein C-Compiler würde den Code direkt aus dem Header einfügen und danach den Optimizer drüberlaufen lassen. Unter umständen sieht er dann, daß Variablen Werte zu gewiesen werden, die später nicht mehr benutzt werden und könnte dadurch ein ZeroMemory() komplett wegoptimieren. Durch die volatile-Anweisung in SecureZeroMemory() wird einem C-Compiler nun gesagt, daß die verwendete Variable "flüchtig" ist, also sich willkürlich auch mal ändern kann, auch wenn der Compiler das vom restlichen Code nicht unbedingt als richtig empfindet. Für den Optimizer bedeutet das dann, daß er die Variable nicht anfassen darf, weil ihr Verhalten vom Programmierer als unvorhersehbar gekennzeichnet ist, also kann auch der Optimizer nicht vorhersehen, wie sich die Variable verhalten wird. Das ist der ganze Trick hinter SecureZeroMemory(). Caches haben damit nichts zu tun. Wenn der Speicherbereich im Cache des Prozessors ist, muss er im RAM und im Cache geändert werden (Write-Through) oder wird nur im Cache geändert und bei Gelegenheit auch im RAM (Write-Back). Die Architektur stellt dabei bereits sicher, daß nicht zwei verschiedene Informationen benutzt werden (z.B. der DMA-Controller, der aus dem RAM liest, während die Seite zuvor im Prozessor-Cache geschrieben wurde). Interessant sit das auch bei Mehrprozessorsystemen. Zitat:
|
Re: SecureZeroMemory vermisst
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 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-2025 by Thomas Breitkreuz