Difference between revisions of "Ntoskrnl.exe"

From ReactOS Wiki
Jump to: navigation, search
Line 727: Line 727:
*(too big to post)
*(too big to post)
* HUGE placeholder for changes made by [[Alex Ionescu]]
* "Fix" RtlQueryRegistryValues() usage ([[Alex Ionescu]], [[Aleksey Bragin]])
* Mandatory address PCR via FS register in certain cases ([[Aleksey Bragin]], [[Dmitry Gorbachev]]).
* Fix wrong access-rights when referencing the object, fixes NtEnumerateKey() API ([[Aleksey Bragin]]).
* KiRosFrldrLpbToNtLpb(): Round up to the correct size in pages ([[Aleksey Bragin]]).
* Change "FreeLDR BIAS hack" to a better one: measure sizes of all 3 codepages, and place them contiguously ([[Aleksey Bragin]]).
* Clear DPC request when delivering DPCs from the idle loop ([[Alex Ionescu]]).
* Fix (and optimize) KeRemoveByKeyDeviceQueue() routine ([[Aleksey Bragin]]).
* Fix freeing of an unallocated memory bug ([[Aleksey Bragin]]).
* Correctly fill FullDllName for modules loaded by the bootloader. Don't load a module with the same name more than once ([[Aleksey Bragin]]).
* If the module failed to load (e.g. fixup couldn't be done), then don't include it in the list of loaded modules ([[Aleksey Bragin]]).
* Fix a bug with querying registry values ([[Herve Poussineau]]).
* Fix a problem when a device, which was already in the list is freed and memory corruption is introduced ([[Aleksey Bragin]]).
* Massive changes to the driver loading / device creation logic: Really reuse the driver's object ([[Aleksey Bragin]]).
* Fix driver's object creation accordingly in NtLoadDriver() and IopActionInitChildServices() ([[Aleksey Bragin]]).
* VMWare video driver regression is gone ([[Aleksey Bragin]]).
* "New device found" wizard appears in the 3rd stage ([[Aleksey Bragin]]).
* Move InvalidateRelations to a later stage, when it really should happen ([[Aleksey Bragin]]).
* Minor bugfixes in various places related to these changes ([[Aleksey Bragin]]).
* Remove a hack from IopCreateDriver(), no boot hang happens in VMWare without it anymore ([[Aleksey Bragin]]).
* Give "RAW" filesystem driver a name ([[Aleksey Bragin]]).
* Added a small piece of a new logic into IopCreateDriver(). In ReactOS it's being called two times almost immediately, which results in a non-unique driver object name, since KeTickCount is the same. In order to prevent this situation a loop is added, having 100 iterations as max ([[Aleksey Bragin]]).
* Correctly set DN_DRIVER_LOADED flag ([[Aleksey Bragin]]).
* Fix symbols loading due to an improved PE mapping ([[Aleksey Bragin]]).
* Fix incorrect usage of sprintf in the kernel ([[Aleksey Bragin]]).
* Rewrite KdbSymProcessBootSymbols() with respect to recent kernel changes ([[Aleksey Bragin]]).
* Change KdbSymInit() to match standard kd-wrapper init function ([[Aleksey Bragin]]).
* Always use PsLoadedModuleList as a list of modules ([[Aleksey Bragin]]).
* Load kernel and hal symbols during BootPhase 1 initialization of this KD wrapper ([[Aleksey Bragin]]).
* Commit a fix for KDBG's attach to process problem ([[Aleksey Bragin]], [[Gé van Geldorp]], bug #1263).
* Start turning KDBG into a KD wrapper, and thus removing KDBG-specific hacks in various places of the kernel ([[Aleksey Bragin]]).
* KdbSymInit() became a general initialization routine ([[Aleksey Bragin]]).
* KdpEnterDebuggerException() improvement related to KDBG support ([[Aleksey Bragin]]).
* Fix a call to readcr3 in KeFlushCurrentTb() ([[Christoph von Wittich]]).
* Fix a call to ExGetPreviousMode() in CmpCreateHandle ([[Christoph von Wittich]]).
* Implement SystemUnloadGdiDriverInformation ([[Saveliy Tretiakov]])
* Bugfix in KiUserExceptionDispatcher described by Myria in bug #2279 ([[Magnus Olsen]])
* Rewrite Plug-and-Play root bus enumerator ([[Hervé Poussineau]])
* Remove IopCreateDriverObject, which was buggy and duplicating IoCreateDriver functionality ([[Hervé Poussineau]])
* Add support for GUID_DEVICE_SYS_BUTTON interface ([[Hervé Poussineau]])
* ReactOS now supports ACLs... (fix SeAccessCheck to sometimes deny access) ([[Hervé Poussineau]])
* Fix usage of KdComPortInUse ([[Hervé Poussineau]])
* Send IRP_MN_FILTER_RESOURCE_REQUIREMENTS to devices before IRP_MN_START_DEVICE ([[Hervé Poussineau]])

Revision as of 05:29, 3 April 2012

See Also




  • Added multiboot support to ntoskrnl
  • Kernel can bow be booted with GRUB


  • Section and general memory manager enhancements
  • Changed irq handler from C to assembler
  • Established forwarded exports
  • Implemented profiling
  • Initial work on exception handling
  • DMA support
  • Kernel debugger
  • Trace facility
  • Added Intel MultiProcessor Specification support
  • Began building PnP manager device tree
  • Registry improvements
  • Work on the filesystem cache
  • Named pipe improvements
  • Implemented atoms in ntoskrnl
  • Enabled FASTCALL calling convention
  • Rewrote stack allocation



  • Implemented NtCreateToken and fixed up NtQueryInformationToken() Joseph Galbraith
  • Minimize access to the module object via the object manager. Eric Kohl
  • Use module list for internal module management. Eric Kohl
  • Protect module list with a spinlock. Eric Kohl
  • Registry improvements: Eric Kohl
    • Improved registry initialization
    • Registry-based driver loading for system-start drivers and auto-start drivers
    • Implemented registry links
  • PICE now loaded automatically Eric Kohl
  • Improved thread support David Welch
  • Fixed a long-standing hack to open symbolic link objects Eric Kohl
  • Implemented the ability to create suspended threads Eric Kohl
  • Implemented binary tree, splay tree and hash table routines Casper Hornstroup
  • Moved the hardcoded command line string from ntoskrnl to loadros Eric Kohl
  • Use NT-compatible (VPB-based) mounting mechanism Eric Kohl



  • Implemented NtProtectVirtualMemory; msvcrt apps now work (David Welch)
  • Memory management improvements,
  • Fixes for SMP in the memory manager,
  • Enable/Disable the irq in KeConnectInterrupt/KeDisconnectInterrupt,
  • Enabled caching of directories and fat segments,
  • Write back dirty pages from cache manager at shutdown (Hartmut Birr)
  • File locking (Gunnar Dalsnes)
  • Registry hive locking, packing value names,
  • Deferred hive synchronization (Eric Kohl)
  • Profiler (Casper Hornstrup)




  • Implementation of Ke(Save/Restore)FloatingPointState (Gé van Geldorp)
  • Made existing eventpair code more efficient and added support for associating eventpairs with * threads and signaling them that way (Skywing)
  • RtlRaiseException user mode implementation (Vizzini)
  • KiRaiseUserExceptionDispatcher/KeRaiseUserException to raise user exceptions from kernel mode (Vizzini)
  • Implemented the allocation type NonPagedPoolCacheAligned/NonPagedPoolCacheAlignedMustS (Hartmut Birr)
  • Process fixes (Hartmut Birr)
  • Plug and Play manager improvements (Filip Navara)
  • Implemented NtUnloadDriver(), partial IoGetDeviceProperty(), IoGetDmaAdapter(), IoIsWdmVersionAvailable(), ExFreePoolWithTag (Filip Navara)
  • Check for presence of \reactos\ntoskrnl.exe instead of REACTOS disk label to identify the boot cdrom device (Eric Kohl)


  • Improved implementation of IoMapTransfer, Implemented KeRemoveDeviceEntryQueue (Gunnar Dalsnes)


  • Implemented driver reinitialization (Eric Kohl)
  • Added "addr" "x" and "tlist" commands to kdbg (Art Yerkes)
  • Added the beginnings of an implementation of NtSetInformationToken (Art Yerkes)
  • Implemented shared segments for images (Hartmut Birr)
  • Work on the error log worker (Eric Kohl)
  • IoReuseIrp, IoQueueThreadIrp, IoEnqueueIrp implementations (Gunnar Dalsnes)
  • APC improvements (Gunnar Dalsnes)
  • Exception handler on broken usermode stack pointer fix (Mike Nordell)


  • Print userland addresses where possible in bugchecks (Art Yerkes)
  • InsertAscendingList adaption (Gunnar Dalsnes)
  • KiAcquire/ReleaseSpinLock adaption (Gunnar Dalsnes)
  • Added KiAcquire/ReleaseSpinLock (Gunnar Dalsnes)
  • KiAcquire/ReleaseSpinLock adaption (Gunnar Dalsnes)
  • Attempt to fix the display corruption problems when using bootvid.sys on certain hardware (Filip Navara)
  • Do not make NtSecureConnectPort fail: for now direct the call to NtConnectPort (Emanuele Aliberti)
  • NtOpenKey() should return a better status value if the desired key does not exist (Eric Kohl)
  • Implementation of RtlStringFromGUID, IoOpenDeviceInterfaceRegistryKey and IoGetDeviceInterfaceAlias (Matthew Brace)
  • Fixed some problems which occurs if a read only segment is changed to write and back to read only and if such a segment (or a page from such a segment) is paged out and reloaded again (Hartmut Birr)
  • Check for a privat page and change only the page protection for such a page in MmAccessFaultSectionView (Hartmut Birr)
  • Only lock a new page on exit from AccessFaultSectionView (Hartmut Birr)
  • Fixed querying and enumerating the subkeys of HKEY_LOCAL_MACHINE; this fixes bug #78 (Eric Kohl)
  • Start parsing at the root object when an object path needs to be reparsed (Art Yerkes)
  • Use macros for LPC message limits in current LPC implementation (Emanuele Aliberti)
  • Implement RtlFindLeastSignificantBit(), RtlFindMostSignificantBit() and _itow() (Eric Kohl)
  • LPC: initial work on NT/ROS compatibility (Emanuele Aliberti)
  • Add byte swap functions (Eric Kohl)
  • Set the previous pointer from the next block, if some blocks was merged (in add_to_free_list) (Hartmut Birr)
  • Free or recycle the remaining path string after a call to ObFindObject (Hartmut Birr)
  • Work on thread-awareness in gdbstub (Gé van Geldorp)
  • Always lock the pages in MmProbeAndLockPages (Hartmut Birr)
  • Locked the pages in MmCommitPagedPoolAddress, if it is necessary (Hartmut Birr)
  • Try to avoid crashing when dumping out a corrupted stack (David Welch)


  • Set the previous pointer from the next block, if some blocks was merged (in add_to_free_list) (Hartmut Birr)
  • Free or recycle the remaining path string after a call to ObFindObject (Hartmut Birr)
  • Lock the pages always in MmProbeAndLockPages (Hartmut Birr)
  • Locked the pages in MmCommitPagedPoolAddress, if it is necessary (Hartmut Birr)
  • Marked a cache segment as page out in progress to prevent from recursive calls to MmPageOutPhysicalAddress; fixed bug 220 (Hartmut Birr)
  • Protected the callback stack list with a spinlock (Hartmut Birr)
  • Made it possible to allocate a pageop only if no other pageop for the given address exists (Hartmut Birr)
  • Try to pageout a page only if no other access to the page exist (Hartmut Birr)
  • Gave a free page only to the next waiting request (in MmReleasePageMemoryConsumer), if sufficient free pages are available (Hartmut Birr)
  • Initialized the object tag to prevent the tag 0xcccccccc (Hartmut Birr)
  • Removed dirty loading of symbol files from ExpInitializeExecutive (Hartmut Birr)
  • Fixed the loading of symbol files (Hartmut Birr)
  • Try to avoid crashing when dumping out a corrupted stack (David Welch)
  • Avoid a crashing when trying to process an exception early in the boot process (David Welch)
  • Use an event rather than a semaphore to wake up the thread that writes debug output to disk (David Welch)
  • Added basic tracing, breakpoints and disassembly to the kernel debugger (David Welch)
  • Added disassembler from gdb (David Welch)
  • Record feature information from cpuid (David Welch)
  • Fixed bug with recalling previous input (David Welch)
  • Switch back to text mode when entering the debugger (David Welch)
  • Fixed whole page allocations since the handle table code now relies on allocations being eight byte aligned (David Welch)
  • Fix reading past the end of the pool block (David Welch)
  • Fix key name size calculation bugs (Eric Kohl)
  • Fix NtOpenThreadToken() and NtSetInformationThread() (Eric Kohl)
  • Clean-up NtQueryInformationToken() (Eric Kohl)
  • Fully implement RtlFormatCurrentUserKeyPath() (Eric Kohl)
  • Fixed crashes that were cause by the changes to the service parameter table (Eric Kohl)
  • Work on thread-awareness in gdbstub (Ge van Geldorp)
  • Make IoGetDeviceInterfaces more compatible with the native version (Matthew Brace)
  • Hardcode build number consistent with major/minor version (NVidia driver requires this) (Ge van Geldorp)
  • Tell apps we're NT4 SP6, VB runtime will fail if we report SP0 (Ge van Geldorp)
  • Allow GDB 6 to backtrace over a syscall (Ge van Geldorp)
  • Disable pool validation since it slows down execution too much (Ge van Geldorp)
  • Locale values are specified in hexadecimal numbers (Filip Navara)
  • Corrected EiAllocatePool prototype (Filip Navara)
  • Fixed RtlNtStatusToDosErrorNoTeb (Filip Navara)
  • Removed the incorrect implementations of Device Interface functions (Filip Navara)
  • Don't zero memory allocated by ExAllocatePool (Filip Navara)
  • Fixed RtlFormatCurrentUserKeyPath and it's use (Filip Navara)
  • Fill correctly all members of the returned device object in IoCreateDevice (Filip Navara)
  • Don't bug check in loader when export isn't found, only report it and don't load the module (Filip Navara)
  • If we know a module path while loading, use it for searching for the import modules (Filip Navara)
  • Modified LdrpBuildModuleBaseName to not strip the extension from file name (Filip Navara)
  • Call create process notify routines from NtCreateProcess (Filip Navara)
  • Started PsSetLoadImageNotifyRoutine implementation, it just registers the callback, but doesn't call it (Filip Navara)
  • Fixed querying of thread locale (Filip Navara)
  • Implemented IoGetDriverObjectExtension and IoAllocateDriverObjectExtension (Filip Navara)
  • Don't load PnP drivers if they're disabled (Filip Navara)
  • Save pointer to PnP tree device node in device object's DeviceObjectExtension (Filip Navara)
  • Add function IopGetDeviceNode for getting device node from device object pointer (Filip Navara)
  • Rewritten IoGetDeviceProperty to use values that are in device node instead of sending Irps (Filip Navara)
  • Lower IRQL in error case of IoAllocateDriverObjectExtension (Filip Navara)
  • Support for upper level filter drivers (Filip Navara)
  • Rewritten some driver loading functions to get higher control of the driver loading and initialization process, fixes bug #263 (Filip Navara)
  • Added support for lower level filter drivers (Filip Navara)
  • Minor cleanup and fixed few memory leaks on driver unload (Filip Navara)
  • Fixed a minor bug in IopLoadServiceModule that caused crashes for disabled drivers (Filip Navara)
  • Don't bugcheck if FDO wasn't attached (Filip Navara)
  • Fixed cygwin fork section map problem, this fixes map_dup_inherit (Art Yerkes, David Welch)
  • MmMapLockedPages patch (Anich Gregor)
  • Initialize LPC-related fields in ETHREAD (Emanuele Aliberti)
  • Finish off NtDuplicateToken (Jason Filby)


  • Added two new Cache Manager files added for the stubs (Alex Ionescu)
  • Fixed memory corruption in IopInitializeBuiltinDriver (Filip Navara)
  • Various bugfixes to IoQueryDeviceDescription and friends. The floppy driver now loads and finds the drive properly (Vizzini)
  • Use raw size for image sections if virtual size isn't specified (Nathan Lineback)
  • The root bus driver should return an empty resource list on IRP_MN_QUERY_RESOURCES (Eric Kohl)
  • Fixed prototypes of NtAddAtom, NtFindAtom, NtProtectVirtualMemory and *KeQueryInterruptTime (Filip Navara)
  • Fixed list traversing in MmAlterRegion to correctly handle Length that is greater than real memory area size (Filip Navara)
  • Added stubs for the Cache Manager by Alex Ionescu (Steven Edwards)
  • Callbacks implementation (Alex Ionescu)
  • Clean up return val checking of some mdl calls (Vizzini)
  • Store page numbers instead of physical address's within mdls (Hartmut Birr)
  • Allocate memory for mdl's for paging io from stack instead of the non paged pool (Hartmut Birr)
  • Exchanged source and target in WRITE_REGISTER_BUFFER_xxx (Hartmut Birr)
  • Retrieve Hardware IDs and Compatible IDs from the bus driver and attach them to the device node (Eric Kohl)
  • Added a check for a waitable objects in NtWaitForSingleObject and *NtWaitForMultipleObjects (Hartmut Birr)
  • Fixed the start offset of a partition within an extended partition (in xHalIoWritePartitionTable) (Hartmut Birr)
  • Fixed some NULL-terminating issues that caused the 'videoprt.sys???????????????' module name problem (Filip Navara)
  • Fixed a wrong address in MmAlterViewAttributes which possible does cause a crash if the region is longer than one page (Hartmut Birr)
  • Implementation of IoQueryDeviceDescription. Patch by Alex Ionescu (Filip Navara)
  • Write the system boot device and start options to registry, also create the MiniNT registry key if needed (Filip Navara)
  • Fixed the searching for boot load drivers. This solves the pci driver loading problem (Hartmut Birr)
  • Set CurrentThread's u1.ExitTime to exit time in PsTerminateCurrentThread. Patch by Alex Ionescu (Filip Navara)
  • Return success for SystemFileCacheInformation requests to NtQuerySystemInformation, so we can see some information in the Task Manager (Filip Navara)
  • ReactOS-specific debugging functions KeRosDumpStackFrames and KeRosPrintAddress (Royce Mitchel III)
  • The last parameter of NtReadVirtualMemory should be optional (Filip Navara)
  • Removed an obsolete call to ExAllocatePool in CHECKPOINT (Hartmut Birr)
  • Do not immediately write the zeroed region to the disk for a cached file (Hartmut Birr)
  • Fixed a problem, which does occur if the cluster size is lower than the segment size (Hartmut Birr)
  • Implement kernel-mode range lists (Eric Kohl)
  • Install target must not rebuild executables (Eric Kohl)
  • Fixed the implementation of MmMapIoSpace (Hartmut Birr)
  • Fixed the implementation of IoBuildPartialMdl (Hartmut Birr)
  • Set Mdl's Process in MmMapLockedPages to current process and back to NULL in MmUnmapLockedPages (Filip Navara)
  • Implement SeQueryAuthenticationIdToken() (Eric Kohl)
  • Add audit function stubs (Eric Kohl)
  • Do not change the mapping count of a page if the physical address falls in the range of valid physical memory (in MmMapIoSpace and MmUnmapIoSpace) (Hartmut Birr)
  • Add some security function stubs (Eric Kohl)
  • Use bugcheck macros where appropriate so users have a better idea of why they crashed (Royce Mitchel III)
  • Implement multi-block bins. This removes all existing size limits within the registry (Eric Kohl)
  • Janitorial work (Eric Kohl)
  • Put the event from file object as user event into the irp in IopCloseFile and IopDeleteFile (Hartmut Birr)
  • Don't assign arc names to removable media drives like zip drives (Hartmut Birr)
  • Don't read the disk informations at boot time from removable medias like zip drives (Hartmut Birr)
  • Added Spinlock in ObpGetHandleCountbyHandleTable (Jim Tabor)
  • Fix recognition of CALL instruction. Spotted by Anich Gregor (Filip Navara)
  • Return reasonably correct result querying a null memory area. Still a TODO left (Mike Nordell)
  • Change bugcheck parameter to easily find out which SESSION5_INITIALIZATION_FAILED bugcheck occurred (Ge van Geldorp)
  • Make MmQuerySectionView tell how many bytes it actually did set. Fixes VirtualQuery (Mike Nordell)
  • MmQuerySectionView now returns correct AllocationBase (Hartmut Birr, Mike Nordell)
  • Proper way for counting process handles (Jim Tabor)
  • Add missing io performance counters (Eric Kohl)
  • SystemPerformanceInformation reads io counters (Eric Kohl)
  • Call the DriverStartIo routine at DISPATCH_LEVEL in IoStartPacket (Hartmut Birr)
  • Set the offset for a physical page in MmGetPhysicalAddress (Hartmut Birr)
  • Dereference the idle process in some of the NtQuerySystemInformation functions (Hartmut Birr)
  • Stop kernel crashing on thread termination (Mike Nordell)
  • Fixed my mistake in SystemProcessorInformation (Jim Tabor)
  • Fixed SystemProcessorInformation (Jim Tabor)
  • Set 386 as default cpu type (Jim Tabor)
  • Implementation of system performance auditing hax (Jim Tabor)
  • Improved Passive Level kernel and user time counters (Jim Tabor)
  • Fix Kernel User Timer and added ProcessTimes to QueryInformatinProcess (Jim Tabor)
  • Fix Kernel User Timer (Jim Tabor)
  • Add BasePriorty to ProcessBasicInformaion (Jim Tabor)
  • NtGetTickCount implementation (Jim Tabor, Filip Navara)
  • Implementation of system performance auditing hax (Jim Tabor)
  • Improved Passive Level kernel and user time counters (Jim Tabor)
  • Fix Kernel User Timer and added ProcessTimes to QueryInformatinProcess (Jim Tabor)
  • Fix Kernel User Timer (Jim Tabor)
  • Add BasePriorty to ProcessBasicInformaion (Jim Tabor)
  • Make mdl impl. more windows compliant (Gunnar Dalsnes)
  • Make mdl usage/impl. more windows compliant (Gunnar Dalsnes)
  • Filip Navara NtGetTickCount implementation (Jim Tabor)
  • Implemented new Ros exclusive function SystemFullMemoryInformation (Jim Tabor)
  • DBG/KD Types and Prototypes Added (Alex Ionescu)
  • Fixed KeRaiseUserException to return old EIP (Alex Ionescu)
  • Added DBG, FSRTL, Kd, Ldr, Lpc, Ex and Io Stubs (Alex Ionescu)


  • KDB stabs handling changed, should require less memory and load slightly faster ;-) (Gregor Anich)
  • Fixed handling of \r\n in KDB (Gregor Anich)
  • Do not call HalReleaseDisplayOwnership when KDB is entered and screen debugging is not enabled. After an exception the screen will not turn blue but will freeze and be un-frozen when KDB is left (cont) (Gregor Anich)
  • Added OPTIMIZED Flag in config file for building an optimized kernel. (Alex Ionescu)
  • Tagged certain functions that were exported both under NT and ROS, but not marked as un/implemented. (Alex Ionescu)
  • Added all Mm, Rtl, Nt, Se, Zw stubs, and Synched EDF/DEF files, completing stub project. Related work done by Eric Kohl, Mike Nordell, Caroline Liang and Bob Yu. (Alex Ionescu)
  • Implemented PsGetProcessCreateTimeQuadPart, PsGetProcessDebugPort, PsGetProcessExitProcessCalled, PsGetProcessExitStatus, PsGetProcessId, PsGetProcessImageFileName, PsGetProcessInheritedFromUniqueProcessId, PsGetProcessPeb, PsGetProcessPriorityClass, PsGetProcessSectionBaseAddress, PsGetProcessSecurityPort, PsGetProcessWin32Process, PsGetProcessWin32WindowStation, PsIsProcessBeingDebugged, PsGetCurrentProcessSessionId, PsGetProcessSessionId, PsSetProcessPriorityClass, PsSetProcessSecurityPort, PsSetProcessWin32Process, PsSetProcessWin32WindowStation, PsGetThreadFreezeCount, PsGetThreadHardErrorsAreDisabled, PsGetThreadId, PsGetThreadProcess, PsGetThreadProcessId, PsGetThreadSessionId, PsGetThreadTeb, PsGetThreadWin32Thread, PsGetCurrentThreadPreviousMode, PsGetCurrentThreadStackBase, PsGetCurrentThreadStackLimit, PsSetThreadHardErrorsAreDisabled, PsSetThreadWin32Thread, PsRevertThreadToSelf. (Alex Ionescu)
  • Small fixes to I/O Manager and Implemented IoMakeAssociatedIrp. (Parts by Filip Navara, Alex Ionescu)
  • Set the thread of the Allocated IRPs created by Io/Nt Query functions that didn't do this. This can cause problems if the thread is ever read on a completed request. (Alex Ionescu)
  • I/O Manager fixes. (Filip Navara)
  • Initial Support for Quota Pool Allocations: Implemented ExAllocatePoolWithQuota, ExAllocatePoolWithQuotaTag, PsChargePoolQuota, PsChargeProcessNonPagedPoolQuota, PsChargeProcessPagedPoolQuota, PsChargeProcessPoolQuota. (Alex Ionescu)
  • Implemented a basic ExAllocatePoolWithTagPriority, but needs Special Pool support for Driver Verifier functionality. The allocation works however. (Alex Ionescu)
  • Rundown Protection Implementation. Implemented ExAcquireRundownProtection, ExAcquireRundownProtectionEx, ExInitializeRundownProtection, ExReInitializeRundownProtection, ExReleaseRundownProtection, ExReleaseRundownProtectionEx, ExRundownCompleted, ExWaitForRundownProtectionRelease. (Alex Ionescu)
  • Fixed RtlUnwind to correctly remove SEH frames and not to call ZwContinue. (Filip Navara)
  • Fixed NtQueryInformationProcess to return STATUS_NOT_IMPLEMENTED for unimplemented cases. (Filip Navara)
  • Improved implementation of UnhandledExceptionFilter. (Filip Navara)
  • Fixed dispatching of nested exceptions. (Filip Navara)
  • Corrected the obtaining of TLS callbacks address. (Filip Navara)
  • RegQueryValueExW shouldn't touch *lpcbData if lpData == NULL. (Filip Navara)
  • RegEnumValueW should fill in *lpcbData if lpData == NULL. (Filip Navara)
  • Change length checking semantics of NtEnumerateKey for KeyBasicInformation. (Filip Navara)
  • Fix handling of METHOD_IN_DIRECT IRPs. (Filip Navara)
  • Fix heap corruption on converting ANSI -> UNICODE strings. (Filip Navara)
  • Support for deserialized miniports (experimental). (Filip Navara)
  • Set StackPtr->Parameters.Read.Length in IoPageRead. (Filip Navara)
  • Set StackPtr->Parameters.Write.Length in Io[Synchronous]PageWrite. (Filip Navara)
  • Don't increase Irp->AssociatedIrp.IrpCount in IoMakeAssociatedIrp. The caller is responsible for doing it. (Filip Navara)
  • Don't unlock MDLs of associated Irps. (Filip Navara)
  • Fix deleting of section if an early failure during section creation happens and not all structures are initialized yet. (Filip Navara)
  • Fix FsRtlDoesNameContainWildCards loop to take into account the first and lst letter of the expression. (Filip Navara)
  • Dumb implementation of FsRtlIsNameInExpression. (Filip Navara)
  • Copy over device object SectorSize and AlignmentRequirement in IoAttachDeviceToDeviceStack. (Filip Navara)
  • NtQuerySection should check for SECTION_QUERY access right and not SECTION_MAP_READ. (Filip Navara)
  • Implement NtNotifyChangeDirectoryFile. (Filip Navara)
  • Honour ApcRoutine and ApcContext parameters of NtQueryDirectoryFile. (Filip Navara)
  • Fix NtQueryDirectoryObject for empty directories. (Filip Navara)
  • Fix masking out the write flags in IoCheckShareAccess and IoSetShareAccess. (Filip Navara)
  • Implement CcRepinBcb and CcGetFileObjectFromBcb. (Filip Navara)
  • Partially implement CcUnpinRepinnedBcb, CcPinMappedData, CcPinRead, CcPreparePinWrite, CcInitializeCacheMap (Art Yerkes),and CcUninitializeCacheMap. (Filip Navara)
  • Fix ReadCacheSegmentChain to handle correctly big request and check for MDL request memory overflow. (Filip Navara)
  • Allow passing NULL BCB to CcSetFileSizes. (Filip Navara)
  • Ensure that registry files are opened using lowercase file names. (Filip Navara)
  • Mapping zero-sized files is prohibited. (Filip Navara)
  • Close the registry hive file object in CmiInitNonVolatileRegistryHive. (Filip Navara)
  • Revise order of PsInitializeThread to insert the thread to the lists after *all* the fields are initialized and while holding the PiThreadListLock lock. (Filip Navara)
  • Implement IntWideCharToMultiByteUTF8 since it's needed for saving Explorer configuration. (Filip Navara)
  • Use FsRtl routines for wildcard handling. (Filip Navara)
  • Fix setting of GDT and IDT pointers in KPCR. (Filip Navara)
  • Fix section object dereferencing in NtCreateSection. (Filip Navara)
  • Improved removable media support. (Hartmut Birr)
  • Implemented NtQueryVirtualMemory for unallocated regions. (Hartmut Birr)
  • Fixed some minor bugs in NtQueryVirtualMemory and its related query functions. (Hartmut Birr)
  • Update the page counters in MmGetContinuousPages. (Hartmut Birr )
  • Add a flag to PHYSICAL_PAGE, to detect if a free page is on the zeroed or on the unzeroed list. (Hartmut Birr)
  • Changed all internal memory functions to use the page frame number instead of the physical address. (Hartmut Birr)
  • Allowed MmCreateVirtualMapping to create mappings for more than one page. (Hartmut Birr)
  • Used invplg to invalidate a single tlb entry. (Hartmut Birr)
  • Simplified the access to the page tables/directories. (Hartmut Birr)
  • Returned more of the protection bits in MmGetPageProtect. (Hartmut Birr)
  • Ignore the PAGE_SYSTEM attribute and set the user bit according to the given address in MmSetPageProtect and MmCreateVirtualMappingUnsafe. (Hartmut Birr)
  • Don't change the accessed and dirty bit in MmSetPageProtect. (Hartmut Birr)
  • Fixed the calculation of used non paged pool pages in grow_block. (Hartmut Birr)
  • Enabled global pages if it is possible. (Hartmut Birr)
  • Put the kernel map onto a fixed location and establish a page table for the first 4MB in the very early boot process. (Hartmut Birr)
  • Disable the mapping for the page table pages within the bss section at boot time. (Hartmut Birr)
  • Replaced MmUpdateStackPageDir by MmUpdatePageDir which can establish the pde's of a process for any address range within the kernel address range. (Hartmut Birr)
  • Set the pde's for the kernel stack at thread creation time and not at any task switch. (Hartmut Birr)
  • Fixed a crash which occurs on thread switching if the pde's for the new process structure are not established within the address space of the old thread. (Hartmut Birr)
  • Rewrote MmInitializePageList. It isn't necessary to setup the pde's for the largest memory configuration at boot time. (Hartmut Birr)
  • Made the parts of the page directory map inaccessible from user mode which are setup at boot time. (Hartmut Birr)
  • Changed the sequence of some memory initialisation functions. (Hartmut Birr)
  • Check for a valid layout buffer entry in xHalIoAssignDriveLetters. (Hartmut Birr)
  • Check if the given address points into a valid section (in MmUnmapViewOfSection). (Hartmut Birr)
  • Check if the section isn't deleted straight (in MmUnmapViewOfSection). (Hartmut Birr)
  • NtOpenThread should look at the CIDs UniqueThread member only, not at UniqueProcess. Makes OpenThread() work. (Gé van Geldorp)
  • Implement TokenOrigin class for GetTokenInformation (Gé van Geldorp)
  • Copy AuthenticationId from existing token when duplicating a token (Gé van Geldorp)
  • Use MmCopyFrom/ToCaller to transfer data in NtQueryDirectoryObject, also lock list when traversing it (Gé van Geldorp)
  • Don't clobber the exception list in the PCR when handling a trap: it breaks kernel-mode SEH (KJK::Hyperion)
  • cleanup/reformat syscall code, save return value as soon as possible so that eax is freed up, which also simplifies the implementation of KiAfterSystemCallHook(), also removes a couple redundant instructions. (Royce Mitchell III)
  • NtContinue fixed to return failure on invalid params ( not checking for access violations yet ), but not clobber EAX on success. This patch was made possible by the collaborative efforts of (Royce Mitchell III, KJK::Hyperion, Art Yerkes, and Skywing)
  • NtRaiseException fixed to not clobber EAX any more, and both NtContinue and NtRaiseException no longer clobber EDX. kmode SEH works now, but there are likely some lingering bugs. This patch was made possible by the collaborative efforts of (Royce Mitchell III, KJK::Hyperion, Art Yerkes, and Skywing)
  • Implement the security descriptor cache (Eric Kohl)
  • Improve many security-related functions (Eric Kohl)
  • Implement basic functionality to ingerit an objects security descriptor (Eric Kohl)


  • Debug symbols from SYM files loaded and used in DBG builds ( they used to only work in KDBG builds ) - several SYM-related bugs fixed (Royce Mitchell III)
  • Floating point and SSE state saving for uni- and multiprocessor systems (Gregor Anich)
  • Unmasked floating point and SSE exception support (Gregor Anich)
  • Various fixes to registry handling (Eric Kohl, Filip Navara)
  • Rewrote APC implementation (Alex Ionescu)
  • Rewrote/improved most of the DPC implementation (Alex Ionescu)
  • Allowed ReactOS to use 2GB/2GB Kernel/User memory model (Alex Ionescu)
  • Implemented KeSetEventBoostPriority, KeFindConfigurationEntry, KeDeregisterBugCheckCallback, KeIsAttachedProcess, KeQueryActiveProcessors, KeSetDmaIoCoherency, KeSetTimeIncrement, KeQueryRuntimeThread, KeUpdateRunTime, KeUpdateSystemTime, KeAreApcsDisabled, KeFlushEntireTb, KeIsExecutingDpc, KeSetKernelStackSwapEnable, KeQueryPriorityThread, KeRevertToUserAffinityThread, KeSetIdealProcessorThread, KeSetSystemAffinityThread, KeTerminateThread, KeStackAttachProcess, KeUnstackDetachProcess, ExVerifySuite, ExInterlockedFlushSList, ExSystemExceptionFilter, ExRaiseException, ExGetCurrentProcessorCpuUsage, ExGetCurrentProcessorCounts, PsRevertThreadToSelf, ExAcquireRundownProtection, ExAcquireRundownProtectionEx, ExInitializeRundownProtection, ExReInitializeRundownProtection, ExReleaseRundownProtection, ExReleaseRundownProtectionEx, ExRundownCompleted, ExWaitForRundownProtectionRelease, ExAllocatePoolWithQuota, ExAllocatePoolWithQuotaTag, PsChargePoolQuota, PsChargeProcessNonPagedPoolQuota, PsChargeProcessPagedPoolQuota, PsChargeProcessPoolQuota, ExAllocatePoolWithTagPriority (Alex Ionescu)
  • Fixed a couple of I/O Manager bugs related to IRPs (Alex Ionescu)
  • Implemented basic Process Quota support (Alex Ionescu)
  • Use 64k granularity for virtual memory (Gé van Geldorp)
  • Add shutdown messages (Gé van Geldorp)
  • PagedPool modified to keep track of Tags and a couple support functions added to access this information (Royce Mitchell III)
  • Added support to KDBG to query the tag of a memory block (Art Yerkes)
  • Complete rewrite of PagedPool - better than 800% performance improvement, designed to support multiple pools (SpecialPool?), and designed to help better catch misused memory under it's care. (Royce Mitchell III)
  • Improved low level page mapping (Hartmut Birr)
  • Implemented PAE (physical address extension) mapping (Hartmut Birr)
  • Implemented the no execution feature for AMD 64 cpus (Hartmut Birr)
  • Made a tlb entry invalid on all processors if the mapping is deleted or changed. (Hartmut Birr)
  • Implemented the driver loading by the sequence of tag entries in the GroupOrderList key (Hartmut Birr)
  • Rewrote parts of the Process & Thread time count functions (Hartmut Birr)
  • Rewrote (copied from ntdll) parts of the relocation and import fixup code. Don't load no-load sections at the end of the driver. Don't relocate the relocation section itself. Set the correct page protection for section which are executable. (Hartmut Birr)
  • Fixed the scanning for boot options. (Hartmut Birr)
  • Started the implementation of the ipi calls. Implemented KiIpiSendRequest for simple requests. (Hartmut Birr)
  • Changed the init sequence in KeInit1 and KePrepareForApplicationProcessorInit. Fixed the pae mode initialisation for application processors. (Hartmut Birr)
  • Prevent from terminate a thread for twice. (Hartmut Birr)
  • Replaced PiThreadLock with the dispatcher databae lock. Fixed some problems while setting/changing the affinity of a thread. (Hartmut Birr)
  • Improved KeBugCheckWithTf for smp machines. (Hartmut Birr)
  • Split KdInitSystem in two phases, to enable debug prints (serial line and bochs) in the very early boot stage (before the initialisation from hal). (Hartmut Birr)
  • Get rid of the "global" system process handle (Thomas Weidenmueller)
  • Better, but as of now - untested - implementation of rundown protections (Thomas Weidenmueller)
  • Fixed prototypes of NtSetEvent(), NtResetEvent(), NtQueryEvent(), NtPulseEvent(), NtOpenEvent(), NtCreateEvent(), NtCreateMutant(), NtQueryMutant(), NtQuerySemaphore(), NtQueryTimer(), NtReleaseMutant(), NtReleaseSemaphore(), NtSetTimerResolution(), NtSetTimer(), NtCreateProfile() and NtQueryIntervalProfile() (Thomas Weidenmueller)
  • Implemented PsGetProcessJob(), PsGetJobLock(), PsGetJobSessionId() and PsGetJobUIRestrictionsClass() (Thomas Weidenmueller)
  • Group Threads into processes instead of a global thread list (Thomas Weidenmueller)
  • Got rid of all reactos-specific fields in the E/KTHREAD structure and make them match the win2k layout (Thomas Weidenmueller)
  • Added preliminary ClientID management - currently only used for thread IDs (Thomas Weidenmueller)
  • Disabled thread event pair functions by default (NT4 only) as they require a field in the ETHREAD structure that is not present in more recent versions (Thomas Weidenmueller)
  • Removed some bad window station/desktop hacks (Thomas Weidenmueller)
  • Added boot logging (Eric Kohl)
  • Support changing the system time and timezone (Eric Kohl)
  • Fix registry bugs (Eric Kohl)
  • Support the FILE_APPEND_DATA file access right (Eric Kohl)


  • Rewritten Kernel Debugger (Gregor Anich)
  • Fix KeRaiseUserException (Alex Ionescu)
  • Fixed kernel source code for future W32API compatibility (Alex Ionescu)
  • Removed /nt directory in source code and put its contents in the respective proper place instead. (Alex Ionescu)
  • Added support for SYSENTER instruction instead of INT2E. Results in up to 80% synthetic speed improvement (ROS will feel about 1.5-2x faster on VMWare/Real Hardware) (Alex Ionescu)
  • Fixed some APC problems which blocked certain apps from working. (Alex Ionescu)
  • Rewrote Timer Implementation. More features and stability were added. The structures were modified to match the NT ones. (Alex Ionescu)
  • Rewrote Dispatcher and Queue functions to fix some bugs and optimize the code. (Alex Ionescu)
  • Sped up some Dispatcher functions. (Alex Ionescu)
  • Fixed Mutant/Mutex bugs and added some missing functionality. (Alex Ionescu)
  • Fixed Event bugs to use locks and proper signaling semantics. (Alex Ionescu)
  • Fixed Semaphore bugs during exception and release. (Alex Ionescu)
  • Removed Thread Event Pairs and added KeInitializeEventPair. (Alex Ionescu)
  • Rewrote Work Items, supporting the NT structures, allowing for Dynamic Work Items to be implemented.
  • Added priority boosting during wait operations and thread scheduling. This should make things a bit more responsive. (Alex Ionescu)
  • Rewrote Thread/Process Termination. Fixed Thread/Set get context, made some broken regression tests work, allowed Task Manager to kill processes, and removed APC hacks. Thanks to Thomas and Filip for having fixed some of the issues which this patch brought. (Alex Ionescu)
  • Sped up thread termination by using a more optimized Reaper/TerminationPort link and syncornizing with NT's. (Alex Ionescu)
  • Properly initialize Threaded DPCs (Alex Ionescu)
  • Fix leak in IO Completion IRPs not being freed. (Alex Ionescu)
  • Implemented KeRemoveServiceDescriptorTable, KeAlertResumeThread, NtAlertResumeThread, KeGetREcommendedSharedDataAlignment, NtRaiseHardError and KeRegister/DeregisterBugcheckWithReason. (Alex Ionescu)
  • Sped up bootup by caching the loaded modules and command line settings. (Alex Ionescu)
  • Rewrote Profile Object Implementation to work as on Windows. (Alex Ionescu)
  • Added dynamic ACPI Support. Fixed by Filip Navara as well. (Alex Ionescu)
  • Rewrote bug check code. Bugchecks are now much friendlier for the user, and actually work all the time without looping or becoming garbled/unavailable. Callbacks are called and IPI works on SMP when a bug check happens. (Alex Ionescu)

ChangeLog-0.2.7 (Hervé Poussineau)

  • Implemented:
    • IoRegisterDeviceInterface
    • IoSetDeviceInterfaceState
    • IoRegisterPlugPlayNotification
    • IoUnregisterPlugPlayNotification
    • PoRequestPowerIrp
    • IRP_MN_QUERY_RESOURCE_REQUIREMENTS for devices enumerated by Root bus

(Eric Kohl)

  • Implemented:
    • PlugPlayControlProperty and PlugPlayControlGetDeviceDepth
    • CM_Get_Global_State/CM_Get_Global_State_Ex

(Alex Ionescu)

  • Kernel (Ke)
    • Implemented Guarded Mutex:
      • KeAcquireGuardedMutex, KeEnterGuardedRegion, KeLeaveGuardedRegion, KeInitializeGuardedMutex, KeAcquireGuardedMutexUnsafe, KeReleaseGuardedMutexUnsafe, KeAcquireGuardedMutex, KeReleaseGuardedMutex, KeTryToAcquireGuardedMutex
    • Fixed critical APC queuing and delivery bugs
    • Optimized Entering/Leaving critical sections and enabled APC delivery after each leave, if required
    • Fixed KeWaitForMultipleObjects if WaitAll was used
    • Rewrote context switching to be faster
    • Fixed KINTERRUPT structure and KeDisconnectInterrupt
    • Fixed a bug in which kernel queues were inserted into the ready thread list
  • Input/Output (Io)
    • Implemented IoIsfileOriginRemote, IoGetLowerDeviceObject, IoGetDiskDeviceObject, IoGetRequestorSessionId, IoGetRequestorProcessId, IoRegisterBootDriverRetinialization, IoAttachDevicetoDeviceStackSafe, IoEnumerateDeviceObjectList, IoGetDeviceAttachmentBaseRef, IoDetachDevice, IoRaiseHardError
    • Fixed controller objects implementation
    • Fixed attaching to devices (IoAttachDevice) so that the appropriate driver will be notified with IO_ATTACH_DEVICE_API
    • Fixed IoAttachDevicetoDeviceStack and IoAttachDevice to call the Safe function
    • Optimized IoGetRelatedDeviceObject
    • Removed IoOpenDeviceInstanceKey and IoQueryDeviceEnumInfo
    • Cleaned up IopAllocateVpb
    • Optimized IoCreateDevice, added support for more flags and removed hard-coded sector size and incorrect sizes which were previously set
    • Fixed IRP Code not to zero out the IRP, to free MDLs in failure cases, to set the correct IRP flags and to set the I/O object type
    • Reimplemented second-stage completion for IRPs to free ALL MDLs, to free memory depending on the flags used, not to call I/O Completion if an APC is registered, not to set event/call APCs in some failure cases, and not to use certain fields after the pointer can become invalid
    • Uses the correct stack count in I/O operations
    • Fixed IopDeleteFile to fix a memory leak and to dereference the completion port
    • Fixed IopCloseFile, NtQueryInformationFile, NtFlushBuffersFile, NtQueryDirectoryFile, NtReadFile, NtWriteFile, NtSetInformationFile, IopSecurityFile, IopQueryFileName, NtDeviceIoControlFile, NtLockFile, and NtUnlockFile, which contained several bugs related to IRPs and completion, were making assumptions or not supporting all the appropriate possibilities, were signaling the wrong event or making the wrong kind of call, or were using the wrong device object
    • Implemented lookaside lists for IRP packets to increase the allocation/deallocation speed by over 400%
    • Optimized completion packets by piggybacking them on IRP packets if possible, and added the correct memory flags to free them properly
    • Share NtDeviceIoControlFile and NtFsIoControlFile
    • Fixed IRP cancellation
    • Rewrote I/O interrupt functions to match the new structure, and optimized some code paths
  • Process Manager (Ps)
    • Created memory manager (Mm) functions when touching process/memory
    • Created kernel (Ke) functions when touching kernel structures and semantics
    • Cached and optimized system DLL (ntdll) loading/mapping, so that it is done only at startup
    • Implemented NtOpenProcess, PsRemoveLoadImageNotifyRoutine, PsGetCurrentProcessSessionId, PsSetLegoNotifyRoutine, PsRemoveCreateThreadNotifyroutine, PsGetVersion
    • Rewrote process/thread creation and exit functions
  • Memory Manager (Mm)
    • PEB and TEB are now properly allocated in memory, allowing 4KB granularity instead of 64KB, and removed all the hacks which allowed this earlier
    • Implemented MmCreateKernelStack and MmDeleteKernelStack
    • Took out many system structures from non-paged pool to paged pool, to reduce physical memory consumption
    • Removed pool debugging functions in retail builds to increase execution speed
    • Prohibit NtQueryVirtualMemory for kernel-mode addresses
    • Fixed bug in memory mapping which caused large applications to trigger the “blue screen of death” (BSOD)
    • Made the PE loader more lenient so that it can load a broader range of valid executables
  • Executive (Ex)
    • Fixed the lookaside functions, their macros and the way the functions were being exported
    • Moved Win32k object registration into Win32k—the pointers and initialization are now done when Win32k loads
  • Debugging Services (Dbgk/Kd)
    • Implemented some Dbgk code for user-mode debugging
    • Implemented modular debugging services for Bochs, GNU Debugger (GDB), etc.
  • Object Manager (Ob)
    • Implemented fast referencing stubs
    • Rewrote ObQueryNameString
    • Rewrote ObjectType creation to match the structures, flags and semantics present in Windows NT's Object Manager, from the caller's point of view
    • Implemented Object Create Information structure and semantics when capturing data from user-mode, securing and removing a lot of potential kernel exploits
    • Fixed ObCreateObject and ObInsertObject to work as in Microsoft Windows— ObCreateObject only allocates the object, while ObInsertObject does everything else
  • File System Runtime (FsRtl)
    • FsRtlMdlRead, FsRtlMdlReadComplete, FsMdlReadCompleteDev, FsRtlMdlWRiteComplete, FsRtlMdlWriteCompleteDev, FsRtlPrepareMdlWrite, CcMdlReadCompleted, CcMdlWriteComplete, CcMdlReadCompleteDev, FsRtlAllocateResource, FsRtlIsPagingFile, FsRtlBalanceReads
  • Security Subsystem (Se)
    • Implemented SeCreateAccessState, SeDeleteAccessState, and SeSetAccessStateGenericMapping based on a patch by Javier M. Mellid


  • Fix PsKillMostProcesses to run in the context of the system process. (Hartmut Birr)
  • Implemented IRP_MJ_QUERY_VOLUME_INFORMATION/FileFsDeviceInformation. (Hartmut Birr)
  • Implemented MEMORY_AREA_PEB_OR_TEB and MEMORY_AREA_PAGED_POOL for MiQueryVirtualMemory.(Hartmut Birr)
  • Make GDB available for release builds (Gé van Geldorp)
  • Fix GDB backtrace (Gé van Geldorp)
  • Fixed APC delivery bug with Normal Routine receing from parameters (Alex Ionescu)
  • Fixed thread termination APC semantics (Alex Ionescu)
  • Disable APC Queuing and add APC Flushing during thread shutdown, call Lego routine during thread shutdown (Alex Ionescu)
  • Properly decrease Thread Quantum during Waits (Alex Ionescu)
  • Optimize locking in Timer Code (Alex Ionescu)
  • Fix Timer Object Type Initializer to actually use ExpTimerDelete when the object is deleted. (Alex Ionescu)
  • Fix Initializer to report correct memory usage of timer object. (Alex Ionescu)
  • Fix Initializer to report OBJ_OPENLINK as an invalid attribute for timer objects. (Alex Ionescu)
  • Use correct access masks when modifying or querying timer objects. (Alex Ionescu)
  • Handle wake timers in NtCancelTimer. (Alex Ionescu)
  • Return warning NTSTATUS code if a wake timer is requested but not supported by the system (default on ROS). (Alex Ionescu)
  • Check for valid timer type in NtCreateTimer. (Alex Ionescu)
  • Check for valid period in NtSetTimer. (Alex Ionescu)
  • Don't dereference the timer in NtSetTimer three times.(Alex Ionescu)
  • Return the correct Due Time in NtQueryTimer by substracting the stable interrupt time. (Alex Ionescu)
  • Optimize Lookaside List implementation (Alex Ionescu)
  • Fix bugs in Semaphore code (Alex Ionescu)
  • Fixed a bug in IoCreateDevice and added an optimization (Alex Ionescu)
  • Added failure cases in NtAllocateVitualMemory (Alex Ionescu)
  • Fixed NtSignalAndwaitForSingleObject to use SEH and optimized it for speed (Alex Ionescu)
  • Implement SeDefaultObjectMethod for security callbacks of objects which don't have a custom one.
  • Initialize more fields when creating an Object Type (Alex Ionescu)
  • Correct the Pool Charge for Object Types, select a Default Object, always use a security procedure, read global flag for maintaing type lists, set the pool type (Alex Ionescu)
  • Initialize a Default Wait Object. (Alex Ionescu)
  • Fix security callback for objects. (Alex Ionescu)
  • Completely reimplemented NtWaitForMultipleObjects not to use 25% of available stack space and added checks for invalid waits. Also optimized for speed to remove a call which significantly slowed down execution.
  • Use DefaultObject from Object Header and remove all previous associated hacks, including the IO_TYPE hack. The DefaultObject will either be NULL, an offset to an internal Object Event, or a pointer to a default event. We handle all three. (Alex Ionescu)
  • Guard KeWaitXXX calls with SEH since it can raise exceptions. (Alex Ionescu)
  • Fixed a large amount of bugs in ObpAllocateObjectAttributes & Name
  • Fix NtSuspendThread: correct PreviousMode check, return error if thread is terminating, handle KeSuspendThread's possible exception, only attempt to return previous suspend count if asked to. (Alex Ionescu)
  • Make KeSuspendThread return an exception if the thread has been suspended beyond the limit. (Alex Ionescu)
  • Implement KeQueryBasePriorityThread to return the actual Base Priority Increment (or Saturation Increment) to NtQueryInformationThread. (Alex Ionescu)
  • Fix priority formulas, account for saturation, do proper km_um conversions for out of bounds or saturation priorirites, create an internal priority change function to be called if the lock is already held (Alex Ionescu)
  • Do not report that ROS is running on 0 active processors, that's a bad idea. (Alex Ionescu)
  • Actually check the affinity mask set by NtSetInformationThread (Alex Ionescu)
  • Fix the check in KeSetAffinityThread (Alex Ionescu)
  • Give a valid affinity to the system thread (corresponding to the active cpu affinity set). (Alex Ionescu)
  • Define and use a list of Bus Type GUIDs instead of saving the GUID in a ROS-only field of DEVICE_NODE. (Alex Ionescu)
  • Use a IRP_MN_QUERY_CAPABILITIES PnP IRP to get the Address of a DeviceNode, intead of saving it inside a ROS-only field.
  • Use correct wait mode when checking alertability in KeDelayExecuteThread. (Alex Ionescu)
  • The KTHREAD alterted flag is now properly set to FALSE during APC delivery during traps. (Alex Ionescu)
  • More support for PKEXCEPTION_FRAME has been added for future PPC/IA64/etc compatibility. (Alex Ionescu)
  • Context to/from TrapFrame functions have been greatly fixed to allow for edited frames, special cases, exceptions and also have the necessary support for supporting sanitation based on PreviousMode. (Alex Ionescu)
  • KDBG now shows the proper CS/SS at all times, previous hack was removed. (Alex Ionescu)
  • Systemcall code was optimized a bit and the trap code was made a lot more generic so that in can be made into macros (it currently isn't, for debugging purposes). (Alex Ionescu)
  • V86 Mode trap frame bias has now been added to make trap code a lot more generic and shareable in the future. (Alex Ionescu)
  • Fix Ntcontinue to respect AlertThread paramter. (Alex Ionescu)
  • Fix KiDispatchException's logic, fix hacks when calling KeUserExceptionDispatcher, use correct context flags (Alex Ionescu)
  • Modify some kernel functions (like KeContextToTrapFrame, KiDispatchException, KiInitializeUserApc, etc.) to support a PKEXCEPTION_FRAME for future PPC compatibility. (Alex Ionescu)
  • Reimplement NtContinue to have more platform-independent code, and to protect and validate user-mode context and parameters with SEH. (Alex Ionescu)
  • Fix KiInitializeUserApc to use KeTrapFrameToContext, to save the debug registers, not to deliver APCs during v86 mode, and to protect user-mode stack operations in SEH and probing. Also make it generate the proper stack for the user-mode callback. (Alex Ionescu)
  • Implement KiUnexpectedInterrupt and KiCoprocessorError (Alex Ionescu)
  • Reimplement NtRaiseException in ASM to take advantage of optimizations due to the trap frame being in the stack when called through System call interface. (Alex Ionescu)
  • Fix some functiosn to return with KiServiceExit2 instead of KiServiceExit when required/needed (Alex Ionescu)
  • Implemented NtQueryDebugFilterState and NtSetDebugFilterState (Alex Ionescu)
  • Implemented DbgUiConnectToDbg, DbgUiContinue, DbgUiWaitStateChange, DbgUiRemoteBreakin, DbgUiIssueRemoteBreakin (Alex Ionescu)
  • Fix a bug where APCs were not dispatched after a system call (Alex Ionescu)
  • Implement alldvrm and aulldvrm and export them from ntoskrnl. (Alex Ionescu)
  • Properly support Special APC Disabling. (Alex Ionescu)
  • Allow Guarded Mutex and Guarded Regions to function properly. (Alex Ionescu)
  • Fix several bugs in KeFreezeAllThreads (Alex Ionescu)
  • Optimize KeRundownThread to reduce contention (Alex Ionescu)
  • Set kernel apc pending flag when needed in KeReleaseMutant (Alex Ionescu)
  • Remove duplicated listhead initialization in KeInitiializeMutex (Alex Ionescu)
  • Use correct increment in KeReleaseMutex (Alex Ionescu)
  • Raise right exception in KeReleaseMutant (Alex Ionescu)
  • Add RtlSetProcessCritical (Alex Ionescu)
  • Fix signalstate check in KGATE code (Alex Ionescu)
  • BCB tracing implementation (Royce Mitchell)


  • Fix bugcheck during shutdown (Gé van Geldorp)
  • Add user-contributed shutdown messages (Gé van Geldorp)
  • Add hardware breakpoints and watchpoints to GDB stub (Gé van Geldorp)
  • Update some system structures to Windows 2003 so that NT 5.2 drivers can now load and be tested. (Alex Ionescu)
  • Send a hacked access state to FS Drivers, they can depend on one. For now use one with full FILE_ALL_ACCESS privileges. (Alex Ionescu)
  • Hackplement ObLogSecurityDescriptor for W2K3 drivers to be happy. (Alex Ionescu)
  • Remove unimplemented macro in SeOpenObjectAuditAlarm and replace it with a DPRINT1; that way callers won't freeze while calling it. (Alex Ionescu)
  • Fixed two really nasty bugs in I/O completion: (Alex Ionescu)
    • The user buffer wasn't written for incomplete I/O (warning levels) for METHOD_BUFFERED
    • Incomplete I/Os (warning levels) took a completely wrong path for completion.
  • Reimplement Fast Mutex implementation in HAL/NT to be compatible with the real implementation. (Fast Mutex needs to raise IRQL). (Alex Ionescu)
  • Implement ExEnterCriticalRegionAndAcquireFastMutexUnsafe and ExReleaseFastMutexUnsafeAndLeaveCriticalRegion. (Alex Ionescu)
  • Implement and export ntoskrnl version of Fast Mutex (Alex Ionescu)
  • Fix a typo causing a potentially fatal bug in user-mode exceptions. (Alex Ionescu)
  • Correctly zero out esi during new thread context switch. Thanks to Patrick Baggett. (Alex Ionescu)
  • Fix KeAttackProcess, KeStackAttachProcess, KeUnstackDetachProcess and KeDetachProcess. (Alex Ionescu)
  • Allocate bus number resources in IopAssignDeviceResources. (Hervé Poussineau)
  • When a driver is a legacy driver, call its AddDevice function with a NULL Pdo (Hervé Poussineau)
  • Fixed the mapping for low alignment images (Hartmut Birr).
  • Set the correct type and state in MiQueryVirtualMemory. Return an error in MiProtectVirtualMemory if we trying to access a region other than a section view or virtual memory. Don't allow to read or write kernel memory in NtRead/WriteVirtualMemory. Don't unprotect the memory in NtWriteVirtualMemory. Don't allow to change the memory protection of kernel address space. If it is possible, access the memory aligned by pages (in ProbeForWrite). Change the protection in WriteProcessMemory if it is necessary. (Hartmut Birr)
  • Removed the initialisation of the kernel map area. Allocate the region for the paged and non paged pool at a 4MB boundary. Protect the local and i/o apic by a memory area. (Hartmut Birr)
  • Lock always the address space if we changing the virtual mapping. This is necessary because we can create or remove a page table. If we unmap a section, we have to wait for all pending pageops for the section within the current process. We do this by waiting for all pageops for the section. Merged MmReleaseMemoryArea into MmReleaseMmInfo. We can only release the address space look if we are calling MmUnmapViewOfSection.(Hartmut Birr)
  • Map the NLS tables after creating the PEB. The top-down mapping of the NLS tables may occupied the region for the PEB. Fixed the check for the MEM_TOP_DOWN flag in MmMapViewOfSection. (Hartmut Birr)
  • Do always dereference the section object if it was created (in PspCreateProcess). (Hartmut Birr)
  • Fixed the growing of the dirty bitmap. This will fix the registry update bugs, if the binary hive is larger than 128kB. (Hartmut Birr)
  • Removed the process from the parameter list of MmCreateMemoryArea. Changed the 9th parameter of MmCreateMemoryArea to allocation flags. Implemented SEC_NO_CHANGE. (Hartmut Birr)
  • Fixed a few length calculation in NtEnumerateValueKey, which has resulted in a overflow, if the given buffer was too small. Fixed the test for the dirty bitmap size. Fixed the length to copy the old dirty bitmap. Set the value/data cell to dirty, if an existing value is overwritten. Used the size of the data cell instead of the previous data length to check if enough space is available (in NtSetValueKey). (Hartmut Birr)
  • Waiting for a fast mutex should be done in kernel mode. (Hartmut Birr)
  • Lock the MainResource from fcb, if we are trying to write back a modified cache segment. Usually we have to call the callback function from FSD. (Hartmut Birr)
  • Allocate the memory for the search pattern in kernel space if it is necessary (in NtQueryDirectoryFile). (Hartmut Birr)
  • Used the already detected cache line size for RtlPrefetchMemoryNonTemporal. Initialized RtlPrefetchMemoryNonTemporal earlier. Change the memory protection during the initialisation of RtlPrefetchMemoryNonTemporal. (Hartmut Birr)
  • Release the rmap list lock after cleaning the head entry in MmDeleteAllRmaps. This may fix bug #1071. (Hartmut Birr)


  • patch from w3seek : create smss with a current directory (system path), Otherwise the current directory for all early processes will be NULL. Fixes some inf installation issues reported by Herve. commited by (Magnus Olsen)
  • Fix a bug in FsRtlNumberOfRunsInLargeMcb after compare http://www.jankratochvil.net/captive source changes of ReactOS ntoskrnl. (Magnus Olsen)
  • Respect the fact, that the driver can return NULL-pointer, instead of a string having 0 characters! (makes third-party drivers compatibility better) (Aleksey Bragin)
  • Move xbox's i2c support to a separate file, and add support of xbox's LEDs switching. Currently it initializes leds to red, and immediately after base init is done (means video has been initialized) they are turned to orange (good for debugging) (Aleksey Bragin)
  • Fix incorrect fast interlocks function prototypes (Aleksey Bragin)
  • Fix kernel mode executive atom implementation (mostly add SEH and tidy up the code). Then fix kernel32 implementation which was sending incorrect sizes, and also refactored the entire code, since most functions were quatriplicated. (Alex Ionescu)
  • Fixed a bug in RtlCreateAtomTable. (Alex Ionescu)
  • Fixed bugs in Profile implementation. Add support for segmented profile objects.(Alex Ionescu)
  • Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchangeAddSizeT. (Alex Ionescu)
  • Reimplemented Rundown Protection. (Alex Ionescu)
  • Implement YieldProcessor (Alex Ionescu)
  • KiAcquireSpinlock and KiReleaseSpinLock should be no-op functions on uniprocessor machines. (Alex Ionescu)
  • KiReleaseSpinLock does not need interlocked access to release the lock. (Alex Ionescu)
  • Use portable code for KiAcquireSpinLock. Also use interlocked bit operations since they are faster. (Alex Ionescu)
  • Rewrite Executive Interlocked Functions to actually work as supposed and also immensly increase their speed, most notably on non*SMP machines. (Alex Ionescu)
  • Fix shamefully dangerously broken Work Thread/Queue/Item implementation. (Alex Ionescu)
  • Implement a worker thread balance set manager. (Alex Ionescu)
  • Implement Pushlocks. (Alex Ionescu)
  • Optimized the dispatcher lock. It is now gone on non*SMP systems and IRQL is raised or lowered instead. (Alex Ionescu)
  • Fixed some places which werne't setting the dispatcher header's size member correctly. (Alex Ionescu)
  • Created separate cases for satisfying mutant, non*mutant and generic objects, to optimize wait satisfaction. (Alex Ionescu)
  • Fixed a case in KiCheckAlertability: we also need to check if the thread is alerted in Kernel-Mode, even if the wait mode given was user and user-mode is not alerted. (Alex Ionescu)
  • Fixed signaling checks across the wait code and removed KiCheckIfObjectSignaled. We must not consider the mutant as signaled if SignalState is = 1. (Alex Ionescu)
  • Fix code to check if the wait blocks' status is STATUS_TIMEOUT, because we do not need to check for signal state in that case. (Alex Ionescu)
  • Removed the exports for internal dispatcher lock routines. (Alex Ionescu)
  • Implemented Queued and In-Stack Queued Spinlocks (at DPC-Level). (Alex Ionescu)
  • Separate UP and MP spinlock functions. (Alex Ionescu)
  • Optimize UP spinlock functions so they don't call ntoskrnl anymore and only raise/lower irql. (Alex Ionescu)
  • Implemented Queued Spinlocks and In*Stack Queued Spinlocks for UP machines. (Alex Ionescu)
  • Implemented KeAcquireInStackQueuedSpinLock, KeReleaseInStackQueuedSpinLock, KeAcquireQueuedSpinLock, KeReleaseQueuedSpinLock, keTryToAcquireQueuedSpinLock, KeTryToAcquireQueuedSpinLockRaiseToSynch, KeAcquireQueuedSpinLockRaisetoSynch. (Alex Ionescu)
  • Rewrite ERESOURCE implementation. (Alex Ionescu)
  • Fix some bugs in Kernel Queue implementation (Alex Ionescu)
  • Handle special case where we have kernel apcs pending and your previous irql was below APC_LEVEL during the wait code. (Alex Ionescu)
  • Set the right Thread*>WaitTime dring waits (Alex Ionescu)
  • Initialize WaitBlock*>Thread during thread creation. (Alex Ionescu)
  • Make APCs queuable for the thread after it's created (Alex Ionescu)
  • Enable Timer Block optimization since it works now. This allows us not to always set*up for each wait, since most of its fields can remain static. (Alex Ionescu)
  • Properly link wait block together with the waitlist of the timer. (Alex Ionescu)
  • Remove KiServiceCheck and implement PsConvertToGuiThread in its place. Has support for detecting and returning errors in case of invalid cases, currently disabled code for doing the required 4kb*>12kb stack conversion, and handling certain failures.
  • Fix MmCreateKernelStack to actually take into account the GuiStack parameter. (Alex Ionescu)
  • Implement KeSwitchKernelStack (Alex Ionescu)
  • Enable code in PsConvertToGuiThread to create a new stack and switch to it. GUI Threads now get the 60KB of kernel stack space they deserve. (Alex Ionescu)
  • Implement (although non-optimally) MmGrowKernelStack for future use. (Alex Ionescu)
  • Fix some bugs in KiCallUserMode (Alex Ionescu)
  • Fix probably one of the most devastating hidden ROS bugs currently in trunk. KWAIT_BLOCK's WaitType was defined as USHORT instead of UCHAR, causing a KeWaitForMultipleObjects of 2 or more objects to overwrite the Thread's PreviousMode (an effect of this is that 99% of user-mode callbacks from win32k were being done with the mode set to Kernel-Mode instead of UserMode). A KeWaitForMultipleObjects of 3 or more objects, or the timer object itself in some cases would cause this conflict to occur with the ResourceIndex member, potentially corrupting the ERESOURCE owner table in my updated implementation. (Alex Ionescu)
  • Rewrite usermode callbacks. These changes should greatly optimize graphic operations. After these changes, my "idle" CPU Usage in taskmgr went from 7-8% to 4-5%, while on the performace page, from 15-18% to 10-13%. (Alex Ionescu)
  • Set KernelApcPending == TRUE in KiCheckForKernelApcDelivery if we are at APC_LEVEL. (Alex Ionescu)
  • Properly create, grow and delete the kernel stack. Fixes potential memory leaks introduced in 20806. (Alex Ionescu)
  • Update KeContextToTrapFrame to support separate ContextFlags parameters in the scenario where we want to convert more then the Context's flag specify (Alex Ionescu)
  • Rename some of the internal FPU flags to external names and make them global. (Alex Ionescu)
  • Improve context creation of new threads to initialize the virgin NPX state for new threads, to clear DR debug registers, to properly convert the context to a trap frame, to set the right segment registers, to set the debugging mark in the trap frame, and to properly set the initial eflags. (Alex Ionescu)
  • Don't bother with clearing the DRs in the CONTEXT, just clear DR7 in the trap frame after the conversion. (Alex Ionescu)
  • Fix some nasty context switch bugs (Alex Ionescu):
 ** We did not update the KPCR's stacklimit/initialstack with the new thread's stacklimit/initialstack.
 ** We always assumed V86 frame bias in KeInitializeThreadContext.
 ** We did not properly update ESP0 during context switch, to make space for the NPX frame and V86 bias.
 ** We did not update fs:18h to point to the new TEB.
 ** We did not clear out GS when switching processes, nor update the TSS's cr3.
 ** If a new LDT was being updated, we over-wrote EBP (which was supposed to point to the TSS) by the GDT pointer.
 ** We used a push/pop esp0 hack which hid the fact we never updated esp0.
  • Fix a bad bug in the system call handler and interrupt/trap exit code which was causing a jump to the incorrect epilogue if V86 mode was detected. (Alex Ionescu)
  • Make traps use the shared EOI (End Of Interrupt) helper instead of their own custom trap exit code. (Alex Ionescu)
  • Share some more trap code. (Alex Ionescu)
  • Increase total system call count in KPCR for performance counter. (Alex Ionescu)
  • Increase per*systemcall call count in the KiServiceTable if it was specified, for performance counters. (Alex Ionescu)
  • Add sanity checks to system call handler to detect. (Alex Ionescu)
  • Detect if exiting with incorrect IF state. (Alex Ionescu)
  • Detect if exiting with broken stack. (Alex Ionescu)
  • Detect if exiting with a broken trap frame (note: Disabled in Kei386EoiHelper beause this raises the assertion. The trap frame is valid, it's just that some old code is using DbgArgMark for other purposes. Will fix.) (Alex Ionescu)
  • Detect if exiting with invalid FS. (Alex Ionescu)
  • Detect if exiting with invalid Exception List. (Alex Ionescu)
  • Detect if exiting with incorrect exception list and/or incorrect previmous mode on the stack (to detect macro/calling type mismatch). (Alex Ionescu)
  • Use MmUserProbeAddress in the system call handler to verify the parametes we got from user-mode are valid and return STATUS_ACCESS_VIOLATION if the check fails. (Alex Ionescu)
  • Handle failure after PsConvertToGuiThread and return STATUS_INVALID_SYSTEM_SERVICE and/or FALSE and/or *1 on failure. (Alex Ionescu)
  • Made MCE/XMMI interrupts unexpected on-boot. (Alex Ionescu)


  • (too big to post)


  • HUGE placeholder for changes made by Alex Ionescu
  • "Fix" RtlQueryRegistryValues() usage (Alex Ionescu, Aleksey Bragin)
  • Mandatory address PCR via FS register in certain cases (Aleksey Bragin, Dmitry Gorbachev).
  • Fix wrong access-rights when referencing the object, fixes NtEnumerateKey() API (Aleksey Bragin).
  • KiRosFrldrLpbToNtLpb(): Round up to the correct size in pages (Aleksey Bragin).
  • Change "FreeLDR BIAS hack" to a better one: measure sizes of all 3 codepages, and place them contiguously (Aleksey Bragin).
  • Clear DPC request when delivering DPCs from the idle loop (Alex Ionescu).
  • Fix (and optimize) KeRemoveByKeyDeviceQueue() routine (Aleksey Bragin).
  • Fix freeing of an unallocated memory bug (Aleksey Bragin).
  • Correctly fill FullDllName for modules loaded by the bootloader. Don't load a module with the same name more than once (Aleksey Bragin).
  • If the module failed to load (e.g. fixup couldn't be done), then don't include it in the list of loaded modules (Aleksey Bragin).
  • Fix a bug with querying registry values (Herve Poussineau).
  • Fix a problem when a device, which was already in the list is freed and memory corruption is introduced (Aleksey Bragin).
  • Massive changes to the driver loading / device creation logic: Really reuse the driver's object (Aleksey Bragin).
  • Fix driver's object creation accordingly in NtLoadDriver() and IopActionInitChildServices() (Aleksey Bragin).
  • VMWare video driver regression is gone (Aleksey Bragin).
  • "New device found" wizard appears in the 3rd stage (Aleksey Bragin).
  • Move InvalidateRelations to a later stage, when it really should happen (Aleksey Bragin).
  • Minor bugfixes in various places related to these changes (Aleksey Bragin).
  • Remove a hack from IopCreateDriver(), no boot hang happens in VMWare without it anymore (Aleksey Bragin).
  • Give "RAW" filesystem driver a name (Aleksey Bragin).
  • Added a small piece of a new logic into IopCreateDriver(). In ReactOS it's being called two times almost immediately, which results in a non-unique driver object name, since KeTickCount is the same. In order to prevent this situation a loop is added, having 100 iterations as max (Aleksey Bragin).
  • Correctly set DN_DRIVER_LOADED flag (Aleksey Bragin).
  • Fix symbols loading due to an improved PE mapping (Aleksey Bragin).
  • Fix incorrect usage of sprintf in the kernel (Aleksey Bragin).
  • Rewrite KdbSymProcessBootSymbols() with respect to recent kernel changes (Aleksey Bragin).
  • Change KdbSymInit() to match standard kd-wrapper init function (Aleksey Bragin).
  • Always use PsLoadedModuleList as a list of modules (Aleksey Bragin).
  • Load kernel and hal symbols during BootPhase 1 initialization of this KD wrapper (Aleksey Bragin).
  • Commit a fix for KDBG's attach to process problem (Aleksey Bragin, Gé van Geldorp, bug #1263).
  • Start turning KDBG into a KD wrapper, and thus removing KDBG-specific hacks in various places of the kernel (Aleksey Bragin).
  • KdbSymInit() became a general initialization routine (Aleksey Bragin).
  • KdpEnterDebuggerException() improvement related to KDBG support (Aleksey Bragin).
  • Fix a call to readcr3 in KeFlushCurrentTb() (Christoph von Wittich).
  • Fix a call to ExGetPreviousMode() in CmpCreateHandle (Christoph von Wittich).
  • Implement SystemUnloadGdiDriverInformation (Saveliy Tretiakov)
  • Bugfix in KiUserExceptionDispatcher described by Myria in bug #2279 (Magnus Olsen)
  • Rewrite Plug-and-Play root bus enumerator (Hervé Poussineau)
  • Remove IopCreateDriverObject, which was buggy and duplicating IoCreateDriver functionality (Hervé Poussineau)
  • Add support for GUID_DEVICE_SYS_BUTTON interface (Hervé Poussineau)
  • ReactOS now supports ACLs... (fix SeAccessCheck to sometimes deny access) (Hervé Poussineau)
  • Fix usage of KdComPortInUse (Hervé Poussineau)
  • Send IRP_MN_FILTER_RESOURCE_REQUIREMENTS to devices before IRP_MN_START_DEVICE (Hervé Poussineau)