From ReactOS Wiki
Jump to: navigation, search

This is the changelog for ReactOS™ version 0.3.8 (released 4 February, 2009), an open-source operating system designed to be binary executable- and device driver-compatible with Microsoft™ Windows NT™ and subsequent Microsoft operating systems such as Windows 2000™ and Windows XP™. ReactOS is written by the ReactOS development team, and the last previous version of ReactOS was version 0.3.7 (released 4 November, 2008).


Generic 0.3.8 Changes


Host Tools

  • Fix compiler warnings treated as errors when using GCC 4.3.2 (Dmitry Gorbachev, bug #3849)
  • Rearrange "host/typedefs.h" to make it look more logical, fix a wrong definition of INT_PTR and UINT_PTR in this file (Colin Finck)


  • Don't decide whether to preprocess .spec files based on Kernel-Mode vs. User-Mode, but on the file extension. Preprocessed files use the .pspec extension now (Colin Finck, KJK::Hyperion)
  • Removed some checks for uppercased file extensions (Colin Finck)
  • Reenable testing on undefined properties, they are treated as being empty now (Colin Finck)
  • Parallel build fixes related to .spec/.pspec and the generation of .exp object files (KJK::Hyperion)
  • Automatically choose a C runtime library for each module and provide a standard way to override the default (KJK::Hyperion)
  • Force each module to choose between a statically linked or a dynamically linked C runtime library, for future compatibility with Visual C++ (KJK::Hyperion)
  • Create a separate import library ("ntsys") to import just system services from ntdll (KJK::Hyperion)
  • Echo "[CPP]" for invocations of the C preprocessor (KJK::Hyperion)
  • Fixed setting project-global compiler flags (KJK::Hyperion)
  • New project-global attribute allowwarnings, to fail on compilation warnings for either all modules or no modules (KJK::Hyperion)
  • Refactored makefile rules to be more maintainable (KJK::Hyperion)
  • Makefile rules extracted from hard-coded strings in rbuild code to an include .mak file, to be more maintainable (KJK::Hyperion)
  • Reimplemented pre-rbuild feature of full dependencies, for faster, minimal, comprehensive incremental builds at the price of slower full builds (KJK::Hyperion)
  • Correctly support C++ precompiled headers (KJK::Hyperion)
  • Echo "[HOST-CC]", "[HOST-LD]" and "[HOST-AR]" for host build tools to distinguish them from target tools (KJK::Hyperion)
  • Fix msvc project generation for kernel mode drivers without a driver entry (Johannes Anderwald)
  • Let rbuild throw an exception when an implicit module dependency (like mingw lib) cannot be resolved instead of silently failing (Timo Kreuzer)
  • Fix some abuse of the c_str buffer in std::string (arty)


  • Don't overrun a heap block when there are discarded relocations (KJK::Hyperion)



Bootloader (FreeLoader)

  • Allow alternate ReactOS path on live-CD (Andrew Greenwood)
  • Add special ReactOSSetup OS type which calls setupldr (Andrew Greenwood)
  • Add a new API to Freeldr's memory manager, which allows to override type of an already allocated memory (Aleksey Bragin)
  • WINLDR: Fix page tables buffer memory allocation so that it doesn't rely on luck anymore and always allocates a contiguous area of memory. Fixes spontaneous case of booting problem (immediate black screen after loading drivers, reboot of real hardware, halt of cpu in a virtual machine) (Aleksey Bragin)
  • WINLDR: Fix some debug print (Aleksey Bragin)

Kernel and Executive (NTOSKRNL)

  • Fixed SMP build compilation and enable it by default. It does not boot due to massive lack of SMP support in critical areas (Stefan Ginsberg)
  • Retrieve the count of handles for a process without the occasional crash or race condition (KJK::Hyperion, Bug #4050)
  • Rename section "init" to "INIT", so that pefixup will actually recognize it. (Timo Kreuzer)


  • Fix KCB ref leaks in Cm parse routine (Aleksey Bragin, Stefan Ginsberg)
  • Fix registry lock leakages in CmpDoOpen in failure cases (Aleksey Bragin)
  • Add support for a special case of opening existing (cached) KCBs by CmpDoOpen (Aleksey Bragin)
  • Specify a flag for that case in one specific case inside CmpParseKey, which allows us to get rid of the "\\REGISTRY" hack inside the code, fixes the 'Kcb->RefCount == 1' assertion failure, and certainly fixes registry-related regression tests. There might be some side effects in theory, but since this hack only applied to the root key, they shouldn't happen (Aleksey Bragin, Stefan Ginsberg)


  • Fix various bugs and some missing handling of failure cases in the DBGK implementation. This makes Ollydbg able to attach, detach, suspend and resume processes under debug without causing weird kernel crashes (Stefan Ginsberg)


  • Fixed implementation of PsCreateProcessNotifyRoutine (Michael Martin)
  • Fixed dereferencing of wrong object in NtCreateProfile, pProcess not Process. (Michael Martin)
  • Fix an array overrun in NtQuerySystemInformation and NtSetSystemInformation (KJK::Hyperion, CID 527 and CID 528)
  • Remove hack around VFATFS and CDFS bugs which were fixed in r37393 (Aleksey Bragin)
  • Fix NtAddAtom/NtFindAtom logic when dealing with NULL or kernel Atom names (Alex Ionescu)
  • Use KeQueryRuntimeProcess for obtaining idle process times, and per-process information in QuerySystemInformation routines (Aleksey Bragin)
  • Fix incorrect multiplier being applied to user/kernel times (should be KeMaximumIncrement instead of 100000) (Aleksey Bragin)
  • Slightly rework SystemProcessorPerformanceInformation to provide valid data (Aleksey Bragin)
  • Implement query case of SystemTimeAdjustmentInformation (Aleksey Bragin)
  • Implement a better stub for setting case of SystemTimeAdjustmentInformation (Aleksey Bragin)
  • Rewrite SystemTimeOfDay QuerySystemInformation case. ReqSize is the amount of data copied to the user so use it accordingly. Also, fill up the buffer as much as the caller requested. Fixes 1 "ntdll_winetest.exe info" (Aleksey Bragin)
  • Use a newer (5.0 and higher) version of SYSTEM_TIMEOFDAY_INFORMATION structure (consisting of two additional 64 bits fields: boot time bias and sleep time bias) (Aleksey Bragin)



  • Correctly assign NtSystemRoot and remove assumption that number of partitions equals number of harddisks (Giannis Adamopoulos, bug 3170)


  • NtWrite/ReadFile: Fix a bug where RequestorMode would always be set to KernelMode, which would cause user-mode APCs to be called directly from kernel (Stefan Ginsberg)
  • IopCheckVpbMounted: Fix a bug where NT_SUCCESS was used on a pointer to NTSTATUS value instead of the status value itself (Timo Kreuzer)
  • Use ExInitializeSystemLookasideList instead of ExInitializeNPagedLookasideList for the internal I/O lookaside lists (just as it was done for the Ob lists a couple of months ago) (Aleksey Bragin)
  • Optimize lookaside allocation by using one large contiguous buffer instead of fragmented buffers for each CPU (Aleksey Bragin)
  • Use NT structure names instead of ReactOS-only structures (Aleksey Bragin)
  • Fixes some memory corruption issues when doing I/O completion (found by Stefan Ginsberg and winetests) (Aleksey Bragin)
  • Do not use "with tag" when freeing the system buffer, because drivers are allowed to re-allocate their own buffer, which may have a different tag (Aleksey Bragin)
  • Fix failure cases in EnumerateRootDevices which might've freed non-allocated memory (Alex Ionescu)
  • Implement IoGetRemainingStackSize (Aleksey Bragin)
  • Fix broken behavior of IoBuildPartialMdl, which instead of copying 4 flags from a source mdl to a target one was always setting all of them, thus often making resultant mdl unusable (Aleksey Bragin)
  • Fix one more typo in the IoBuildPartialMdl code leading to ignore of TargetMdl flags and always setting MDL_ALLOCATED_FIXED_SIZE and MDL_ALLOCATED_MUST_SUCCEED even if a caller did not want so (Alex Ionescu)
  • Fix an always true comparison in IoCheckEaBufferValidity (Aleksey Bragin)
  • Check if CompletionFilter has a valid value too (Aleksey Bragin)
  • Don't leak a FileObject reference in case of failure (Aleksey Bragin)
  • Merge IoGetRelatedTargetDevice implementation by Pierre Schweitzer (pierre-fsd branch), with my modifications (Pierre Schweitzer, Aleksey Bragin)
  • Remove a hack from IopApplyRosCdromArcHack (Giannis Adamopoulos)


  • Add some code to complete breakpoint of gdbstub (Cary Xiao)


  • Fix KDBGs usage of PsLookupThread/ProcessByThread/ProcessId, which leaked references every time we attached to a process/thread (Stefan Ginsberg)
  • Remove useless circle definition _setjmp -> setjmp -> _setjmp (Timo Kreuzer)



  • Implement VirtualMemoryInformationClass of MemorySectionName for NtQueryVirtualMemory. (Michael Martin)
  • Use volatile with PagesLocked and MdlAddress in MiDoMappedCopy, to prevent bugcheck when code in SEH failed. (Michael Martin, Bug #3674)
  • MmMapViewOfSection: Fix a missing unlock of the kernel address space in some failure cases (Stefan Ginsberg)
  • Fix page protection flag checks in NtAllocateVirtualMemory and MmMapViewOfSection (Timo Kreuzer)
  • Fix inversed failure logic in MmAllocatePagesForMdl (Aleksey Bragin)



  • Fix a potential case of non-paged pool memory double freeing spotted by Michael Martin (Aleksey Bragin)
  • Fix a typo: if a process has DisableBoost set then TRUE should be returned when querying ProcessPriorityBoost information, not FALSE (Aleksey Bragin)


Hardware Abstraction Layer (HAL)

  • Fix broken implementation of KdComPortInUse (Stefan Ginsberg)
  • Fixed HAL DMA problem that caused floppy driver not to work (the point was that function had to copy the read sector back to the MDL buffer and it was not doing that because of the problem with braces, broken in rev is 24464) (Juan Sánchez Jurado, bug #2287)

Run Time Library (RTL)

  • Fix a bug in OEM to Unicode conversion code (Dmitry Gorbachev)
  • Fix weird code in RtlGetVersion (Aleksey Bragin, Daniel Zimmerman)
  • RtlUnicodeStringToCountedOemString improvements: Fix zero-sized input string handling, result would be error instead of success and zero output string; If destination string's MaximumLength and Length are equal, it's not an erroneous situation (in fact, a very common situation); Add comments (Aleksey Bragin)
  • RtlOemStringToCountedUnicodeString improvements: Fix STATUS_BUFFER_OVERFLOW when destination string's MaximumLength and Length are equal; Add comments (Aleksey Bragin)
  • Stubplement SwapSplayLinks helper function, and make RtlDelete call it (Aleksey Bragin)

Kernel Mode Drivers



  • When querying file name information, fill in the whole buffer provided by the caller, even if filename does not fully fit (driver by Microsoft(R) does the same). Also, return the actual amount of data written in IoSb.Information, even in case of buffer overflow result (Aleksey Bragin)
  • Upcase a search expression when calling RtlIsNameInExpression with case-insensitive option (Pierre Schweitzer)
  • Add a per-directory cache for short filenames that guarantees generation of unique names (arty)


  • When allocating a cluster, decrement the AvailableClusters count to keep reported free space consistent (Jeffrey Morlan)
  • Fixed bug where extending the size of an already non-empty file would crash if disk space runs out; also optimized that code so it doesn't always have to traverse the entire file (Jeffrey Morlan)
  • When querying file name information, fill in the whole buffer provided by the caller, even if filename does not fully fit (driver by Microsoft(R) does the same). Also, return the actual amount of data written in IoSb.Information, even in case of buffer overflow result (Aleksey Bragin)
  • Target device to mount may not have VPB, the driver should get the VPB passed in parameters (Aleksey Bragin)
  • Set target device's VPB to this value. This should not really be done, however our driver heavily depends on target device having this VPB. I don't see any side effects. With these changes, Windows 2003 is able to boot up to desktop and cleanly shutdown using this driver (Aleksey Bragin)
  • Always uninit cache for a file object (Aleksey Bragin)


  • UDF recognizer fixed so it doesn't perform partial sector reads. When trying to detect filesystem for a floppy without 0xaa55 signature UDF recognizer is called and it performed wrong partial sectors read because of a confusion between sectors and offset in bytes (Juan Sánchez Jurado, bug 2287)


  • Implement KsCreateAllocator, KsRegisterWorker, KsUnregisterWorker, KsRegisterCountedWorker, KsDecrementCountedWorker, KsIncrementCountedWorker, KsQueueWorkItem (Johannes Anderwald)
  • Implement KsCreateDevice, KsAddDevice, KsInitializeDriver (Johannes Anderwald)
  • Add KsDefaultForwardIrp stub (Johannes Anderwald)


  • Re-implemented read/write for message type mode. (Michael Martin)
  • Fixed bug in NpfsRead that was causing thread to not wake from wait. (Michael Martin)
  • Fixed problems with not being able to terminate threads that used pipe functions. (Michael Martin)
  • Modified NpfsSetPipeInformation to not allow changing read mode to message mode for byte stream type pipes. (Michael Martin)
  • Modified NpfsCreatePipe so that clients for NamedPipes always start off in byte stream mode. (Michael Martin)
  • Implemented NpfsPeekPipe. (Michael Martin)


  • Implement PcGetDeviceProperty, PcGetTimeInterval, PcNewResourceSublist, PcRegisterIoTimeout, PcUnregisterIoTimeout, PcNewServiceGroup, PcRegisterSubdevice, PcRegisterAdapterPowerManagement, PcNewDmaChannel, PcForwardIrpSynchronous, PcNewPort, PcDmaMasterDescription, PcDmaSlaveDescription, PcRegisterPhysicalConnection, PcRegisterPhysicalConnectionFromExternal, PcRegisterPhysicalConnectionToExternal, PcRequestNewPowerState (Johannes Anderwald)
  • Implement PcNewRegistryKey for DeviceRegistryKey, DriverRegistryKey, HwProfileRegistryKey (Johannes Anderwald)
  • Implement portcls port drivers such as IPortWavePci, IPortWaveCyclic, IPortTopology and IPortMidi (Johannes Anderwald)
  • Implement portcls helper object such as IServiceGroup, IRegistryKey, IInterruptSync, IDmaChannel, IDmaChannelSlave (Johannes Anderwald)
  • Implement IPortClsVersion interface and make all port drivers use them (Johannes Anderwald)
  • Implement IDrmPort, IDrmPort2 interface and make all port drivers use them (Johannes Anderwald)
  • Partly implement PcCreateSubdeviceDescriptor (Johannes Anderwald)
  • Implement ISubdevice interface for IPortTopology, IPortWaveCyclic, IPortWavePci (Johannes Anderwald)
  • Add IIrpTarget, IKsWorkSink, IKsShellTransport, IIrpStream, IIrpStreamVirtual IIrpStreamPhysical, IPortFilterWaveCyclic, IPortPinWaveCyclic interface (Johannes Anderwald)
  • Use FILE_DEVICE_KS when creating new device object (Johannes Anderwald)
  • Pass correct flags when creating the fdo (Johannes Anderwald)
  • If there is no interrupt yet connected, call the synchronized routine holding the internal spinlock (Johannes Anderwald)
  • Don't disconnect the interrupt on cleanup, IInterruptSync_Disconnect exist for that purpose (Johannes Anderwald)
  • Move all calls to ExAllocatePoolWithTag to a function AllocateItem which is also responsible for zeroing memory (Johannes Anderwald)
  • Store PhysicalDeviceObject in device extension (Johannes Anderwald)
  • Check for valid DeviceExtensionSize (Johannes Anderwald)
  • Set DO_DIRECT_IO flag (Johannes Anderwald)
  • Clear DO_DEVICE_INITIALIZING flag (Johannes Anderwald)
  • Initialize the dpc for calling Miniport object, as it might create an interrupt object which immediately fires an interrupt (Johannes Anderwald)
  • If the caller doesnt provide an IAdapterPowerManagement interface, clear the existing reference (Johannes Anderwald)
  • Pass the pdo to IoOpenDeviceRegistryKey (Johannes Anderwald)
  • Move all guids and IIDs to own file and initialize them (Johannes Anderwald)
  • Store DeviceObject before calling IMiniportWaveCyclic, IMiniportTopology, IMiniportMidi as the driver might immediately call port functions (Johannes Anderwald)
  • Pass the PhysicalDeviceObject to IoGetDmaAdapter (Johannes Anderwald)
  • Handle IRP_MN_QUERY_INTERFACE (Johannes Anderwald)
  • Implement IPortEvents interface to IPortWavePci (Johannes Anderwald)
  • Register all device interfaces identified in the subdevice descriptor (Johannes Anderwald)
  • Create a subdevice descriptor for IPortWavePci, IPortWaveCyclic and IPortTopology and handle the respective ISubDevice::GetDescriptor (Johannes Anderwald)
  • Always request PCFILTER_DESCRIPTOR regardless of presence IPinCount interface (Johannes Anderwald)
  • Check if IMiniportWavePci omits a IServiceGroup (Johannes Anderwald)
  • no DriverEntry in here -> entrypoint="0" (Christoph von Wittich)
  • Fix parameter for KeWaitForSingleObject (Christoph von Wittich)
  • Rename device context struct (Christoph von Wittich)





  • Add missing assignments to all CallingProcess variables in int10.c. (Michael Martin, Bug #2286)
  • Fixed memory corruption in VideoPortInt10 implementation. (Michael Martin, Bug #2286)
  • Fixed bug in VideoPortGetAccessRanges, causing the device to not be found on the bus. (Michael Martin, Bug #2286)

NT System Library (NTDLL)

Static Libraries




  • Reimplemented as PSEH v2. Now allows a much more readable syntax that's almost completely compatible with native SEH constructs. Also handles exceptions thrown during unwinding in a way that's compatible with native SEH (KJK::Hyperion)

Keyboard Layouts


Win32™ Personality

User mode subsystem server (CSRSS)

Kernel-mode subsystem server (Win32K)

  • Fix TransparentBlt in 24bpp mode (Gregor Schneider, bug #1583)
  • Fix StretchBlt offset calculation in 8bpp and 16bpp (Gregor Schneider)
  • Fix BitBlt MergePaint operation (Gregor Schneider)
  • Fix hatched brush color conversion (Gregor Schneider)
  • Fix BitBlt coordinate calculation for 1 bit masks (Gregor Schneider, bug #2372)
  • Add several PS_NULL, PS_INSIDEFRAME and PS_ALTERNATE brush improvements (Gregor Schneider)
  • Fix DrawIcon and DrawIconEx in 32bpp mode (Gregor Schneider)
  • Fix returning correct previous windows procedure for SetWindowLong. (Michael Martin, James Tabor)
  • Create CallProc for edit controls to match windows behavior. (Michael Martin, James Tabor)
  • Store settings of SPI_SETMOUSEBUTTONSWAP in registry (Johannes Anderwald)
  • Add key modifiers MK_CONTROL and MK_SHIFT to all mouse events (Matthias Kupfer, bug #3557)
  • Rename BITMAPOBJ to SURFACE as it's called on windows (Timo Kreuzer)
  • Fix creation of xlate object for mono dib sections (Timo Kreuzer)
  • Use the bitmap's palette, not the DC one's in NtGdiGetDIBitsInternal (Timo Kreuzer, bug #3854)
  • Flush the gdi batch in NtGdiDeletObjectApp, so all pending operations are done, before the dc is deleted (Timo Kreuzer)
  • Make NtGdiExtTextOutW call the internal function GreExtTextOut and use that from within win32k (Timo Kreuzer)
  • Fix usermode pointer protection in NtGdiExtTextOutW using SEH instead of MmCopyFromCaller (Timo Kreuzer)
  • Only use one pool allocation for usermode buffer in NtGdiExtTextOutW, try a stack buffer first (Timo Kreuzer)
  • Handle Dy values in NtGdiExtTextOutW when ETO_PDY is specified (Alexander Potashev, bug #3958)
  • Probe the usermode buffer instead of the safe buffer in NtGdiGetFontUnicodeRanges (Timo Kreuzer)
  • Fix thread dereferencing mechanism in NtUserSetWindowsHookEx (Aleksey Bragin)
  • Remove the dib pointer from SURFACE (Timo Kreuzer)
  • Handle mapped sections in SURFACE_Cleanup (Timo Kreuzer)
  • Handle user provided bitfields, when creating a dib section (Timo Kreuzer)




  • Set the APPDATA environment variable when logging in (Colin Finck)
  • Correct return type for GinaLoadFailedWindowProc and DefaultWlxWindowProc (Samuel Serapión)

Control panel applets


  • Check for a null pointer when creating a link to a directory or a file without extension (Kamil Horníček, Bug #3959)



Win32™ Applications


Command Prompt

  • Fix parsing of batch files lacking '\n' character on the last line (Jeffrey Morlan)
  • Fix bug where DIR /D wouldn't always show all files (Jeffrey Morlan)
  • Implement proper support for multi-line IF blocks, IF /I option, IF CMDEXTVERSION, and generic comparisons (EQU etc); fix IF ERRORLEVEL to do >= check rather than == (Jeffrey Morlan)
  • Give an error message when trying to MKDIR a directory that already exists; add support for making multiple directories with one MKDIR command (Jeffrey Morlan, bug #3961)
  • Allow the DIR command to be interrupted via Ctrl-C even while in the middle of a directory. (Jeffrey Morlan, bug #3967)
  • Allow MOVE's arguments to contain slashes (Víctor Martínez Calvo, bug #4013)
  • For MOVE command: only check for options at the beginning of the command line; give an error message if too many parameters are given; if no destination is given, default to current directory; fix crash that occurred with certain source filenames; fix memory leaks (Jeffrey Morlan)
  • Add support for removing multiple directories with one RMDIR command (Jeffrey Morlan)
  • Fixed REN command (Víctor Martínez Calvo, bug #3902)



  • Fix the display of Line and Column in the Status Bar and add language resources for this (Carlo Bramini, bug #3702)




Win32™ Libraries




  • Implemented the following functions (Gregor Gullwi)
    • IDirect3DDevice9::CreateAdditionalSwapChain()
    • IDirect3DDevice9::GetGammaRamp()
    • IDirect3DDevice9::GetRasterStatus()
    • IDirect3DDevice9::GetBackBuffer()
    • IDirect3DDevice9::Present()
    • IDirect3DDevice9::GetFrontBufferData()


  • Zero the last character in lfFaceName when converting a LOGFONT from A to W or vice versa (Timo Kreuzer)



  • Reimplemented BuildCommDCB and BuildCommDCBAndTimeouts. New implementation passes the Wine regression tests (KJK::Hyperion)
  • Thanks to PSEH v2, OutputDebugString now correctly sends the output to the user-mode debugger, if one is attached (KJK::Hyperion)


  • Multiple listen on a listening socket is ok. (Arty)



  • Dont display NCRP_QUERY_PROPERTY_UI when the notification object has already been created (Johannes Anderwald)








  • Choose the correct version of DEVMODE in EnumDisplaySettingsExA (Kamil Horníček)
  • Add inline wrapper functions for kernel forwarded exports and use them inside user32 (Timo Kreuzer)

Regression tests



  • Wrote a new tool for running automatic regression tests, superseding our previous syssetup/cmd/dbgprint hack (Colin Finck)


  • Add some tests for WC_NO_BEST_FIT_CHARS, which pass under Windows XP SP3 (Colin Finck)
Versions / Official Changelogs / Community Changelogs
0.0.x Series 0.0.8 | 0.0.9 | 0.0.10 | 0.0.11 | 0.0.12 | 0.0.13 | 0.0.14 | 0.0.15 | 0.0.16 | 0.0.17 | 0.0.18 | 0.0.19 | 0.0.20 | 0.0.21
0.1.x Series 0.1.0 | 0.1.1 | 0.1.2 | 0.1.3 | 0.1.4 | 0.1.5
0.2.x Series 0.2.0 | 0.2.1 | 0.2.2 | 0.2.3 | 0.2.4 | 0.2.5 | 0.2.6 | 0.2.7 | 0.2.8 | 0.2.9
0.3.x Series 0.3.0 | 0.3.1 | 0.3.2 | 0.3.3 | 0.3.4 | 0.3.5 | 0.3.6 | 0.3.7 | 0.3.8 | 0.3.9 | 0.3.10 | 0.3.11 | 0.3.12 | 0.3.13 | 0.3.14 | 0.3.15 | 0.3.16 | 0.3.17
0.4.x Series 0.4.0 | 0.4.1 | 0.4.2 | 0.4.3 | 0.4.4 | 0.4.5 | 0.4.6 | 0.4.7 | 0.4.8 | 0.4.9 | 0.4.10 | 0.4.11 | 0.4.12 | 0.4.13 | 0.4.14