From ReactOS Wiki
Jump to: navigation, search

This is the changelog for ReactOS™ version 0.3.9 (released 26 April, 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.8 (released 4 February, 2009).


Generic 0.3.9 Changes




  • winddk.h: Fix amd64 / ia64 default definition of RtlGetCallersAddress (Timo Kreuzer)
  • wdm.h: Add 64 bit BitTest functions. (Timo Kreuzer)




  • comctrl.h: Fix 64bit definition of CreateToolbarEx (Samuel Serapión)
  • comctrl.h: Fix 64bit definition of COMBOBOXEXITEA/W (Samuel Serapión, Daniel Verkamp)
  • commdlg.h: Fix 64bit definition of HOOKPROC (Timo Kreuzer)
  • commdlg.h: Fix packing for commdlg. (Samuel Serapión)
  • commdlg.h: Fix 64bit definition of CDHOOKPROC (Daniel Verkamp)
  • intrin_x86.h: Implement __readeflags and __writeeflags (Timo Kreuzer)
  • intrin_x86.h: Remove hacks from __addgsbyte, __addgsword, __addgsdword. (Timo Kreuzer)
  • intrin_x86.h: Fix __rdtsc on amd64 build (Timo Kreuzer)
  • lmaccess.h: Fix 64bit definition of NetLocalGroupGetMembers (Samuel Serapión)
  • mmddk.h: Fix 64bit definition of WAVEOPENDESC (Samuel Serapión)
  • mmsystem.h:Fix 64bit definitions of WAVEHDR, waveOutGetDevCapsA/W, waveInGetDevCapsA/W, midiStreamOpen, midiOutGetDevCapsA/W, midiOutOpen, midiInGetDevCapsA/W, midiInOpen, auxGetDevCapsA/W, auxOutMessage, mixerGetDevCapsA/W, mixerOpen, timeSetEvent, joyGetDevCapsA/W, mciSendCommandA/W, (Samuel Serapión)
  • mmsystem.h:Fix 64bit definition of waveOutMessage, waveInMessage, midiOutMessage, midiInMessage (Timo Kreuzer)
  • msacm.h: Fix 64bit definition of ACMSTREAMHEADER (Samuel Serapión)
  • prsht.h: Fix 64bit definition of PropertySheetA/W (Samuel Serapión)
  • richedit.h: Fix 64bit definition of EDITSTREAM (Samuel Serapión)
  • shellapi.h: Fix 64bit definition of SHGetFileInfoA/W (Samuel Serapión)
  • tlhelp.h: Fix 64bit definition of Toolhelp32ReadProcessMemory (Samuel Serapión)
  • vfw.h: Fix some 64bit portability issues. (Samuel Serapión)
  • winbase.h: Fix 64bit definition of ReadProcessMemory (Samuel Serapión)
  • winbase.h: Fix 64bit definition of HeapAlloc. (Timo Kreuzer)
  • winbase.h: Fix 64bit definition of SYSTEM_INFO, GetProcessAffinityMask, SetProcessAffinityMask (Daniel Verkamp)
  • windef.h: Fix 64bit definition of PROC, FARPROC, NEARPROC (Daniel Verkamp)
  • winnt.h: Fix GetCurrentFiber for amd64 (Samuel Serapión)
  • winnt.h: Add MemoryBarrier definition for amd64 (Timo Kreuzer)
  • winnt.h: Inlcude excpt.h in winnt.h. (Timo Kreuzer)
  • winsock.h: Fix 64bit definition of SOCKET. (Timo Kreuzer)
  • winuser.h: Fix 64bit definitions of DialogBoxIndirectParamA/W, DialogBoxParamA/W, DispatchMessageA/W, EndDialog, GetClassLongPtrA/W, GetMessageExtraInfo, keybd_event, KillTimer, SendDlgItemMessageA/W, SendMessageCallbackA/W, SendMessageTimeoutA/W, SetTimer (Samuel Serapión)
  • winuser.h: Fix 64bit definition of TIMERPROC (Samuel Serapión)
  • winuser.h: Fix 64bit definition of NMHDR (Samuel Serapión, Daniel Verkamp)

Host Tools

  • ssprintf.cpp/xml.cpp: Fix compilation for gcc 4.4.0 and 64bits (Samuel Serapión)



  • Strip off stdcall decoration from amd64 entry points (Timo Kreuzer)
  • Link to libgcc_eh for amd64 C++ apps (Samuel Serapión)
  • Use dwarf-2 debugging format on amd64, stabs on all other architectures (Timo Kreuzer)
  • Unified the name of the entry point for ANSI and Unicode (Colin Finck)




  • Implement a function pollchar_and_empty to make sure that the keyboard buffer is empty before we pass control to the boot loader (Colin Finck)
  • Get rid of another procedure for getting a character, can be replaced with two instructions in the only place where this procedure was called (Colin Finck)

Bootloader (FreeLoader)

  • Remove two unnecessary boot types (Windows2000 and WindowsXP), and add ReactOSSetup2 type for WinLdr-style setup loader. (Aleksey Bragin)
  • Implement a better setupldr called setupldr2, which implements NT-compatible bootloading. (Aleksey Bragin)
  • Port freeldr to amd64 architecture (Timo Kreuzer)

Kernel and Executive (NTOSKRNL)


  • ReactOS can now be installed on systems with as little as 24 MB. Memory usage after boot is down by 20-30MB. Application installations will use/require/leak less memory (Aleksey Bragin, Bug #703)


  • Return full process image names in SystemProcessInformation when possible, instead of limiting to 32 bytes (Aleksey Bragin, Evgeniy Boltik, Bug #4087)
  • If looking up a long name for a process failed, use short one. This fixes the issue with "System" not being displayed correctly (Aleksey Bragin)
  • Round up process name length more correctly (Aleksey Bragin, Evgeniy Boltik)
  • Make SystemProcessInformation return required size if buffer is too small. Matches Windows XP behavior. (Aleksey Bragin, Evgeniy Boltik)
  • Add privileges check to SystemTimeAdjustmentInformation SSI routine. (Aleksey Bragin, Dmitry Chapyshev)
  • Always capture fast reference values on the stack since a fast reference is by nature volatile (Aleksey Bragin)
  • NtSetSystemInformation: Don't leak the copied string when being called from user mode. (Timo Kreuzer)
  • NtSetSystemInformation: Don't recursively call ZwSetSystemInformation, instead continue the normal path. (Timo Kreuzer)


  • If a driver has no Tag specified it should be defaulted to the max ULONG value, so it gets loaded after all drivers with correct tags. This fixes a problem of null.sys and beep.sys loading up to TagCount (20 for Base group) times during each boot. (Aleksey Bragin)
  • Consider Pnp initialized after system drivers finished loading. (Aleksey Bragin)
  • Fix reinitialization routines callbacks: processing reinit callbacks after EVERY driver load, including boot drivers is wrong. The sequence should be init boot drivers, call boot drivers reinit routines, load pnp drivers, load system drivers, call reinit routines. And then, when Pnp is initialized, call reinit routines after every driver module load event. (Aleksey Bragin)


  • Synchronize debug messages output to the serial port. Now each line of a debug log is printed synchronously, as it is NT. In future, this should be converted to a generic spinlock for all registered KD handlers (Aleksey Bragin)


  • Load debug symbols if compiled with DBG, but don't load if booting with less than 96Mb of RAM. (Aleksey Bragin)



  • Don't match pool tags in ExFreePool if Tag is 0. (Aleksey Bragin)
  • Fix a typo: set a value, not a bit. (Aleksey Bragin)
  • Implement a new Hyperspace Mapping Interface: (ReactOS Portable Systems Group)
    • The new interface is portable and much faster than before. For example, unmapping a hyperpage is almost a one-line operation.
    • The new interface is also thread-safe and uses the EPROCESS hyperspace spinlock.
    • However, in order to isolate from React Mm internals, the Hyper IRQL and Process are stored as globals, so this will not work on SMP.
    • For now, mapping vs. zero PTEs are not treated differently, but the two interfaces have been separated pending future work.
    • Performance tests with _rdtsc resulted in an improvement of over 300% compared to the old interface.
    • Hyperspace mappings are frequent, so the improvement is noticeable during startup (3/10ths of a second).
    • This also fixes incorrect initializtion of hyperspace -- pages were zeroed out (which requires hyperspace) before hyperspace was created.
  • Call ExFreePoolWithTag with 0 tag from ExFreePool instead of vice versa, bugcheck system, when Block is not inside any pool. (Timo Kreuzer)
  • Allow freeing a NULL pointer with ExFreePoolWithTag. (Timo Kreuzer)


  • Don't require ULONG alignment on OBJECT_HANDLE_ATTRIBUTE_INFORMATION structure since it is just made of BOOLEANs. (Jeffrey Morlan)
  • Refactor Fast Reference implementation into a generic module with init/acquire/release/compare/insert interfaces, and update the executive callback & object manager referencing code to use it (Aleksey Bragin)
  • Make TOKEN pointer in OBJECT_HEADER a fast reference, just like on Windows (Aleksey Bragin)
  • Update SD cache code to treat it as such (Aleksey Bragin)
  • Improves performance by 500% during security checks – noticeable impact during large file or registry transfer operations (Aleksey Bragin)


  • Change ExitStatus of Process from STATUS_TIMEOUT to STATUS_PENDING (STILL_ACTIVE). (Michael Martin, bug #3135)
  • Don't reference target process in the beginning of NtQueryInformationProcess but check buffer's length first (Aleksey Bragin, Dmitry Chapyshev)


Run Time Library (RTL)

  • Remove code for updating the drive-specific current-directory environment variable from RtlSetCurrentDirectory_U; belongs in the CRT instead. (Jeffrey Morlan)
  • Add another heap freelist for small blocks, making mingw32-make much faster. (Jeffrey Morlan)
  • RtlSetEnvironmentVariable: Removing a variable that didn't exist in the first place should still return STATUS_SUCCESS. (Jeffrey Morlan)
  • Removing a variable can be done by using a pointer to a UNICODE_STRING with a NULL Buffer as the value, as well as just passing NULL as the value. (Jeffrey Morlan)
  • Implement RtlInterlockedPopEntrySList, RtlInterlockedPushEntrySList and RtlInterlockedFlushSList in assembly. (Timo Kreuzer)

Kernel Mode Drivers


  • Don't change the status of a completed irp Cameron Gutman
  • Rewrite AfdGetPeerName Cameron Gutman
  • Fix a race condition that causes a crash in TdiReceiveDatagram Cameron Gutman
  • Make irp cancellation and socket shutdown work correctly and remove hacks related to it Cameron Gutman
  • Don't forget to lock buffers before dispatching the datagram request Cameron Gutman
  • Fix LockBuffers Cameron Gutman
  • Validate size of output buffers before writing to them Cameron Gutman
  • Fix some listening bugs Cameron Gutman
  • Loop the irp queue and cancel the requests Cameron Gutman
  • Loop the datagram queue and free all the datagram requests Cameron Gutman
  • Loop the pending connection list and free all the pending connections Cameron Gutman
  • Free the FCB context, ConnectionReturnInfo, and ConnectionCallInfo Cameron Gutman
  • Implement a DispatchCleanup handler and properly separate cancellation from closing Cameron Gutman
  • Set pointer to NULL after we free the memory Cameron Gutman
  • Don't call TdiCloseDevice when we run out of memory because it causes a crash later Cameron Gutman


  • Fix bug preventing removal of directories that previously contained many files. (Jeffrey Morlan)


  • Start implementation of GDI/DDI compliant freetype based font driver. (Timo Kreuzer)
  • Use x86 setjmp/longjmp assembly code only on x86 architecture. (Timo Kreuzer)


  • Move part of the 1st stage pnp hacks to kbdclass driver. Previously, the driver (i8042prt) relied on kbdclass's normal reinit routine being called BEFORE a registered boot reinit routine, which is certainly wrong on a real NT system. Now, the correct order is ensured, and it is not relying on a broken reinit calling order in ReactOS anymore (Aleksey Bragin)


  • Fix some issues causing us to skip valid read data ports Cameron Gutman
  • Handle IRP_MN_FILTER_RESOURCE_REQUIREMENTS so the driver receives IRP_MN_START_DEVICE now Cameron Gutman



  • Implement KsDefaultDispatchPnp, KsAcquireDeviceSecurityLock, KsReleaseDeviceSecurityLock, KsAddObjectCreateItemToDeviceHeader, KsAllocateDeviceHeader, KsAllocateObjectCreateItem, KsAllocateObjectHeader, KsSetMajorFunctionHandler, KsDispatchIrp, KsCreateTopologyNode, KsCreatePin, KsPinPropertyHandler, KsPinDataIntersection, KsTopologyPropertyHandler, KsValidateConnectRequest, KsAddIrpToCancelableQueue, KsRemoveIrpFromCancelableQueue Johannes Anderwald
  • Fix KsAddObjectCreateItemToObjectHeader prototype Johannes Anderwald
  • Fix implementation of KsAllocateObjectHeader and store the result either in the passed irp or device header Johannes Anderwald
  • Implement Reading / Writing / DeviceIoControl / Flush / QuerySecurity / SetSecurity operation using the object file header Johannes Anderwald
  • Implement KsSynchronousIoControlDevice function Johannes Anderwald
  • Fix a bug in KsAllocateDeviceHeader which copied the create item to the wrong offset Johannes Anderwald
  • Set Created status to true when create function is not zero Johannes Anderwald
  • Partly implement KsStreamIo Johannes Anderwald
  • Set a completion routine for irps send to lower devices by KsSynchronousIoControlDevice Johannes Anderwald


  • NpfsDisconnectPipe: Return STATUS_PIPE_DISCONNECTED if pipe is already disconnected. (Michael Martin)
  • Return STATUS_BROKEN_PIPE for cases where the pipe has been closed. (Michael Martin)
  • Check that pipes otherside is valid before attempting to fire othersides read/write event. (Michael Martin, Bug #4137)


  • Fix NdisReadNetworkAddress Cameron Gutman
  • Implement NdisMDeregisterDmaChannel, NdisMQueryAdapterInstanceName, NdisMRegisterDmaChannel, NdisMInitializeScatterGatherDma, NdisGetDriverHandle, NdisCompleteUnbindAdapter, NdisDeregisterAdapterShutdownHandler, NdisMapIoSpace, NdisRegisterAdapterShutdownHandler, NdisAllocateSharedMemory, NdisFreeSharedMemory, NdisFreeDmaChannel, and NdisMAllocateSharedMemoryAsync Cameron Gutman
  • Query MaxMulticastAddresses from the miniport Cameron Gutman
  • Fix a memory leak Cameron Gutman
  • Report that we are NDIS 5.0 to drivers Cameron Gutman
  • Pass packet flags to MiniportSend Cameron Gutman
  • Fix a bug that causes any NIC driver that calls NdisMTransferDataComplete to fail Cameron Gutman
  • Deserialized miniports complete sends asynchronously so don't double complete packets which causes a crash (fixes miniport drivers that have a deserialized MinportSendPackets handler) Cameron Gutman
  • Finish implementation of MiniIndicateReceivePacket (Fixes miniport drivers that use NdisMIndicateReceivePacket) Cameron Gutman
  • Simplify and fix timer implementation (fixes seemingly random hangs when loading some miniport drivers) Cameron Gutman Johannes Anderwald
  • Initialize the spin lock in NdisInitializeReadWriteLock (fixes miniport drivers that use the read/write lock) Cameron Gutman
  • Fix a multiplication error that causes a garbage timeout value to be passed to KeWaitForSingleObject (similar to the timer bug) (NdisWaitEvent works properly now) Cameron Gutman





  • Fix a horrible bug, when DriverEntry was not having __stdcall calling convention. (Aleksey Bragin)
  • Scan three PCI buses in the legacy USB driver instead of 2. Fixes UHCI/EHCI detection issues in VMWare Workstation 6.5 and higher (Emulated UHCI is located on bus 2). (Aleksey Bragin)
  • Actually advance current item pointer to the next one when traversing a linked list. Fixes an infinite loop when building USB interface. (Aleksey Bragin)
  • Rename a variable so it doesn't conflict with a reserved keyword. (Aleksey Bragin)
  • Wait until all usb embedded drivers are initialized before returning from DriverEntry. This allows usb mouse driver to have a chance to register itself before mouclass is loaded. (Aleksey Bragin)
  • Add first version of USB keyboard driver (limitations: no keyboard LEDs support, no repeated keypress support, right-side modifier keys not supported). (Aleksey Bragin)
  • Cleanup source code of USB mouse driver. (Aleksey Bragin)
  • Fix UsbBuildGetStatusRequest macro. (Aleksey Bragin)
  • Fix an incorrect assumption that endpoint descriptors must immediately follow an interface descriptor (there may be generic descriptors in between too, as it is for e.g. USB HID devices). (Aleksey Bragin, Michael Lotz)
  • Fix incorrect handling of alternate interface settings, which resulted in reading uninitialized memory. (Aleksey Bragin)
  • Major cleanup of USB keyboard driver: Remove huge hack, which is not needed anymore since 39912. (Aleksey Bragin)
  • Major cleanup of USB keyboard driver: Put all global variables into device extension, allowing support for more than one USB keyboard. (Aleksey Bragin)
  • Major cleanup of USB keyboard driver: Cleanup driver extension structure. (Aleksey Bragin)
  • Major cleanup of USB keyboard driver: Remove unneeded endpoint finding code. (Aleksey Bragin)
  • Add test code for LEDs support (now puts three of them into ON state). (Aleksey Bragin)
  • Move USB keyboard LEDs managing code into an own function. (Aleksey Bragin)
  • Unhack usb mouse driver after endpoint parsing code was corrected. (Aleksey Bragin)
  • Cleanup usb mouse driver source code, make its structure similar to the usb keyboard driver. (Aleksey Bragin)

Static Libraries


  • Fix some places where Win32 error codes were put in errno directly instead of going through _dosmaperr. (Jeffrey Morlan)
  • Fix bug in wcscspn where it would return a non-zero value on an empty string. (Jeffrey Morlan)
  • Added code for updating the drive-specific current-directory environment variable to _tchdir. (Jeffrey Morlan)
  • Fix bug in wcstoul causing it to set *endptr improperly. (Jeffrey Morlan)



  • Sync the common mingw stuff with mingw-w64 HEAD (Colin Finck)
  • Fixed initialization for Console apps with Unicode entry point (Colin Finck)


  • Display memory usage in the installer as Kernel Cache and Kernel Pool, instead of Paged and Nonpaged Pool, which doesn't reveal the source of the memory leak (Aleksey Bragin)
  • Remove 40% memory delay hack (Aleksey Bragin)
  • Recognize all 4 primary partitions of every harddisk and assign drive letters to them. (Aleksey Bragin)
  • Make it possible to install ReactOS on any primary partition. Creating/deleting of more than one partition is still broken. (Aleksey Bragin)
  • Write ReactOS MBR if harddisk lacks one (Aleksey Bragin).

Win32™ Personality

Kernel-mode subsystem server (Win32K)

  • Fix mouse cursor problem in 256 color mode (Evgeniy Boltik, bug #4172)
  • Unify StretchBlt implementations (Gregor Schneider, Evgeniy Boltik)
  • Add StretchBlt clipping support (Gregor Schneider, bug #3477, bug #3656, bug #4089)
  • Fix GetBitmapBits return values (Gregor Schneider)
  • Fix palette copy in GetDIBits (Gregor Schneider)
  • Fix brush and rectangle offsets in BitBlt and TransparentBlt functions (Gregor Schneider, Evgeniy Boltik)
  • Added stretching support to TransparentBlt (Evgeniy Boltik, Gregor Schneider, bug #4337)
  • Fix system palette entries (Evgeny Boltik, Gregor Schneider, bug #4341)
  • Misc coordinate fixes for AlphaBlend, BitBlt, GradientFill, ExtTextOutW, PatBlt, StretchBltMask and TransparentBlt (Gregor Schneider)
  • Allow creation of empty regions in ExtCreateRegion (Gregor Schneider)
  • Fix buffer operations in GetTextFaceA/W (Gregor Schneider)
  • Fix a memory overwrite in BitBlt (Gregor Schneider, bug #4361, bug #4072)
  • Use bitmap's DIB palette, if it exists. Fixes problems described in bug 4147 (Evgeniy Boltik, bug #4147)
  • Brush's origin is always (0,0) of a window, not a screen. Offset it accordingly in NtGdiStretchBlt.(Evgeniy Boltik, bug #4147)
  • EngStretchBltROP expects a ROP4 code, but SRCCOPY is ROP3. Convert it accordingly. (Evgeniy Boltik, bug #4156)
  • Move clipping from StretchBlt to Eng. (Evgeniy Boltik, bug #4156)
  • Add ROP support to StretchBlt. (Evgeniy Boltik, bug #4156)
  • Fix alphablend support (alphablend.exe produces same result as tested on Windows XP). (Evgeniy Boltik, bug #4156)
  • Rework 16bit DIB alphablend to do alpha operations in source's palette (32bpp) to obtain much better output quality without data loss. (Evgeniy Boltik, bug #3708)
  • Rework 8bit DIB alphablend to do alpha operations in source's palette (32bpp) to obtain much better output quality with lowest possible quality loss. (Evgeniy Boltik, bug #4291)
  • Don't try to be smarter than Windows and don't copy background/foreground color from the original DC. Spotted and confirmed by Evgeniy Boltik. As a result issues in bug 4143 are fixed, as well as other possible problems. (Aleksey Bragin, Evgeniy Boltik, bug #4143)
  • Pass correct allocation flags to ZwAllocateVirtualMemory (Aleksey Bragin)
  • Don't provide region size when freeing virtual memory, confirmed by MSDN. (Aleksey Bragin, Evgeniy Boltik)
  • Remove a header structure from memory regions allocated with EngAllocUserMem. Modern versions of Windows (at least XP and higher) don't do this and instead save this information elsewhere. Confirmed by Alexandre Julliard's test case for calling WriteFile with the DIB section bits as buffer (5 less failures now) and by arguing with Evgeniy Boltik. (Aleksey Bragin)
  • NtGdiSetDIBitsToDeviceInternal: use bitmap's palette if it exists instead of always using system palette.(Aleksey Bragin, Evgeniy Boltik, bug #4326)
  • Apply a fix by Timo Kreuzer for the bug spotted by Evgeniy Boltik. 4 failures less in "gdi32_winetest.exe bitmap" now. (Timo Kreuzer, Evgeniy Boltik, bug #4326)
  • Rework NtGdiStretchBlt into GreStretchBltMask function, which provides stretch blitting with mask support. (Aleksey Bragin, Evgeniy Boltik, bug #4294)
  • Add NtGdiStretchBlt as a simple forwarder to the internal GreStretchBltMask helper. (Aleksey Bragin, Evgeniy Boltik, bug #4294)
  • Fix copypaste mistake in EngStretchBltROP. (Evgeniy Boltik, bug #4336)
  • Fix check in EngStretchBltROP, it should check original InputRect, not the clipped one. (Evgeniy Boltik, bug #4336)
  • Fix improper variable type in DIB_XXBPP_StretchBlt: PatternX and PatternY could be negative. (Evgeniy Boltik, bug #4336)
  • Enable and use mask support in UserDrawIconEx, fully compatible with Windows, based on tests in bug 4336. (Evgeniy Boltik, bug #4336)
  • Remove IntSet[Text/Bk]Color hacks from UserDrawIconEx, no longer required due to fix in CreateCompatibleDC. (Evgeniy Boltik, bug #4336)
  • Change a few comments in the code of UserDrawIconEx. (Evgeniy Boltik, bug #4336)
  • Always calculate a palette for the DIB in NtGdiGetDIBitsInternal, when dealing with 15 or 16 bit depth. Fixes broken taskbar icons on 16bpp. (Evgeniy Boltik)
  • Optimize BltMask (Timo Kreuzer, Evgeniy Boltik)
  • Fix global mouse and keyboard hooks in NtUserSetWindowsHookEx (Kamil Horníček)
  • Fix check for return status in IntChangeDisplaySettings (Kamil Horníček)
  • gdiobj.c: go back from intrinsics to to portable interlocked functions. (Timo Kreuzer)
  • InterlockedPopFreeEntry: Use InterlockedIncrement instead of InterlockedCompareExchange when exchanging the next unused entry in the handle table. (Timo Kreuzer)
  • Lock the free entry before accessing it, fixing a race condition. (Timo Kreuzer, bug 4115)
  • Win32k: remove NtGdiSetWindowExtEx and NtGdiSetViewportExtEx, rewrite IntFixIsotropicMapping, implement IntGetViewportExtEx. (Timo Kreuzer)
  • IntSetPaletteEntries: Don't free a NULL pointer. (Timo Kreuzer)
  • co_IntCallHookProc: Don't dereference the ResultPointer returned from KeUserModeCallback and then probe the LRESULT cast to PVOID, but probe the ResultPointer. (Timo Kreuzer, bug 4114)
  • Make the SURFACE structure more like the one from Windows. (Timo Kreuzer)
  • Remove hBitmap from DC.rosdc and use DC.dclevel.pSurface instead. (Timo Kreuzer)
  • Return NULL, if failed to lock the provided palette in IntEngCreateXlate. (Timo Kreuzer, bug 4378)
  • Implement RECTL_vMakeWellOrdered. (Timo Kreuzer)
  • Rename PALGDI to PALETTE as it's called in gdikdx. (Timo Kreuzer)
  • Fix hooking/punting logic for (int)EngBitBlt. (Timo Kreuzer)
  • Do not call DrvBitBlt with a single clipping rectangle. (Timo Kreuzer)
  • Use vDbgPrintExWithPrefix in EngDebugPrint to fix output of parameters. (Timo Kreuzer)
  • IntChangeDisplaySettings: Save refresh frequency in the registry. Fixes changing of resolution with VBox driver. (Timo Kreuzer)
  • Rewrite DRIVEROBJ API. (Timo Kreuzer)
  • Don't delete an object that has a shared reference. (Timo Kreuzer)
  • Implement delayed deletion of gdi objects. (Timo Kreuzer)
  • Rename NtGdiDeleteObject to GreDeleteObject. (Timo Kreuzer)
  • Define RECT to RECTL in win32k. (Timo Kreuzer)
  • Rename rect functions to RECTL_Xxx. (Timo Kreuzer)
  • Rewrite the dc state saving implementation. (Timo Kreuzer)
  • Make DC_AllocDC return a pointer, not a handle. (Timo Kreuzer)
  • Remove DC_GetNextDC and DC_SetNextDC, as they are trivial. (Timo Kreuzer)
  • Rename DC.Dc_attr to dcattr, DC.DcLevel to dclevel, just like in gdikdx. (Timo Kreuzer)
  • Inline GDIOBJ_UnlockObjByPtr, ASSERT that we don't unlock an already unlocked object, return how many locks are left. (Timo Kreuzer)
  • Change most DC struct members to the names they have on Windows according to gdikdx. (Timo Kreuzer)
  • Implement DC_vSelectSurface, that dereferences the old SURFACE and references the new. (Timo Kreuzer)
  • Select NULL surface when doing DC cleanup. (Timo Kreuzer)
  • Add debugprints if leaking objects on process cleanup. (Timo Kreuzer)
  • Rename GDIDEVICE to PDEVOBJ. (Timo Kreuzer)
  • Remove DC_GET_VAL macro and friends. (Timo Kreuzer)
  • Replace IntGetViewportExtEx with DC_vUpdateViewportExt. (Timo Kreuzer)
  • Remove unused Status from the GDIPOINTER struct. (Timo Kreuzer)
  • Remove MovePointer and use PDEVOBJ.pfnMovePointer instead, which is always set to a valid function. (Timo Kreuzer)
  • Implement IntEngSetPointerShape, calling either the Eng or the Drv function if available, set pfnMovePointer according to the result. (Timo Kreuzer)
  • Use IntEngSetPointerShape instead of EngSetPointerShape in IntSetCursor. (Timo Kreuzer)
  • Don't misuse gpsi->ptCursor in IntShow/HideMousePointer and EngMovePointer, use ppdev->ptlPointer instead. (Timo Kreuzer)
  • Dont lock and unlock the surface everytime the pointer is drawn, instead keep a shared lock. (Timo Kreuzer)
  • Implement IntEngCopyBits, that does the MouseSafety and calls EngCopyBits. (Timo Kreuzer)
  • Implement DC_vUpdateFillBrush and DC_vUpdateLineBrush, superseding IntGdiSelectBrush and IntGdiSelectBrush. (Timo Kreuzer)
  • Add EBRUSHOBJs for the DC's brush, pen, text abd back color to the DC structure and use them instead of newly initialized ones, adding support for DC_PEN and DC_BRUSH. (Timo Kreuzer)
  • Rename several BRUSHOBJ_xxx functions to BRUSH_xxx, as they deal with a BRUSH, not a BRUSHOBJ. (Timo Kreuzer)
  • Initialize flattrs in EBRUSHOBJ_vInit. (Timo Kreuzer)
  • Update the EBRUSHOBJ independent of changing the brush/pen handle in DC_vUpdateFill/LineBrush. (Timo Kreuzer)
  • Mark the brushes as dirty after change of surface, palette and DIB colot table. (Timo Kreuzer)
  • Update the EBURHOBJs on demand in IntGdiPolygon and IntRectangle. (Timo Kreuzer, bug 4340)
  • Rename DCs pDc_Attr to pdcattr, like in gdikdx. (Timo Kreuzer)
  • Make DC.pdcattr always point to a DC_ATTR, either the user mode struct or the local part. (Timo Kreuzer)
  • Remove all 'If (!pdcattr) pdcattr = &dc->Dc_Attr;' that are not required anymore. (Timo Kreuzer)




  • Use rundll32.exe and CreateProcessAsUserW to call ClientSideInstallW for installing new devices and supply all required information over a named pipe.
    The named pipe communication was monitored under Windows XP SP2, so that the protocol under ReactOS is mostly compatible (Colin Finck)
  • Give umpnpmgr the SE_ASSIGNPRIMARYTOKEN privilege to use CreateProcessAsUserW (Colin Finck)
  • Open the token of the userinit process with TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE | TOKEN_QUERY, we don't get TOKEN_ALL_ACCESS and used to fail here without noticing it (Colin Finck)
  • Return CR_FAILURE in case of problems inside PNP_ReportLogOn (Colin Finck)

Control panel applets


  • Show the currently selected color scheme in combo box instead of default "Reactos Standard" (Matthias Kupfer)
  • Update settings for dmDisplayFrequency, when changing the video mode. (Timo Kreuzer)


  • Fix size of the clock for different screen resolutions. (Timo Kreuzer)

Win32™ Applications

Command Prompt

  • Fix handling of quotes in various commands. (Jeffrey Morlan)
  • Make delayed variable expansion actually be delayed. (Jeffrey Morlan)
  • Implement complete support for FOR command. (Jeffrey Morlan)
  • In SET /A: allow hex/octal numbers; allow space after an identifier; don't echo result when in a batch file. (Jeffrey Morlan)
  • Improve performance of TYPE; also make it interruptable by ^C. (Jeffrey Morlan, Bug #4057)
  • Speed up batch file execution by reading a line at a time instead of a byte at a time; only end line on '\n', not '\r'. (Jeffrey Morlan)
  • Fix handling of "call file.bat & somethingelse" so the right side doesn't run until after the batch file is finished. (Jeffrey Morlan)
  • Do variable expansions in arguments to CALL command, and also argument to CMD /C or /K. (Jeffrey Morlan)
  • Ignore special characters in a REM line. (Jeffrey Morlan)
  • Implement SETLOCAL and ENDLOCAL; make delayed expansion optional. (Jeffrey Morlan)
  • Fix bug where "DIR directoryname /S" wouldn't list subdirectories; got rid of extra * that appeared in DIR /B /S output. (Jeffrey Morlan)
  • Give an error message when trying to DEL a file that doesn't exist. (Víctor Martínez Calvo, Bug #4244)
  • In a pipeline ("prog1 | prog2") run all programs simultaneously. (Jeffrey Morlan)
  • In a 'Bad command or filename' error, print the name of the non-existent program, so getting the error from a batch file isn't so mysterious. (Jeffrey Morlan)
  • Implement enhanced variable substitution. (Jeffrey Morlan)
  • Fix output of various date/time stuff to be more compatible with Windows. (Jeffrey Morlan)
  • Implement ASSOC command (Lee C. Baker, Bug #4275)
  • Implement MKLINK command. (Jeffrey Morlan)
  • Implement SHIFT /n. (Jeffrey Morlan)
  • Do delayed expansion in argument to IF ERRORLEVEL. (Jeffrey Morlan)
  • Make MEMORY and FREE commands capable of showing values >= 4 GB. (Jeffrey Morlan)
  • Replace hard-coded English string constants with translatable resource strings. (Jeffrey Morlan, Bug #3718)
  • When running a non-executable file, run the handler program in the same console if it's a console program; use NULL as the lpVerb to get the default action rather than assuming that it's "open"; allow passing parameters besides just the file name. (Jeffrey Morlan)
  • Make START command able to open non-executable files or directories/URLs by using ShelllExecute. (Jeffrey Morlan, Bug #4055)
  • Implement all remaining switches for the START command. (Jeffrey Morlan)
  • Implement CMD /D, /Q, /R, /A, and /U switches. (Jeffrey Morlan)
  • Make VERIFY set the errorlevel; also make it recognize when ON/OFF is followed by spaces. (Jeffrey Morlan)
  • Make ECHOSERR actually print to stderr, not stdout. (Jeffrey Morlan)
  • Make batch file echo output look nicer. (Jeffrey Morlan, Bug #4022)
  • Fix a buffer overflow in Execute; make command parsing in DoCommand/Execute more compatible with Windows. (Jeffrey Morlan)
  • Make cmd able to (sort of) work without a console. (Jeffrey Morlan)
  • Fix some incorrect lengths in ConInString; also make sure result is nul-terminated. (Jeffrey Morlan, Bug #4085)
  • Fix PAUSE so it only returns on a key being pressed, not released. (Jeffrey Morlan, Bug #4324)
  • Use correct codepage for reading batch files. (Jeffrey Morlan)
  • Check for AutoRun registry value in HKEY_CURRENT_USER was well as HKEY_LOCAL_MACHINE; allow AutoRun commands to be longer than MAX_PATH. (Jeffrey Morlan)
  • Simplify code for CD, PUSHD, and POPD commands and also fixed some bugs. (Jeffrey Morlan)
  • Various fixes to the way cmd handles errorlevel and the "return values" of commands. (Jeffrey Morlan)
  • Properly free a buffer allocated during "copy" command. Fixes cmd.exe crash when copy operation experiences a write error or is being interrupted with a Ctrl+C keypress. (Aleksey Bragin)



  • Use correct printf format so strings don't get displayed as gibberish. (Jeffrey Morlan)




  • Remove last application from task list (Matthias Kupfer)
  • Allow only one instance of Task-Manager to be run at the same time (Gabriel Ilardi,Bug 3976)
  • Use DWORD_PTR instead of DWORD for the Affinity mask. (Samuel Serapión)

Win32™ Libraries


  • Correct param values for GetServiceDisplayNameW and GetServiceKeyNameW when service name is not found. (Michael Martin)
  • Improve error checking (Johannes Anderwald)
  • Add more error checks which reduce winetest errors Johannes Anderwald)
  • Fix memory corruption and crash in ConvertStringSecurityDescriptorToSecurityDescriptorW (Gregor Schneider)


  • Fix and enable usermode implementation of SetWindowExtEx and SetViewportExtEx. (Timo Kreuzer)
  • Fix GetDCBrushColor. It was returning the pen color. (Timo Kreuzer)


  • MultiByteToWideChar: Fill the WideCharString buffer with what will fit, to match Windows. (Michael Martin, Bug #3740)






  • Make sure "Open" verb is always inserted first Johannes Anderwald
  • Apply item style to current item not to next Johannes Anderwald
  • Remove _SHExpandEnvironmentStrings and replace calls to it by usual ExpandEnvironmentStringsW calls.
    That function didn't really do what it should as it replaced some variables by faulty generated values instead of their actual values. (Colin Finck)
  • Remove the now unused _SHOpenProfilesKey and _SHGetProfilesValue functions (Colin Finck)
  • Fix and slightly optimize _SHGetUserShellFolderPath (Colin Finck)



  • Default handler for WM_SYSCOLORCHANGE Messages (Matthias Kupfer)
  • Allow creation of colored cursors from resources, create monochrome cursors properly from color data (Gregor Schneider, bug #4370)
  • Use Marlett font for caption buttons, system buttons and menus. (Matthias Kupfer)
  • Allow colored cursor creation in CreateCursorFromData (Gregor Schneider)
  • Fix monochrome cursor and icon handling in CreateIcon and CreateIconIndirect (Gregor Schneider)
  • LoadBitmapImage: Add space for 3 RGBQUADs to BITMAPINFO when biCompression is BI_BITFIELDS. (Evgeniy Boltik, Timo Kreuzer, bug #3708)


  • Alter "userenv.spec" to match the output of "dumpbin /exports" for the Windows Server 2003 SP1 userenv.dll exactly. (Colin Finck)

Regression tests

  • Remove most Skip hacks from the Wine tests as we resume from crashes now (Colin Finck)


  • Rewrite rosautotest in C++ (Colin Finck)
  • Add a /c option to supply a comment for the web service submission (Colin Finck)
  • Implement a Crash Recovery feature (/r option) based on a journal (Colin Finck)
  • Add some reasonable timeouts to avoid certain hangs in case a test crashes (Colin Finck)
  • Output SYSREG_ROSAUTOTEST_FAILURE for sysreg2 in case of a failure inside rosautotest (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