Difference between revisions of "ChangeLog-0.3.7"

From ReactOS Wiki
Jump to: navigation, search
(My work and the one I commited)
(Generic 0.3.7 Changes)
Line 14: Line 14:
* Update ReactOS Calc to Version 1.10. ([[Carlo Bramini]])
* Update ReactOS Calc to Version 1.10. ([[Carlo Bramini]])
* Sync winhlp32, wordpad and xcopy with wine. ([[Daniel Reimer]])
* Sync winhlp32, wordpad and xcopy with wine. ([[Daniel Reimer]])
* Sync WineD3D with WIne 1.1.5 ([[Kamil Hornicek]])
* Sync WineD3D with Wine 1.1.5 ([[Kamil Hornicek]])
* Fix inline versions of integer <-> pointer conversion functions ([[Timo Kreuzer]])
* Fix inline versions of integer <-> pointer conversion functions ([[Timo Kreuzer]])
* Implement 64 bit Interlocked intrinsics and gs-segment-adressing functions ([[Timo Kreuzer]])
* Implement 64 bit Interlocked intrinsics and gs-segment-adressing functions ([[Timo Kreuzer]])

Revision as of 10:46, 4 October 2008


Remember the format for changelogs! * Description (Developer names, bug #x)

Always write developer names in brackets

This is the changelog for ReactOS™ version 0.3.7 (released *wouldn't you like to know*), 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)


  • Added/Updated Bulgarian translations (CCTAHEB, bugs #3661, #3697)
  • Added/Updated Czech translations (Radek Liska, bug #3600)
  • Added/Updated French translations (Amine Khaldi)
  • Added/Updated French translations (Jean Michel, bugs #3651, #3652, #3653)
  • Added/Updated French translations (Pierre Schweitzer)
  • Added/Updated Italian translations (Paolo Devoti, bugs #3642, #3664, #3682, #3729)
  • Added/Updated Korean translations (Seungyu Kim, bugs #3665, #3741)
  • Added/Updated Norwegian translations (Lars Martin Hambro, bugs #3516, #3618, #3631, #3637, #3670, #3675, #3726)
  • Added/Updated Polish translations (Maciej Bialas, bugs #3630, #3659, #3694, #3705)
  • Added/Updated Polish translations (Olaf Siejka)
  • Added/Updated Slovak translations (Mario Kacmar, bugs #3649, #3721, #3722, #3723, #3738)
  • Added/Updated Spanish translations (Javier Remacha, bugs #3588, #3668, #3700)
  • IDS_PROPERTIES Translation (Victor Martinez Calvo, bug #3655)
  • Rename the Norwegian RC Files to no-NO.rc, which is correct according to MSDN. (Daniel Reimer)
  • Syssetup: Adjust size of controls for italian translation (Carlo Bramini, bug #3555)

Host Tools






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)



  • Use RtlCopyUnicodeString instead of RtlInitUnicodeString. Fixes a memory leak and bad (stack) pointers (Stefan Ginsberg)


  • 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 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)


  • 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)


  • 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)


  • 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)


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

Hardware Abstraction Layer (HAL)

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)



  • 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)


  • "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)




  • 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)







  • Remove redundant NULL-check (Aleksey Bragin, CID #761)
  • Don't try to complete the IRP if irp == NULL (Aleksey Bragin, CID #398)
  • Ports are counted starting from 1, with 0 being an invalid port index. Remove memory corruption by actually allocating MAX_ROOT_PORTS + 1 sized array (Aleksey Bragin, CID #601)
  • Fix uninitialized variable usage (Aleksey Bragin, CID #1293)

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)

Static Libraries

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)





Keyboard Layouts


Win32™ Personality

User mode subsystem server (CSRSS)

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 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)


  • 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)

Control panel applets





  • Fall back on NameServer value in TCPIP\Parameters if interface for adapter does not exist in registry. (Michael Martin, bug #2392)





Win32™ Applications



  • Select ANSI_VAR_FONT in explorer when drawing start button text and desktop switching buttons text (Aleksey Bragin, Juriy Sidorov, bug #3484)




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)


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




  • Relocated the base address



  • Implement filling GateWayList member of IP_ADAPTER_INFO structure for GetAdaptersInfo function. (Michael Martin, bug #2392)
  • Fixed GetIpForwardTable to return correct dwForwardIfIndex for structure MIB_IPFORWARDTABLE. (Michael Martin)
  • Use DHCPNameServer value for NameServer assignment if NameServer value is empty in registry. (Michael Martin, bug #2392)




  • Update with exports new to Windows 2003 (Stefan Ginsberg)
  • Don't forget to set the fiber argument parameter in ConvertThreadToFiberEx (Stefan Ginsberg)
  • Implement InterlockedCompareExchange64 and GetCurrentProcessorNumber by forwarding to NTDLL(Stefan Ginsberg)










  • Set bInitialOwner to TRUE for a mutex we release before waiting for it (Stefan Ginsberg)







  • Allocate size of structure, not size of pointer to the structure (Timo Kreuzer)
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