From ReactOS Wiki
Jump to: navigation, search

This is the changelog for ReactOS™ version 0.3.7 (released 4 November, 2008), 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.6 (released 6 August, 2008).



Generic 0.3.7 Changes

  • Fix _InterlockedCompareExchange64 intrinsic for x86 (patch from hackbunny) (Stefan Ginsberg)
  • Update 3rd Party lib Document. (Daniel Reimer)
  • Update DejaVu Fonts from 2.24 to 2.26 (Daniel Reimer)
  • Update ReactOS Calc to Version 1.10. (Carlo Bramini)
  • Sync winhlp32, wordpad and xcopy with wine. (Daniel Reimer)
  • Sync WineD3D with Wine 1.1.5 (Kamil Hornicek)
  • Fix inline versions of integer <-> pointer conversion functions (Timo Kreuzer)
  • Implement 64 bit Interlocked intrinsics and gs-segment-adressing functions (Timo Kreuzer)
  • Fix some loader structs ULONG -> ULONG_PTR / SIZE_T (Timo Kreuzer)
  • Convert LDR_RESOURCE_INFO members from ULONG to ULONG_PTR (Timo Kreuzer)
  • Fix IMAGE_FIRST_SECTION macro (Timo Kreuzer)
  • Implement GetCurrentFiber(), NtCurrentTeb() and YieldProcessor() for amd64 (Timo Kreuzer)
  • Add interlocked functions for pointers for amd64 (Timo Kreuzer)
  • Add intrinsic port and register access functions fix LIST_ENTRY() macro for amd64 (Timo Kreuzer)
  • Fix parameter types of NtAllocateVirtualMemory and NtFreeVirtualMemory (Timo Kreuzer)
  • Implement AMD64 intrinsic functions (Timo Kreuzer)
  • Implement byteswap intrinsics (Timo Kreuzer)
  • Fix segment addressing intrinsics (Timo Kreuzer)
  • Fix definitions of IsBadHugeReadPtr, IsBadHugeWritePtr, IsBadReadPtr, IsBadStringPtrA, IsBadStringPtrW, IsBadWritePtr and SetProcessWorkingSetSize (Samuel Serapión)
  • Define CONTEXT and XMM_SAVE_AREA32, taken from WINE (Samuel Serapión)
  • Fix rotl declaration, add mysteriously missing rotr (Samuel Serapión)
  • Fix CONTEXT_AMD64 and friends, add various constants (Samuel Serapión)
  • Define RUNTIME_FUNCTION, RtlCaptureContext, RtlRestoreContext, RtlAddFunctionTable, RtlInstallFunctionTableCallback, RtlDeleteFunctionTable (Samuel Serapión)
  • Fix definitions for EXCEPTION_RECORD and friends to support amd64 (Samuel Serapión)
  • Define IMAGE_THUNK_DATA64 and related constants (Samuel Serapión)
  • Define IMAGE_TLS_DIRECTORY64 and related constants (Samuel Serapión)
  • Remove multiple declarations and minor fixes in winddk.h (Samuel Serapión)
  • Fix TreeView_EnsureVisible macro (Samuel Serapión)
  • Implemented a working FAT filesystem checker (Aleksey Bragin)
  • Fix passing of an unitialized variable as buffer size to RegQueryValueEx in VMWare(R) video driver installation tool (Aleksey Bragin)
  • Fix existing font substitutions; Add FreeMono as substitution for Courier and Courier New; Optimize font substitution tables and make them easy to maintain (Juriy Sidorov, bug #3483)
  • Fix NtQueryOpenSubKeys prototype (Eric Kohl)
  • Change vDbgPrintEx and vDbgPrintExWithPrefix to stdcall from cdecl (Hervé Poussineau)
  • Limit use of -enable-stdcall-fixup to mesa32, msvcrt and riched20 modules (Hervé Poussineau)
  • Add a timer handle type (James Tabor)
  • Add NULL checks to _atoi64, _wtol, and _wtoi64 and make them call _tcstol instead of ttoi64 (Jeffrey Morlan)
  • Do not build with -s, use --strip-debug instead (ReactOS Portable Systems Group)
  • Add ramdisk support to various components of ROS for the x86 platform (ReactOS Portable Systems Group)
  • Fix various buffer leaks reported by Coverity (Art Yerkes)
  • Sync various components to more up to date Wine code (Christoph von Wittich)
  • Fix various heap corruptions (Christoph von Wittich)
  • Add MemoryBarrier for MSVC (Christoph von Wittich)
  • Add CLSIDWaveParser (Christoph von Wittich)
  • Allocate without a tag if buffer won't be freed by the driver allocating it (Hervé Poussineau)
  • Move kdcom to system32 directory (Hervé Poussineau)
  • Only apply C++ flags when compiling using the C++ compiler (KJK::Hyperion)


Host Tools


  • Remove the WriteConfigurationFile function creating the roscfg.h file, it never worked properly (Colin Finck)
  • Add a host attribute to the project's <include> and <define> tags to make it possible to define global includes/defines for host components (Colin Finck)
  • Add a new file extension .pspec for preprocessing .spec files (Colin Finck, Timo Kreuzer)



Bootloader (FreeLoader)

Kernel and Executive (NTOSKRNL)


  • Fix SHARED_CACHE_MAP structure: it should contain a PRIVATE_CACHE_MAP, not a pointer to it! (confirmed by OSR). The same error in VacbPushLock field (also confirmed by OSR) (Aleksey Bragin)


  • Implement CmpQueryKeyName as a wrapper around CmpConstructName helper function (Aleksey Bragin)
  • Implement CmpConstructName (builds a full name of the given key) (Aleksey Bragin)
  • Fix freeing of the buffer returned by CmpConstructName in CmpQueryKeyName routine and related query-routines (Aleksey Bragin, bug #3616)
  • Fix incorrect freeing of a buffer returned by a call to CmpConstructName (Stefan Ginsberg, Aleksey Bragin)
  • Fix a major problems in CmpCleanUpKcbCacheWithLock: Accessing (reading and writing – corruption!) freed paged pool memory (Aleksey Bragin)
  • Fix a major problems in CmpCleanUpKcbCacheWithLock: Lacking a dereference of a parent key (Aleksey Bragin)
  • Comment out asserts which are hit in some cases ("advapi32_winetest.exe registry" being one of them), because there is no locking operation performed in CmpBuildHashStackAndLookupCache yet (Aleksey Bragin)
  • Implement a delay-close worker function (Aleksey Bragin, bug #3418)
  • Implement a linear search in CmpFindSubKeyInRoot (until cells are stored in a lexically sorted way) (Aleksey Bragin)
  • Implement Leaf->Root index conversion (leaf selecting algorithm, splitting the leaf if necessary) (Aleksey Bragin, bug #3418)
  • Fix an unitialized variable usage in CmEnumerateValueKey (Aleksey Bragin, CID #772)
  • Remove redundant check for SystemHive being non-NULL (because CmpInitializeHive is already checked for failure earlier, and in success case it returns a valid Hive) (Aleksey Bragin, CID #280)


  • NtDebugActiveProcess: Don't leak a handle if user mode tries to debug the system process (Stefan Ginsberg)
  • DbgkpPostFakeThreadMessages and DbgkpSetProcessDebugObject: Don't dereference a thread/debug object when we are supposed to reference them. Now WinDBG can attach to a process without bringing down the system. (Stefan Ginsberg)




  • Add IoEnumerateRegisteredFiltersList stub and export, implement IoGetPagingIoPriority and export it (Stefan Ginsberg)
  • Use the queued spinlock in IoAcquireCancelSpinLock/IoReleaseCancelSpinLock and IoAcquire/ReleaseVpbSpinLock instead of a regular, ReactOS specific spinlock (Stefan Ginsberg)
  • NtQueryInformationFile and NtSetInformationFile: Don't clear the IRP_SYNCHRONOUS_API flag if it has been previously set, and remove the hack in IopCompleteRequest which worked around this. (Stefan Ginsberg)
  • Implement IoSetFileOrigin (Stefan Ginsberg)
  • Implement IopGetRegistryValue (complementary function to IopOpenRegistryKeyEx) (Aleksey Bragin)
  • ObQueryNameString can return STATUS_INFO_LENGTH_MISMATCH, take this into account and report a proper buffer length to the caller in IopQueryNameFile (Aleksey Bragin)
  • Detect failure to release cancel spinlock (Art Yerkes)
  • Replace third argument of IopActionInitChildServices with a global variable (Hervé Poussineau)
  • No need to get top of the stack in IopStartDevice (Hervé Poussineau)
  • Move most of IoSynchronousInvalidateDeviceRelations' code to IopEnumerateDevice and use it when possible (Hervé Poussineau)
  • Fix prototype for IoSynchronousInvalidateDeviceRelations (Hervé Poussineau)
  • Calling IoSynchronousInvalidateDeviceRelations with type TargetDeviceRelation returns success (Hervé Poussineau)
  • Remove a negativity check for DEVICE_RELATIONS->Count, since it is unsigned (Hervé Poussineau)
  • Fix device node structure to be compatible with Vista (Hervé Poussineau)
  • IopEnumerateDevice: Set DNF_ENUMERATED and DO_BUS_ENUMERATED_DEVICE when required (Hervé Poussineau)
  • IopEnumerateDevice: Continue to process PDOs, even if one failed (Hervé Poussineau)
  • Add new devices at start of list, not end (Hervé Poussineau)



  • Use RtlCopyUnicodeString instead of RtlInitUnicodeString. Fixes a memory leak and bad (stack) pointers (Stefan Ginsberg)
  • Fix next and step commands (Art Yerkes)
  • Make all printing go through KdbpPrint (Art Yerkes)
  • Switch to KeStallExecutionProcessor for checking messages from the terminal (Art Yerkes)
  • Set time limit to 100ms for messages (Art Yerkes)


  • Add KeAcquireInStackQueuedSpinLockForDpc, KeReleaseInStackQueuedSpinLockForDpc, KeAcquireSpinLockForDpc, KeReleaseSpinLockForDpc, KeRegisterNmiCallback, KeDeregisterNmiCallback, KeInitializeCrashDumpHeader and KeTestSpinLock stubs and exports (Stefan Ginsberg)
  • Export KiBugCheckData, KeI386MachineType and KeInitializeThreadedDpc (Stefan Ginsberg)
  • Fix stack size calculations in KeInitThread , KeAttachProcess and KeStackAttachProcess (spotted by Alex) (Stefan Ginsberg)
  • In NtYieldExecution, KiSwapThread and KiIdleLoop, hack "sync" to the next thread's stack before switching to it. Otherwise, because of broken Mm behaviour, we may page fault while interrupts are disabled. A hack in the trap handler works around this, but the hack still stays because these changes appear to be insufficient. (thanks to Alex for his help with this issue) (Stefan Ginsberg)
  • Rework Mm hack-syncing to go through MiSyncForProcessAttach and MiSyncForContextSwitch (Stefan Ginsberg)
  • Fix a inverted check in KeStartProfile which either leaked memory or freed memory the caller expected to use (Stefan Ginsberg)
  • ASSERTify two assumptions in KeRemoveByKeyDeviceQueue and KeRemoveByKeyDeviceQueueIfBusy to catch infinite loops (Stefan Ginsberg)
  • Export KeSaveFloatingPointState/KeRestoreFloatingPointState for all architectures, and stub the API when it is not applicable. (Stefan Ginsberg)
  • Use THREAD_TERMINATE_HELD_MUTEX bugcode instead of "0", and add said bugcode. (Stefan Ginsberg)
  • Fix guarded mutex code: "When releasing the gmutex my awesome code was removing the woken flag" (Alex Ionescu)
  • Make KiSwitchKernelStack return the stack base instead of the stack limit (Aleksey Bragin)
  • Don't increment priority when waking the thread in KeThawAllThreads (Aleksey Bragin)
  • Fix new thread priority calculation in KiDeferredReadyThread (Aleksey Bragin)
  • Add experimental support for Centaur, Cyrix, Rise and Transmeta CPUs (Colin Finck, KJK::Hyperion)
  • Enable the 3DNow detection code through extended CPUID also for Centaur CPUs (Colin Finck)
  • Report the presence of AMD K6 MTRRs also for mobile AMD K6-2+/K6-III+ CPUs (Colin Finck)
  • Add CMPXCHG8B enabling/detection code for Transmeta, Centaur, and Rise, reference (KJK::Hyperion)


  • Add MmAllocatePagesForMdlEx stub and export (Stefan Ginsberg)
  • Fixed a few incorrect exported function prototypes (Aleksey Bragin)
  • Fixed incorrect MM section functions usage throughout the whole system (Aleksey Bragin)
  • Fixed broken MMPTE_LIST structure definition (Aleksey Bragin)
  • Fixed callers of MmLoadSystemImage, its last parameter (BaseAddress) is not marked as OPTIONAL so must always be provided (Aleksey Bragin)
  • Header fix: Balance of an Memory Manager's AVL tree node can be negative, so make it a signed variable (Aleksey Bragin)
  • MmDeleteKernelStack should take StackBase as the first parameter, not StackLimit (thus actually the need for the 2nd parameter – large stack size flag). Fix it, and fix callers (Aleksey Bragin)
  • Save SizeOfImage field from the image header during PE loading (Aleksey Bragin)
  • Implement MmCallDllInitialize (Aleksey Bragin, Cecill Etheredge, bug #3730)
  • Fix NtAllocateVirtualMemory: in success case return the real (page rounded!) base address and region size, not the possibly unaligned pointer and length which were passed to the function. These cases were hit when a region of memory was previously reserved, then a commit request came with unaligned base address and length, which match that previously reserved region after aligning (Aleksey Bragin)
  • Fix ReactOS's MmCreateDataFileSection to ignore 0 value in the MaximumSize (it has an additional check for MaximumSize being non-NULL, but this should be removed in future). MaximumSize is mandatory for file-backed sections (Aleksey Bragin)
  • MiQueryVirtualMemory should only query the user address space, so don't accept kernel addresses (Stefan Ginsberg)
  • Check if tags match in ExFreePoolWithTag (Hervé Poussineau)
  • Check if provided tag is valid in ExAllocatePoolWithTag (Hervé Poussineau)
  • Return STATUS_ACCESS_VIOLATION instead of STATUS_UNSUCCESSFUL when trying to write to a read-only section (Jeffrey Morlan)
  • Remove unneeded 0 check for NumberOfBytes (Andrew Munger, Bug #3715)


  • Use correct bug code (INVALID_KERNEL_HANDLE) when kernel tries to close a protected handle (Stefan Ginsberg)
  • Fix ~4.4 million handle limit bug due to memory corruption. ReactOS can now create 16 million handles as expected (thanks Alex) (Aleksey Bragin)
  • Correct the exported ObIsKernelHandle to perform a TRUE/FALSE test, instead of always returning false (silently missed by gcc) (Stefan Ginsberg)


  • Remove PoSetDeviceBusy export as it is a ddk header macro, and add said macro to our ddk (Stefan Ginsberg)


  • Fix a typo PsTerminateSystemThread which led to inverted behaviour and caused it to terminate user threads and return "invalid parameter" for system threads. (Stefan Ginsberg)
  • Fix a inverted check in PspExitThread which caused worker thread termination to bugcheck due to a flag being set (because worker threads modify this flag themselves). This only worked for other threads because KeInitThread set the flag incorrectly (fixed this too). (Stefan Ginsberg)
  • NtQueryInformationProcess with ProcessImageFileName query type: Free the buffer allocated by SeLocateProcessImageName, and set return status correctly if return buffer is too small (so caller will know to allocate more memory). (Stefan Ginsberg, spotted by bug 3714)
  • Implement and export PsIsSystemProcess (Stefan Ginsberg)
  • Add SYSTEM_THREAD_EXCEPTION_NOT_HANDLED bugcode and make use of it (Stefan Ginsberg)


  • ObQueryNameString can return STATUS_INFO_LENGTH_MISMATCH, so make sure SeInitializeProcessAuditName supports that along with BUFFER_OVERFLOW and BUFFER_TOO_SMALL, which an Ob query name procedure could return (Aleksey Bragin)


  • Make SmCreateUserProcess accept two flags: the old "wait for" one, and a new "reserve 1Mb" one. NT reserves lower 1 MB of address space when starting a subsystem process. ReactOS should too, however right now this change is disabled (leads to boot problems) (Aleksey Bragin)


  • Create a VdmpInitialize function for NtVdmControl's initialize command (Aleksey Bragin)
  • Remove NtEarlyVdmInitialize hack and csrss IVT/BDA copying hack, instead, copy the first page of physical memory to the beginning of process's virtual address space like NT does (Aleksey Bragin)


- Add WmiQueryTraceInformation, WmiTraceMessage and WmiTraceMessageVa stubs and exports (Stefan Ginsberg)

Kernel Mode Drivers


  • Remove a hack not needed now that we don't get bad IRPs (Cameron Gutman)
  • Always set Irp->IoStatus.Status in UnlockAndMaybeComplete (Cameron Gutman)
  • Make sure we don't fail without completing the IRP (Cameron Gutman)
  • Fix 12 memory leaks (Cameron Gutman)
  • Return STATUS_INVALID_PARAMETER if we get passed a NULL ConnectionObject (Cameron Gutman)
  • Check for a NULL FCB before accessing it (Cameron Gutman)
  • Set the MDL to NULL after we free it so it doesn't get freed again (Cameron Gutman)
  • Fail if LockBuffers() fails (Cameron Gutman)
  • FCB->Recv.Window and FCB->Send.Window must be allocated before returning STATUS_SUCCESS (Cameron Gutman)
  • Make sure MakeSocketIntoConnection() completed successfully (Cameron Gutman)
  • Make sure WarmSocketForConnection() completed successfully (Cameron Gutman)
  • Don't continue if TdiBuildNullConnectionInfoInPlace() fails (Cameron Gutman)
  • Make sure we have a non-NULL TargetAddress before calling TdiSendDatagram() (Cameron Gutman)
  • Free the MDL if we fail (Cameron Gutman)
  • Use _SEH_YIELD (Cameron Gutman)
  • Check for FCB->TdiDeviceName.Buffer before attempting to access it (Cameron Gutman)
  • Move memory freeing to ListenComplete (Cameron Gutman)
  • Don't crash if the buffers are already freed (Cameron Gutman)
  • Set Buf to NULL so we don't try to free it again later (Cameron Gutman)
  • Fix a typo resulting in any call to AfdGetSockOrPeerName with Local set to FALSE to return STATUS_NO_MEMORY (Cameron Gutman)
  • Move SocketAcquireStateLock out of SEH (Cameron Gutman)
  • Make sure we successfully allocated ConnectionReturnInfo and ConnectionCallInfo (Cameron Gutman)
  • Make sure ObReferenceObjectByHandle was successful (Cameron Gutman)
  • Call SocketStateUnlock before returning (Cameron Gutman)
  • Don't complete the IRP again in the completion routine (Cameron Gutman)
  • Move the Irp->Cancel check after SocketAcquireStateLock to fix a possible crash (Cameron Gutman)
  • Move SocketAcquireStateLock in front of the check for a NULL return from LockRequest to prevent another possible crash (Cameron Gutman)
  • Call MmProbeAndLockPages for SysMdl (Cameron Gutman)
  • Use the correct IOCTL (Cameron Gutman)
  • Make sure we don't complete with STATUS_SUCCESS if MmMapLockedPages fails (Cameron Gutman)
  • Use MmGetSystemAddressForMdlSafe instead of MmMapLockedPages (Cameron Gutman)
  • Fix a bug that resulted in the status getting changed if TdiQueryInformation failed (Cameron Gutman)
  • Use FCB->Connection.Object instead of FCB->AddressFile.Object (Cameron Gutman)
  • Enclose MmProbeAndLockPages in SEH (Cameron Gutman)
  • Return a more accurate status (STATUS_INVALID_PARAMETER) than STATUS_UNSUCCESSFUL when a parameter is NULL (Cameron Gutman)
  • Make sure FCB->AddressFrom is non-NULL (Cameron Gutman)
  • Make sure FCB->RemoteAddress is non-NULL (Cameron Gutman)
  • Make sure IPAddr is non-NULL (Cameron Gutman)
  • Fail if MmProbeAndLockPages doesn't succeed (Cameron Gutman)
  • Fail if IoAllocateMdl returns NULL (Cameron Gutman)
  • Skip ObReferenceObjectByHandle if HandleArray[i].Handle is NULL (Cameron Gutman)
  • Fail if ObReferenceObjectByHandle didn't succeed (Cameron Gutman)
  • Set *ConnectionInfo to NULL if we can't allocate memory for ConnInfo (Cameron Gutman)
  • Fail if DatagramRecv->Address is NULL (Cameron Gutman)
  • Add some missing calls to PollReeval (Cameron Gutman)
  • Move an existing PollReeval so it always gets called (Cameron Gutman)
  • Set Handle to NULL so we don't try to close it later (Cameron Gutman)
  • Free the address we've previously allocated if needed (Cameron Gutman)
  • Check if MakeSocketIntoConnection succeeded (Cameron Gutman)
  • Check if TaCopyTransportAddress succeeded (Cameron Gutman)
  • Check if TdiBuildNullConnectionInfo completed successfully (Cameron Gutman)
  • Fail if we can't allocate Qelt (Cameron Gutman)
  • Change the status to STATUS_SUCCESS if TdiReceive returns STATUS_PENDING (Cameron Gutman)
  • Make sure we successfully allocated memory (Cameron Gutman)
  • There are 4 in flight requests not 3 (Cameron Gutman)
  • Set the InFlightRequest to NULL when we complete (Cameron Gutman)
  • Fail if From is NULL (Cameron Gutman)
  • Restore cancellation for proper socket shutdown (Art Yerkes)


  • Use a correct device type when creating volume device objects (Aleksey Bragin)


  • Silence the raised IRQL level warning, use a better status code for invalid requests (Aleksey Bragin)
  • Remove an excessive ASSERT (there is a real one below in the function), which was hit when trying fastfat in Windows 2003 (Aleksey Bragin)


  • Truly separate i8042BasicDetect from i8042DetectKeyboard and i8042DetectMouse: It now only does the CTRL_SELF_TEST, any other specific detections are done in their respective functions (Colin Finck)
  • Only set KEYBOARD_PRESENT and MOUSE_PRESENT, when all respective detections completed successfully (Colin Finck, bug #3550)


  • Returning STATUS_BUFFER_OVERFLOW is ok also since we're only trying to get DriverKeyLength (Cameron Gutman)
  • Initially set PoolHandle, ConfigurationHandle, KeyHandle, and Filter to NULL (Cameron Gutman)
  • Initially set PortOffset to 0 (Cameron Gutman)
  • Fix 10 memory leaks (Cameron Gutman)
  • Don't return NDIS_STATUS_SUCCESS when we really failed (Cameron Gutman)
  • Initially set Packet to NULL (Cameron Gutman)
  • Initially set NdisProtocolHandle to NULL (Cameron Gutman)
  • Accept STATUS_SUCCESS also as done in config.c (Cameron Gutman)
  • Set ParameterValue to NULL on failure (Cameron Gutman)
  • Fix a possible crash in the cleanup code (Cameron Gutman)
  • Handle AllocatedResources and AllocatedResourcesTranslated separately (Cameron Gutman)
  • Fix 4 handle leaks (Cameron Gutman)
  • Remove the adapter from the global adapter list if we fail (Cameron Gutman)
  • We must call MiniQueueWorkItem while holding a spin lock (Cameron Gutman)
  • Call MiniportQueryInformation, ProtocolSendComplete, ProtocolRequestComplete, SetInformationComplete, SetInformationComplete, and MiniportSetInformation at the correct IRQL (Cameron Gutman)
  • We must call MiniDequeueWorkItem while holding a spin lock (Cameron Gutman)
  • Call MiniportTransferData at DISPATCH_LEVEL (Cameron Gutman)
  • Fix a possible crash if Buffer is NULL (Cameron Gutman)
  • Use MmGetSystemAddressForMdl instead of MmGetMdlVirtualAddress (Cameron Gutman)
  • Implement NdisDprAllocatePacket, NdisDprAllocatePacketNonInterlocked, NdisDprFreePacket, MiniCheckForHang, MiniReset, and NdisDprFreePacketNonInterlocked (Cameron Gutman)
  • Call KeAcquireSpinLockAtDpcLevel instead of KeAcquireSpinLock when possible (Cameron Gutman)
  • Don't hold the spin lock as long in MiniportDpc (Cameron Gutman)
  • Queue a work item to do our work that was previously done in MiniportDpc so Send/SendPackets gets called at the correct IRQL (Cameron Gutman)
  • Call a serialized miniport's Send/SendPackets handler at DISPATCH_LEVEL (Cameron Gutman)
  • Store the current thread (Cameron Gutman)
  • Set Status to NDIS_STATUS_NOT_SUPPORTED if we don't support the parameter type (Cameron Gutman)
  • Initialize the callback record before calling KeRegisterBugCheckCallback so NdisMRegisterAdapterShutdownHandler should work now (Cameron Gutman)
  • Queue the packet if we currently don't have enough resources to process it (Cameron Gutman)
  • The handle passed to MiniRequestComplete, NdisMQueryInformationComplete, and NdisMSetInformationComplete is the Adapter not the MiniportBlock (Cameron Gutman)
  • Set MiniportBusy to FALSE in all the completion routines (Cameron Gutman)
  • Hold the spin lock when requeuing the packet (Cameron Gutman)
  • Only call MiniSendComplete if ProIndicatePacket didn't return NDIS_STATUS_PENDING (Cameron Gutman)
  • Set MiniportBusy to TRUE if MiniDoRequest returns NDIS_STATUS_PENDING (Cameron Gutman)
  • Set MiniportBusy to TRUE in MiniDequeueWorkItem (Cameron Gutman)
  • Fail if another miniport request is still in progress (Cameron Gutman)
  • Set CheckForHangSeconds to a default value of 2 if it wasn't set in MiniportInitialize (Cameron Gutman)
  • Check for miniport hangs every two seconds (the default value which can be changed by the miniport driver) (Cameron Gutman)
  • Call the MiniReset if the miniport detected a hang (Cameron Gutman)
  • MiniportAdapterHandle is PLOGICAL_ADAPTER not PNDIS_MINIPORT_BLOCK (Cameron Gutman)
  • Queue a work item in MiniReset if the adapter is currently busy (Cameron Gutman)
  • Handle NdisWorkItemResetRequested in MiniportWorker (Cameron Gutman)
  • Don't add the protocol to the protocol list if binding failed (Cameron Gutman)
  • Call the ProtocolReceive handler at DISPATCH_LEVEL (Cameron Gutman)
  • Call MiniportDisableInterrupt handler at the proper time (Cameron Gutman)
  • Fix the calling the MiniportShutdown handler (Cameron Gutman)



  • Fix a leak when immediately replying to small packets (Art Yerkes)


  • "0xbaadfood" is not a valid tag pool allocation tag. Use "PcNt" instead. (Stefan Ginsberg)
  • Add some IRQL checks (Cameron Gutman)
  • Change NdisAcquireSpinLock/NdisReleaseSpinLock to NdisDprAcquireSpinLock/NdisDprReleaseSpinLock for code that always runs at DISPATCH_LEVEL (Cameron Gutman)
  • Use the correct flag to show that this adapter doesn't support hardware loopback. Fixes the loopback adapter. (Cameron Gutman)



NT System Library (NTDLL)

  • Add lots of exports, mostly stubbed, and make the export list compatible with Windows 2003 (albeit a lot of exports are commented out) (Stefan Ginsberg)
  • Implement RtlInterlockedCompareExchange64 and RtlGetCurrentProcessorNumber and use them from kernel32 (Stefan Ginsberg)
  • Allow non-DLL files to be loaded with LOAD_LIBRARY_AS_DATAFILE (Christoph von Wittich)

Run Time Library (RTL)

  • Clean up and add SEH to vDbgPrintExWithPrefixInternal (patch by Alex) (Stefan Ginsberg)
  • Fix saving/restoring of registers in DebugService (Timo Kreuzer)
  • Get rid of sprintf usage in default_dbg_vprintf. This makes tracing macro usage safe in crt sprintf implementation and simplify overall codepath (no need for intermediate buffer) (Aleksey Bragin, bug #3632)
  • Fix 3 bitmap functions RtlTest/Set/ClearBit (Art Yerkes, Aleksey Bragin)
  • Fix infinite loop during generic table lookups (Alex Ionescu)
  • Do not allow an empty name in RtlSetEnvironmentVariable (Jeffrey Morlan)
  • RtlSetEnvironmentVariable: To delete a variable, it was necessary to pass a NULL pointer as the value, but passing an empty string should create an empty variable. Remove Value->Length > 0 check (Jeffrey Morlan)
  • Import timer queues from Wine (Christoph von Wittich)

Static Libraries




Recycle Bin

  • Expand recyclebin API with DeleteFileHandleToRecycleBin and GetRecycleBinDetails (Hervé Poussineau)

Win32™ Personality

User mode subsystem server (CSRSS)

  • Commit the whole mapped BIOS/device registers block, not only the first 2 pages (Aleksey Bragin)
  • Use Zw instead of Nt (Aleksey Bragin)
  • Implement Alt-Tab Switching Dialog (Johannes Anderwald)
  • Implement CsrGenerateCtrlEvent (Jeffrey Morlan)
  • Remove redundant NULL checks (Jeffrey Morlan)
  • CsrApiCallHandler: Get rid of "Found" variable and just return when the right definition is found and use the return value to set Request->Status (Jeffrey Morlan)
  • Trim redundant Request->Status settings from a lot of CSR_API functions (Jeffrey Morlan)
  • CsrCreateProcess: Do not set shutdown parameters (Jeffrey Morlan)
  • Always set the console's event on any keypress (Jeffrey Morlan)

Kernel-mode subsystem server (Win32K)

  • Implement x86 FLOATOBJ fpu emulation api in assembly (Timo Kreuzer)
  • Implement XFORMOBJ api (Timo Kreuzer)
  • Initialize keyboard layout before startung the keyboard thread (Cristo Silva)
  • Don't use a NULL tag with EngAllocMem (Timo Kreuzer)
  • NtGdiExtCreateRegion: Add more parameter checks (Timo Kreuzer, bug #3724)
  • NtGdiExtCreateRegion: Do not copy more data than allocated for the region (Timo Kreuzer)
  • NtGdiExtCreateRegion: Add coordinate transformation (Timo Kreuzer)
  • Simplify and fix InitMetrics (Timo Kreuzer)
  • Create a stock font object ANSI_VAR_FONT, this fixes explorer's clock using the wrong font (and any other app using that stock font object) (Aleksey Bragin, bug #3484)
  • Fix an incorrect MmCreateSection usage case. Not only the MaximumSize is mandatory for file-backed sections, but an allocation type must be specified (SEC_COMMIT, and it's not the same as some humble "0" passed there as a value) (Aleksey Bragin)
  • Fix Alphablend for 24 Bit display mode (Gregor Schneider, bug #3708)
  • Fix GetDIBits implementation, allowing CopyImage to work properly (Gregor Schneider, bug #2225, bug #3708)
  • Improve parameter checks for GetCharSet and SetBrushOrg (Gregor Schneider, CIDs #660, #661)
  • Check for successful palette lock in GetDIBColorTable and SetDIBColorTable (Gregor Schneider, CIDs #486, #487)
  • Add missing EngMapFile, EngQueryFileTimeStamp and EngPlgBlt exports (Stefan Ginsberg)
  • For windows message WM_MOUSEACTIVATE, pass MsgWindow->hSelf as WPARAM for windows that have no parent. (Michael Martin, bug #3111)
  • Fix memory overwrites in several StretchBlt variants (Gregor Schneider, bug #821)
  • Add tags when allocating memory (Hervé Poussineau)
  • NtUserToUnicodeEx should return zero if key in lpKeyState array is not pressed (Yuriy Sidorov)
  • Move timers from the message queue to a linked list (James Tabor)
  • Add NULL check after allocating a new DCE (James Tabor, Bug #3638)
  • NtGdiGetRegionData: Use correct address of region header (&obj->rdh, not obj) and for the contents just use 'rgndata->Buffer' as the destination address instead of doing pointer arithmetic (Jeffrey Morlan)
  • When reverting a window's system menu, delete the old one recursively (Jeffrey Morlan)
  • Short version of average16 added (Matthias Kupfer)
  • Install fonts to SystemRoot/Fonts instead of SystemRoot/media/fonts (Matthias Kupfer)
  • Do not read and copy 32bit blocks, use 24bit blocks, to fix NtGdiAlphaBlend in 24bit mode (Gregor Schneider, bug #3708)
  • Handle PALETTE_LockPalette returning NULL, Coverity CID 486 and 487 (Gregor Schneider)
  • Check to make sure device context is not NULL before attempting to use it, Coverity CID 661, 680 (Gregor Schneider)
  • Pair ExAllocatePoolWithTag with ExFreePoolWithTag (Hervé Poussineau)
  • Fix a memory leak in W32kGetDefaultKeyLayout (Hervé Poussineau)
  • Fix a double free in IntFreeMenuItem (Hervé Poussineau)
  • Open Registry entry with only the required rights (Hervé Poussineau)
  • Free memory with the correct tag (Hervé Poussineau, bug #3713)
  • Add flag set and clears for SetMapMode and associate MapMode flags with Xform flags (James Tabor)
  • Add check for WH_KEYBOARD_LL and WH_MOUSE_LL in ntuser (James Tabor)
  • Add Defer Window Position Handle type for multiple window positions (James Tabor)
  • Remove hColor from IntSetCursor, fixes Coverity CID 40 (Gregor Schneider)
  • Destination height may be smaller than the source height, so calculate image size in GetDIBits, which fixes CopyImage and the icons for the virtual desktops on the taskbar (Gregor Schneider)



  • Fixed typo in FindAdapterKey that caused failure to find adapters registry key, resulting in static ip info not being assigned for TCPIP. (Michael Martin, bug #2392)
  • Write NameServer determined by dhcp to DHCPNameServer value in registry vice NameServer (Michael Martin, bug #2392)
  • Fix retrieval of automatic DNS settings by storing the settings under the correct registry key (Johannes Anderwald)
  • Delete old DhcpNameServer key when no nameservers could be obtained (Johannes Anderwald)
  • Store DHCP configuration parameters in the registry (Johannes Anderwald)
  • Close registry key when done (Johannes Anderwald)
  • Remove dead code (Art Yerkes)
  • Fix possible overrun of the last byte of dbuf (Art Yerkes)

Event Log

  • Cast returned handle values correctly (Eric Kohl)

RPC Server

  • Implement RGetServiceDisplayNameA and RGetServiceKeyNameA (Eric Kohl)
  • RGetServiceDisplayNameW: Return service name if display name is unavailable (Eric Kohl)
  • Add parameter checks to RCreateServiceW and set the service's "ObjectName" to "LocalSystem" if there is no name (Eric Kohl)
  • Fix incorrect buffer size passed to MultiByteToWideChar (Christoph von Wittich)
  • Fix 64bit portability issues (Eric Kohl)
  • RSetServiceStatus: Don't fail if the system is shutting down because services must report successful shutdown to the service manager while the system is shutting down and add some more parameter checks (Eric Kohl)
  • Fix lock handle typecasts (Eric Kohl)


  • Add a reference counter to the service record. (Michael Martin)
  • Implemented a common service record delete function. (Eric Kohl)
  • Implement REnumDependentServicesA/W. (Michael Martin)
  • Implement RChangeServiceConfigA, RQueryServiceConfigA, RQueryServiceConfig2A, RGetServiceDisplayNameA and RGetServiceKeyNameA. (Michael Martin, Eric Kohl)
  • RCloseServiceHandle: Remove a service if it has been marked for deletion and reference on service is 0. (Michael Martin, Eric Kohl)
  • RControlService: Stop a service only if there are no dependent services running. (Michael Martin, Eric Kohl)
  • RCreateService: Add more parameter checking. Set ObjectName to "LocalSysyem" if it doesn't have a name. (Michael Martin, Eric Kohl)
  • Change RQueryServiceConfigW to return empty strings vice NULL pointers if information not available. (Michael Martin, Eric Kohl)
  • RGetServiceDisplayNameW: Return the service name if display name is not set. (Michael Martin, Eric Kohl)
  • RQueryServiceConfigW: Update display name if is has been changed. (Eric Kohl)
  • ROpenServiceW: Fail if lpServiceName is NULL. (Michael Martin, Eric Kohl)
  • Pass ImagePath buffer as a command line (Andrew Munger)



  • Fix file logging to be asynchronous and convert to unicode (Ged Murphy)
  • Allow log to be opened while logging (Ged Murphy)
  • Fix return value so we exit ServerMain correctly (Ged Murphy)

User Mode PnP Manager


  • Count the end of szApplicationName in the right units (Art Yerkes)
  • Count in bytes in bufferSize and count in chars in the subscript in RegQueryValueEx

Control Panel Applets




  • Fall back on NameServer value in TCPIP\Parameters if interface for adapter does not exist in registry. (Michael Martin, bug #2392)
  • Convert ncpa to a simple wrapper which invokes netshell.dll IShellFolder (Johannes Anderwald)


  • Restart clock when it has been stopped to be altered (Ged Murphy)


Win32™ Applications

Boot Acceptance Application for Registry


  • Do not truncate labels to only 12 characters (Jeffrey Morlan)
  • Use _tcsncat instead of tcsncpy (Jeffrey Morlan)
  • Do not show old volume information if a label was given (Jeffrey Morlan, Bug #3621)
  • Give error message if setting the label was unsuccessful (Jeffrey Morlan)
  • Fix SearchForExecutable to give directory priority over extensions and remove code that tried to make sure it returned an absolute path (Jeffrey Morlan)
  • Remove code that checked if the file's extension was in PATHEXT, as Windows does not (Jeffrey Morlan)
  • Allow explicit paths with no backslashes (Jeffrey Morlan)
  • Use GetFullPathName to get the batch file's absolute path (Jeffrey Morlan)
  • Fix how the start command parses its arguments to preserve quotes and remove first argument, which was the start command itself (Jeffrey Morlan)
  • Implement "title", /Ddirectory, /MIN, /MAX, and /WAIT options (Jeffrey Morlan)
  • Fix crash when trying to start a file with no extension (Jeffrey Morlan)
  • Move ExpandAlias from ParseCommandLine to ReadCommand (Jeffrey Morlan)
  • Removed processing of %variable% in ExpandAlias and rewrote %variable% substitution code (Jeffrey Morlan)
  • cmd_start: - Allow space between /D and directory, allow /W as a synonym for /WAIT and give an error message on invalid switches (Jeffrey Morlan)
  • Implement X>&Y redirections and hold redirections in a linked list structure, because order matters (>x 2>&1 is not the same as 2>&1 >x) and allow redirection of any handle number from 0 to 9 as well as allow quotes around the redirection file name (Jeffrey Morlan)
  • Batch: Fix buffer overflow bug (incorrect size for bc->BatchFilePath) (Jeffrey Morlan)
  • Begin writing a real parser for Cmd, with &, &&, ||, and ()implemented (Jeffrey Morlan)
  • Separate line reading code from ProcessInput to a separate function, ReadLine (Jeffrey Morlan)
  • ReadBatchLine: Don't strip the trailing \n, the parser needs it and remove handling of :labels and @quiet commands, now done by the parser (Jeffrey Morlan)
  • ReadCommand: Add a \n to the line and Move PrintPrompt call out, since the prompt shouldn't be printed for additional lines read in a command beyond the first (Jeffrey Morlan)
  • Remove the LPTSTR cmd argument in internal commands as it is obsolete (Jeffrey Morlan)
  • When given a name with no value, show all variables that start with that name (Jeffrey Morlan)
  • Implement /P switch (Jeffrey Morlan)
  • Set nErrorLevel on failure (Jeffrey Morlan)
  • cmd_set: When given an empty value, pass NULL to SetEnvironmentVariable (Jeffrey Morlan)
  • cmd_type: Fix misuse of ConOutPrintf which caused problems when the file had any '%' characters in it (Jeffrey Morlan)
  • Implement call :label by creating a new batch context so calls can be nested and have their own %0-%9 parameters (Jeffrey Morlan)
  • GetBatchVar: Implement %~n. Remove %? (an old FreeDOS-ism; the Windows equivalent is %ERRORLEVEL%) (Jeffrey Morlan)

Dev Utils






  • Print no approximate round trip times on 100% loss like Windows does (Mario Kacmar, bug #2542)
  • Increase lost packet count when transmit failed or receive failed (Hervé Poussineau)


  • Do not use LoadIcon, fixes ugly treeview icons (Ged Murphy)


  • Fixed typo in SetMenuAndButtonStates, causing incorrect options on context menu. (Michael Martin, bug #3792)
  • Pass correct size for ServiceStatusProcess to QueryServiceStatusEx to prevent trashing next services information in Info buffer. (Michael Martin)
  • Added missing CloseServiceHandle calls. (Michael Martin)



  • Prevent a redefinition of _pctype in newer GCC versions (Marcelo Slomp)


  • Notify umpnpmgr about logon after the shell has initialized -- makes it possible to progress if userinit crashes with heavy debug output enabled (Stefan Ginsberg)

Win32™ Libraries


  • Implement a common RPC Status to Windows Error function. (Eric Kohl)
  • Add SEH protection to all calls made to rpcrt. (Michael Martin, Eric Kohl)
  • EnumDependentServicesA/W and EnumServicesStatusA/W: don't attempt fix up pointers if the service manager returns an error.(Michael Martin)
  • Update with exports new to Windows 2003 (Stefan Ginsberg)
  • Make sure we are passed a subkey in RegDeleteKeyA/W (Stefan Ginsberg)
  • Make RegQueryValueA conform to Winetests (Stefan Ginsberg)
  • Return true in EncryptFile and DecryptFile even if unimplemented, mirroring Wine's method (Christoph von Wittich)
  • Sync RegGetValueA/W with Wine head (Dmitry Chapyshev)
  • GetServiceDisplayNameA/W and GetServiceKeyNameA/W: Fix returned name size (Eric Kohl)
  • Add parameter checks to QueryServiceConfig2A/W, passes three more Winetests (Eric Kohl)
  • GetUserNameW: Re-set an_len to the actual buffer size before second LookupAccountSidW call, set *lpSize correctly, and fix leakage of hToken in failure cases (Jeffrey Morlan)
  • GetUserNameA: Don't include nul terminator when calculating NameW.Length and remove redundant NULL termination of NameA (Jeffrey Morlan)
  • Fix various Winetests (Christoph von Wittich)
  • Add missing HandleBind calls (Christoph von Wittich)
  • Fix DllMain parameters (Christoph von Wittich)
  • Fix memory leaks (Ged Murphy)
  • Implement I_ScSetServiceBitsA/W and SetServiceBits (Eric Kohl)


  • Use strtoui64 instead of non-existing strtoull. This makes dbghelp load again (Stefan Ginsberg)



  • Allocate size of structure, not size of pointer to the structure (Timo Kreuzer)
  • Added cleanup code for Internal_CreateSurface (Gregor Schneider)


  • Check if lpLogFont is NULL, so we don't crash if it is.
    Verified by the GDI32 Wine test, which explicitly checks for this behaviour and doesn't crash under WinXP SP2. (Giannis Adamopoulos, bug #3725)
  • NULL terminate strings in GetCharWidthsA, GetCharWidth32A, GetCharABCWidthsFloatA, GetCharABCWidthsA, GetCharABCWidthsFloatA and add better error checking (Christoph von Wittich)



  • Relocated the base address




  • Add missing functions of LSA RPC interface and fix existing prototypes to be the same as in Windows (Hervé Poussineau)


















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