Commit Graph
2005 Commits
Author SHA1 Message Date
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
Hermès Bélusca-Maïto 45687e82f3 [NTOS:IO] Minor formatting for IopAttachDeviceToDeviceStackSafe()
- Fix few comments;
- Mark the function static.
- SAL2-ify its parameters.
2026-04-07 20:23:49 +02:00
Hermès Bélusca-Maïto a4621bb280 [NTOS:PS][NTDLL_APITESTS] Implement ThreadNameInformation for NtQuery/SetInformationThread() (#8484)
The `ThreadNameInformation` (#38) class is the Windows 10.1607+ way
of assigning a human-readable name (i.e. description) to a given
thread object, that is visible to debuggers and diagnostic tools
(e.g. WinDbg `!thread` command, Process Explorer ...), which is
useful for debugging scenarios.[^1]

Before this, the only way to assign a name to a thread for debugging
purposes was to raise a specific exception, that had to be caught and
interpreted by a supported debugger.[^2][^3]

When the thread object is being deleted (`kill.c!PspDeleteThread()`),
free the thread name if set (courtesy of Ahmed Arif, PR #8796).

References:
[^1]: https://learn.microsoft.com/en-us/visualstudio/debugger/tips-for-debugging-threads
[^2]: https://learn.microsoft.com/en-us/archive/blogs/stevejs/naming-threads-in-win32-and-net
[^3]: https://ofekshilon.com/2009/04/10/naming-threads/
2026-03-29 19:35:34 +02:00
Hermès Bélusca-Maïto 2e1a0b73c9 [NTDLL_APITEST][NTOS:PS] Adjust probelib.c test code to skip non-implemented Win7+ thread information classes
Re-enable in ps_i.h the stubbed probing info values for thread information
classes, that were disabled in commit 60aad33ed0 (PR #8487), and adjust
the test code in probelib.c so that the failures for these non-implemented
classes are correctly taken into account.
2026-03-29 16:52:07 +02:00
Hermès Bélusca-Maïto a2a434e8d5 [NTDLL_APITEST] Minor formatting for probelib.c 2026-03-29 16:52:06 +02:00
Hermès Bélusca-Maïto dddb6d5da8 [NTOS:PS] query.c: Code style: Add switch-case brackets; move variable declarations where they belong.
In preparation for PR #8484.
2026-03-28 21:38:22 +01:00
Hermès Bélusca-Maïto 62deebac2d [FREELDR:NTLDR] Try to auto-detect which bootvid module to load at boot time (#8720)
Detect whether we run on XBOX or PC98 (on x86 builds), or on (U)EFI or on
a BIOS-based PC, or whether a generic linear framebuffer mode is used, in
order to choose the correct bootvid module to load, based from a predefined
file names list (ideally it should be derived from txtsetup.sif...).

Supersedes PR #8701.

Use `KeFindConfiguration*Entry()` to spelunk the hardware configuration
tree in the NT loader module.

Alternatively, allow the user to override the choice with a new `BOOTVID=`
boot option. In any case, if the selected bootvid module failed to be loaded,
silently fall back to the default bootvid.dll file. The fallback is done
by just letting the PE loader resolve the necessary exports from hal.dll
and ntoskrnl.exe.
2026-03-22 20:16:15 +01:00
Hermès Bélusca-Maïto e05e6c4849 [NTOS:KE][NDK] Minor enhancements to the KeFindConfiguration*Entry() routines (#8720)
- Update the SAL annotations;
- Simplify some while-loops into for-loops.
2026-03-22 20:15:50 +01:00
Hermès Bélusca-Maïto 2593cea230 [NTOS:IO] Remove last remnants of IoCreateDriverList() and IoDestroyDriverList()
These two functions were removed as part of the boot/system drivers
loading support rewrite in commit 959116f521 (r46693).
2026-03-22 15:39:54 +01:00
Hermès Bélusca-Maïto 6c532e771e [FREELDR][KDCOM][KDGDB] Allow specifying the serial port address in the DEBUGPORT option
This is the same feature as the one that already exists in the
NTOS:KD!kdmain.c module used by the in-kernel KDBG debugger
(GCC builds), first introduced in commit 4ce30245de (r54473),
and documented at:
https://reactos.org/wiki/Debugging#Changing_the_serial_port_address

This feature is useful if one uses a PCI, PCIe, PCMCIA, or ExpressCard
serial card on real hardware (these cards are used e.g. with laptops
without a built-in serial port), or with AMT serial over LAN.
After determining the serial port I/O address (say, 0xCC00), specify
the debug port as follows:

/DEBUGPORT=COM:0xCC00

instead of the usual syntax: /DEBUGPORT=COMn (n an integer).

The same syntax can be used for debugging FreeLoader as well: in the
FREELDR.INI file, add a "Debug" line in the "FREELOADER" section,
as follows:

```
[FREELOADER]
Debug=/DEBUG /DEBUGPORT=COM:0xCC00 /BAUDRATE=115200
```

----

NOTE for KDCOM/KDGDB:

Since `strtoul()` is used, but isn't exported by ntoskrnl, link against
the "strtol" static library that has been introduced in commit d317d4fbcc
(r71481).
2026-03-21 00:10:21 +01:00
Hermès Bélusca-Maïto acb91336e3 [NTOS:KD] Const-ify the KdpGetDebugMode() function parameter 2026-03-21 00:06:28 +01:00
Hermès Bélusca-Maïto 956d9f7973 [FREELDR][KDCOM][KDGDB][KDVM][NTOS:KD] Don't overrun the command-line when parsing "DEBUGPORT"
Don't loop past the end of the command-line buffer, if the command-line
terminates with a lone "DEBUGPORT" without any extra parameter following.
For example: "some things   DEBUGPORT  "
2026-03-21 00:06:20 +01:00
Hermès Bélusca-Maïto b7c3432070 [NTOS:KD] Restore BAUDRATE option support
Support for the BAUDRATE option was erroneously removed in commit 95faf65ebf.
As a result, the in-kernel KDBG debugger was always running with the
default debug port baud rate (115200 Bd), even if the user tried to
override it with the BAUDRATE option for supporting terminals that use
a different baud rate.
2026-03-19 23:22:54 +01:00
Hermès Bélusca-Maïto c4d60756dd [FREELDR][KDCOM][KDGDB][NTOS:KD] Some code "nits"
- Don't hardcode constant string lengths.

- Use `_strnicmp()` -- Ideally we shouldn't have to unconditionally upcase
  the global kernel command-line string to perform substrings comparisons.

- Cast `atol()` returned value to `ULONG`.
2026-03-19 22:49:29 +01:00
Hermès Bélusca-Maïto 4d0642b67f [FREELDR][KDCOM][KDGDB][NTOS:KD] Minor code comments enhancements 2026-03-19 22:14:00 +01:00
Hermès Bélusca-Maïto fe6ee1223a [NTOS:KDBG] Fix misleading indentation
Address second part of comment
https://github.com/reactos/reactos/commit/3726b992ed3631c3571df056da70839c35a05582#r50112970
2026-03-19 21:52:12 +01:00
Hermès Bélusca-Maïto bc7d0f1ec6 [NTOS:KD] i386/kdserial.c: Improve "Kernel Debugger:" messages; use correct default baud rate
- Use DEFAULT_DEBUG_BAUD_RATE for the debug serial port.

- Use a less dramatic "Serial port not available" (without '!')
  instead of "Serial port not found!" message, in case ReactOS
  BSODs without a debugger attached to a serial port.
  Sometimes people mistake this informational line as one of the
  reasons why ReactOS BSODed or whatnot...

- Replace "Serial port found" by "Using COM..." message.
2026-03-19 21:52:10 +01:00