Commit Graph
89080 Commits
Author SHA1 Message Date
Timo Kreuzer 5b2091e37c [CRT_APITEST] Add more tests for _setjmp 2025-08-22 09:12:51 +03:00
Timo Kreuzer d7761b1296 [VCRUNTIME][ASM] Fix definition of x64 _JUMP_BUFFER 2025-08-22 09:12:51 +03:00
Timo Kreuzer d3a744a1ad [PSEH] Remove x64/ARM asm stubs
These are all x86 specific.
2025-08-22 09:12:51 +03:00
Timo Kreuzer 1694901961 [MSVCRT20][MSVCRT40] Only build for x86
These are legacy DLLs and only exist on x86.
2025-08-22 09:12:51 +03:00
Timo Kreuzer cdfae35256 [NTOS:KDBG] Set default disassembly style to Intel
Seriously!
2025-08-22 09:12:51 +03:00
Eric Kohl 61ff1117ee [IPHLPAPI] More fixes for GetAdapterAddresses
- Fix the reversed DNS server ip addresses.
- Return the ip addresses and network prefix lengths in the prefix list.
2025-08-21 17:18:48 +02:00
Eric Kohl fc84d6860a [ROUTE] Sort network interfaces by index 2025-08-20 21:41:51 +02:00
Doug Lyons 05caf99940 [NTOS:MM] Fix Lazarus hang when closing running project with "X" (#8331)
CORE-20172
Make DbgkUnMapViewOfSection in function MiRosUnmapViewOfSection contingent on MapCount being 0.
2025-08-20 14:18:25 -05:00
Carl J. Bialorucki 693e1ebc4c [APITESTS] Add GetNTDDIVersion() for NTDDI version detection at runtime (#8340)
- Introduce GetNTDDIVersion() to get NTDDI version at runtime for apitests.
- Introduce GetMajorNTVersion() and GetMinorNTVersion() macros and use them for GetNTVersion()
- Introduce GENERATE_NTDDI() macro to construct NTDDI values from major, minor, service pack, and subversion values.
- Introduce NTDDI_MIN and NTDDI_MAX macros for tests that use NTDDI ranges.

Note: the build number in KUSER_SHARED_DATA is only populated on Windows 10 RTM and later. On older Windows versions, this field is reserved and is usually 0. For this reason, I chose not to expose it as a macro.
2025-08-20 12:54:46 -06:00
Hervé Poussineau 4da4648092 [WIN32SS:USER] Add 'DISPLAY' as an alternate name for global display
CORE-20303
2025-08-20 19:33:17 +02:00
Hervé Poussineau 45c8cf7efd [WIN32SS:USER] UserEnumDisplayDevices: correctly report monitor device ids
desk.cpl can now open Monitor properties.
2025-08-20 19:33:17 +02:00
Doug Lyons 8e6fbe0c90 [NTUSER][COMCTL32] Fix garbage displayed at bottom of listbox.c (#8316)
CORE-20062
@I_Kill_Bugs fix for rect.bottom in LISTBOX_Paint function.
2025-08-20 11:34:44 -05:00
Eric Kohl 1a61f50ddd [ROUTE] Map interface index to ip address in the active routes list 2025-08-20 13:31:41 +02:00
Eric Kohl f0ba72616d [ROUTE] Add improve the the delete command
- Add wildcard support to the delete command
- Add code to delete persistent routes
- Improve command line and registry value name parsing code
2025-08-19 16:23:01 +02:00
Eric Kohl 714dfdc29a [ROUTE] Add /f option to the add and delete command 2025-08-19 10:59:02 +02:00
Eric Kohl 2cba5b772d [ROUTE] Add missing advapi32 2025-08-18 22:26:59 +02:00
Eric Kohl e0bdfb04f1 [ROUTE] Add support for persistent routes to the add and print command 2025-08-18 22:09:27 +02:00
Eric Kohl 4ddebadc7e [ROUTE] Support the -f and -p options and and improve the help text 2025-08-18 11:33:21 +02:00
Eric Kohl 46c2a3cd09 [ROUTE] Some improvements
- Improvements to the usage text
- Use GetAdapterAdresses instead of GetAdaperInfo
- Show the physical address for ethernet adapters
2025-08-17 21:02:00 +02:00
Eric Kohl 36533549a2 [IPHLPAPI] GetAdapterAddresses: Retrieve DnsSuffix 2025-08-17 14:45:19 +02:00
Eric Kohl 0502e33ae4 [IPHLPAPI] Improve GetAdapterAddresses
- Return the adapter name, friendly name and description for the loopback adapter.
- Return the description for network adapters.
2025-08-17 01:37:14 +02:00
Serge Gautherie a871ff1763 [SDK] ntddndis.h: Add/Update 3 NDIS typedefs (#8319) 2025-08-16 19:05:42 +02:00
Serge Gautherie d68a9d7aa4 [KMTESTS] KmtAreInterruptsEnabled(): Be explicit about architectures (#8295)
Let this function compile/run on other architectures, like ARM*.
And improve code a bit.

ROSTESTS-363
2025-08-16 19:03:17 +02:00
Serge Gautherie 5ae1c72395 [NDIS] NDIS_TAG: Fix definition and usages (#8243)
- Let it be `"NDIS"`, instead of variations of `"SIMN"`.
- Use matching `ExFreePoolWithTag()`.
- Remove a redundant `KeyInformation = NULL;`.

Addendum to commits e8861acfb2 (r12196) and 5658b2154c (r53045).
CORE-18791
2025-08-16 19:01:55 +02:00
Serge Gautherie 7e294faff4 [UNIATA] Upgrade to v0.47b from v0.47a (#8177)
- Remove unused idedma.def
  Addendum to commit 1daf74908e (r29256).

- Convert a few files to UTF-8 from ANSI
  Plus, 2 tiny formatting fixes.

- id_ata.cpp: Unmark a ReactOS own diff
  Addendum to commit 7fdf078134.

- id_init.cpp: Mark a diff
  Addendum to commit 09dde2cff9.

- Upgrade to v0.47b from v0.47a

CORE-17876
2025-08-16 18:56:58 +02:00
Serge Gautherie f100d34638 [NDIS][PSDK] Define IOCTL_NDIS_RESERVED7 and add a stub (#8240)
Another small step, until further investigation and implementation.

CORE-13831
2025-08-16 19:54:21 +03:00
Serge Gautherie 513e977fbc [INTL] "sLanguage" actually relates to LOCALE_SABBREVLANGNAME, not LOCALE_SLANGUAGE (#8089)
Similar to commit ba507ba439 (PR #62)
CORE-13128 CORE-15848
2025-08-16 18:52:00 +02:00
Eric Kohl 7432f4e9d9 [ROUTE] Improvements to the ROUTE command
- Show the physical address for ethernet interfaces.
- Implement wildcard support for the print command (e.g. route print 192.168.*).
2025-08-16 15:55:54 +02:00
Eric Kohl 559a4ec918 [ROUTE] Convert ROUTE to UNICODE only 2025-08-16 11:35:26 +02:00
Eric Kohl 050d8a8d65 [ROUTE] Make ROUTE translatable
- English text only
2025-08-15 19:22:15 +02:00
Hermès Bélusca-Maïto 752f6b5591 [MSGINA] Erase passwords & set focus back to the password field, in failure cases (#8337)
Do this in the "Logon", "Unlock Computer", and "Change Password" dialogs.
2025-08-14 23:28:25 +02:00
Hermès Bélusca-Maïto bded90874e [WINLOGON] Let the dialog manager manage the default focus (#8337)
- The single default button in the "Shutdown Computer" and "GINA failed
  to load" dialogs will be automatically focused by the dialog manager,
  so there is no need to invoke `SetFocus()` in their `WM_INITDIALOG`
  handler -- which also erroneously returned `TRUE`, thus ignoring any
  focus set by the caller :D

- Use `DeleteMenu()` instead of `RemoveMenu()` so that it'll free any
  memory resources.
2025-08-14 23:28:08 +02:00
Hermès Bélusca-Maïto 35ecbde693 [WINLOGON] *.rc: Fix dialog controls IDs; adjust few translations (#8337)
- "1" == `IDOK`; "-1" == `IDC_STATIC`
- Use the same translation for "Restart" between the two
  "GINA failed to load" and "Shutdown Computer" dialogs.
2025-08-14 23:28:08 +02:00
Hermès Bélusca-Maïto 20b3673aab [MSGINA] Fix default focus to dialog controls (#8337)
Fix some erroneous `SetFocus()` invocations in dialog procedures:

- In `WM_INITDIALOG`, don't return `TRUE` if focus is changed to a
  control, otherwise any focus set by the caller would be ignored;

- In other handlers, `SetFocus()` would generate an inconsistent
  behaviour with the dialog push-buttons, as mentioned in:
  https://devblogs.microsoft.com/oldnewthing/20040802-00/?p=38283
2025-08-14 23:28:02 +02:00
Hermès Bélusca-Maïto d537052196 [MSGINA][SHELL32] Make the minimal shutdown and logoff dialogs handle WM_ACTIVATE similarly (#8334)
Fix also the `LOGOFF_DLG_CONTEXT Context` in `shell32!LogoffWindowsDialog()`
not being initialized to default values.
2025-08-14 17:56:43 +02:00
Hermès Bélusca-Maïto 61623ab497 [MSGINA] Use IDOK/IDCANCEL for the "Log Off ReactOS" Yes/No buttons (#8334)
This allows pressing ENTER or ESC on the keyboard and have the correct
action done. The equivalent dialog in shell32.dll was already using that.
Simplify the associated code as well.

Also: remove the unused `", 400, 0, 1"` `FONT` resource specification info.
2025-08-14 17:56:42 +02:00
Hermès Bélusca-Maïto 10b0101cc5 [MSGINA] *.rc: Default to "Lock Computer" in the "Security" dialog (#8334)
And add missing keyboard accelerators to the dialog buttons
(except for Hebrew where it's not clear what the preferred way
of specifying accelerators is).
2025-08-14 17:56:42 +02:00
Hermès Bélusca-Maïto dc43104a70 [MSGINA] *.rc: Simplify BS_DEFPUSHBUTTON style (#8334)
Indeed, `DEFPUSHBUTTON` == `PUSHBUTTON ..., BS_DEFPUSHBUTTON` with
also the `WS_TABSTOP` style that is needed for keyboard navigation.
2025-08-14 17:56:22 +02:00
Adam Słaboń 8ecfbb3a8c [SETUPLIB] Fix system partition selection DPRINTs (#8336)
Some partition entries (such as those added by the CreateInsertBlankRegion function) may not have their Volume member allocated. This fixes the USETUP crash when such partitions are handled.
2025-08-14 17:40:52 +02:00
Eric Kohl dc97a4d380 [DHCPCSVC][IDL] Implement DhcpRemoveDNSRegistrations()
The dnsapi.dll part is still missing.
2025-08-14 14:44:04 +02:00
Hermès Bélusca-Maïto c29e4eb944 [WINLOGON] Move WlxShutdown() GINA notification in HandleShutdown() (#8329)
- Both 3rd-party modules and GINA shutdown notifications should be
  called just when shutdown is being started.

  Addendum to commit d3b9c68d22 (r66252)
  CORE-8322

- Factor the two `DisplayStatusMessage()` calls for shutdown vs. reboot.
2025-08-13 16:31:45 +02:00
Hermès Bélusca-Maïto 27e147a8ce [WINLOGON] Fixes for logon/logoff steps and notifications (#8325)
- The `LogonHandler` notification should be invoked only once for a
  given logon operation. It is invoked in `HandleLogon()` after access
  to the window station (and desktop) is allowed for the user logging in.
  And so, it must not be invoked elsewhere, when no user is logged in
  (or a logon failure happened), like after a call to `WlxDisplaySASNotice()`...

- Invoke the `StartShellHandler` notification **before** starting the
  shell, and the `PostShellHandler` notification **after** the shell
  started.

- Invoke the `LogoffHandler` notification on the application desktop,
  just after having terminated all the user's programs, and before
  switching back to Winlogon's desktop.

- Add and show the 'Logging off' status message.

- When performing the following actions:
  `WLX_SAS_ACTION_LOGOFF`, `WLX_SAS_ACTION_FORCE_LOGOFF`,
  as well as:
  `WLX_SAS_ACTION_SHUTDOWN`, `WLX_SAS_ACTION_SHUTDOWN_POWER_OFF`,
  `WLX_SAS_ACTION_SHUTDOWN_REBOOT`,
  ensure that Winlogon is in a correct LogonState for doing the logoff
  sequence.

----

Test results for Winlogon notifications, after fix:

- `Asynchronous: FALSE, Impersonation: FALSE`

  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventStartShell: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventPostShell: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLock: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventUnlock: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventStartScreenSaver: 32 tests executed (0 marked as todo, 6 failures), 0 skipped.
  WLEventStopScreenSaver: 32 tests executed (0 marked as todo, 5 failures), 0 skipped.
  WLEventLogoff: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```

- `Asynchronous: FALSE, Impersonation: TRUE`

  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventStartShell: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventPostShell: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventLock: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventUnlock: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventStartScreenSaver: 34 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventStopScreenSaver: 34 tests executed (0 marked as todo, 2 failures), 0 skipped.
  WLEventLogoff: 34 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```
2025-08-13 16:26:59 +02:00
Eric Kohl 0bd6b3dd58 [DHCPCSVC][PSDK] Clean up, add some documentation and missing declarations 2025-08-13 14:58:27 +02:00
Serge Gautherie f6346c6228 [NTOS:KE] Fix X86_FEATURE_MTTR typo (#8330)
"MTTR" should read: "MTRR".
2025-08-13 12:25:43 +02:00
Eric Kohl 0f4e223ce7 [DHCPCSVC] Implement the dhcp release message and fix the dhcp registry values
- Do not modify the EnableDHCP value as it should not be changed by the service.
2025-08-12 23:25:38 +02:00
Hermès Bélusca-Maïto 51ee32f5f8 [WINLOGON] Close all the user network connections only at logoff (#8324)
Per-user network connections (to shared drives...) are restored at user
logon: `HandleLogon() -> RestoreAllConnections()`.
These connections should be closed only at user logoff, in `HandleLogoff()`,
instead of inside the common logoff/shutdown thread, which is also invoked
at... shutdown!

- Isolate the network connections closing inside a `CloseAllConnections()`
  helper (which also performs the necessary user thread impersonation).

- Invoke this helper directly inside `HandleLogoff()`, and also re-enable
  the `IDS_CLOSINGNETWORKCONNECTIONS` message display.
2025-08-12 23:01:47 +02:00
Mohammed al-Ramadany 4f61d2ea04 [KERNEL32] Fix use-after-free in GetStartupInfoA (#8282)
- Set StartupInfo to point to the global BaseAnsiStartupInfo only after the local data has been freed.
2025-08-11 17:17:29 -06:00
Hermès Bélusca-Maïto 78ce856564 [WINLOGON] Duplicate the logged-in user/domain names and give them to the notifications (#8322)
Test results:

- Test 1a: `Asynchronous: FALSE, Impersonation: FALSE`
  BEFORE the fix:

  OK, the thread isn't impersonated:
  ```
  Thread Token   : 0x00000000 - User: '(null)\(null)'
  ```
  BUT these two WLX notify info fields aren't set when the user is logged in:
  ```
  Info.UserName       : '(null)'
  Info.Domain         : '(null)'
  ```

  Results:
  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 30 tests executed (0 marked as todo, 3 failures), 2 skipped.
  WLEventStartShell: 30 tests executed (0 marked as todo, 3 failures), 2 skipped.
  (NOTE: WLEventPostShell isn't yet implemented in ReactOS)
  WLEventLock: 30 tests executed (0 marked as todo, 4 failures), 2 skipped.
  WLEventUnlock: 30 tests executed (0 marked as todo, 3 failures), 2 skipped.
  WLEventStartScreenSaver: 30 tests executed (0 marked as todo, 9 failures), 2 skipped.
  WLEventStopScreenSaver: 30 tests executed (0 marked as todo, 7 failures), 2 skipped.
  WLEventLogoff: 30 tests executed (0 marked as todo, 4 failures), 2 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```

- Test 1b: `Asynchronous: FALSE, Impersonation: FALSE`
  AFTER the fix:

  OK, the thread isn't impersonated:
  ```
  Thread Token   : 0x00000000 - User: '(null)\(null)'
  ```
  OK, these two WLX notify info fields are now set when the user is logged in:
  ```
  Info.UserName       : 'Administrator'
  Info.Domain         : 'MYCOMPUTERNAME'
  ```

  Results:
  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventStartShell: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  (NOTE: WLEventPostShell isn't yet implemented in ReactOS)
  WLEventLock: 32 tests executed (0 marked as todo, 2 failures), 0 skipped.
  WLEventUnlock: 32 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventStartScreenSaver: 32 tests executed (0 marked as todo, 7 failures), 0 skipped.
  WLEventStopScreenSaver: 32 tests executed (0 marked as todo, 5 failures), 0 skipped.
  WLEventLogoff: 32 tests executed (0 marked as todo, 2 failures), 0 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```
  Less failed tests and none skipped anymore.

- Test 2a: `Asynchronous: FALSE, Impersonation: TRUE`
  BEFORE the fix:

  OK, the thread impersonates the user when (s)he is logged in:
  ```
  Thread Token   : 0x00000360 - User: 'MYCOMPUTERNAME\Administrator'
  ```
  BUT these two WLX notify info fields aren't set when the user is logged in:
  ```
  Info.UserName       : '(null)'
  Info.Domain         : '(null)'
  ```

  Results:
  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 31 tests executed (0 marked as todo, 5 failures), 2 skipped.
  WLEventStartShell: 31 tests executed (0 marked as todo, 5 failures), 2 skipped.
  (NOTE: WLEventPostShell isn't yet implemented in ReactOS)
  WLEventLock: 31 tests executed (0 marked as todo, 6 failures), 2 skipped.
  WLEventUnlock: 31 tests executed (0 marked as todo, 5 failures), 2 skipped.
  WLEventStartScreenSaver: 32 tests executed (0 marked as todo, 6 failures), 2 skipped.
  WLEventStopScreenSaver: 32 tests executed (0 marked as todo, 4 failures), 2 skipped.
  WLEventLogoff: 32 tests executed (0 marked as todo, 4 failures), 2 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```

- Test 2b: `Asynchronous: FALSE, Impersonation: TRUE`
  AFTER the fix:

  OK, the thread impersonates the user when (s)he is logged in:
  ```
  Thread Token   : 0x00000360 - User: 'MYCOMPUTERNAME\Administrator'
  ```
  OK, these two WLX notify info fields are now set when the user is logged in:
  ```
  Info.UserName       : 'Administrator'
  Info.Domain         : 'MYCOMPUTERNAME'
  ```

  Results:
  ```
  WLEventStartup: 30 tests executed (0 marked as todo, 1 failure), 0 skipped.
  WLEventLogon: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventStartShell: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  (NOTE: WLEventPostShell isn't yet implemented in ReactOS)
  WLEventLock: 33 tests executed (0 marked as todo, 4 failures), 0 skipped.
  WLEventUnlock: 33 tests executed (0 marked as todo, 3 failures), 0 skipped.
  WLEventStartScreenSaver: 34 tests executed (0 marked as todo, 4 failures), 0 skipped.
  WLEventStopScreenSaver: 34 tests executed (0 marked as todo, 2 failures), 0 skipped.
  WLEventLogoff: 34 tests executed (0 marked as todo, 2 failures), 0 skipped.
  WLEventShutdown: 31 tests executed (0 marked as todo, 3 failures), 0 skipped.
  ```
  As well, less failed tests and none skipped anymore.
2025-08-11 22:00:23 +02:00
Hermès Bélusca-Maïto b1322d43b2 [USERENV] LoadUserProfileW(): Improve handling of lpProfileInfo->lpProfilePath (#8321)
- As mentioned in the previous MSGINA commit aa67222595,
  `lpProfilePath` specifies the path to a *roaming* user profile,
  for example on a domain server, if any. It is then used to create
  a local image (copy) of the profile on the local computer.

  HOWEVER (ReactOS HACK):
  We currently don't implement this in ReactOS; instead, we use it
  directly as *the* user's profile path, without doing any copy...

- Yes, MS Windows allows `lpProfileInfo->lpProfilePath` to be NULL :)
2025-08-11 21:57:58 +02:00
Hermès Bélusca-Maïto aa67222595 [MSGINA] CreateProfile(): Fix initialization of some WLX_PROFILE_V2_0 members (#8321)
The following members of the returned `WLX_PROFILE_V2_0` structure:
`pszProfile`, `pszPolicy`, `pszNetworkDefaultUserProfile`, and
`pszServerName`, have a specific meaning and are used when logging
to (NT4, Active Directory...) domains.
See the added code comments for details.

In particular, `pszProfile` specifies the path to a *roaming* user
profile[^1] on a domain server, if any. It **DOES NOT** specify the local
`"C:\Documents and Settings"` path (got via `GetProfilesDirectoryW()`).

Since we don't really support user login on domains, set these pointers to NULL.

----

Enabling UserEnv debug logging[^2] on Windows 2003, one can observe such
following traces, for a `TestUser` roaming user profile:
```
USERENV(148.14c) 20:24:59:821 LoadUserProfile: Entering, hToken = <0x8bc>, lpProfileInfo = 0x6e5d8
USERENV(148.14c) 20:24:59:875 LoadUserProfile: lpProfileInfo->dwFlags = <0x0>
USERENV(148.14c) 20:24:59:912 LoadUserProfile: lpProfileInfo->lpUserName = <TestUser>
USERENV(148.14c) 20:24:59:966 LoadUserProfile: lpProfileInfo->lpProfilePath = <C:\Documents and Settings\TestUser_Roaming>
USERENV(148.14c) 20:25:00:021 LoadUserProfile: lpProfileInfo->lpDefaultPath = <\\PC-H\netlogon\Default User>
USERENV(148.14c) 20:25:00:075 LoadUserProfile: NULL server name
...
USERENV(148.14c) 20:25:06:177 CopyProfileDirectoryEx: Found hive file NTUSER.DAT
USERENV(148.14c) 20:25:06:395 ReconcileFile: C:\Documents and Settings\TestUser_Roaming\NTUSER.DAT ==> C:\Documents and Settings\TestUser\NTUSER.DAT  [OK]
...
```
The `lpProfilePath` specifies a roaming profile directory (`"TestUser_Roaming"`)
for a user named named `TestUser`, and UserEnv proceeds to image the roaming
profile into the directory (`"TestUser"`) in the local computer.

However, when the user has a local profile, the `lpProfilePath` is set to
NULL in this case, and one observes instead:
```
USERENV(148.14c) 20:21:22:644 LoadUserProfile: NULL central profile path
```

----

[^1]: The following links explain this, also demonstrating UserEnv debug logging:
    - https://web.archive.org/web/20130319204738/http://blogs.technet.com/b/askds/archive/2008/11/11/understanding-how-to-read-a-userenv-log-part-2.aspx
    - https://web.archive.org/web/20150405040409/http://blogs.technet.com/b/ad/archive/2007/08/20/tracking-user-environment-creation.aspx

[^2]: For more details, see:
  https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/221833
  (archived from: http://support.microsoft.com/kb/221833)
  UserEnv debug logging is achieved by adding a `REG_DWORD` value named
  `UserEnvDebugLevel` in the following registry sub-key:
  `HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon`
  with a non-zero value.
  To view the output in a debugger (e.g. WinDbg when kernel-debugging
  Windows), set the value to `0x00020002`.
2025-08-11 21:55:43 +02:00