Zitat von
Dirkmswt:
Klar lernt man sowas nicht von heut auf Morgen
Sicher nicht, zumal viele Dinge fundamental anders sind. Umso überraschender ist es, wenn jemand sagt 90% eines DDKs durchgelesen zu haben aber die Grundlagen nicht versteht.
Zitat von
Dirkmswt:
Nun meine Antwort zu irql: Ein irql ist ein Hardware Interrupt und steht für interrupt Request Level.
Setzen! Sechs!
IRQL bedeutet Interrupt Request Level, korrekt. Allerdings hat das mit
Hardware-Interrupts nichts zu tun (dort gibt es auch IRQLs, die aber
Interrupt Request Lines bedeuten). Es handelt sich dabei vielmehr um eine Art Priorität (nicht verwechseln mit Threadprioritäten), mit der Code behandelt wird. Code welcher in einem höheren IRQL läuft kann beispielsweise anderen Code (und
immer Usermode-Code, welcher
immer auf IRQL PASSIVE_LEVEL läuft) unterbrechen.
Es gibt "device IRQLs" (DIRQLs), ja - allerdings liegen die zwischen DISPATCH_LEVEL und PROFILE_LEVEL und werden nicht bei allen von NT unterstützten Architekturen genutzt. Allein die Tatsache, daß sie nicht überall genutzt werden, sollte dir deutlich machen, daß es keinen zwingenden Zusammenhang zwischen IRQLs im NT-Jargon und IRQs gibt.
Die Anzahl der IRQLs und deren Namen hätten dir einen Tip geben können:
Code:
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 //
APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define PROFILE_LEVEL 27 // timer used for profiling.
#define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86
#define CLOCK2_LEVEL 28 // Interval clock 2 level
#define IPI_LEVEL 29 // Interprocessor interrupt level
#define POWER_LEVEL 30 // Power failure level
#define HIGH_LEVEL 31 // Highest interrupt level
... zugegeben, die Frage war absichtlich gewählt, weil es ein häufiger Anfängerfehler ist, die IRQLs mit IRQs zu verwechseln und durcheinanderzuwürfeln.
Hier ein Ausschnitt aus "Inside Microsoft Windows 2000, 3rd Edition", weil auch ich keinen Aufsatz schreiben will:
Zitat:
Interrupt Levels vs. Priority Levels
As illustrated in Figure 6-13, all threads run at IRQL 0 or 1. (For a description of how Windows 2000 uses interrupt levels, see Chapter 3.) User-mode threads run at IRQL 0; only kernel-mode APCs execute at IRQL 1, since they interrupt the execution of a thread. (For more information on APCs, see in Chapter 3.) Also, threads running in kernel mode can raise IRQL. Because of this, no user-mode thread, regardless of its priority, blocks hardware interrupts (although high-priority real-time threads can block the execution of important system threads).
Thread-scheduling decisions are made at DPC/dispatch level. Thus, while the kernel is deciding which thread should run next, no thread can be running and possibly changing scheduling-related information (such as priorities). On a multiprocessor system,
access to the thread-scheduling data structures is synchronized by acquiring the Dispatcher spinlock (KiDispatcherLock).
Aus dem
DDK:
Zitat:
interrupt dispatch table (IDT)
A kernel-defined call table with a platform-dependent number of first-level entries (some for DIRQL ISRs) and second-level entries for interrupt transfer routines (dependent on a first-level ISR). For symmetric multiprocessor platforms, the kernel sets up an IDT for each processor.
The kernel reserves eight first-level entries per IDT for its own use; the remaining first-level entries can be connected to a platform-specific I/O bus interrupt by the HAL or to a device interrupt. The kernel's reserved entries (in low-to-high IRQL priority) are defined by the following constants:
PASSIVE_LEVEL − execute thread
APC_LEVEL − execute special kernel
APC; page fault
DISPATCH_LEVEL − dispatch (execute DPC)
WAKE_LEVEL − debugger execution
CLOCK2_LEVEL − interval-timer execution
REQUEST_LEVEL − interprocessor request
POWER_LEVEL − power failure notification
HIGH_LEVEL − machine checks or bus errors
The set of software and hardware interrupt vectors mapped to these constants is platform-dependent, but none can be connected to a driver's interrupt object. Note that the constants PASSIVE_LEVEL through DISPATCH_LEVEL and WAKE_LEVEL correspond to software interrupt vectors. DIRQLs for device drivers usually have hardware priority higher than DISPATCH_LEVEL but lower than CLOCK2_LEVEL.
See also multiprocessor machine.
Zitat von
Dirkmswt:
Aber eine Frage hab ich die hier aufjedenfall auch noch gut reinpasst:
Wie greife ich aus Delphi auf einen Treiber direkt zu,bzw spreche den treiber direkt an?
Gibts da
Api Befehle,muss ich da den Usermode verlassen?
DeviceIoControl(),
ReadFile(),
WriteFile(),
CreateFile(),
CloseHandle() und eventuell sowas wie die MMF-Funktionen. Bei einem Display-Treiber sind es wieder ganz andere Funktionen. Ich beziehe mich also auf einen Legacy-/WDM-Treiber.
Zitat von
Dirkmswt:
Die Auflistung ist sehr gut
... und die Fragen/Aufforderungen waren ernstgemeint. Bisher hast du dich aus jeder ernsthaften Diskussion herausgewunden, ohne natürlich die Verbreitung von Unfug einzustellen (bis auf diesen deinen letzten Post), was die ersten Newbies vermutlich schon wieder auf die falsche Fährte gebracht hat (denn die lesen oft genug auch nur die Hälfte ...).