From ReactOS Wiki
Revision as of 11:10, 15 December 2009 by Vicmarcal (talk | contribs) (FASTFAT : VicmarBot adding Stefan changes.Dev review needed)
Jump to: navigation, search

This is the changelog for ReactOS™ version 0.3.11 (released *pending*), 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.10 (released 5th July, 2009).



Generic 0.3.11 Changes










  • Italian translations for spider, explorer_new, ks.inf, usetup (Gabriel Ilardi)








  • Generic: Updated resources for explorer_new, added english ks.inf (Gabriel Ilardi)





  • Reorganize some headers to make them better match the Platform SDK (Andrew Hill)
  • Move InlineIsEqualGUID to guiddef.h (Andrew Hill)
  • Create new header files shlguid_undoc.h, shlobj_undoc.h, and shlwapi_undoc.h to hold undocumented types, functions, and GUIDs (Andrew Hill)
  • Move some undocumented definitions declared in explorer_new/todo.h and undoc.h to new headers (Andrew Hill)
  • Add definition of RBSTR_CHANGERECT to commctrl.h (Andrew Hill)
  • IDeskBarClient inherits from IOleWindow, not IUnknown (Andrew Hill)
  • HMONITOR was declared in both dxsdk/axextend.idl and wine/wined3d.idl, but not in wtypes.idl where it belongs (Andrew Hill)


  • Make our IDLs files to not specify a [range] tag for string datatypes, and 0,256 range for an unsigned type. Fixes compiling with newer WIDL and (probably) MIDL. (Aleksey Bragin)

Host Tools






Bootloader (FreeLoader)

  • Clear the screen before printing the current path\file. (Gabriel Ilardi, #4877)
  • Display error message when boot sector reading fails. (Andrew Steinborn, #4641)
  • Rework operating system menu, by storing each selection in a structure instead of distinct arrays. As a bonus, entries like LiveCD\reactos="ReactOS" /DEBUGPORT=COM1 /SOS /MININT now work (Hervé Poussineau)
  • Move KiBootTss and KiBootGdt to freeldr.c as this is where they belong -- they are not required for NTLDR/WINLDR boot style and are only used directly in freeldr.c. (Stefan Ginsberg)

Kernel and Executive (NTOSKRNL)

  • Make use of the _SEH2_YIELD macro when returning from an exception instead of pre-initializing status codes and checking them after leaving the SEH block. (Stefan Ginsberg)
  • Don't use ExSystemExceptionFilter in SEH filters if we know the caller is user mode. (Stefan Ginsberg)
  • Fixed the remaining issues for running the MP kernel (only on UP so far). Implemented stubbed code in the scheduler, DPC handling and context switch code and fixed various bugs in the spinlock implementation. (Stefan Ginsberg)
  • Rewrite RtlpCreateAtomHandle to readable code and fix a problem spotted in bug #4788 (Aleksey Bragin)


  • Implement NtUnloadKey2 as a wrapper around internal CM API. (Aleksey Bragin)
  • CmpSelectLeaf fixes: looking into an incorrect cell, returning wrong cell, slightly simplify code and add more comments for clarity. (Aleksey Bragin)


  • Fixed support for sending second chance exceptions to user mode debuggers. (Stefan Ginsberg)


  • Fix a critical bug in ExAllocatePoolWithQuota spotted by msvc. Because of the current POOL_TAGGING mess in wdm.h, ExAllocatePoolWithQuotaTag is defined to ExAllocatePoolWithQuota, so when ExAllocatePoolWithQuota called the with-tag version, it ended up calling _itself_. Fix this by undefining the broken macro.(Stefan Ginsberg)



  • Calling NtLoadDriver on an already loaded driver should fail with STATUS_IMAGE_ALREADY_LOADED. Fixes one test for kmtest driver tests and a bugcheck when loading drivers a second time. (Michael Martin)
  • Don't call ExFreePool for null pointers (Johannes Anderwald)
  • Don't touch the freed buffer in case of an error (Amine Khaldi)
  • Fix IoRegisterDeviceInterface, IoSetDeviceInterfaceState to handle reference strings (Johannes Anderwald)
  • Rewrite failure branch of IopLoadUnloadDriver and remove unneeded code duplication (Aleksey Bragin)


  • Continued the implementation of kernel support for debugging with WinDbg/KD. Implemented missing handling of various functionality in the KD support APIs and fixed missing or broken support in other areas. Debugging ReactOS kernel mode with WinDbg now works quite well. (Stefan Ginsberg)
  • Rename some variables in KD to better match the logic. (Stefan Ginsberg)
  • Implement support for reading and writing physical memory for KD. The implementation uses a reserved mapping page to map the target physical address to. On x86 this page is located at virtual address 0xFFBFF000, and the PTE for this page is the last PTE of the nonpaged pool's PDE. Other architectures may need to reserve the PTE elsewhere. (Stefan Ginsberg)
  • Fix incorrect cache flag check and set in KdpRead/WritePhysicalmemory for write combined requests. The debugger's Uncached flag was checked instead of the Write Combined flag, and the debuggers Write Combine number (0x3) was set instead of Mm's flag (0x20). (Stefan Ginsberg)
  • DBGKD_WAIT_STATE_CHANGE64 is used in KD protocol 5, not number 6 that we use. Protocol 6 uses the DBGKD_ANY_WAIT_STATE_CHANGE structure which is sized according to the largest control-report structure (AMD64_DBGKD_CONTROL_REPORT currently), and is larger than DBGKD_WAIT_STATE_CHANGE64 on x86. This worked because our DBGKD_WAIT_STATE_CHANGE32/64 structures contained incorrect DBGKD_CONTROL_REPORT (used) and CONTEXT (unused) members that sized up the wait-state structure to pass WinDbg's length verification! It actually becomes larger than DBGKD_ANY_WAIT_STATE_CHANGE, but WinDbg only seems bail out only if the structure is too small. Remove the incorrect members from the protocol 5 structures and change to DBGKD_ANY_WAIT_STATE_CHANGE everywhere. Stefan Ginsberg)
  • Use better named and sized variables in KdpTrap for setting the "return register" in the caller's CONTEXT. (Stefan Ginsberg)
  • KdbpCallMainLoop: Add VOID to parameter list (Stefan Ginsberg)
  • Rename the 3 kdsup.c files to kdx86.c, kdx64.c and kdarm.c to differ them from each other. (Stefan Ginsberg)
  • Implement KdpAllowDisable -- just check if any processor breakpoints are set on any processor in the system and disallow the disable if so. The routine is now architecture dependant, so move it to the appropriate files. (Stefan Ginsberg)
  • KD uses STRINGs, not ANSI_STRINGs -- they are the same thing, but let's be consistent. (Stefan Ginsberg)
  • Add STATUS_ASSERTION_FAILURE status code required for NT_ASSERT. (Stefan Ginsberg)
  • Check KdReceivePacket return for KdPacketReceived instead of 0 for correctness. (Stefan Ginsberg)
  • Use KdpDprintf instead of setting CR2 for unhandled cases. (Stefan Ginsberg)
  • Add more variables to KdDebuggerDataBlock. (Stefan Ginsberg)


  • Fix some 64-bit issues and some x86 specificness. (Stefan Ginsberg)
  • Sub out some KdpTrap cases more properly.(Stefan Ginsberg)
  • Implement support for .crash and .reboot. Does not seem to work currently because of weird issues.(Stefan Ginsberg)
  • Implement KdpDprintf to send strings directly to the debugger from inside of KD64. Use it in KdEnterDebugger instead of DbgPrint so we won't try to enter the debugger recursively. (Stefan Ginsberg)
  • Implement KdUpdateDataBlock to set the KeUserCallbackDispatcher pointer in the debugger block after its address is retrieved from ntdll. (Stefan Ginsberg)
  • Don't assume breakpoints are 1 byte long in portable code -- use KD_BREAKPOINT_SIZE and define it per architecture. (Stefan Ginsberg)
  • KdpStub: KdEnableDebugger returns NTSTATUS, not TRUE/FALSE. (Stefan Ginsberg)
  • wdbgexts.h: Properly define CURRENT_KD_SECONDARY_VERSION for AMD64. (Stefan Ginsberg)
  • Make PsNtosImageBase pointer-sized as it should be. (Stefan Ginsberg)
  • Change the definition of KDSTATUS so it is guaranteed to be 32-bit. (Stefan Ginsberg)
  • Fix a critical bug in KiRestoreProcessorControlState: it didn't clear the busy flag in the TSS before reloading the task register, resulting in a GPF if we tried to reload the same register. (Stefan Ginsberg)
  • Add macros for getting and setting special purpose registers (the Program Counter and the "return register") in portable code instead of using #ifdef every time. Do likewise for setting IMAGE_FILE_MACHINE_XXX, using a new IMAGE_FILE_MACHINE_ARCHITECTURE macro. (Stefan Ginsberg)
  • Don't refer to the Program Counter as "Eip" in portable code. (Stefan Ginsberg)


  • Get rid of the KDB_MODULE_INFO and operate with LDR_DATA_TABLE_ENTRYs directly.
    This saves us from some copy steps and unneeded search operations. (Colin Finck)
  • Don't duplicate code in KdbpSymFindModule and KdbpSymFindUserModule. Use a helper function instead and call it twice from KdbpSymFindModule. (Colin Finck)
  • Get rid of KdbpSymFindModuleByAddress, KdbpSymFindModuleByName and KdbpSymFindModuleByIndex. Instead use a single KdbpSymFindModule for all three variants. (Colin Finck)
  • Remove some unused functions and defines. (Colin Finck)
  • KdbInitialize can now assume that the 2nd entry in the Load Order list is HAL, just like ExpLoadBootSymbols and KD does, so get the Loader Entry directly instead of searching for it. (Stefan Ginsberg)
  • Define correctly sized KDDEBUGGER_DATA64 for our kernel (needs to be done in a better way). (Stefan Ginsberg)
  • Use _WIN64 instead of _M_AMD64 when determining if we need to set the DBGKD_VERS_FLAG_PTR64 flag. (Stefan Ginsberg)
  • Correct and clarify the comment documenting under what conditions we pass user mode exceptions to the kernel debugger. (Stefan Ginsberg)


  • Fixed a bug in KeDetachProcess and KeUnstackDetachProcess that caused a switch from the original process to itself instead of

switching from the attached process. (Stefan Ginsberg)

  • Removed a hack from KiGetMachineBootPointers and set the TSS selector properly in KiRosPrepareForSystemStartup instead for FreeLdr boot style. (Stefan Ginsberg)
  • Fixed a critical bug in KeFindConfigurationEntry; it passed NULL to KeFindConfigurationNextEntry which expected a pointer to a value containing NULL. This was hidden by the FreeLdr boot style as that boot style maps NULL, but got exposed by WinLdr boot style as NULL is not mapped there. (Stefan Ginsberg)
  • Add generic KeInvalidateTlbEntry to invalidate a single TLB entry for a given address instead of flushing the whole TLB. Used by the debugger physical memory support as invalidating the whole TLB for every map and unmap of its debug PTE would incur significant overhead for large copies. Replace direct usage of __invlpg() with this in x86 code too. (Stefan Ginsberg)
  • Correct the value of SIZE_OF_FX_REGISTERS -- it was 4 times too low which resulted in KeContextToTrapFrame not properly clearing out the XMM register area. Correct the define and move it out from ke.h to x86's ketypes.h and use it in the FXSAVE format structure. Also remove the IOPM definitions from ke.h as they have been in the NDK for a while. (Stefan Ginsberg)
  • Use ZwCurrentProcess() instead of -1 or 0xFFFFFFFF (which is incorrect for 64-bit) for the ProcessId parameter of DbgLoad/UnloadImageSymbols to clarify what is being passed. Don't use ZwCurrentProcess() in KeBugCheckWithTf for the pointer parameter of DbgUnLoadImageSymbols either. Use MAXULONG_PTR casted to PVOID instead. (Stefan Ginsberg)
  • Don't use KeBugCheck(0) -- 0 is an invalid bugcode. Use a proper bugcode, DbgBreakPoint or UNIMPLEMENTED instead depending on how the old call was used. (Stefan Ginsberg)
  • Define DBG_STATUS_CONTROL_C for assembly code and use it in KeUpdateSystemTime. (Stefan Ginsberg)


  • Implement NtReplyPort based on NtReplyWaitReceivePortEx and LpcReplyPort. (Aleksey Bragin)
  • Implement NtRequestPort based on NtRequestWaitReplyPort and LpcRequestPort. (Aleksey Bragin)


  • NtAllocateVirtualMemory: Add check to make sure that BaseAddress + RegionSize is inside MemoryArea. For AllocationType of MEM_RESET add FIXME's and return STATUS_SUCCESS, without modifying attributes of region. Fixes 2 kernel32 virtual tests. (Michael Martin)
  • NtMapViewOfSection: When referencing the section object by handle, don't assume access mask of SECTION_MAP_READ. Access mask must be determined from page protection attributes passed in Protect parameter. Fixes 5 winetests for kernel32 virtual. (Michael Martin)
  • MiReserveAlignedSystemPtes: Add missing lock release (Johannes Anderwald)
  • Fixed recursive spinlock acquisition in the Memory Manager introduced by the rewrite: the old Mm calls certain routines for performing operations on PFNs, and those routines acquire the PFN lock, while the new Mm holds the PFN lock while working with PFNs, including calling those routines. Moved out spinlock acquire/release to the callers of those functions instead. (Stefan Ginsberg)
  • Added missing spinlock release to MiReserveAlignedSystemPtes. (Stefan Ginsberg)
  • Added missing synchronization for PsLoadedModuleList in certain cases. (Stefan Ginsberg)
  • Fix MmGrowKernelStack to check for available space. Timo Kreuzer)
  • Fix inverted if condition in TEB initialization (MmCreateTeb), spotted by Stefan. (Aleksey Bragin)
  • Rewrite MmPageEntireDriver in a better way, fix bugs. (Aleksey Bragin)
  • Make SystemUnloadGdiDriverInformation take the opaque SectionPointer (which is really the Loader Entry) from the SYSTEM_GDI_DRIVER_INFORMATION structure returned in SystemLoadGdiDriverInformation so it doesn't need to loop the loaded module list to find it. (Stefan Ginsberg)
  • Remove some externs from related variables in the code -- we use something called "headers".(Stefan Ginsberg)
  • Disable the MiCacheImageSymbols call in MmLoadSystemImage for KD too as this hack is required for rossym rather than KDBG. Fixes detection of non-boot driver images by WinDbg. (Stefan Ginsberg)
  • Add another hack to freeldr.c to make sure that HAL is the second entry in the Load Order list -- detect if it isn't and insert it as the second entry manually if it isn't. (Stefan Ginsberg)
  • Add MmIsSessionAddress stub and use it from KD handle session space properly in the Memory Query API, and ASSERT that we are not trying to do a copy to/from session space in MmDbgCopyMemory as we don't handle it properly. Put this in mmdbg.c for now as we don't implement session space, and it is only called from KD right now. (Stefan Ginsberg)
  • Get rid of the MmFreeLdr* variables too. These have been deprecated for some time now. (Stefan Ginsberg)
  • The ModuleObject and ImageBaseAddress parameters of MmLoadSystemImage are not optional so don't treat them as such, and don't zero initialize them as callers shouldn't rely on this. (Stefan Ginsberg)
  • Set LDRP_ENTRY_NATIVE instead of LDRP_COMPAT_DATABASE_PROCESSED to mark the image as a native image. Also fix the value of LDRP_ENTRY_NATIVE. (Stefan Ginsberg)
  • Fix definition of LDR_DATA_TABLE_ENTRY -- the Checksum member should be in the union too. (Stefan Ginsberg)
  • Remove some unnecessary externs for stuff we now define globally in the kernel headers. (Stefan Ginsberg)
  • Move some x86 only stuff from global ke.h and ke_x.h to the x86 dependent ke.h. Remove DR_ACTIVE_MASK as it has been deprecated/unused for a while now. (Stefan Ginsberg)
  • The physical memory support relies on several Mm variables and structures to be properly set up. Add a new flag, MiDbgReadyForPhysical, and set it when the debugger support can handle physical memory requests. (Stefan Ginsberg)
  • Protect this page with a Memory Area to make the old Mm keep its dirty hands off it. (Stefan Ginsberg)
  • Does not support I/O space or cache flags yet. (Stefan Ginsberg)
  • Fix implementation of MmIsAddressValid (at least for x86; other architectures will need more checks). Just check the Address' PDE and PTE valid bits instead of using Memory Areas. (Stefan Ginsberg)
  • Add missing ASSERTs to ensure the Memory Areas for paged pool, the PCR page, and the Shared User Data page are created. (Stefan Ginsberg)
  • Add missing Memory Area for the 2 pages HAL currently uses for its own mappings on x86 -- previously, those pages could have been allocated by other parts of the OS, which would have resulted in serious corruptions. (Stefan Ginsberg)
  • Add 'simple' implementation of MmDbgCopyMemory to read/write virtual memory in a somewhat safe way (still no support for physical memory). Properly implement KdpCopyMemoryChunks as a wrapper around MmDbgCopyMemory and make most of the remaining unsafe copies use it instead of RtlCopyMemory. This fixes most of the remaining crashes during KD debugging as WinDbg/KD relies on the kernel support to handle bad addresses. (Stefan Ginsberg)
  • Stub out the remaining missing global variables for the debugger data block -- fixes some cases of WinDbg failures and gives it a chance to handle errors instead of failing on a NULL read. Several of these variables are for functionality we don't yet implement, so I tried to put them where they are "least wrong". Everything besides the MmLoadedUserImageList variable is left unitialized -- KD should mostly be able to handle this properly. (Stefan Ginsberg)
  • ExceptionRecord32To64 should be available for both 32 and 64 bit builds (and it shouldn't be a forceinline). Get rid of CopyExceptionRecord and determine if we need to convert or can just copy it directly instead. (Stefan Ginsberg)
  • Don't check Nt/DbgQueryDebugFilterState for zero or nonzero -- it actually returns TRUE, FALSE or STATUS_INVALID_PARAMETER_1! Check for != TRUE in preparation for proper implementation of NtSet/QueryDebugFilterState. (Stefan Ginsberg)
  • Fix Format parameter of DbgPrintReturnControlC -- it is const like the other DbgPrint* routines. (Stefan Ginsberg)
  • Be consistent with the types used in debug.c and don't set local variables to zero if we are going to return to caller -- this doesn't seem to be required anymore. (Stefan Ginsberg)
  • Fix DebugService and DebugService2: DebugService should take a ULONG followed by 4 pointers and DebugService2 doesn't return anything. (Stefan Ginsberg)
  • Remove some unused and deprecated macros from the network stack that did this. (Stefan Ginsberg)
  • Add several missing assertions documented on the MSDN page "Checked Build ASSERTs" (Stefan Ginsberg)
  • Fix a typo in MmProbeAndLockPages; assignment within an ASSERT isn't such a good idea! (was harmless though) (Stefan Ginsberg)
  • Get rid of MmStats -- most of the fields weren't used anymore and we have duplicates for most of the ones that are still in use; (Stefan Ginsberg)
  • NrTotalPages -> MmNumberOfPhysicalPages (Stefan Ginsberg)
  • NrFreePages -> MmAvailablePages (new) (Stefan Ginsberg)
  • Get rid of NrSystemPages. Its value was only respected in MmInitializePageList at boot, even though it got updated later. Use a local variable in MmInitializePageList instead. (Stefan Ginsberg)
  • Fix SystemBasicInformation to use the correct variables for physical page information. Also, don't set ResidentSystemCodePage in the SystemPerformanceInformation query to some random incorrect Mm value. We don't depend this value anywhere in ReactOS currently, so just set it to 0. (Stefan Ginsberg)
  • Fix recursive spinlock acquisition in Mm caused by locking inconsistency between ARM3 and the old ReactOS Mm. The old Mm calls certain routines to modify PFN entries (lock, unlock, reference, dereference, etc) and acquires/releases the PFN lock inside those functions (which is extremely inefficient as you can't, for example, have to acquire/release the PFN lock twice to reference and lock the same page), while ARM3 synchronizes differently and holds the lock while calling those routines, resulting in a recursive lock attempt on MP (which works on UP because spinlocks are just IRQL raise/lower there). Move out locking from MmAllocPage, MmReference/DereferencePage and MmLock/UnlockPage to the callers to be consistent with ARM3. (Stefan Ginsberg)
  • Add missing PFN locking to MmFreePagesFromMdl and MiAllocatePoolPages. (Stefan Ginsberg)
  • Get rid of MmLockPageUnsafe and MmReferencePageUnsafe. The "safe" routines just forwarded to the unsafe versions -- call them directly instead. Remove unused MmAcquirePageListLock/MmReleasePageListLock (Stefan Ginsberg)
  • MmInitMemoryAreas doesn't exist anymore so don't try to put it in .INIT. (Stefan Ginsberg)
  • Remove duplicate MmHighestPhysicalPage (the other being in init.c) -- we still ended up with only 1 global however, so this doesn't really change anything (Stefan Ginsberg)
  • MmArmInitSystem: Define MiNonPagedPoolStart and MiNonPagedPoolLength externs compatibly (Stefan Ginsberg)
  • MmpDeleteSection can be called for a Section Object before it is fully set up (when ObDereferenceObject is called before all fields are initialized), and it will now crash due to a bogus, nonintialized Segment/ImageSection pointer. Always zero out the whole buffer to prevent this. Fixes the kernel32 loader Winetest. (Stefan Ginsberg)


  • Fixed assumptions that memory allocated by ObCreateObject is zero-initialized (it shouldn't be) and removed the object zeroing hack. (Stefan Ginsberg)



  • Add missing synchronization for access to PsLoadedModuleList. Inserting and removing entries to the list was protected by a spinlock, but some places didn't acquire the lock before looping the list when searching for module information. For efficiency, use an executive resource for other access than inserting/removing entries so we can have shared locking in some common cases (spinlock stays so access can be synchronized with DPCs). (Stefan Ginsberg)
  • Fix EngLoad/UnloadImage to do this. Also make EngLoadImage return the pointer to the internal structure as the "handle" so EngUnloadImage doesn't need to loop the driver list to find it. The code is still extremely broken and needs a rewrite.(Stefan Ginsberg)


  • Factor out working code from SeAccessCheck into SepAccessCheck, the lowest level for SeAccessCheck remains SecurityImpersonation, but for NtAccessCheck it's lowered to SecurityIdentification. (Aleksey Bragin, #4169)

Hardware Abstraction Layer (HAL)

  • Reimplemented HalpCalibrateStallExecution with a more accurate implementation to determine the stall count factor for KeStallExecutionProcessor. (Stefan Ginsberg)


NT System Library (NTDLL)

Run Time Library (RTL)

  • Map STATUS_NOT_FOUND to ERROR_NOT_FOUND (Johannes Anderwald)
  • Reimplemented RtlRaiseException and RtlRaiseStatus in assembly for x86 so they do not corrupt non-volatile registers when saving the callers context. (Stefan Ginsberg)
  • Fix stack offset in asm implementations of RtlInterlockedPopEntrySList, RtlInterlockedPushEntrySList and RtlInterlockedFlushSList. (Timo Kreuzer)
  • Make heap functions 64bit safe. (Samuel Serapión)
  • Implement RtlpDidUnicodeToOemWork to check for unmapped characters. Based on a patch by Daniel Zimmerman. (Aleksey Bragin, #4548)
  • Instead of removing FORCEINLINE to make GCC happy (it can't inline functions using va_list), use __inline to merely hint that the function should be inlined. This lets you use RtlStringCbPrintfA and RtlStringCbPrintfExA in multiple source files as the functions aren't static. (Stefan Ginsberg)
  • There is no reason to forceinline all the RtlString* routines -- they are quite big and the compiler should be allowed to optimize here as it likes, so just use __inline. Also add RtlStringCchCopyA and re-enable ASSERTMSG and use it for the stubs. (Stefan Ginsberg)
  • Add missing GUID_CLASS_COMPORT and GUID_SERENUM_BUS_ENUMERATOR to ntddser.h (Stefan Ginsberg)
  • Add driverspecs.h to stub out Driver Verifier annotations (Stefan Ginsberg)

Kernel Mode Drivers

Audio Stack


  • Implement DllInitialize, BdaPropertyGetPinControl, BdaPropertyNodeTypes, BdaPropertyPinTypes, BdaInitFilter, BdaCreateTopology, BdaCheckChanges, BdaCommitChanges, BdaCreateFilterFactory, BdaCreateFilterFactoryEx, BdaCreatePin, BdaMethodCreatePin, BdaFilterFactoryUpdateCacheData, BdaGetChangeState, BdaMethodCreateTopology, BdaMethodDeletePin, BdaPropertyTemplateConnections, BdaStartChanges, BdaUninitFilter, BdaValidateNodeProperty (Johannes Anderwald)
  • Define automation tables for Filter & Pin (Johannes Anderwald)
  • Plug in automation tables when creating a new filter factory / pin (Johannes Anderwald)
  • Add BDA filter context to object bag, so that it gets freed automatically later (Johannes Anderwald)






  • Fix a bug in KsCancelIo which accessed already freed memory (Johannes Anderwald)
  • Activate handling of requests of type KSPROPERTY_TYPE_BASICSUPPORT (Johannes Anderwald)
  • Return correct status code in the GUID_NULL handler (Johannes Anderwald)
  • Store KSPROPERTY_SET in Irp when using KsPropertyHandler (Johannes Anderwald)
  • Fix a bug in KsPinDataIntersection (Johannes Anderwald)
  • Fix a bug when canceling irps (Johannes Anderwald)
  • Fix a critical bug in the counted worker implementation (Johannes Anderwald)
  • Check if NodeId is out of bounds (Johannes Anderwald)
  • Return correct status code (Johannes Anderwald)
  • Retrieve the correct pin name (Johannes Anderwald)
  • Implement KSPROPERTY_PIN_NAME properly (Johannes Anderwald)
  • KsPinPropertyHandler does *NOT* set Status in the IRP (Johannes Anderwald)
  • The Category member is LPGUID not GUID (Johannes Anderwald)
  • Check if there is a category member (Johannes Anderwald)
  • Fix 'Assertion 'WorkItem->List.Flink == NULL' failed at ntoskrnl\ex\work.c' (Johannes Anderwald)
  • Fix a bug spotted by Timo (Johannes Anderwald)
  • Store Object Header in FsContext2 (Johannes Anderwald)
  • Fix allocation of create item entry in KsAllocateObjectCreateItem (Johannes Anderwald)
  • Fix de-referencing in Ks[De]ReferenceSoftwareBusObject & Ks[De]ReferenceBusObject (Johannes Anderwald)
  • Fake success in KsEnableEvent (Johannes Anderwald)
  • Check if the list empty in KspFreeEventList (Johannes Anderwald)
  • Handle GUID_NULL in KspPropertyHandler (Johannes Anderwald)
  • Return STATUS_MORE_ENTRIES if outputbuffer is too small (Johannes Anderwald)
  • Zero struct in KsRegisterWorker (Johannes Anderwald)
  • Fix calling property handler in IKsFilter_DispatchDeviceIoControl Found by (Amine Khaldi)
  • Implement handling of KSPROPERTY_TYPE_BASICSUPPORT (Johannes Anderwald)
  • Fix a few bugs in KsPinPropertyHandler & KsTopologyPropertyHandler (Johannes Anderwald)
  • Implement CBaseUnknown class functions in C! (KJK::Hyperion)
  • Store input buffer in Irp->AssociatedIrp.SystemBuffer (Johannes Anderwald)
  • Implement KsCopyObjectBagItems, KsCreateBusEnumObject, KsProbeStreamIrp, KsGetFirstChild, KsGetNextSibling, IKsFilter_fnAddProcessPin, IKsFilter_fnRemoveProcessPin, KsDispatchSpecificProperty, KsPropertyHandler, KsMergeAutomationTables, KsStreamPointerDelete, KsStreamPointerScheduleTimeout, KsStreamPointerCancelTimeout, KsPinGetFirstCloneStreamPointer, KsStreamPointerGetNextCloneKsPropertyHandlerWithAllocator, KsFastPropertyHandler, KsValidateConnectRequest, IKsPin_DispatchDeviceIoControl, IKsPin_Close, KsQueryInformationFile, KsStreamIo, KsMoveIrpsOnCancelableQueue, KsRegisterFilterWithNoKSPins, _KsEdit, KsCacheMedium, KsHandleSizedListQuery, KsAcquireResetValue, KsCompletePendingRequest, KsAllocateExtraData, KsFreeEventList, KsDisableEvent, KsAddEvent, KsDefaultAddEventHandler, KsPinAttachAndGate, KsPinAttachOrGate, KsPinGetAndGate, KsDeviceSetBusData, KsDeviceGetBusData, KsGetPinFromIrp, KsPinAcquireProcessingMutex, KsPinGetConnectedPinDeviceObject, KsPinGetConnectedFileObject, KsPinGetConnectedPinInterface, KsPinGetNextSiblingPin, KsPinGetParentFilter, KsPinRegisterFrameReturnCallback, KsPinRegisterHandshakeCallback, KsPinRegisterIrpCompletionCallback, KsPinRegisterPowerCallbacks, KsPinReleaseProcessingMutex, KsAcquireControl, KsReleaseControl, KsFilterAddTopologyConnections, KsFilterCreatePinFactory, KsFilterAcquireProcessingMutex, KsFilterReleaseProcessingMutex, KsFilterGetChildPinCount, KsFilterRegisterPowerCallbacks, KsGetFilterFromIrp, KsGetObjectFromFileObject, KsGetObjectFromFileObject, KsGetObjectTypeFromIrp, KsGetParent, KsGetObjectFromFileObject, KsGetObjectFromFileObject, KsGetObjectTypeFromIrp, KsGetParent, KoDriverInitialize, KoDeviceInitialize, KsReferenceBusObject, KsReferenceSoftwareBusObject, KsDereferenceSoftwareBusObject, KsDereferenceBusObject, KsGetFirstChild, KsGetImageNameAndResourceId, KsMapModuleName, KsAcquireDevice, KsReleaseDevice, KsTerminateDevice, KsQueryObjectAccessMask, KsQueryObjectCreateItem, KsQueueWorkItem, KsIncrementCountedWorker, KsDecrementCountedWorker, KsRegisterCountedWorker, KsUnregisterWorker, KsRegisterWorker, KsCancelIo, KsReleaseIrpOnCancelableQueue, KsRemoveIrpFromCancelableQueue, KsRemoveSpecificIrpFromCancelableQueue, KsAddIrpToCancelableQueue, KsCancelRoutine, KsValidateAllocatorCreateRequest, KsValidateClockCreateRequest, KsValidateTopologyNodeCreateRequest, KsAddObjectCreateItemToObjectHeader, KsGetDevice, KsDefaultDispatchPnp, KsDefaultDispatchPower, KsDefaultForwardIrp, KsReadFile, KsSetInformationFile, KsQueryInformationFile, KsCreateAllocator, KsCreateDefaultAllocatorEx, KsValidateAllocatorFramingEx, KsSetDevicePnpAndBaseObject, KsQueryDevicePnpObject, KsSetTargetState, KsSetTargetDeviceObject, KsSetPowerDispatch, KsFreeDeviceHeader, KsFreeObjectHeader, KsAllocateObjectCreateItem, KsFreeObjectCreateItem, KsFreeObjectCreateItemsByContext, KsCreateDefaultSecurity, KsCreateClock, KsCreateDefaultClock, partly implement KsAllocateDefaultClockEx, KsFreeDefaultClock, KsGetDefaultClockState, KsSetDefaultClockState, KsGetDefaultClockTime, KsSetDefaultClockTime, KsInitializeDevice, KsGetDeviceForDeviceObject, KsCreateFilterFactory, KsFilterFactorySetDeviceClassesState, KsFilterFactoryGetSymbolicLink, KsFilterFactoryAddCreateItem, KsLoadResource, KsDispatchQuerySecurity, KsDispatchSetSecurity, KsWriteFile, KsDefaultIoCompletion, KsEnableEvent, KsEnableEventWithAllocator, KsDiscardEvent (Johannes Anderwald)
  • Implement attach of filter factories to the device header (Johannes Anderwald)
  • Filter dispatch is optional, handle it when creating new filters (Johannes Anderwald)
  • Fix allocation check by (Amine Khaldi)
  • Fix uninitialized return value when the list is empty (Johannes Anderwald)
  • Fix a horrible bug where the end of the list wasnt checked by the source list but the destination list by (Amine Khaldi)
  • Acquire Spinlock at dpc level (Johannes Anderwald)
  • Release cancel spinlock at correct level (Johannes Anderwald)
  • Fix a desastreous bug in KsRemoveIrpFromCancelableQueue (Johannes Anderwald)
  • Remove KsGetChildCreateParameter, it is not exported in NT 5.1 KS (Johannes Anderwald)
  • Start Implementing IKsPin interface (Johannes Anderwald)
  • Increment PinInstanceCount when a pin has succcessfully been created (Johannes Anderwald)
  • Initialize pin dispatch table (Johannes Anderwald)
  • Add create items for allocator, clock, node create requests (Johannes Anderwald)
  • Add create item for creation of pins and topology nodes (Johannes Anderwald)
  • Implement pin creation handler (Johannes Anderwald)
  • Copy Filter descriptor for each instantiated filter (Johannes Anderwald)
  • Create object bag for IKsFilter, IKsFilterFactory and IKsDevice (Johannes Anderwald)
  • Fix storing of device descriptor in KsInitializeDriver, KsAddDevice (Johannes Anderwald)
  • Remove DriverEntry as ks is kernel mode dll (Johannes Anderwald)
  • Fix unimplemented tags (Johannes Anderwald)
  • Use double in spec for functions taking longlong arguments (Colin Finck)
  • Use KSQUEUE_SPINLOCK_IRP_STORAGE macro for access the stored spin lock (Johannes Anderwald)
  • Remove old irp queue implementation (Johannes Anderwald)
  • Use KSSTRING instead of hardcoding object class (Johannes Anderwald)
  • Rewrite KSCREATE_ITEM handling to support clocks, nodes, allocators. (Johannes Anderwald)
  • Store create items in list instead of an array. Consequently, the code can be re-used for KSDEVICE_HEADER / KSOBJECT_HEADER functions. (Johannes Anderwald)
  • Implement by using KSBASIC_HEADER struct which must be positioned before its object specific (PKSFILTER, PKSFILTERFACTOR, PKSPIN) (Johannes Anderwald)
  • Remove a hack from KspCreateObjectType (Johannes Anderwald)
  • Return the correct device object in KsQueryDevicePnpObject (Johannes Anderwald)
  • Remove KspClose, KspRead, KspWrite, KspFlushBuffers, KspQuerySecurity, KspSetSecurity and all these IOCTL in KspDispatchIrp (Johannes Anderwald)
  • Rewrite KsDispatchIrp to handle IRP_MJ_CREATE & IRP_MJ_POWER, IRP_MJ_PNP for AV Stream minidrivers and forward IRP_MJ_SYSTEM_CONTROL requests to the registered pnp base object (Johannes Anderwald)
  • Unsupported IOCTLs are now completed with KsDispatchInvalidDeviceRequest (previously leaked) (Johannes Anderwald)
  • Implement registering of device interface for AVStream drivers (Johannes Anderwald)
  • Add KsFilterFactoryUpdateCacheData (Johannes Anderwald)
  • Fix a bug which was responsible for most audio-related crashes (Gregor Schneider)






  • Add stubs for unimplmented cases in ScsiPortNotification. (Olaf Siejka)




  • Synched the UniATA Inf to the internal support list. Now ROS can detect all supported SATA Controllers even after 1st stage and properly shows them in the HW Wizard. (Daniel Reimer)
  • Fix a couple of bugs in the uniata ATA code spotted by bearwindows. ICH8/ICH9/ICH10 should be supported now. (Aleksey Bragin)
  • Revert most of the 41684: "-fix support for ICH7,ICH7M,ICH8,ICH8M,ICH9,ICH9R,ICH9M and ICH10 in compat mode". Those controllers should be supported now, and when set to compat mode the driver falls back to UDMA automatically. (Aleksey Bragin)
  • Don't wait so long for drive reset. Reapplying r26470 by Dmitriy Gorbachev. (Aleksey Bragin)


  • Initialize DPC before connecting interrupt with IoConnectInterrupt in ehci_alloc, ohci_alloc and uhci_alloc. Probably fixes crashes on real hardware. (Michael Martin)


  • Add missing exports (Timo Kreuzer)
  • Rewrite VideoPort and Win32k (Eng) event functions to: Use a documented ENG_EVENT structure (thus be compatible with Windows videoprt/win32k) instead of a stupid (PKEVENT) casting everywhere through EngEvent or VideoPort event functions. (Aleksey Bragin)
  • Rewrite VideoPort and Win32k (Eng) event functions to: Implement additional checks for user mapped events in EngDeleteEvent and EngWaitForSingleObject. (Aleksey Bragin)
  • Rewrite VideoPort and Win32k (Eng) event functions to: Implement EngReadStateEvent and EngClearEvent. (Aleksey Bragin)
  • Rewrite VideoPort and Win32k (Eng) event functions to: Provide a better, readable code which matches kernelstyle coding guidelines. (Aleksey Bragin)
  • Rewrite VideoPort and Win32k (Eng) event functions to: Remove (stub out) totally incorrect and buggy map user events support. (Aleksey Bragin)


Static Libraries


  • Initial submit with enough code to compile new browseui classes (Andrew Hill)
  • Added Init and Term to CComModule (Andrew Hill)


  • CmpPrepareKey: Call CmpPrepareKey vice CmpPrepareIndexOfKeys for cell signature of CM_KEY_NODE_SIGNATURE. Fixes ASSERT in cminit.c that occurs on reboot after installing some applications. (Michael Martin)


  • Rewrite time implementation, implement 64bit time support. (Timo Kreuzer)



  • Properly handle multiple monitors by expanding the screensaver window to all monitors (Michael Bruestle)


  • Don't check boot partition during unattended setup if MBR installation is skipped anyway. (Maciej Bialas)
  • Change "MBR" to "bootsector", changed languages are English and Russian. (Aleksey Bragin, #4356)

Win32™ Personality

User mode subsystem server (CSRSS)

  • Create a solid black brush for background color of a ConsoleWindowClass (Aleksey Bragin)
  • Paint the desktop only when getting WM_ERASEBKGND message, and do nothing in WM_PAINT. This is the behavior Windows and Wine implement. (Aleksey Bragin)
  • Add WM_CLOSE stub-handler to desktop background window proc. (Aleksey Bragin)
  • Route unhandled messages to DefWndProc, as it's usually done for every window proc. (Aleksey Bragin)

Kernel-mode subsystem server (Win32K)

  • experimental message handling implementation for ClickLock feature (Matthias Kupfer)
  • KeyboardThreadMain: Set RepeatRate to 1 vice 0. Fixes text input in OpenOffice Writer. (Michael Martin)
  • Various AlphaBlend fixes (Gregor Schneider)
  • Don't try to delete non existing XLateObjects (Gregor Schneider)
  • Implement and optimize FloodFill (Gregor Schneider)
  • Use system wide caret width and height if input parameters are zero (Gregor Schneider, #1559)
  • Fix a typo in EngMovePointer (Gregor Schneider)
  • ChangeDisplaySettings improvements (Gregor Schneider)
  • StretchBlt: Don't access the pattern GetPixel function pointer if it hasn't been set (Gregor Schneider)
  • BitBlt: Only set the pattern function pointer if the pattern surface is valid (Gregor Schneider)
  • Allocate span memory for every clipping type, not only for one (Gregor Schneider)
  • StretchBlt: Copy the source rectangle after checking it, create input rectangle from destination size if source is not used (Gregor Schneider)
  • Various resource and failure fixes (Amine Khaldi, Gregor Schneider)
  • Sync and adapt Wine font metric code for setting first, last, default and break characters (Gregor Schneider)
  • co_IntLoadSysMenuTemplate: only copy buffer if prior operation succeeded (Gregor Schneider, #4803)
  • GetTransform: Add support for more transforms, stub out missing functionality, fix return values (Gregor Schneider)
  • NtGdiGetRasterizerCaps: fix return value on success (Kamil Hornicek)
  • Implement brush realization. (Timo Kreuzer)
  • Rewrite XLATEOBJ implementation. (Timo Kreuzer)
  • Implement EngFileIoControl and EngFileWrite. (Timo Kreuzer)
  • Remove XlatePatternToDest from BLTINFO and DIB code. (Amine Khaldi)
  • Don't cleanup the XLATEOBJ in GreSetPointerShape when it wasn't initialized. (Amine Khaldi)
  • Rewrite (NtUser)SystemParametersInfo implementation. (Timo Kreuzer)
  • Remove syscolor pen support. (Timo Kreuzer)
  • Implement PALETTE_ulGetNearestPaletteIndex, PALETTE_ulGetRGBColorFromIndex, PALETTE_vGetBitMasks. (Timo Kreuzer)
  • Implement GreMovePointer and GreSetPointerShape. (Timo Kreuzer)
  • Fix LIST_FOR_EACH and LIST_FOR_EACH_SAFE. (Timo Kreuzer)
  • UserPostMessage: allow broadcasting of WM_QUIT and post it to the window's message queue instead of the current thread's message queue. (Giannis Adamopoulos, bug #4058)
  • Don't do callbacks to usermode when holding the lock. Fixes the famous "VMWare video driver installer 2nd stage hang" bug. (Giannis Adamopoulos, #2666)



RPC Server



Control panel applets









Win32™ Applications



  • Rename a few interfaces in explorer_new to the correct name (Andrew Hill)








Win32™ Libraries


  • Check Input Parameter (fixes a skype crash) (Johannes Anderwald)
  • Fix broken check (Johannes Anderwald)
  • Return proper lengths of required buffer sizes in characters (including the termination NULL character) in LookupAccountSid. Fixes 4 "advapi32_winetest security" failures. (Alexander Yastrebov, #4904)


  • Convert existing classes to C++/ATL (Andrew Hill)
  • Add AddressBand, AddressEditBox, BandProxy, BaseBar, BaseBarSite, BrandBand, InternetToolbar, ShellBrowser, ToolsBand, and TravelLog (Andrew Hill)
  • Add stub implementations of commonbrowser, globalfoldersettings, and regtreeoptions (Andrew Hill)


  • Added 11 new Backs for my bavarian cards dll. Way better than using 12 times the same (Daniel Reimer)


  • Fix a critical bug in TOOLTIPS_NotifyFormat. Its first parameter changed from HWND to infoPtr pointer, however the function was not updated accordingly. (Aleksey Bragin)



  • Implement IDirectSoundCaptureBuffer8::Stop, IDirectSoundCaptureBuffer8::Lock, IDirectSoundCaptureBuffer8::Unlock, IDirectSound8::GetCaps, IDirectSound8::Compact, IDirectSoundCaptureBuffer::GetCaps, IDirectSoundCaptureBuffer::GetCurrentPosition, IDirectSoundCaptureBuffer::GetFormat, IDirectSoundCaptureBuffer::GetStatus, IDirectSoundCaptureBuffer::Start, DirectSoundEnumerateA, DirectSoundEnumerateW, DirectSoundCaptureEnumerateA, DirectSoundCaptureEnumerateW, GetDeviceID
  • Implement changing the stream format for secondary buffers
  • Fix checking of flags found by Ged Murphy
  • Register IDirectSound8, IDirectSoundCapture8 with COM
  • Verify if wrong guid is passed in IDirectSound8::Initialize
  • Check for invalid guids passed to IDirectSoundCapture::Initialize
  • Close pin handle when the capture buffer is released
  • Compute a compatible pin format when the format is not supported natively by the driver
  • Fix shadowing of global variable (Usurp)
  • Verify that directsound global info has already initialized in IDirectSound8::Initialize
  • DllRegisterServer / DllUnregisterServer are taken from Wine DSound implementation (John K. Hohm)
  • Implement stereo to mono channel conversion (Johannes Anderwald)
  • Create a thread which performs the mixing (Johannes Anderwald)
  • Add more checks IDirectSoundCapture::CreateCaptureBuffer (Johannes Anderwald)
  • Implement IDirectSoundNotify interface (Johannes Anderwald)





  • Update German NLS Files in Kernel32 (Daniel Reimer)
  • Comm: Supply default ansi codepage when converting from unicode (Gregor Schneider)
  • GetFileAttributes: Return INVALID_FILE_ATTRIBUTES when no filename is passed (Gregor Schneider)
  • Various resource and failure fixes (Amine Khaldi, Gregor Schneider)
  • Extend checks for ATOM handling (Gregor Schneider)
  • SetDllDirectory should add a directory to the search path used to locate DLLs for the application. (Alexander Yastrebov, #4820)
  • Remove incorrect null-termination of a string. Thanks to Russel for spotting. (Aleksey Bragin, #4820)
  • Initialize PreviousStackBase/Limit to NULL in BasepCreateStack. Previously this bug was hidden because those values were ignored by the kernel. (Aleksey Bragin)
  • Print module and function name when a Wine unimplemented function exception is raised. (Daniel Zimmerman, #4546)
  • Don't export unnecessary stub. Fixes Firefox 3.5.5 startup. (Aleksey Bragin)




  • Schedule a rename operation also for ERROR_USER_MAPPED_FILE. Prevents msi from aborting an install when attempting to overwrite font files. Open Office should now install successfully. (Michael Martin)




  • Handle WGL_SWAP_MAIN_PLANE case in SwapLayerBuffers stub (Kamil Hornicek)
  • Ported wglUseFontOutlines, wglUseFontBitmaps from the glDirect driver (Kamil Hornicek)









  • DIALOG_CreateIndirect: Save the current focused window after sending WM_INITDIALOG as the current window with focus could have been set in the dialog's procedure. Fixes setting focus on Open and Close dialogs to the FileName edit control in OpenOffice. (Michael Martin)
  • GetDlgItem: Change to WINE's implementation as ours was incorrect. Remove function GetDlgItemEnumProc and struct GETDLGITEMINFO as they are no longer needed. Fixes drawing issues in Open and Save dialogs for OpenOffice. (Michael Martin)
  • Fix 2 user32 winstation test failures (Giannis Adamopoulos)
  • Restructure and simplify CreateCursorFromData, allow to create colored icons (Gregor Schneider)
  • Handle WM_SETREDRAW messages differently in the DefWndProc, riched20 regression (Gregor Schneider, #4098)
  • Only set text resource in DefWndProcA on WM_NCCREATE if passed and exists (Gregor Schneider, #4766)


- Set ProgramFiles, CommonProgramFiles environment variable (Johannes Anderwald)






Regression tests

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