Ich habe absichtlich die
Win32-Termini benutzt um niemanden zu verwirren. Nicht jeder hier ist mit K-Mode und/oder Native
API vertraut, denke ich.
Die Frage haben wir also offenbar unterschiedlich aufgefaßt.
Ansonsten eine sehr gute Erklärung. Daß DebugView die Section ausliest, wußte ich garnicht - ich ging wegen des gleichen Schemas, welches sich durch viele der Sysinternals-Tools zieht, davon aus, daß einzig auf der tiefsten Ebene (eben K-Mode) gehookt wird. Wie gesagt, auch OutputDebugString() ruft ja schließlich DbgPrint() auf, welches in den K-Mode geroutet wird (s.o.). Genaueres muß man wohl oder übel in einem KD anschauen.
Da hat wohl einer in die Windows-Sourcen geguckt - oder war es vielleicht doch nur ROS, ein guter Disassembler und ein Debugger
? Gelle, w3seek?
... naja, Dax kennt eben noch nicht die besten und interessantesten OpenSource-Projekte, wie mir scheint.
@Thomas:
Hier eine Funktion, die in ROS 0.2.5 noch nicht deklariert war. Die wurde allerdings auch erst mit Windows XP eingeführt. Viel Spaß
Delphi-Quellcode:
// Resembles the RtlValidateUnicodeString() function available from Windows XP
// on exactly as it is on this OS version, except for the calling convention.
function RtlValidateUnicodeString(dwMustBeNull: DWORD; UnicodeString: PUNICODE_STRING): NTSTATUS;
begin
result := STATUS_INVALID_PARAMETER;
if(dwMustBeNull = 0)
then
begin
result := STATUS_SUCCESS;
if(Assigned(UnicodeString))
then
begin
result := STATUS_INVALID_PARAMETER;
if((UnicodeString^.Length
mod 2 = 0)
and (UnicodeString^.MaximumLength
mod 2 = 0)
and (UnicodeString^.Length <= UnicodeString^.MaximumLength))
then
if((UnicodeString^.Length > 0)
and (UnicodeString^.MaximumLength > 0))
then
if(Assigned(UnicodeString^.Buffer))
then
result := STATUS_SUCCESS;
end;
end;
end;