Commit Graph
2021 Commits
Author SHA1 Message Date
Ahmed ARIF 174b9d64fe [NTOS] Export the UTF-8 conversion routines
RtlUTF8ToUnicodeN and RtlUnicodeToUTF8N are documented kernel APIs since Windows 7, but they are missing from the ntoskrnl export table.
2026-07-24 14:49:13 +02:00
Carl J. Bialorucki c3d141b675 [NTOS][NTOS:FSRTL] Use RtlIsNameInExpression for FsRtlIsNameInExpression
Also link rtl_vista to ntoskrnl
2026-07-22 19:53:20 -05:00
copilot-swe-agent[bot] 7877f5bc0b [NTOS:CC] Fix CcRosDeleteFileCache race with concurrent CcFlushCache causing ASSERT(Refs > 0)
Root cause: CcRosDeleteFileCache's first loop ran under the spinlock and removed VACBs from the LRU and dirty lists, but left them in CacheMapVacbListHead. It also set Vacb->Dirty = TRUE as a flush hint (after CcRosUnmarkDirtyVacb cleared it), creating an inconsistent VACB state: Dirty=TRUE but not in the dirty list, with only the cache-map-list refcount (1). After releasing the lock, the second loop removed VACBs from CacheMapVacbListHead without holding any lock.

This created a race with CcFlushCache: a caller that already held a SharedCacheMap pointer could call CcRosLookupVacb between the two loops, find the VACB (refcount → 2), see Dirty=TRUE (the hack), and call CcRosFlushVacb. Meanwhile the second loop could set Dirty=FALSE, drop the cmap ref (→1, print "Leaking VACB"), and then the early-return in CcRosUnmarkDirtyVacb would skip the decrement. CcRosReleaseVacb then drops 1→0 → ASSERT(Refs > 0) fires.

Before the previous fix, the same race caused ASSERT(Vacb->Dirty) in the old CcRosUnmarkDirtyVacb — the previous fix just changed which assert fired.

The fix:
- CcRosDeleteFileCache: VACBs are now removed from CacheMapVacbListHead in the first loop, under the spinlock, and moved to a private LocalVacbList. After the lock is released, CcRosLookupVacb can no longer find these VACBs, preventing new lookup references from being created.
- CcRosReleaseVacb: Removed the overly strict ASSERT(Refs > 0). When CcRosDeleteFileCache drops the cmap ref while a lookup is outstanding, CcRosReleaseVacb legitimately releases the last reference and CcRosVacbDecRefCount correctly frees the VACB. Callers (e.g., CcFlushCache) don't access the VACB pointer afterward.

Signed-off-by: Timo Kreuzer <[email protected]>
2026-07-21 21:59:09 +00:00
copilot-swe-agent[bot] 55c4c525b4 [NTOS:CC] Fix a race condition for dirty VACBs
- CcRosUnmarkDirtyVacb: return BOOLEAN, guard against double-unmark
- CcRosMarkDirtyVacb: guard against double-insertion
- CcRosFlushVacb: only re-mark dirty on failure if we were the one who unmarked
- Add comments to lockless Dirty reads in CcFlushCache and CcRosReleaseVacb

Signed-off-by: Timo Kreuzer <[email protected]>
2026-07-21 21:59:09 +00:00
Justin Miller 9ffc373bf6 [NTOS:IO][SDK:DRIVERS][FORMATTING] Start SDK:Arbiter from scratch (#9270)
Same idea as
094b7d9
and
Final step that doesn't require rtlrange improvements
2026-07-19 10:29:04 -07:00
Justin Miller 1b460291e2 [NTOS:IO] Fix a small bug in PiUpdateDeviceState (#9290)
technically an adjustment to commit cf0bc1c.

CORE-17519
2026-07-14 22:07:42 -07:00
Timo Kreuzer 7955690ad7 [NTOS:EX] Create a stub for SystemModuleInformationEx sysinfo class
The stub returns STATUS_INVALID_INFO_CLASS rather than STATUS_NOT_IMPLEMENTED.
This is a temporary measure to indicate to ntdll_winetest that this system information class is not implemented and prevent the test from crashing.
2026-07-03 17:04:11 +00:00
Timo Kreuzer c6410fb0c2 [NTOS:EX] Fix query of SystemTimeAdjustmentInformation 2026-07-03 17:04:11 +00:00
Timo Kreuzer feb0f56da7 [NTOS:EX] Fix query of SystemInterruptInformation 2026-07-03 17:04:11 +00:00
Timo Kreuzer eb3d5a4f9d [NTOS:EX] Implement query of SystemRecommendedSharedDataAlignment 2026-07-03 17:04:11 +00:00
Timo Kreuzer 05017d7160 [NTOS:EX] Implement query of SystemExtendedProcessInformation 2026-07-03 17:04:11 +00:00
Timo Kreuzer ef7d4d2043 [NTOS:EX] Implement query of SystemProcessorBrandString 2026-07-03 17:04:11 +00:00
Timo Kreuzer 5ab5b8e5f3 [NTOS:EX] Implement query of SystemEmulationProcessorInformation 2026-07-03 17:04:11 +00:00
Timo Kreuzer 252a552dc6 [NTOS:EX] Implement query of SystemEmulationBasicInformation 2026-07-03 17:04:11 +00:00
Timo Kreuzer dbb4d36927 [NTOS:KE][NTDLL][NTDLL_VISTA] Implement NtGetCurrentProcessorNumberEx 2026-07-01 21:45:34 +00:00
Alex Mendoza 8e865cb39d [NTOS:OB] Return handle attributes by ObReferenceFileObjectForWrite (#9213)
Resolve a FIXME in ObReferenceFileObjectForWrite by getting the handle attributes,
the same way it's done in other parts of the Ob code.
2026-06-26 19:22:55 +02:00
Hermès Bélusca-Maïto 620222ad28 [NTOS:OB][NDK] Enhancements to ObSetHandleAttributes() and ObpSetHandleAttributes() (#9170)
- Use SAL2 annotations; write Doxygen documentation (based on GPT-5.4 feedback).
- Simplify some of the code.
- Add the `ObSetHandleAttributes()` prototype to `ndk/obfuncs.h`,
  since it is exported by ntoskrnl.exe
2026-06-23 19:52:22 +02:00
Hermès Bélusca-Maïto 37fe06f1c7 [NTOS:OB] Enhancements to NtSetInformationObject() (#9170)
- Simplify the `ObjectHandleFlagInformation` class implementation,
  by directly invoking the `ObSetHandleAttributes()` routine.
  Addendum to commit 02d0bb9dbd (r22228) that implemented the class,
  and to commit 91105c7915 (r61037) that implemented `ObSetHandleAttributes()`.

- Use SAL2 annotations; write Doxygen documentation (based on GPT-5.4
  feedback and https://ntdoc.m417z.com/ntsetinformationobject).
2026-06-23 19:52:21 +02:00
Hermès Bélusca-Maïto cf4dce77c2 [NDK][NTOS:INCLUDE] Minor reshuffling of some functions (#9170) 2026-06-23 19:52:16 +02:00
Dmitry Borisov 57a7c56d51 [NTOS:PNP] Compile PC-98 PnP IDs only on x86 (#9195)
Addendum to 7d5e159131

CORE-17977
2026-06-23 01:20:19 +03:00
Stanislav Motylkov 13364f7be6 [NTOS:CM] Detect NEC PC-98 alternative system architecture dynamically (#9193)
Perform detection by matching system identifier passed from the loader block,
similarly to how FreeLoader detects the boot video driver:
https://github.com/reactos/reactos/blob/332331ce1b7a71b0227b9ec3d4449272b28a84f6/boot/freeldr/freeldr/ntldr/winldr.c#L653

Windows checks if the identifier starts with a known string and then sets
additional flags for the drivers.

See also https://www.geoffchappell.com/studies/windows/km/ntoskrnl/inc/api/arc/i386_loader_block.htm

Follow up of 8df1b53508. CORE-17977
2026-06-22 14:04:34 +03:00
Adam Słaboń 8aac5c4c87 [NTOS:KE][AMD64] Move KD initialization after HalInitializeProcessor call (#9177)
This is needed for PCI debugging devices whose KD modules depend
on the functions registered in HalpRegisterKdSupportFunctions().

Also it's consistent with what x86 does, and also what Win7 x64 does
(the KdInitSystem is invoked after the HalInitializeProcessor call).

Necessary for PR #9156 on AMD64. CORE-20385
2026-06-19 00:44:48 +03:00
Ahmed Arif 69474b3190 [NTOS:OB] Replace the joke debug print in NtWaitForMultipleObjects with a proper diagnostic (#9163)
Addendum to commit f543c860f7 (r69399).
2026-06-16 18:06:18 +03:00
Serge Gautherie 5df7d05049 [NTOS:MM] MiMapViewOfDataSection(): ASSERT InheritDisposition value 2026-06-15 12:34:56 +00:00
Timo Kreuzer d1c281c95e [NTOS:EX] Fix wait mode in keyed event implementation
Use previous mode instead of KernelMode, to allow user mode threads to be terminated.
2026-06-08 14:10:10 +00:00
Ahmed Arif b1f04786e1 [NTOS:FSTUB] Clear the whole partition table in FstubCreateDiskRaw (#9124)
FstubCreateDiskRaw is supposed to wipe the MBR when it makes a RAW disk.
Before this fix, that function only cleared the first of the 4 partition entries, so one entry (16 bytes) instead of the whole table (64).
As a consequence, the wiped MBR written back to disk still had entries 2, 3 and 4 sitting there with old data, and those came back as ghost/garbage partitions.
2026-06-08 00:14:11 +02:00
Timo Kreuzer a7f658e322 [NTOS:IO] Fix IopGetBusTypeGuidIndex
- Use a global structure instead of pointer
- Allocate only the GUID buffer
- Keep track of allocated size and number of GUIDs
- Grow in steps of 8 GUIDs
- Use ExAllocatePoolWithTag instead of ExAllocatePool
- Use IsEqualGUID

See CORE-12791
2026-05-16 21:07:55 +00:00
Serge Gautherie f00e1cd6aa [NTOS:PNP] IopGetBusTypeGuidIndex(): Remove 1 unwanted ExFreePool()
in a failure case.

CORE-12791
2026-05-10 14:07:51 +00:00
Serge Gautherie 25a6fdf867 [NTOS:MM] Convert some annotations to SAL2 and fix them
And add a specific ASSERT(SectionOffset) in MmMapViewOfSection().
2026-05-10 11:05:30 +00:00
Timo Kreuzer da64ad34ef [CRT] Stop implementing non-conforming swprintf / vswprintf
- Don't compile the non-conformng swprintf (it is identical to _swprinf)
- Rename swprintf to _swprintf
- Forward non-conforming exports to the underscored versions in CRT dlls
2026-05-07 06:27:58 +00:00
Timo Kreuzer 1cf31524d5 [REACTOS] Stop using non-conforming swprintf / vswprintf
Use the underscored versions instead.
2026-05-07 06:27:58 +00:00
Timo Kreuzer 081a6366df [KSECDD][NTOS][RTL] Change license of some of my code to MIT 2026-04-23 12:39:01 +00:00
Timo Kreuzer 77b88c48a4 [NDK][NTOS][NTDLL][KRNEL32] Fix read/write of KSYSTEM_TIME
Fix KiWriteSystemTime and move it to NDK. The previous implementation of KiWriteSystemTime was broken and updated the fields in the wrong order. Before that it was right for SystemTime and wrong for InterruptTime. ExpSetTimeZoneInformation had it wrong for the TimeZoneBias.
Add KiReadSystemTime to read KSYSTEM_TIME values correctly, instead of doing it manually (and partly wrongly) all over the place.
2026-04-23 11:58:15 +00:00
Dmitry Borisov e2aa54321a [BOOTVID] Rename some function parameters
Delta       -> Stride
TopDelta -> Height
2026-04-21 15:08:17 -05:00
Hermès Bélusca-Maïto 13ac291830 [NTOS:FSTUB] IoGetBootDiskInformation(): Fix the disks matching condition check.
This is the same fix for the same condition check, as the one already
applied to `IopCreateArcNamesDisk()` in commit 3fe12f1a7c.

This bug was introduced in commit 538b9e4fbf (r49212) and is identical
to the one introduced in commit 6d0861e9ed (r49131).

The idea behind the condition check, is that we consider the enumerated
disk to be a match with the currently-considered one from the ARC disk
signatures, *IF*:

- there is only one single disk listed in the ARC disk signatures,
  *AND* only one single disk detected at runtime by the kernel,
  *AND* this disk is MBR-partitioned;

- *OR*, there is one or more disks present and the enumerated disk's
  signature match the currently-considered ARC disk signature. (This
  is the more general case for when there are one or multiple disks
  on the system, and/or one disk at least is GPT).
2026-04-12 17:26:54 +02:00
Hermès Bélusca-Maïto 278234259d [NTOS:FSTUB] Fix bugs in the drive-letters assignment algorithm
Addendum to commit 5ab1cfc553.

- Fix the drive letters assignment ordering for hard disks.

  * Fix the loop that assigns letters to MBR boot and primary partitions;
  * Fix the condition that finds the boot partition (or defaults to the
    first primary partition) to be skipped when assigning letters to all
    remaining hard-disk partitions -- after letters have been assigned
    to the specific boot, primary, logical, etc. partitions.

  NOTE: The drive-letter assignment algorithm is as follows:

  1. For each hard disk, assign a letter to the first encountered boot
     (MBR "active") partition; or if GPT disk, to all data partitions.
     If no boot partition has been found on this disk, assign a letter
     to all of its primary partitions.

  2. Assign a letter to all (MBR) logical partitions for each hard disk.

  3. Assign a letter to all remaining partitions with recognized IDs on
     all disks.

  ****
  We observe that the algorithm 1-3 is tailored for MBR-partitioned disks,
  as it is inherited from the way MS-DOS did it. In addition, partitions
  on GPT disks acquire their drive letters early one, during step 1.
  ****

  4. Assign letters to floppy disks (see below), then to CD-ROMs.

  5. Finally, verify that the OS boot volume has got a drive letter; if
     not, get a free one (or delete the 'Z' drive letter and reassign it
     to the boot volume).

  (See also "Inside Storage Management, Part 1", Mark Russinovich,
   https://www.digiater.nl/openvms/decus/vmslt00b/nt/storage-mgt-nt_2.htm
   about the `IoAssignDriveLetters` function.)

- When assigning drive letters to floppy drives, first assign letters to
  legacy (non-MountMgr-aware) devices, and then to MountMgr-aware devices.
2026-04-11 18:16:27 +02:00
Hermès Bélusca-Maïto 750e463fb1 [NTOS:FSTUB] disksup.c: More simplifications
Addendum to commit 5ab1cfc553.

- Static const-ify the `FloppyString` and `CdString` constants, that are
  common to both `HalpNextDriveLetter()` and `xHalIoAssignDriveLetters()`.

- Improve code comments and variable names.

- In `xHalIoAssignDriveLetters()`:
  * One of the two "generic string buffers" can be thrown away, since
    we can already use the on-stack `Buffer`.

  * No need to `sprintf` + `RtlInitAnsiString` + `RtlAnsiStringToUnicodeString`
    with the risk of failing the conversion (that also allocates memory).
    Instead, just invoke `swprintf` + `RtlInitUnicodeString` as already
    done elsewhere in this function.

  * Replace some '0' to 'FALSE' where applicable.
  * Reduce indentation level of two for-loops.
2026-04-11 18:16:25 +02:00
Hermès Bélusca-Maïto f2e0e63ee5 [NTOS:FSTUB] Simplify GUID comparisons and partition info saving 2026-04-11 18:16:24 +02:00
Hermès Bélusca-Maïto bb30c56d6f [NTOS:FSTUB] Improve output of the FstubDbg* helpers + fix a bug
- Compile their contents only when NDEBUG is _NOT_ defined.

- Only keep the first DPRINT in these functions in order to keep the
  file path and line number, but replace the others with DbgPrint in
  order to have a clearer printout.

- Fix a bug in FstubDbgPrintSetPartitionEx(), where PartitionNumber has
  to be used as an indicator parameter but MUST NOT be used to index the
  PartitionEntry pointer. (PartitionEntry already points to the data for
  setting the partition specified by PartitionNumber.)
  The bug certainly came from a copy-pasting error from FstubDbgPrintPartitionEx().
2026-04-11 18:16:23 +02:00
Hermès Bélusca-Maïto 2e610aa9df [NTOS:FSTUB/IO] Unhardcode some values 2026-04-11 18:16:22 +02:00
Hermès Bélusca-Maïto 0bbb12f991 [NTOS:FSTUB] Make some macros more "conforming"
i.e. parenthesized parameters; parenthesize compound macros, etc.
2026-04-11 18:16:21 +02:00
Hermès Bélusca-Maïto ff751cfa35 [NTOS:FSTUB] Minor formatting improvement for disksup.c internal functions
In addition, add SAL2 annotations to them, some comments fixes,
and remove old unused definitions.
2026-04-11 18:16:20 +02:00
Hermès Bélusca-Maïto 44f06398e2 [NTOS:FSTUB] Fix old-annotations for the *IoReadPartitionTable* routines 2026-04-11 18:16:19 +02:00
Hermès Bélusca-Maïto f3c1d644ec [NTOS:IO] IopCreateArcNames(): Remove unused variable and improve comments
This has been forgotten since the split of `IopCreateArcNames()`
in commit 6d0861e9ed (r49131).

Also, improve comments regarding `ArcHalDeviceName` vs. `ArcBootDeviceName`.
2026-04-09 22:21:06 +02:00
Hermès Bélusca-Maïto 7f433ed74d [NTOS:CM] CmpSetSystemValues(): Export the Vista+ "FirmwareBootDevice" registry value
In the `HKLM\SYSTEM\CurrentControlSet\Control` registry key,
the `FirmwareBootDevice` value specifies the firmware boot
(i.e. system partition) device in ARC format, obtained from
`LoaderBlock->ArcHalDeviceName`.
For some reason it is exposed only on Windows Vista and later.

This value is similar to the `SystemBootDevice` one, which specifies
instead the OS boot device in ARC format, obtained from
`LoaderBlock->ArcBootDeviceName`.

In addition: check the value returned by `RtlCreateUnicodeStringFromAsciiz()`
and fail if so.
2026-04-09 22:16:35 +02:00
Hermès Bélusca-Maïto 9336919fec [NTOS:KD64] Improve the ARC Paths output in the KdpPrintBanner()
Instead of mixing the paths order (ArcBoot, NtHal, ArcHal, NtBoot),
show them in a meaningful order: ArcHal, NtHal, ArcBoot, NtBoot.

- The `ArcHalDeviceName` + `NtHalPathName` is the path to the system
  loader started by the firmware (and the HAL in old non-x86 Windows
  versions).

- The `ArcBootDeviceName` + `NtBootPathName` is the operating system
  boot partition and directory ("system root").
2026-04-09 22:16:34 +02:00
Hermès Bélusca-Maïto 474348fcb4 [NTOS:IO] IopCheckDeviceAndDriver(): Improve DPRINT trace 2026-04-07 20:23:56 +02:00
Hermès Bélusca-Maïto 9a6dfe313d [NTOS:IO] Use IoGetDevObjExtension/IoGetDrvObjExtension macros instead of unreadable casts 2026-04-07 20:23:55 +02:00
Hermès Bélusca-Maïto b364f702d2 [NTOS:IO] IoGetAttachedDeviceReference/IoGetDeviceAttachmentBaseRef: Retrieve attached device under lock
As implicitly implied by the MSDN description for `IoGetAttachedDevice()`:
https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-iogetattacheddevice

> IoGetAttachedDevice differs from IoGetAttachedDeviceReference in the
> following respects:
>
> [...]
>
> - Callers of IoGetAttachedDevice must ensure that no device objects are
>   added to or removed from the stack while IoGetAttachedDevice is executing.
>   Callers that cannot do this must use IoGetAttachedDeviceReference instead.

the `IoGetAttachedDeviceReference()` has to acquire the device list lock
to ensure that no device objects get added to or removed from the device
stack during its invocation.

Similarly, `IoGetDeviceAttachmentBaseRef()` has to do the same.
2026-04-07 20:23:54 +02:00
Hermès Bélusca-Maïto cea19d2e0f [NTOS:IO] IopAttachDeviceToDeviceStackSafe(): Attach the device to the device list UNDER lock!
This function is the internal helper for the `IoAttachDevice*()` functions,
in particular for `IoAttachDeviceToDeviceStackSafe()`.

Because the function modifies the chained list of stacked devices, it must
hold the device list lock (the I/O system database lock) while doing the
devices attachment.
In particular, modifying the `SourceDevice`'s extension `AttachedTo` field,
but also modifying its other fields and the `AttachedDevice` ones as well.

This fix is similar to the one already committed in f8cbc3e48c (r70496).

----

In MSDN [^1] it is indicated (although not as clearly as it could be) that
`IoAttachDeviceToDeviceStackSafe()` sets the returned `AttachedToDeviceObject`
pointer under the device list lock. The reason is best spelled in [^2][^3].
Indeed, when a filter attaches to a lower PDO (`PhysicalDevice`) by doing:
```c
myDeviceExtension->LowerDevice =
    IoAttachDeviceToDeviceStack(myFilterDevice, PhysicalDevice);
```
there exists a time window where the function finished attaching the filter
device to the PDO, but hasn't yet returned the device at the top of the
stack to be stored in `myDeviceExtension->LowerDevice` (which gets used
later internally by the filter to pass IRPs down the device stack).
During this time, the filter device may receive some IRPs and its
dispatch routine would use a not-yet initialized `LowerDevice` member.

The IoAttachDeviceToDeviceStackSafe() allows doing:
```c
Status = IoAttachDeviceToDeviceStackSafe(
    myFilterDevice, PhysicalDevice, &myDeviceExtension->LowerDevice);
```
and forbidding the IRPs to be delivered to the filter device, while the
`LowerDevice` member is being initialized with the device list lock held.

----

[^1]: "IoAttachDeviceToDeviceStackSafe function (ntddk.h)"
https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/nf-ntddk-ioattachdevicetodevicestacksafe#remarks

[^2]: "IoAttachDeviceToDeviceStack gotcha" (Satya Das, Winprogger)
https://winprogger.com/ioattachdevicetodevicestack-gotcha/

[^3]: Community OSR answer (by Tony Mason)
https://community.osr.com/t/attach-filter-driver/9450/3
2026-04-07 20:23:54 +02:00