Ich glaube hier liegt ein Mißverständnis über den Sinn der Funktionen vor. Sie können bspw. ja zum Datentransfer von und zu Geräten (logisch "Dateien") benutzt werden. Und da hängt es ganz vom Treiber ab, ob und wie er das implementiert und ob es dadurch schneller wird.
Auch kann es sein, daß jemand schon sowas wie einen Ringpuffer oder ähnliches hat. Dann würde ihm die Funktion u.U. entgegenkommen. Man benutzt eben immer die Werkzeuge, die einem am besten "zur Hand gehen".
Zitat von
himitsu:
Code:
typedef union _FILE_SEGMENT_ELEMENT {
PVOID64 Buffer;
ULONGLONG Alignment;
} FILE_SEGMENT_ELEMENT;
Delphi-Quellcode:
Type FILE_SEGMENT_ELEMENT = packed Record
Buffer: Pointer64;
Alignment: UInt64;
End;
wie man sieht is alles 64 Bit groß, weßhalb ich es so definiert hatte:
Delphi-Quellcode:
Type FILE_SEGMENT_ELEMENT = packed Record
Buffer, _fill: Pointer;
Alignment: UInt64;
End;
Du bist lustig ... das heißt, du übergibst mal eben eine 128bit-Struktur, wo nur eine 64bit-große stehen sollte?
Zitat von
himitsu:
Wenn zufällig noch jemand weiß wofür Alignment da sein soll?
Es hatte bei mir jedenfalls keine Auswirkungen und wenn MS was im Record freilassen wollte, dann heißt es ja sonst reserved, oder so.
Im
PSDK steht zumindestens nichts drin.
Da es sich um eine
UNION handelt, wird dieser Wert natürlich dem "Pointer" entsprechen, weshalb man durch ein einfaches logisches AND das Alignment bestimmen kann ...
Und jetzt husch husch nochmal schnell das Thema Unions in
meinem DLL-Tut nacharbeiten
...:
Delphi-Quellcode:
type
FILE_SEGMENT_ELEMENT = packed record
case Integer of
0: (Buffer: PVOID64);
1: (Alignment: ULONGLONG);
end;
... bei der letzten Klammer bin ich nicht sicher, ob die vor oder nach dem Semikolon stehen muß, da ich zu faul bin
BDS jetzt zu starten
... achja, und die Typen mußt du natürlich auf Delphi zurechtschneidern. Habe ich hier der Einfachheit halber nicht gemacht. Bsp. #2:
Delphi-Quellcode:
type
FILE_SEGMENT_ELEMENT = packed record
case Integer of
0: (Buffer, _fill: Pointer);
1: (Alignment: UInt64);
end;