Compare commits

..

368 Commits

Author SHA1 Message Date
Justin Miller
ae82771d43 [SDK][KernelBase][Kernel32] Build Wine-10.0 kernelbase 2025-05-29 01:14:01 -07:00
Justin Miller
a775284d21 [KernelBase][Kernel32][SDK] Build path.c from KernelBase 2025-05-29 00:56:02 -07:00
Justin Miller
9438150b2f [KernelBase] Import KernelBase from WINE-10.0 2025-05-29 00:56:01 -07:00
Justin Miller
7477aa5030 [SDK][MODULES] Fix a test and add wine-10 entries to headers 2025-05-29 00:56:01 -07:00
Justin Miller
edef68afb7 [SDK] Update ThreadInfoClass to wine-10.0 2025-05-29 00:56:01 -07:00
Serge Gautherie
bc03c010b3 [WIN32K:DIB] USE_DIBLIB: Use new DIB_16BPP_AlphaBlend() (#4568)
* [WIN32K:DIB] Fix 'DIB_16BPP_AlphaBlend' copypasta in a DPRINT()

Addendum to 684c3d3 (r49275).

* [WIN32K:DIB] USE_DIBLIB: Use new DIB_16BPP_AlphaBlend()

Addendum to 7540c2e (r64953).
2025-05-28 22:06:41 -05:00
Hervé Poussineau
72dcb3a11f [WIN32SS:ENG] Initialize pdo variable before using it 2025-05-28 23:37:28 +02:00
Hervé Poussineau
9f21cc3e98 [WIN32SS:ENG] Do not allocate 0 bytes if no monitor is reported
Addendum to 2f00ca4663
2025-05-28 18:26:23 +02:00
Hervé Poussineau
4534537036 [WIN32SS:USER] Remove useless assignations of pdo variable
Addendum to 30a7d19d84
2025-05-28 18:26:23 +02:00
Katayama Hirofumi MZ
9853f1de67 [KBSWITCH] Make message handlers functions (#8044)
Simplify window procedure management.
JIRA issue: CORE-20142
- Make message handling codes some
  functions (KbSwitch_On...).
2025-05-28 21:45:30 +09:00
Katayama Hirofumi MZ
b4e471c87d [IMM32][SDK] Add install.c and move some code (#8032)
Splitting IME installation code for code readability.
JIRA issue: CORE-19268
- Add win32ss/user/imm32/install.c.
- Move some code to install.c.
- Add SAL annotations. Use debugstr_a/_w macro.
- Modify <imm32_undoc.h>.
- Don't CharUpperW for IME pathname due to
  security reason.
2025-05-28 16:08:51 +09:00
Carl J. Bialorucki
b627a42898 [APPSHIM_APITEST] Fix test for x86 Vista and 7 (#8042)
On x86 builds, accept the sentinel hmodule instead of the 111 hmodule and 0 hmodule for Vista and 7.
2025-05-27 16:11:42 -06:00
Eric Kohl
7015c76c63 [ADVAPI32] Do not call the classic service handler function with an event control code 2025-05-27 23:37:19 +02:00
Katayama Hirofumi MZ
d4c64771cd [CTFMON][MSCTF][MSCTFIME][MSUTB] Move CTF modules to base/ctf (#8040)
This PR reorganizes the location of
the CTF-related modules to improve
grep-ability, understanding, and
readability. New folder base/ctf will
become incomplete Cicero, CTF or
TSF (Text Services Framework).
JIRA issue: CORE-19360
JIRA issue: CORE-19361
JIRA issue: CORE-19363
- Move ctfmon, msctf, msctfime,
  and msutb modules to new
  directory base/ctf.
- Adapt CMakeLists.txt to this move.
- Modify .github/labeler.yml and
  media/doc/WINESYNC.txt.
- No code content changes except
  CMakeLists.txt, .github/labeler.yml,
  and media/doc/WINESYNC.txt.
2025-05-28 05:04:03 +09:00
Hermès Bélusca-Maïto
2a0d98c2bc [DOSKEY][USETUP][KERNEL32][NTVDM][CONSRV][REGEXPL] Fix build (#8019)
Fix build after the move and update of private console API
definitions to wincon_undoc.h
2025-05-27 20:52:20 +02:00
Hermès Bélusca-Maïto
412fe7d9ac [SDK] Improve wincon.h and add wincon_undoc.h (#8019)
- Add missing WINBASEAPI modifiers.
- Update/add missing SAL annotations.
- Add missing function argument names.
- Only keep public definitions there.
- Move private/undocumented ones in a new wincon_undoc.h

This header is based on the following resources:
- https://undoc.airesoft.co.uk/kernel32.dll/
- https://github.com/microsoft/terminal/blob/main/dep/Console/ntcon.h
- https://github.com/microsoft/terminal/blob/main/dep/Console/winconp.h
  (commit f08321a0b2)
2025-05-27 20:52:19 +02:00
Hermès Bélusca-Maïto
228156e79f [SDK][SHELL] Sort out SEE_MASK_* and CMIC_MASK_* defines (#8019)
- Add missing versioning defines for the different SEE_MASK_*
  and CMIC_MASK_* defines.
- Move the five undocumented SEE_MASK_* defines into reactos/undocshell.h
2025-05-27 20:52:19 +02:00
Hermès Bélusca-Maïto
07ab1cc82d [SDK] winuser.h: Add missing Vista+ WinEvent defines (#8019) 2025-05-27 20:52:18 +02:00
Hermès Bélusca-Maïto
6696d40cfc [SDK] Introduce winbase_undoc.h for undocumented exported kernel32 definitions (#8019)
This header is based on the following files from the official
Windows 10.0.10240.0 PSDK, a copy of which can be found at:
- https://github.com/tpn/winsdk-10/blob/master/Include/10.0.10240.0/um/minwin/winbasep.h
- https://github.com/tpn/winsdk-10/blob/master/Include/10.0.10240.0/um/minwin/wbasek.h
2025-05-27 20:52:17 +02:00
Hermès Bélusca-Maïto
4fce13e06b [SDK] winbase.h: Add missing WINADVAPI define (#8019) 2025-05-27 20:52:16 +02:00
Hermès Bélusca-Maïto
2c5bba3c48 [SDK] sdkddkver.h: Add NTDDI_* defines for newest Windows 11 versions (#8019)
And add version descriptions, from https://github.com/MiroKaku/Veil
and cross-checked with BetaWiki ones.
2025-05-27 20:52:15 +02:00
Hermès Bélusca-Maïto
14877a7ec6 [CODEOWNERS] Sort out entries for "Win32 Subsystem" 2025-05-27 20:52:14 +02:00
Hervé Poussineau
30a7d19d84 [WIN32SS:USER] Rework UserEnumDisplayDevices to correctly report monitors
desk.cpl now returns the correct monitor name.
2025-05-27 20:34:37 +02:00
Hervé Poussineau
29b5003455 [VIDEOPRT] Implement IOCTL_VIDEO_ENUM_MONITOR_PDO 2025-05-27 20:34:37 +02:00
Hervé Poussineau
2f00ca4663 [WIN32SS:ENG] Retrieve and store list of associated monitors for each video adapter device 2025-05-27 20:34:37 +02:00
Katayama Hirofumi MZ
17577d2581 [IMM32][SDK] Support ImmIMPQueryIMEA/W and ImmIMPSetIMEA/W (#8033)
Implementing missing features...
These functions are given for IME
program handling.
JIRA issue: CORE-19268
- Implement ImmIMPQueryIMEA
  and ImmIMPQueryIMEW functions.
- Implement ImmIMPSetIMEA and
  ImmIMPSetIMEW functions.
- Add prototypes to <imm32_undoc.h>.
2025-05-27 20:10:25 +09:00
Katayama Hirofumi MZ
3df71d678d [KBSWITCH] Make Alt+Shift working Part 1 (#8039)
Recently language switching (Alt+Shift)
was not working. This PR will fix
Alt+Shift (partially).
JIRA issue: CORE-18546
- Add WH_KEYBOARD_LL hook to
  detect Alt+Shift.
- Add delay to the action after language
  change.
- Increase g_SpecialIds not to be full.
- Delete useless ID_NEXTLAYOUT
  command.
2025-05-27 20:09:03 +09:00
Whindmar Saksit
c03d7794b8 [SHELL32_APITEST] Fixed SimpleIDListFromPath and SHGetFileInfo tests on NT5 (#8038) 2025-05-27 00:10:53 +02:00
Johannes Anderwald
4bdbb3092c [POWERCFG] Add Batteries page
Missing things are:
- "Show details for each battery" doesn't work
- Data are not updated on timer (you need to reopen the window)

Global battery doesn't work, but that's a ntoskrnl bug (CORE-19452)
2025-05-26 21:45:55 +02:00
Hervé Poussineau
f4992a4484 [RTL] Fix prototypes of RtlCreateUserSecurityObject and RtlCreateAndSetSD 2025-05-26 21:29:30 +02:00
Katayama Hirofumi MZ
5af1d7c6b1 [MSCTF][SDK][CTFMON][MSCTFIME][MSUTB] Add msctf.dll stubs (#8026)
Some baby steps to msctf.dll for CTF.
JIRA issue: CORE-19361
- Add all the export functions of msctf.dll.
- Modify msctf.spec.
- Modify sdk/include/psdk/msctf.idl
  and sdk/include/psdk/inputscope.idl.
- Add sdk/include/reactos/msctf_undoc.h.
- Include <msctf_undoc.h> in ctfmon,
  msctfime, and msutb.
2025-05-26 07:22:41 +09:00
Eric Kohl
99e2606982 [DC21x4][ne2000][netkvm][nvnet][pcnet][rtl8139] Implement OID_GEN_PHYSICAL_MEDIUM
CORE-20206
2025-05-25 23:48:38 +02:00
Katayama Hirofumi MZ
3194e0556f [MSCTF] Implement CheckAnchorStore function (#8025)
Implementing missing features...
JIRA issue: CORE-19361
2025-05-26 06:40:22 +09:00
Hervé Poussineau
0743ceefa2 [WIN32SS:ENG] Fix check to enable panning driver
If ldevtype is not LDEV_DEVICE_DISPLAY, pdm is really a PMDEVOBJ structure.
So, we must not read the dmFields value.
2025-05-25 20:24:00 +02:00
Eric Kohl
c699471994 [AUDIOSRV] Register and unregister device notifications 2025-05-25 17:15:23 +02:00
Eric Kohl
16e620d647 [ADVAPI32] Pass PnP data to services on SERVICE_CONTROL_DEVICEEVENT
Services can now receive PnP events.
2025-05-25 14:34:25 +02:00
Katayama Hirofumi MZ
55b6f3455c [CTFMON] Include <ime/indicml.h> and use INDICATOR_CLASS
CORE-19362
2025-05-25 19:48:17 +09:00
Katayama Hirofumi MZ
8a913baed8 [CONSRV] Improve Japanese (ja-JP) translation
CORE-18706
2025-05-25 19:36:12 +09:00
Eric Kohl
a6bdcbc007 [SERVICES] Refactor ScmControlService(Ex) and implement RI_ScSendPnPMessage 2025-05-25 10:34:13 +02:00
Katayama Hirofumi MZ
64fda67763 [KBSWITCH] s/ARRAYSIZE/_countof/
Use standard-ish macro.
CORE-18546
2025-05-25 08:27:13 +09:00
Doug Lyons
284f15be02 [USP10] Fix notepad without word-wrap 'select all' (#8016)
CORE-20176 & CORE-20177
2025-05-24 18:06:35 -05:00
Whindmar Saksit
6bd0ffc494 [SHELL32_APITEST] Fix control panel printers PIDL test (#8022) 2025-05-24 22:08:54 +02:00
Katayama Hirofumi MZ
57981ed025 [KBSWITCH] Unlink ntdll and add vDbgPrintExWithPrefix
CORE-18546
2025-05-24 23:23:22 +09:00
Katayama Hirofumi MZ
2041f3c7a1 [IMM32][GITHUB] Move dll/win32/imm32 to win32ss/user/imm32 (#8024)
imm32 and win32ss have common
interface. This move will improve
grep-ability.
JIRA issue: N/A
- Move dll/win32/imm32 to
  win32ss/user/imm32.
- Adapt CMakeLists.txt to this move.
- No code content change except
  CMakeLists.txt and .github\labeler.yml.
2025-05-24 13:44:47 +09:00
Whindmar Saksit
5299f047e4 [NTUSER][PSDK] Implement Snap DockMoving setting (#8020)
SPI_SETDOCKMOVING allows you to turn off window snapping when moving a window with the mouse. The Win keys can still snap unless you turn everything off with SPI_SETWINARRANGING.
2025-05-23 13:45:25 +02:00
Timo Kreuzer
e326b06983 [KMTEST] Improve MmSection test 2025-05-22 18:39:14 +00:00
Timo Kreuzer
08b6106aac [NTDLL_APITEST] Improve test for NtQuerySection 2025-05-22 18:39:14 +00:00
Timo Kreuzer
f920d349e0 [APITESTS] Improve ok_* macros to avoid format warnings 2025-05-22 18:39:14 +00:00
Timo Kreuzer
4cb4eee23a [E1000] Implement OID_GEN_PHYSICAL_MEDIUM 2025-05-22 18:37:55 +00:00
Katayama Hirofumi MZ
99064a58d9 [KBSWITCH] Enable Wine debug (#8010)
Debug easy and develop easy.
JIRA issue: CORE-18546
- Include <wine/debug.h>.
- Import ntdll and link to wine.
- Enable Wine debug.
2025-05-22 20:08:36 +09:00
Timo Kreuzer
40721f49ba [CRT_APITEST] Reorganize tests
- Move build files and testlist.c into individual modules folder
2025-05-21 14:29:29 +00:00
Timo Kreuzer
99d9e764a2 [CRT_APITEST] Fix GCC format warnings 2025-05-21 14:29:29 +00:00
Katayama Hirofumi MZ
ec5b1422bc [IMM32][SDK] Implement ImmIMPGetIMEA/W (#8011)
Implementing missing features...
JIRA issue: CORE-19268
- Add dll/win32/imm32/imepro.c.
- Move some utils.c code into imepro.c.
- Implement ImmIMPGetIMEA and
  ImmIMPGetIMEW functions there.
- Add prototypes into <imm32_undoc.h>.
- Delete needless code.
2025-05-21 07:16:39 +09:00
Timo Kreuzer
06034b258a [XDK] Some GCC/wine compatibility fixes 2025-05-20 18:13:16 +00:00
Timo Kreuzer
8369c55edb [WINE] wine/asm.h: add missing __ASM_DEFINE_IMPORT 2025-05-20 18:13:16 +00:00
Timo Kreuzer
0453ed98df [WINE] Improve wine/exception.h 2025-05-20 18:13:16 +00:00
Timo Kreuzer
876bba3d07 [PSDK] Add threadpoolapiset.h 2025-05-20 18:13:16 +00:00
Timo Kreuzer
ada4584cb6 [PSDK] make winnt.h compile with rtlsupportapi.h 2025-05-20 18:13:16 +00:00
Timo Kreuzer
61ff0eb940 [PSDK] Import rtlsupportapi.h from wine-10.0 2025-05-20 18:13:16 +00:00
Timo Kreuzer
2f30fda4f9 [VCRUNTIME] emmintrin.h: don expect _STATIC_ASSERT to be defined
Legacy headers, like the Wine msvcrt headers, do not define _STATIC_ASSERT
2025-05-20 18:13:16 +00:00
Timo Kreuzer
eff677ca98 [PSDK] winnls.h: add missing LOCALE_ALLOW_NEUTRAL_NAMES 2025-05-20 18:13:16 +00:00
Timo Kreuzer
95caf762d4 [XDK] Add missing _InlineInterlockedAdd 2025-05-20 18:13:16 +00:00
Timo Kreuzer
281855e88c [KMTEST] Fix MmSection tests 2025-05-20 16:30:06 +00:00
Whindmar Saksit
937954cf6c [BROWSEUI][SHELL32][SHLWAPI][BOOTDATA] Implement and use IRegTreeOptions (#7255) 2025-05-20 16:59:02 +02:00
Eric Kohl
3842b59f75 [TCPIP] Retrieve the interface medium type from NDIS
Send OID_GEN_PHYSICAL_MEDIUM and OID_GEN_MEDIA_SUPPORTED query requests to NDIS.

This will enable us to distinguish wired and wireless ethernet adapters.
2025-05-20 00:47:26 +02:00
Katayama Hirofumi MZ
c876fe350d [IMM32][NTUSER] Strictly check Cicero IME (#8009)
This PR enhances Cicero IME support.
JIRA issue: CORE-19268
- Add null checks for the functions
  of Cicero IMEs in Imm32LoadIME
  function.
- Add and use
  IS_CICERO_COMPAT_DISABLED
  macro in win32ss/include/ntuser.h.
- Fix ImmGetImeInfoEx,
  Imm32LoadImeDpi,
  ImmGetDescriptionA,
  ImmGetDescriptionW,
  ImmGetIMEFileNameA,
  ImmGetIMEFileNameW, and
  ImmGetProperty functions for
  Cicero IME support.
- Set last error in NtUserGetImeInfoEx.
2025-05-20 07:34:46 +09:00
Katayama Hirofumi MZ
7ce90a0399 [IMM32] NotifyIME: Improve debug trace (#8005)
JIRA issue: CORE-19455
- Add some traces for NotifyIME calls.
- Improve Imm32MakeIMENotify trace.
- Make some parameter types of
  Imm32MakeIMENotify function
  DWORD's.
- Fix and improve ERR_PRINTF macro.
2025-05-20 07:30:46 +09:00
Hervé Poussineau
eff61af6df [IPHLPAPI] Call tcpip.sys driver to get IP/TCP/UDP statistics
CORE-19596
2025-05-19 21:07:58 +02:00
Hervé Poussineau
7cc36bd42f [PSDK] Add TCP_MIB_STAT_ID/UDP_MIB_STAT_ID 2025-05-19 21:07:58 +02:00
Eric Kohl
c477928b0e [HIDCLASS] Override hid device capabilities
- Disable the Removable capability
- Enable the SilentInstall and SurpriseRemovalOK capabilities

This keeps the remove device icon from showing in the notification area whenever you plug in a mouse or a keyboard.
2025-05-19 00:29:10 +02:00
Katayama Hirofumi MZ
5d40ec3e8c [IMM32] ImeGetImeMenuItems is optional (#8008)
Supporting old IMEs.
JIRA issue: CORE-19268
Do null check of ImeGetImeMenuItems
function of IME side, in
ImmGetImeMenuItemsAW function.
2025-05-19 06:09:48 +09:00
Timo Kreuzer
eb9c664d7e [KERNEL32_APITEST] Revert manifest architecture changes
While the previous change didn't have any effect on ReactOS, it made the test crash on Windows 2003.
2025-05-18 17:53:12 +00:00
Timo Kreuzer
6b222fb084 [SHELL32_APITEST] Comment out OpenAs_RunDLL test
This test hangs on Windows 2003 and breaks testing on Windows 2003 x64.
2025-05-18 11:54:26 +00:00
Katayama Hirofumi MZ
8029339c49 [IMM32] Fix ImmLocalAlloc usage (#8007)
JIRA issue: CORE-19268
- Replaces LPTR with 0 in two calls
  to ImmLocalAlloc within imemenu.c
  (No need to zero-fill).
2025-05-17 06:35:17 +09:00
Katayama Hirofumi MZ
9e1f2b035f [NTUSER][USER32] Rewrite GetAncestor (#7978)
JIRA issue: N/A
- Set the last error.
- Check message window.
- Modify user32.spec.
2025-05-16 19:41:01 +09:00
Whindmar Saksit
53685ada35 [SHELL32][SHDOCVW] Only forward menu messages to the correct shell extension (#7968)
Folder Marker 1.4 fails if it gets a WM_INITPOPUPMENU it does not expect.

CORE-17811
2025-05-15 12:21:22 +02:00
Katayama Hirofumi MZ
6bfb792439 [IMM32][SDK] Add User32InitializeImmEntryTable to <undocuser.h> (#8006)
Declare function in proper place.
JIRA issue: CORE-19268
- Add User32InitializeImmEntryTable
  prototype to <undocuser.h> and use it.
2025-05-15 15:10:57 +09:00
Katayama Hirofumi MZ
6efbed51ac [BROWSEUI][FORMATTING] Quick Launch: Just formatting (#7998)
JIRA issue: N/A
Just fix indentation and formatting.
2025-05-15 07:57:23 +09:00
Katayama Hirofumi MZ
490f7af4ae [NETAPI32] Revert to Wine module (#8004)
Partially revert #7912.
JIRA issue: CORE-5743
Use wine instead of wine2ros.
2025-05-15 07:43:14 +09:00
Katayama Hirofumi MZ
e2e6fcdb96 [IMM32] Revert to Wine module (#8003)
Partially revert #7912.
JIRA issue: CORE-5743
- Use wine instead of wine2ros.
- Improve Unexpected Condition Checkers.
2025-05-15 07:38:49 +09:00
Doug Lyons
a2dd6efcb4 [COMCTL32] Fix StatusBar left border frame missing (#7979)
Remove flag BF_MIDDLE from DrawEdge function.

CORE-19854
2025-05-14 17:15:16 -05:00
Mohammad Amin Mollazadeh
0fa49018cd [FREELDR] Show a notice message when booting in debug mode (#7967)
Make FreeLoader print a notice message before it passes the control
to the kernel, if kernel-mode debugging is enabled via boot options.

This can be helpful for people who may forget that they're booting
in debug mode (the default boot option also for the bootcd) and they
need to attach a debugger for the boot process to continue.
2025-05-14 22:15:11 +02:00
Timo Kreuzer
947c03e948 [WS2_32][WS2HELP] On Vista+ forward all ws2help to ws2_32 2025-05-14 05:50:59 +00:00
Timo Kreuzer
8df62f2f2c [WS2_32] Add Vista exports 2025-05-14 05:50:59 +00:00
Timo Kreuzer
3a0e02cede [WS2_32] Improve exports
- Add 64 bit exports
- Fix some parameters
- Add stubs file to build
2025-05-14 05:50:59 +00:00
Timo Kreuzer
c47d1ffba6 [WS2_32] Fix export ordering
Put exports with ordinals at the top, sort the rest like on Windows.
2025-05-14 05:50:59 +00:00
Katayama Hirofumi MZ
4f84ffa118 [IMM32][SDK] Support IME menus Part 1 (#7969)
Supporting IME menus will improve
Asian users' usability. IME menu is
used on the IME System Pen icon.
JIRA issue: CORE-20142
- Add dll/win32/imm32/imemenu.c.
- Move some code to imemenu.c.
- Implement IME menu transporting
  correctly by using file mapping and
  serialization.
2025-05-14 11:02:57 +09:00
Katayama Hirofumi MZ
189623614d [ACCESS] Improve Japanese (ja-JP) translation Part 3 (#7997)
Follow-up of #7995.
JIRA issue: CORE-18706
2025-05-14 10:30:27 +09:00
Katayama Hirofumi MZ
626a875de1 [EXPLORER] Improve Japanese (ja-JP) translation (#7996)
JIRA issue: CORE-18706
2025-05-14 10:21:05 +09:00
Katayama Hirofumi MZ
6d1d6a7c51 [ACCESS] Improve Japanese (ja-JP) translation Part 2 (#7995)
Follow-up of #7994.
JIRA issue: CORE-18706
2025-05-14 10:13:19 +09:00
Katayama Hirofumi MZ
6d460b61bf [ACCESS] Improve Japanese (ja-JP) translation (#7994)
JIRA issue: CORE-18706
2025-05-14 10:07:04 +09:00
Katayama Hirofumi MZ
9e3546028d [SHELL32] Improve Japanese (ja-JP) translation (#7993)
JIRA issue: CORE-18706
2025-05-14 09:47:03 +09:00
Katayama Hirofumi MZ
e07cf7f629 [DXDIAG] Improve Japanese (ja-JP) translation (#7992)
JIRA issue: CORE-18706
2025-05-14 09:35:45 +09:00
Katayama Hirofumi MZ
6cca9a9466 [SERVMAN] Improve Japanese (ja-JP) translation (#7991)
JIRA issue: CORE-18706
2025-05-14 09:26:36 +09:00
Katayama Hirofumi MZ
f17f96cb7e [RAPPS] Update Japanese (ja-JP) translation (#7990)
JIRA issue: CORE-18706
2025-05-14 09:22:26 +09:00
Katayama Hirofumi MZ
2766144b8b [FC] Improve Japanese (ja-JP) translation (#7989)
JIRA issue: CORE-18706
2025-05-14 09:04:22 +09:00
Katayama Hirofumi MZ
0c5274549b [REG] Improve Japanese (ja-JP) translation (#7988)
JIRA issue: CORE-18706
2025-05-14 08:49:25 +09:00
Katayama Hirofumi MZ
42b48b7435 [HELP] Improve Japanese (ja-JP) translation (#7987)
JIRA issue: CORE-18706
2025-05-14 08:22:28 +09:00
Katayama Hirofumi MZ
28ff80d3d1 [NETID] Improve Japanese (ja-JP) translation (#7986)
JIRA issue: CORE-18706
2025-05-14 08:16:18 +09:00
Katayama Hirofumi MZ
aa79640218 [DEVMGR] Improve Japanese (ja-JP) translation (#7985)
JIRA issue: CORE-18706
2025-05-14 08:10:41 +09:00
Katayama Hirofumi MZ
4fe1f62ba3 [NETCFGX] Improve Japanese (ja-JP) translation (#7984)
JIRA issue: CORE-18706
2025-05-14 08:01:29 +09:00
Katayama Hirofumi MZ
42da121600 [SYSSETUP] Improve Japanese (ja-JP) translation (#7983)
JIRA issue: CORE-18706
2025-05-14 07:09:41 +09:00
Katayama Hirofumi MZ
99ecbf5e56 [KBSWITCH][SDK] Add indicml.h and change window class (#7970)
Supporting the IME System Pen icon.
JIRA issue: CORE-19268
- Change kbswitch window class to "Indicator"
  from "kbswitcher".
- Add <ime/indicml.h> from DDK.
2025-05-13 07:14:17 +09:00
Hervé Poussineau
49427c48c5 [WIN32SS:USER] If default display driver doesn't work, try with VGA
CORE-7728, CORE-16002, CORE-16009, CORE-19224, CORE-19951
2025-05-12 18:24:58 +02:00
Hervé Poussineau
dca369cf41 [WIN32SS:ENG] Rework EngpUpdateGraphicsDeviceList
- choose VGA adapter outside of driver initialization loop
- choose primary adapter outside of driver initialization loop
- link VGA adapter to primary adapter at the end
- only set DISPLAY_DEVICE_PRIMARY_DEVICE in this function

Also mark VgaSave driver as SystemStart instead of Disabled,
so it is available if main display driver doesn't work.
2025-05-12 18:24:55 +02:00
Katayama Hirofumi MZ
6df1cc63b6 [BROWSEUI] Fix 'bad window handle' on CShellBrowser::RepositionBars (#7980)
Silence "NtUserSetWindowPos bad window
handle!" error at win32k!NtUserSetWindowPos
function when Desktop has started up.
JIRA issue: CORE-19663
Add null check of window handle before
SetWindowPos call in
CShellBrowser::RepositionBars method.
2025-05-12 22:27:52 +09:00
Katayama Hirofumi MZ
d06d9f3e8f [SYSDM] Improve Japanese (ja-JP) translation (#7976)
JIRA issue: CORE-18706
Update dll/cpl/sysdm/lang/ja-JP.rc.
2025-05-11 21:57:55 +09:00
Katayama Hirofumi MZ
6a905ae2e1 [REACTOS] Improve Japanese (ja-JP) translation (#7975)
JIRA issue: CORE-18706
Update base/setup/reactos/lang/ja-JP.rc.
2025-05-11 21:57:07 +09:00
Eric Kohl
d32fd58722 [UMPNPMGR][ADVAPI32][SERVICES] Pass PNP events to the service manager
- umpnpmgr.dll: Call I_ScSendPnPMessage to report pnp events to the service manager.
- adavpi32.dll: Implement I_ScSendPnPMessage which calls the service managers RI_ScSendPnPMessage function.
- services.exe: Add a debug message to RI_ScSendPnPMessage.
2025-05-11 14:25:15 +02:00
Katayama Hirofumi MZ
00b5dc8b49 [BROWSEUI] Quick Launch: Refresh buttons on change notify (#7965)
Respond change notification on Quick Launch.
JIRA issue: CORE-18475
- Subclass CISFBand to handle messages.
- Register change notification.
- Refresh buttons on change notification.
- Use timer to reduce redrawing cost.
2025-05-11 06:04:14 +09:00
Whindmar Saksit
afe29ee7fa [BROWSEUI] Don't remember invoked non-folders in addressbar (#7954)
CORE-20091
2025-05-09 16:19:49 +02:00
Eric Kohl
e0ef51b11e [UMPNPMGR] PNP_RegisterNotification: Validate a service and keep its status handle in the notification entry 2025-05-09 01:00:59 +02:00
Hervé Poussineau
3729b96625 [WIN32SS:ENG] In case of error, display the name of the problematic file 2025-05-08 21:48:14 +02:00
Hervé Poussineau
a8abe1d677 [WIN32SS:ENG] Move debug log to the right place
Display number of prepared modes after preparing them, not at device creation
where this number is always 0.
2025-05-08 21:48:14 +02:00
Hervé Poussineau
a36bf31a0d [VGAMP] Correctly initialize interface before calling VideoPortInitialize 2025-05-08 21:48:14 +02:00
Hermès Bélusca-Maïto
f20efc6007 [INCLUDE][ATL] Fix WM_SETHOTKEY macro wrappers
WM_SETHOTKEY / WM_GETHOTKEY messages encode the hotkey in a different
way than with the WM_HOTKEY message.
For more details, see:
https://learn.microsoft.com/en-us/windows/win32/inputdev/wm-gethotkey
https://learn.microsoft.com/en-us/windows/win32/inputdev/wm-sethotkey

Addendum to commit 6829350af9 (PR #7947)
2025-05-08 18:57:43 +02:00
Eric Kohl
3bb27eb416 [UMPNPMGR] Fix buggy identification of window and service handles 2025-05-07 23:57:09 +02:00
Katayama Hirofumi MZ
0ca6002b4f [GDI32][NTGDI][SDK] Font/Text: Fix SAL2 annotations and const-ness (#7865)
I want to work in correct type info.
JIRA issue: CORE-17684
- Add and fix SAL2 annotations.
- Fix const-ness of function
  parameters.
- Delete needless type casts.
2025-05-06 15:13:04 +09:00
Katayama Hirofumi MZ
530d26a1f4 [NTGDI][NTUSER] Initial support of NtGdiRemoveFontResourceW (#7877)
Enable the users to delete fonts.
JIRA issue: CORE-17684
- Add IntDeleteRegFontEntry helper function.
- Add RegDeleteValueW and RegEnumValueW helper
  functions in win32ss/user/ntuser/misc/registry.c.
- Add some code to IntGdiRemoveFontResourceSingle
  function.
2025-05-06 12:38:54 +09:00
Katayama Hirofumi MZ
2c475add8c [IMM32][NETAPI32][SDK] Reduce Wine dependency (#7912)
Related to #7870. netapi32.dll uses NDK.
So, we have to reduce dependency on Wine.
JIRA issue: CORE-5743
- Introduce wine2ros module in
  sdk/lib/wine2ros/.
- Reduce Wine dependency.
2025-05-06 09:59:47 +09:00
Dmitry Borisov
45b928f8bc [ACPI] Remove section assignment from IOCTL handlers (#7829)
Fix a bug introduced in 5070e8960a.

CORE-17256

- These handlers must be memory resident. Otherwise,
  this would cause a page fault that needs to be resolved.
  Low-level storage drivers could evaluate ACPI control
  methods while the device's IRP queue has been paused.

- Minor code enhancements.
2025-05-05 22:42:11 +02:00
Timo Kreuzer
d1f9e06a4f [REACTOS] Change manifest architecture from "X86"/"" to "*" 2025-05-05 10:02:51 +00:00
Katayama Hirofumi MZ
93e9710caf [CRT_APITEST] Add setjmp testcase (Retry) (#7847)
Splitted from #7839. Improved a little.
JIRA issue: CORE-19265
2025-05-05 12:56:21 +09:00
Katayama Hirofumi MZ
7073bdfead [EXPLORER][SHELL32][SHELL32_APITEST][SDK] AppBar Part 2 (#7946)
Follow-up of #7778.
JIRA issue: CORE-7237
- Rename APPBARDATA3264 structure
  as APPBARDATAINTEROP.
- Fix structures for WoW64.
- Use trace instead of DPRINT1.
- Add CAppBarManager::
  RecomputeAllWorkareas function.
- Fix WM_DISPLAYCHANGE handling
  to re-compute the work areas.
2025-05-05 12:48:02 +09:00
Petru Răzvan
24c2e4433b [NETSHELL] Implement Right click menu (#7959)
This implements the right click menu on the network icon that is in the taskbar.

CORE-9055

Note that Repair isn't implemented and emits a "not implemented" message,
because as far as I see ReactOS has no repair functionality for internet.
2025-05-04 22:41:20 +02:00
Petru Răzvan
986c4778fa [REGEDIT] Fix Incorrect status bar (#7944)
This fixes the incorrect status bar that happens when context menu action is used.

CORE-19524
2025-05-04 22:38:21 +02:00
Mohammad Amin Mollazadeh
2e7cfa0400 [WINESYNC][COMCTL32] Move caret to the end on "select all" (#7939)
CORE-19903

comctl32/edit: Scroll caret on Ctrl+A.

wine commit id e71087cd39 by Vladislav Timonin <timoninvlad@yandex.ru>
2025-05-04 22:32:56 +02:00
Petru Răzvan
2aa6fc1c7f [WORDPAD] Fix garbage in "Get Text" dialog (#7922)
This fixes the garbage in the "Get Text" dialog which occurs if there is no text input
and one clicks on "Get Text" under Extras.

CORE-19868
Reported to Wine: https://bugs.winehq.org/show_bug.cgi?id=58144
2025-05-04 22:28:32 +02:00
Eric Kohl
7c8a8400e0 [SDK][LSASRV][SETUPAPI] Move undocumented service manager functions into a new header file 2025-05-04 20:15:48 +02:00
Hermès Bélusca-Maïto
fad52db479 [EVENTVWR] Add missing output buffer size parameters to some routines.
Fix also some bugs encountered while testing.
2025-05-04 17:54:28 +02:00
Marcin Jabłoński
39ce22150a [DESK][SHELL32] Remove desk.cpl hacks for argument parsing (#7934)
Remove argument parsing hacks from desk.cpl that were originally introduced to
make it work with the previous broken implementation of `Control_RunDLLW`.

CORE-20076

- Remove argument parsing hacks from desk.cpl;
- Fix some issues with space separated string parsing in `Control_RunDLL`;
- Windows seems to allow invalid dialog-box names if there is only one dialog-box.
2025-05-04 17:47:28 +02:00
Eric Kohl
9638666d84 [MOUCLASS] Only set the device interface state if we have an interface name 2025-05-04 17:28:37 +02:00
Eric Kohl
5414600e1e [KBDCLASS] Set the device interface state on device start and device remove 2025-05-04 17:27:23 +02:00
Mohammad Amin Mollazadeh
cc16769179 [SHELL32] Fix focus glitch when hovering separators with submenu open (#7932)
CORE-20124

Since `TB_HITTEST` returns negative numbers for ID for separator menu items [^1],
shell menu assumes mouse moved outside of the menu popup, highlighting the menu
item for currently open submenu.
To fix this behavior, we can detect separators in `CMenuFocusManager::ProcessMouseMove`
and negate the ID returned by `TB_HITTEST` to make it a positive number again,
so the shell menu wouldn't glitch.

[^1]: https://learn.microsoft.com/en-us/windows/win32/controls/tb-hittest
2025-05-04 17:11:44 +02:00
Mohammad Amin Mollazadeh
3e342246d4 [WINESYNC][COMCTL32] Fix large height for ComboBox when CBS_NOINTEGRALHEIGHT is specified (#7940)
CORE-19833

wine commit id d551564f1b by Orin Varley <ovarley@codeweavers.com>

comctl32: Make CBS_NOINTEGRALHEIGHT only set minimum combobox height.

When the combobox height is to be set by the application (as the CBS_NOINTEGRALHEIGHT style is on),
and when a large size is specified but only a small number of items in the list, the height of the
combobox should be set by the number of items rather than the size specified to avoid empty lines.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=57360
2025-05-04 16:59:54 +02:00
Timo Kreuzer
946f17e93d [NTOS] Fix x64 definition of MMPFN
Adjust the definition of COLORED_LIST_HEAD to always match the new MI_PTE_FRAME_BITS define.
2025-05-04 07:28:41 +00:00
Timo Kreuzer
fb8e6124e0 [NDK][XDK] Update definition of KUSER_SHARED_DATA with tests 2025-05-04 07:24:40 +00:00
Mohammad Amin Mollazadeh
21d3e290b7 [WINESYNC][COMCTL32] Don't delete font when destroying the control (#7941)
The font object `infoPtr->Font` is not owned by the `syslink` control, therefore freeing it would make the whole system use a different font. The fix provided by Wine removes the code that deletes this font object.

Imports Wine commit 480598680c

Fixes deleting system font object when destroying syslink. CORE-20127
2025-05-04 02:14:24 +03:00
Tim Abdiukov
a9ba54f678 [DWNL] Improve user experience and fix progress output (#7903)
- `CBindStatusCallback_UpdateProgress`:
  * Rework the failsafe check to enable percentage to be at 100%.
  * More thorough failsafe check, to avoid displaying 100% (or even 101%) where the actual and expected file sizes don't match.
- `case BINDSTATUS_ENDDOWNLOADDATA`: Do update the progress one last time to be at 100%, on download success.
2025-05-03 23:42:36 +02:00
Hermès Bélusca-Maïto
e6f5065f32 [EVENTVWR] Rewrite the way data is copied into the clipboard
CORE-20023

- Besides copying the event information, copy also its formatted data.

- Update translations with new IDS_COPY* strings.

- Eliminate all statically-sized temporary buffers, in favour of
  carefully calculating the size, and allocating an adequately
  sized buffer to hold the data to be copied.

- By default, the "title" and event info on the single-line fields,
  are separated with TABs (to facilitate data import in spreadsheets).
  Add a mode where, when the user presses the SHIFT key while clicking
  on the "Copy" button, the separation is instead done with space
  padding, to be able to prettify information display when copying
  into text files instead.
2025-05-03 17:15:29 +02:00
Hermès Bélusca-Maïto
85a69768d0 [EVENTVWR] DisplayEvent(): Avoid using multiple large statically-sized buffers
CORE-20023

And use a loop to fill the individual event item fields,
instead of repeating the same code over and over.
2025-05-03 17:15:18 +02:00
Whindmar Saksit
6829350af9 [SHELL32][NTUSER] Implement the SEE_MASK_HOTKEY/ICON/HMONITOR flags (#7947) 2025-05-03 16:08:58 +02:00
Timo Kreuzer
102c1db735 [NTDLL_APITEST] Fix x64 MSVC warnings 2025-05-03 08:01:03 +00:00
Timo Kreuzer
7af8ab2470 [NTDLL_APITEST] Add a test for NtQuerySection 2025-05-03 08:01:03 +00:00
Timo Kreuzer
4cee67df3f [CMAKE] Fix TREAT_ALL_WARNINGS_AS_ERRORS 2025-05-03 08:00:44 +00:00
Timo Kreuzer
2d57c60148 [WINMM] Silence MSVC warning about unary minus operator
mci.c(1012): warning C4146: unary minus operator applied to unsigned type, result still unsigned
2025-05-03 08:00:44 +00:00
Timo Kreuzer
edc8eb63c4 [RICHED20] Fix array bounds overflow
editor.c(4518): warning C4045: 'text': array bounds overflow
2025-05-03 08:00:44 +00:00
Timo Kreuzer
9bfa6b51be [BROWSEUI] Fix MSVC warning about unary minus operator
basebarsite.cpp(536): warning C4146: unary minus operator applied to unsigned type, result still unsigned
2025-05-03 08:00:44 +00:00
Doug Lyons
e98bba2535 [NTGDI:FREETYPE] Fix Fonts broken by opening VLC About (Retry of PR #4579) (#7952)
* Check is FontGDI->OriginalWeight > FontGDI->RequestWeight and if so, then return original weight.
* Do not handle FontGDI->OriginalWeight as a boolean. Use 'FontGDI->OriginalWeight = FW_DONTCARE;'.

CORE-17011
2025-05-01 17:44:10 -05:00
Whindmar Saksit
bbd6a57c0f [MSGINA][LSASRV] Support LSA secret DefaultPassword in autologon (#7936) 2025-05-01 17:51:42 +02:00
Stanislav Motylkov
21810f11e4 [REGEDIT] Update Russian (ru-RU) translation
Addendum to eb91f91569. CORE-19886
2025-05-01 16:36:11 +03:00
Marcin Jabłoński
b79a0447b9 [REGEDIT] Update Polish (pl-PL) translation (#7949)
Addendum to eb91f91569. CORE-19886
2025-05-01 16:26:33 +03:00
Katayama Hirofumi MZ
d722e70817 [SDK][USER32] Implement WM_IME_SYSTEM.IMS_SOFTKBDONOFF (#7950)
Supporting soft keyboard will improve IME
usability.
JIRA issue: CORE-19268
- Define IMS_SOFTKBDONOFF constant as
  0x13 in <immdev.h>.
- Implement
  WM_IME_SYSTEM.IMS_SOFTKBDONOFF
  message handling in ImeWnd_OnImeSystem.
2025-05-01 11:20:18 +09:00
Katayama Hirofumi MZ
e40e5f572f Revert "[COMCTL32] Pager: Fix PGM_RECALCSIZE behaviour (#7875)" (#7910)
Reverts #7875.
JIRA issue: CORE-20121
2025-04-30 20:38:22 +09:00
Katayama Hirofumi MZ
b33127f494 Revert "[CURSOR] Add Cursor AI project settings (#7752)" (#7913)
Reverts #7752
JIRA issue: CORE-20011
2025-04-30 20:36:41 +09:00
Whindmar Saksit
ba6760683b [SHELL32] Handle sort order in RegItems (#7906)
* [SHELL32] Handle sort order in RegItems

This makes the TweakUI "First icon on desktop" setting work correctly.
2025-04-30 13:31:58 +02:00
Hermès Bélusca-Maïto
b1cf981c52 [PSDK] Add missing hMonitor member in union with hIcon in SHELLEXECUTEINFOA/W
As documented in the official MS PSDK and MSDN.
2025-04-29 16:25:23 +02:00
Whindmar Saksit
37e2c59096 [RAPPS] Add ExeInZip installer type to support running installers in zip files (#7866) 2025-04-29 15:39:22 +02:00
Leon Frommholz
eb91f91569 [REGEDIT] Add missing status text for "New" elements (#7927)
Add missing status text for the "Multi-String Value" and
"Expandable String Value" in the "New" menu of the registry editor
for the English and German languages.

CORE-19886
2025-04-29 13:10:26 +03:00
Mohammad Amin Mollazadeh
be87e0099f [SHELL32] Return correct CSIDL for "Network Connections" menu item (#7938)
Fixes erroneous addition of "Properties" item into its context menu.

- Addendum to 0241b5c4e9 and 5aaead3fdb. CORE-20152
- Also remove FIXME for CORE-19477 which is fixed now. CORE-20151
2025-04-28 22:44:58 +03:00
Eric Kohl
dbc0c37750 [UMPNPMGR] Typo: Handle device interface removal events properly 2025-04-28 21:16:05 +02:00
Eric Kohl
bfa63932ce [MOUCLASS] Activate and deactivate the device interface for mouse devices 2025-04-28 21:14:20 +02:00
Hermès Bélusca-Maïto
5456e195db [EVENTVWR] Improve _some_ translations
- Add accelerators to the IDD_EVENTDETAILS_CTRL controls, in _some_
  translations but NOT all. Anyone is welcome to add the missing ones
  in the translations to their own language!

- Fix "Data" static text tab-ordering. It should be just before the
  IDC_EVENTDATAEDIT control, so that when pressing its accelerator,
  focus is given to the edit control and NOT on the Bytes/Words buttons.

- Change IDC_WORDRADIO -> IDC_WORDSRADIO
2025-04-28 18:02:45 +02:00
Hermès Bélusca-Maïto
87eac43fb9 [EVENTVWR] Improve details controls transition when updating events list
CORE-20021, CORE-20023, CORE-20037

Complements commits 1786a68256 (#7757) and d1aa59982d (#7921)

- When starting eventvwr, the details buttons are disabled and the fields
  are empty.

- During events enumeration, i.e. when refreshing the events list, the
  Previous/Next navigation arrow buttons are disabled. They get re-enabled
  once enumeration is done. No default event item is auto-selected at first.

- When the user selects an item, the details fields are filled (and the
  Copy button is enabled; the Byte/Word mode buttons are enabled only if
  the selected event has associated data).

- When changing the current filter via the TreeView, the events list is
  refreshed, but also the event details fields are emptied and buttons
  are disabled. The navigation arrows are re-enabled once enumeration is
  finished, but the details fields remain empty until an event is selected.

- Pressing the Previous/Next buttons just after the events list refresh
  (when no item is selected), automatically selects respectively the
  last/the first event in the list.
  The rationale for this behaviour is the following: in this situation,
  no item is selected, so it is as if the "current" item is at the same
  time, at the top and at the end (i.e. at the borders) of the list.

- Temporary HACK: When disabling the navigation arrows, this is usually
  because the events list is being refreshed, so we loose access to the
  event's data and we cannot use the bytes/words mode buttons anymore.
2025-04-28 17:53:16 +02:00
Hermès Bélusca-Maïto
fe6de816d6 [EVENTVWR] Update French (fr-FR) translation 2025-04-28 13:19:16 +02:00
Katayama Hirofumi MZ
f19c62c80e [EXPLORER][SHELL32][SHELL32_APITEST][SDK] AppBar: Initial support (#7778)
Supporting AppBars.
JIRA issue: CORE-7237
- Rewrite shell32!SHAppBarMessage
  function.
- Introduce CAppBarManager class in
  base/shell/explorer/appbar.cpp.
- Add support of ABM_NEW,
  ABM_REMOVE, ABM_QUERYPOS,
  and ABM_SETPOS messages for
  AppBar in Tray Window.
2025-04-28 19:08:13 +09:00
Whindmar Saksit
378a335468 [SHELL32] Don't pass menu band hwnd to InvokeCommand (#7945)
The menu band window is about to go away, don't pass it to InvokeCommand because it's invalid as an owner window for any dialogs the callee might display.
2025-04-28 00:24:15 +02:00
Hervé Poussineau
9b70d4380c [FREELDR] Allow empty RDPATH parameter
In that case, read the whole partition/disk, instead of the selected file.

CORE-14603
2025-04-27 23:49:21 +02:00
Dmitry Borisov
c27a2fc7cb [XDK] Add missing PCI subclass type definition for AHCI controllers (#7931)
Split out of #6577. CORE-17256
2025-04-27 23:04:41 +03:00
Eric Kohl
f8efb5d474 [UMPNPMGR] Report device interface arrivals and removals to registered windows
- Other event types are not supported yet.
- Services notification is not supported yet.
2025-04-27 17:09:50 +02:00
Petru Răzvan
d1aa59982d [EVENTVWR] Fix "Bytes" and "Word" buttons enabled with empty entry (#7921)
CORE-20037
2025-04-27 16:31:25 +02:00
Whindmar Saksit
a6558c0562 [EXPLORER] Implement ClearRecentDocsOnExit setting (#7935) 2025-04-27 01:28:37 +02:00
Whindmar Saksit
bd2d3b8603 [SHELL32] Don't set a desktop.ini folder icon on WinDir and System32 (#7933)
wine 332b90c0064563a9e4f67fb2d9b26a940e5e745c removed the whole icon member on their side.

CORE-19037
2025-04-27 01:06:32 +02:00
Petru Răzvan
0a6bcfc9ff [CHARMAP] Fix status bar not being refreshed (#7924)
Ensure SetCaretXY() is called when the charset is changed,
or a new font is being set.

CORE-19838
2025-04-26 22:42:46 +03:00
Whindmar Saksit
8b6907f2a6 [EXPLORER] Implement NoWinKeys and HideClock restrictions (#7926) 2025-04-25 13:51:26 +02:00
Doug Lyons
85afe48c3e [GDI32] Fix MSVC warning in SetDIBitsToDevice and simplify code. (#7919)
This is a very small revert of PR #5227 to simplify the code and eliminate an MSVC warning.
It was pointed out by Timo Kreuzer as probably not doing what I intended and he was correct.
I added this code in PR #5227 to try and correct some return values from SetDIBitsToDevice.
After testing with this new PR, there was no difference in the regression tests for either
1) gdi32:bitmap or 2) gdi32:SetDIBitsToDevice after deleting the code here and the MSVC warning was fixed.
2025-04-24 21:04:36 -05:00
Whindmar Saksit
efbdd483b3 [SHELL32] Allow .Lnk properties dialog to change icon for non-FS targets (#7911)
CORE-19971
2025-04-24 21:30:27 +02:00
Whindmar Saksit
7eb8535edf [STOBJECT][NTUSER][ACCESS] Don't use a systray timer when not needed (#7917) 2025-04-24 21:27:36 +02:00
Whindmar Saksit
78e04c07b8 [USER32] Read the CoolSwitch settings from the registry (#7920) 2025-04-24 15:22:43 +02:00
Timo Kreuzer
e452980e0e [HALX86/APIC] Change IRQL for x86 profile interrupt to HIGH_LEVEL
While PROFILE_LEVEL is defined as 27 on x86, this does not match the vector for the profiling interrupt, which is 0xFD (see https://community.osr.com/t/odd-ioapic-output/45216), implying IRQL 31.
Fixes boot with x86 APIC hal (CORE-20093)
2025-04-24 11:36:12 +00:00
Timo Kreuzer
35fd771c84 [HALX86/APIC] Read APIC Id from APIC instead of using initial Id
This is needed on some hardware systems, where the BIOS has modified the actual APIC IDs.
The timer interrupt already did this, but in a broken way.
2025-04-24 11:36:12 +00:00
Timo Kreuzer
faaac75546 [HALX86/APIC] Use physical addressing in HalEnableSystemInterrupt 2025-04-24 11:36:12 +00:00
Timo Kreuzer
f1f01771b6 [HALX86/APIC] Set timer interrupt to level triggered 2025-04-24 11:36:12 +00:00
Timo Kreuzer
884f73fb04 [HALX86/APIC] Fix interrupt delivery on bare metal
Write both high and low 32 bits of ICR in ApicRequestSelfInterrupt. In VMs we get away with only writing the low 32 bits, but actual hardware doesn't always accept that.
2025-04-24 11:36:12 +00:00
Timo Kreuzer
0f6e982ad7 [HALX86/APIC] Mask profiling interrupt on init 2025-04-24 11:36:12 +00:00
Timo Kreuzer
2c057d9bc1 [HALX86] Set the NMI disable flag when accessing CMOS registers
An NMI while accessing the CMOS can leave it in an undefined state. NMIs are used on x64 SMP for CPU freeze in the debugger.
2025-04-24 11:36:12 +00:00
Katayama Hirofumi MZ
94fc56c038 [COMCTL32][USER32] Edit: Don't unlock if unlocked on EM_SETHANDLE (#7886)
JIRA issue: CORE-18944
EDIT_EM_GetHandle unlocks the handle,
so the next EM_SETHANDLE handler
shouldn't unlock the unlocked text.
Don't unlock the handle when es->text
was NULL on EM_SETHANDLE
message handling.
2025-04-24 19:21:22 +09:00
Mohammad Amin Mollazadeh
860262952d [SHELL32] Fix Deselect highlighted item in shell menus on close (#7904)
CORE-18855

Add a call to _ChangeHotItem(NULL, -1, 0) in CMenuBand::OnSelect(MPOS_CANCELLEVEL) which causes to deselect currently selected item the moment the menu bands (including start menu) are closing.
Start Menu is not destroyed when it's closed so its allocated resources can be re-used next time user wants to open it, so to keep this behavior and still not having an item selected every time you open the start menu, you have to deselect the currently selected item.
2025-04-23 23:10:08 +02:00
Whindmar Saksit
fcc2247774 [BROWSEUI] Use the last id for custom find files menu item (#7918) 2025-04-23 18:57:24 +02:00
Whindmar Saksit
6faee56f86 [DESK] Preview the color on the background color button (#7916)
Note: A bug in the classic button prevents it from sending CDDS_POSTPAINT if the button has no text, the button resource has a space in its text as a workaround.
2025-04-23 18:32:45 +02:00
Whindmar Saksit
d3456f5060 [SHELL32] Implement IShellFolder2::GetDetailsEx (#7880) 2025-04-21 23:21:44 +02:00
Marcin Jabłoński
4cbd5d1b44 [TASKMGR] Distinguish WOW64 processes with a " *32" in the image name (#7915) 2025-04-21 23:17:19 +02:00
Whindmar Saksit
73b019a390 [SHELL32] Respect the REST_NODRIVES restriction (#7907)
This is the "My Computer => Drives" setting in TweakUI.
2025-04-21 23:16:59 +02:00
Whindmar Saksit
fb6191b71a [SHELL32] Respect StrCmpLogicalW policy in shell folders (#7900) 2025-04-21 23:06:47 +02:00
Eric Kohl
4514e748f0 [DHCPCSVC] Implement DhcpAcquireParameters and DhcpReleaseParameters
TODO: The AdapterName parameter should be a unicode string. Fix this later.
2025-04-21 14:45:51 +02:00
Hermès Bélusca-Maïto
f135cab83e [SETUPLIB] Add a setuplib_static library, used for the dll and the unit-tests.
Since the setuplib.dll isn't available after installing ReactOS, build
instead a static library that is then used for the dll, and linked into
the setuplib_unittest, so that it can be run in our test-suite.

Addendum to commit d7c1d220.
2025-04-20 19:18:28 +02:00
Eric Kohl
2c2cdfddd3 [DHCPCSVC] Move the public header rosdhcp_public.h
This header is not to be used outside of dhcpcsvc because it contains the data structures for the communication between the client and the server part within dhcpcsvc. That is why it is moved inside of dhcpcsvc and renamed to rosdhcp_pipe.h.
2025-04-19 22:55:52 +02:00
Hermès Bélusca-Maïto
d489f1a170 [NTOS:KD] Supplement minimal handling in KdSend/ReceivePacket when no kernel debugger is present.
CORE-20107

Improve the minimal handling done in the fall-back KdSend/ReceivePacket()
routines when they are invoked by KD64 (in Release build).

Part of my `kdbg_tests_kdio_split` branch for splitting kd/kdio.c
into a separate KD dll.

KdSendPacket:
- Silently ignore PACKET_TYPE_KD_STATE_CHANGE32/64 DbgKdLoadSymbolsStateChange notification.
- Partially manage and log the unhandled PACKET_TYPE_KD_STATE_CHANGE DbgKdExceptionStateChange notification.
- Log other unhandled PACKET_TYPE_KD_STATE_CHANGE32/64 and PACKET_TYPE_KD_STATE_MANIPULATE notifications.

When KdSendPacket receives the DbgKdExceptionStateChange notification,
it cannot handle it (no debugger is there!). However, we need to claim
the debugger to be present, so that its KD64 caller: KdpSendWaitContinue(),
can call back KdReceivePacket(PACKET_TYPE_KD_STATE_MANIPULATE), which,
in turn, informs KD that the exception cannot be handled, by returning
a failure code in the ManipulateState's ContinueStatus.

During bugchecks, this allows KiBugCheckDebugBreak() to not loop infinitely,
but instead fall back into calling HalHaltSystem() to halt the computer.
2025-04-19 20:01:10 +02:00
Serge Gautherie
0e21c6f3fd [NTOS:KD] Accept some packet types without KDBG (#7892)
When KDBG isn't included in the kernel (Release build), the fall-back
KdSend/ReceivePacket() routines are invoked by KD64. A minimal handling
of the basic packets needs to be done:
PACKET_TYPE_KD_STATE_CHANGE32/64 for KdSendPacket(),
and PACKET_TYPE_KD_POLL_BREAKIN, PACKET_TYPE_KD_STATE_MANIPULATE
for KdReceivePacket().

Addendum to commit 2046a17ef4
CORE-20107
2025-04-19 20:01:09 +02:00
Hermès Bélusca-Maïto
005f75bd61 [RTL] x64/ARM: Alias RtlpBreakWithStatusInstruction to DbgBreakPointWithStatus; x64: fix a bug.
RtlpBreakWithStatusInstruction is just a label for KD.

On machines that have register calling conventions (basically all except
x86), the `Status` parameter for `DbgBreakPointWithStatus` is stored in
the first argument register.

https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-dbgbreakpointwithstatus

On the x64 platform, `DbgBreakPointWithStatus` only uses the ECX register
and leaves EAX untouched. Verified on Windows.
2025-04-19 20:01:08 +02:00
Hermès Bélusca-Maïto
a7d86fe3a7 [NTOS][RTL] Remove unused deprecated ReactOS-only DbgBreakPointNoBugCheck()
This helper was introduced in commit b041530f2d (r8551), and its
last remaining usage removed in commit f038f4a895 (r23636).
2025-04-19 20:01:06 +02:00
Whindmar Saksit
b42b015cc6 [SHELL32] Enable OK Run dialog button on combo change (#7909)
CORE-20125
2025-04-19 14:18:08 +02:00
Eric Kohl
2fe3073697 [DHCPCSVC] Remove the now obsolete function DhcpRosGetAdapterInfo 2025-04-19 11:42:09 +02:00
Eric Kohl
3fe4b41f20 [IPHLPAPI] Retrieve DHCP information from the registry 2025-04-18 19:52:23 +02:00
Doug Lyons
fa7890f39d [SERVMAN] Services Properties 'Dependencies' tab missing text above lower listbox (#7899)
- Add some missing 'colons' to descriptive text above upper listbox.
CORE-20115
2025-04-18 12:45:48 -05:00
Timo Kreuzer
aa60e56199 [NTOS] Fix MSVC warnings
Be strict about string length to prevent overflows.
2025-04-18 17:28:49 +00:00
Eric Kohl
aa6c33b21c [DHCPCSVC] Set more registry values when an ip address has been provided
Set the DhcpServer, LeaseObtainedTime and LeaseTerminatesTime values.
2025-04-18 19:26:23 +02:00
Whindmar Saksit
5a10ec60be [EXPLORER][BROWSEUI][SHLWAPI][BOOTDATA][WIN32K] Support AppKeys and more WM_APPCOMMANDs (#7879)
Implements a couple of extra commands in IShellBrowser and adds support for the AppKeys fallback registry key (used when the foreground application does not handle the command).
2025-04-18 18:35:30 +02:00
Timo Kreuzer
2e85425c53 [NTOS:MM] Remove one more instance of MmLocateMemoryAreaByAddress 2025-04-17 22:22:08 +00:00
Timo Kreuzer
0e58b59794 [NTOS:MM] Get rid of more calls to MmLocateMemoryAreaByAddress 2025-04-17 22:22:08 +00:00
Timo Kreuzer
1f27911997 [NTOS:MM] Reduce the magnitude of the MiRosProtectVirtualMemory hack 2025-04-17 22:22:08 +00:00
Timo Kreuzer
f60128b69d [NTOS:MM] Remove usage of memory area in MiProtectVirtualMemory 2025-04-17 22:22:08 +00:00
Timo Kreuzer
edecbf4799 [NTOS:MM] Remove usage of memory area in MiUnmapViewOfSection 2025-04-17 22:22:08 +00:00
Timo Kreuzer
a8f4a76c7b [NTOS:MM] Improve MiDeleteVirtualAddresses
- Fix parameter annotations
- Add an ASSERT
2025-04-17 22:22:08 +00:00
Timo Kreuzer
8851d86847 [NTOS:MM] Remove Vad pointer from MEMORY_AREA 2025-04-17 22:22:08 +00:00
Timo Kreuzer
7611e49b9d [NTOS:MM] Use StartingVpn instead of Vad member to check for user/kernel 2025-04-17 22:22:08 +00:00
Timo Kreuzer
7ec2e1cd2f [NTOS:MM] Stop inserting fake MEMORY_AREAs for ARM³ VADs
They were introduced when MEMROY_AREAs and VAD still lived in different tables to synchronize between them. Since some time MEMORY_AREAs are special VADs and live in the same table as ARM³ VADs, but with flags to distinguish them. Since then the only reason that the fake MEMORY_AREAs still existed was to determine whether a VAD that is a MEMORY_AREA is still handled by ARM³ (which is the case for some kernel VADs, like for paged pool). This is no longer required as it is now determined by a 2nd flag in the VAD itself.
Additionally, we tried to insert the fake MEMORY_AREAs into the VAD table, which would fail, because it was already occupied by the ARM³ VAD, but the failure was ignored.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
2696f1a29f [NTOS:MM] Do not update ARM³ owned memory area
Those are not inserted into a table and we don't use them.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
ec45b8fde8 [NTOS:MM] Stop using memory areas in MmAccessFault
- Implement MiLocateVad and make MiLocateAddress call it
- Use MiLocateVad in MmAccessFault to get the VAD
- Check VadFlags for whether this is an ARM³ VAD/MEMORY_AREA
2025-04-17 22:22:08 +00:00
Timo Kreuzer
fca88bb94d [NTOS:MM] Add more checks for MEMORY_AREA_OWNED_BY_ARM3 2025-04-17 22:22:08 +00:00
Timo Kreuzer
d0a7e496aa [NTOS:MM] Mark RosMm memory areas
This is to distinguish them from ARM³ memory areas, which we use for some kernel regions, like paged pool.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
42c7e4f66a [NTOS:MM] Add macros to determine whether a VAD is a MEMORY_AREA 2025-04-17 22:22:08 +00:00
Timo Kreuzer
d27f5971c5 [NTOS:MM] Add MmIsAddressRangeFree helper function
Use this instead of MmLocateMemoryAreaByRegion to determine whether we can inert a section at the requested base address. This will be required to get rid of fake memory areas allocated for each ARM³ VAD.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
48027a8058 [NTOS:MM] Remove obsolete code path
In MmCleanProcessAddressSpace we already delete VADs that are RosMm memory areas by calling MiRosCleanupMemoryArea, so we never reach the later check. This code path is from a time when VADs and memory areas lived in different tables, which is no longer the case.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
7b23673851 [NTOS:MM] Forward MmLocateMemoryAreaByAddress to MmLocateMemoryAreaByRegion
Both functions do exactly the same.
2025-04-17 22:22:08 +00:00
Timo Kreuzer
31a693a035 [NTOS:MM] Remove some obsolete declarations 2025-04-17 22:22:08 +00:00
Katayama Hirofumi MZ
67e5343daf [IMM32] Make IMM32 non-Wine module (#7890)
Related to #7870. IMM32 uses NDK.
So, we have to remove Wine
dependency.
JIRA issue: CORE-5743
- Add dll/win32/imm32/debug.h.
- Remove Wine dependency.
- Update the documentation
  (media/doc/WINESYNC.txt).
2025-04-17 22:50:22 +09:00
Adam Słaboń
016c5fd083 [KERNEL32] RemoveDirectoryW: Fix the code for removing a mounted folder (#7897)
- Fix the crash due to copying the memory to wrong destination buffer.
- Fix the check for trailing backlash on path string.
2025-04-17 15:49:38 +02:00
Adam Słaboń
3d9b919814 [MOUNTMGR] Few fixes and improvements (#7896)
- `MountMgrVolumeMountPointChanged()`: Set status code in all failure
  paths and correct the check for remote or removable media.
- `DeleteRemoteDatabaseEntry()`: Do not allow the database with size of zero.
- `QueryVolumeName()`: Use reparse point file reference when no file name is supplied.
2025-04-17 15:26:58 +02:00
Adam Słaboń
26e0a5472f [NDK] Add definitions for system partition and disk information classes (#7895)
Add definitions for SystemSystemPartitionInformation and SystemSystemDiskInformation classes.
2025-04-17 13:57:19 +02:00
Petru Răzvan
7026466324 [USRMGR] Implement "Require user name and password on system startup." (#7887)
This implements the tickbox along with the associated code required for it to work.

CORE-11371
2025-04-17 13:55:31 +02:00
Curtis Wilson
be56c5c328 [TRACERT] Improve command line parsing (#7779)
- Added bounds check for -w and -h options to prevent the program from crashing.
- Added argument checks for -w and -h to make sure values were of the correct type and within range.
- Added check to see if a host was specified.
- Added new resource strings for reporting errors related to the checks above.
- Added the slash character as an additional option to specify command options.
2025-04-17 13:53:43 +02:00
Doug Lyons
23ad93627b [COMDLG32] Improve IDC_TOOLBARPLACES placement (#7898)
Change IDC_TOOLBARPLACES y-value from 192 to 200 to allow Browse Dialog for "My Network Places" to show lower border.
CORE-19732
2025-04-16 19:52:33 -05:00
Serge Gautherie
2f380814d3 [NTOS:KD] Fix KdMax value without KDBG debugger (#7889)
Addendum to commit 271b985
CORE-20107

[NTOS:KD] Comment defines related to KdMax. They are not used,
but keep them for documentation purposes.
Addendum to e160c0f (r14799) and 6d53c91 (r27419).
2025-04-16 17:18:07 +02:00
Katayama Hirofumi MZ
80eb313eed [COMCTL32] Pager: Fix PGM_RECALCSIZE behaviour (#7875)
JIRA issue: CORE-7017
- Add m_bProcessingReCalcSize to PAGER_INFO structure.
- Fix EM_FMTLINES and PGM_RECALCSIZE handling, by
  usiing m_bProcessingReCalcSize.
2025-04-15 08:59:43 +09:00
Eric Kohl
00983aa86f [UMPNPMGR] PNP_AddEmptyLogConf: Implement adding a resource list to an existing configuration value 2025-04-13 20:12:08 +02:00
Hermès Bélusca-Maïto
79f281e74f [SDK:CMAKE] Remove unused BUILD_MP build option (#7862)
It was introduced in commit 1f9c4940d (r38270), but this flag isn't used
anymore in our source tree, and nowadays, we actively compile both UP
and MP support.
2025-04-12 22:37:48 +02:00
Timo Kreuzer
00f4a0f89b [RICHED20] Enable thiscall wrappers for MSVC
Properly fix thiscall functions by enabling thiscall wrappers on MSVC builds.
See CORE-20079, CORE-20006
2025-04-12 07:57:42 +00:00
Timo Kreuzer
dd53e7f79e Revert "[RICHED20] Fix MSVC Wordpad failure after riched20 Wine Sync to 6.10 (#7789)"
This reverts commit 74599f6c97.
2025-04-12 07:57:42 +00:00
Timo Kreuzer
18fc5a1391 [USER32] Fix use of uninitialized variable 2025-04-11 07:24:44 +00:00
Doug Lyons
3b8cfa42c1 [RICHED20] Fix RTC MSVC Failure in function ME_GetTextW. (#7881)
Import Wine Commit: 5cbe3a6cb1
CORE-20082
2025-04-10 13:35:53 -05:00
Whindmar Saksit
5022a451df [SHELL32] Fix Search Folder resource string id (#7874) 2025-04-09 16:29:57 +02:00
Alexey Strukov
9a0ff8b21b [BROWSEUI] Fix backspace button behavior in win32 shell browser (#7837)
Update backspace button functionality to align with standard modern Windows behavior in the win32 shell browser.
2025-04-08 23:54:14 +02:00
Hermès Bélusca-Maïto
1b564c1ba8 [REACTOS] Use the RT_* resource type defines where possible (#6023)
And use the self-documenting `MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)`
instead of `0` for the `LDR_RESOURCE_INFO::Language` structure member.
2025-04-08 20:21:07 +02:00
Hermès Bélusca-Maïto
111c8cc62a [REACTOS] Usage improvements for some RtlFindMessage invocations (#6023)
Use `RT_MESSAGETABLE` and `MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)`
instead of hardcoding their values.
2025-04-08 20:19:54 +02:00
Hermès Bélusca-Maïto
2f805d7a02 [PSDK] winuser.h: Add missing (MINIMUM|MAXIMUM)_RESERVED_MANIFEST_RESOURCE_ID define 2025-04-08 20:18:44 +02:00
Hermès Bélusca-Maïto
a3899d8151 [FREELDR:PC98] Don't do the HighRes check everytime a character is written with writechr (#4359)
And bring similar simplifications to the PC98 FAT12 bootsector.

Co-authored-by: Dmitry Borisov <di.sean@protonmail.com>
2025-04-08 15:50:43 +02:00
Hermès Bélusca-Maïto
94a650cdf7 [TASKKILL] Simplify children processes termination code (#7855)
Use process-tree Level-Order-Traversal to determine the children
processes to be terminated.

This avoids using recursion to establish the process tree, and also
allows termination in a fashion similar to Windows' taskkill.
The main difference with the latter is that we terminate parent
processes first before terminating their children, instead of doing
the reverse. (This allows avoiding the case where parent processes
respawn their children when they have been terminated.)
2025-04-08 15:42:36 +02:00
Hermès Bélusca-Maïto
1519a676bd [TASKKILL] Improve translations of the process-termination messages (#7855) 2025-04-08 15:40:46 +02:00
Hermès Bélusca-Maïto
4089e90890 [TASKKILL] Final sync with wine-10.0 (#7855)
[WINESYNC] taskkill: Build with msvcrt.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
wine commit id fb80c1b554eaf07bf2f89fcf2960e39bd0d4787a by Alexandre Julliard <julliard@winehq.org>

[WINESYNC] taskkill: Use wide-char string literals.
Signed-off-by: Michael Stefaniuc <mstefani@winehq.org>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
wine commit id 3180972ee2c8e67c425aa7f5279d0cd830455c3d by Michael Stefaniuc <mstefani@winehq.org>

[WINESYNC] taskkill: Use the standard va_list instead of __ms_va_list.
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
wine commit id 2c2e75503bea973a3091ea48d431782da656ef8e by Alexandre Julliard <julliard@winehq.org>

[WINESYNC] taskkill: Use OEM code page for output.
Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
wine commit id 8fdf397505522cc8e41b58cd960899ef7cdf322b by Eric Pouech <eric.pouech@gmail.com>

[WINESYNC] taskkill: Use exit code 1 when terminating processes.
wine commit id fe6294c74346e9956fb839d2a4ca078c624f6bbf by Brendan Shanks <bshanks@codeweavers.com>

[WINESYNC] taskkill: Use CRT allocation functions.
wine commit id dd3f3f381f9e761325c7c06236de1241c9605ed6 by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Remove unneeded free() before process exit.
wine commit id 20ab5f06d0972440a7df7fb1ba390ab1b32f3b1d by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Enumerate processes in main().
wine commit id cf4a0b7392f33ba3e0b3fe69007a6d1f327f13f2 by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Factor out get_task_pid().
wine commit id 62ef3c5be1d2c5374399984588a9daa75663d030 by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Use toolhelp snapshot to get process information.
wine commit id 6cca1f5099a8354b67578b42dd34fd010e80b6de by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Mark processes for termination in main().
wine commit id 5c851451892e05c1747108432a5a2bff3a78ed9e by Paul Gofman <pgofman@codeweavers.com>

[WINESYNC] taskkill: Support terminating child processes.
wine commit id fb6b1c91bbf412f5eba260ae52ee38176fd693d4 by Paul Gofman <pgofman@codeweavers.com>

NOTE: This implementation is disabled for ReactOS, and we keep
our own. See the comment block in the code for the reasons why.

+ Adaptations for ReactOS-specific code.

In particular, great care has been taken to keep the `pkill_list`
functionality (read: fix) introduced in PR #2403 (commit 97e7efc020).
The current problem with Wine's code is that if many processes (more
than one) with the same image name are running, then:

   taskkill /im theimagename.exe

would only terminate *one* of the corresponding processes, instead of
all processes having this same image name (as on Windows).
The `pkill_list` array contains all the PIDs of these processes. This
replaces the single `pid` initialized by `get_task_pid`.

Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
2025-04-08 15:36:57 +02:00
Whindmar Saksit
f669426bf4 [COMCTL32] Include size of state imagelist for column 0 LVSCW_AUTOSIZE (#7873)
CORE-20080 CORE-15423
2025-04-07 21:20:15 +02:00
Timo Kreuzer
52719b52ae [VCRUNTIME] Fix a bug in x64 __security_init_cookie 2025-04-07 13:57:17 +00:00
Whindmar Saksit
182f353b2f [COMCTL32] ImageList_LoadImageW with CLR_NONE should not use a mask (#7869)
CORE-16146
2025-04-06 19:00:54 +02:00
Oleg Dubinskiy
ff7bf747bf [WDMAUD.DRV] Allow enumerating only present audio devices
- Avoid unnecessary enumerating audio-related device interfaces which are currently not present in the system.
- Do this for MMixer routines, same as it's already done for Legacy ones.
2025-04-06 17:29:45 +02:00
Johannes Anderwald
ecf4001e6f [SETUPAPI] Do not fail enumeration on invalid device interface keys (#7741)
Necessary for drivers, which install multiple device interfaces and all interfaces might not be available for this device.
CORE-17285
2025-04-06 17:10:08 +02:00
Oleg Dubinskiy
9aa299bea4 [MMIXER] Don't stop audio devices enumeration when one or more of them failed to initialize (#7863)
Skip unsuccessfully initialized devices and continue enumeration until all of devices are enumerated.
Patch by Johannes Anderwald with additional improvements from me.
This fixes 0 audio devices detected for HD audio controllers (e. g., Realtek), and hence allows to properly detect all available devices and play the sound with MMixer routines enabled (they are currently default).
Tested personally with Realtek HD Audio driver version R2.74 for Windows XP/Server 2003 in pair with hdaudbus.sys from Windows Vista SP2 on real hardware.
CORE-17285
2025-04-06 10:55:55 +02:00
Eric Kohl
2ec3a199af [UMPNPMGR] Implement first part of PNP_FreeLogConf 2025-04-05 18:17:33 +02:00
Doug Lyons
208dfd22c6 [ROSAUTOTEST] Final changes to improvements (#7857)
Follow-up of PR #7823.
2025-04-04 22:00:54 -05:00
Hermès Bélusca-Maïto
8d7eca9482 [CODEOWNERS] Add myself for modules I wrote or heavily contributed to (#5279) 2025-04-04 20:47:59 +02:00
Whindmar Saksit
ac3ecb2b2d [SHELL32] Add SHFileOp error UI and use it for CFSFolder renaming (#7858) 2025-04-04 20:34:52 +02:00
Hermès Bélusca-Maïto
774b3a6e1d [RAPPS] Correctly update the Install/Uninstall/... buttons (#7351)
The Install/Uninstall/Modify/... buttons stay disabled by default, unless:

- For installed apps: when an app item is selected, Uninstall (and
  Registry-remove) are enabled, and Modify is enabled under certain
  conditions.

- For available apps:
  * Modify, Uninstall and Registry-remove are always disabled.
  * When an app item is selected, Install is enabled.
  * Install is also enabled if there is at least one application
    selected for installation (box checked), in which case the button
    stays enabled even while changing across apps categories.
2025-04-04 18:18:49 +02:00
Katayama Hirofumi MZ
1e6e5529c6 [FREETYPE][FTFD][DOC] Update FreeType to 2.10.0 from 2.9 (#7786)
Modernize font engine modules.
JIRA issue: CORE-16084
- Update FreeType to 2.10.0 from 2.9.
- Delete useless files.
- Add technical notes (TechNote.txt) on freetype.
- DbgPrint became FT_Message.
2025-04-04 20:50:25 +09:00
Katayama Hirofumi MZ
7efab12e6f [CMAKE] Introduce set_wine_module (Retry) (#7860)
Re-trial of #7800. Deleting __WINESRC__
hacks.
JIRA issue: CORE-5743
- Add sdk/cmake/set_wine_module.cmake.
- Load set_wine_module.cmake at
  top-level CMakeLists.txt.
- Use set_wine_module cmake function
  and delete __WINESRC__ as possible.
- Delete many include_directories.
2025-04-04 20:44:38 +09:00
Hermès Bélusca-Maïto
125f94d8ab [NTOS:EX] Check whether the boot-time drivers are safe to use on MP systems (#7744)
Invoke the MmVerifyImageIsOkForMpUse() helper. If the boot-time driver
only supports a uniprocessor system, bugcheck with UP_DRIVER_ON_MP_SYSTEM.

https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/bug-check-0x92--up-driver-on-mp-system

Note that we don't do this check very soon at boot time (e.g. in
MiReloadBootLoadedDrivers or MiInitializeLoadedModuleList), but only
after loading the drivers' debug symbols (if any).
The reason is simply to ease debugging in case we bugcheck: this allows
having the debugger set up with the symbols for this driver.

For automatic and manual driver loading, MmVerifyImageIsOkForMpUse()
is invoked by MmCheckSystemImage() but in this case, there is graceful
failure and no bugcheck.
2025-04-04 13:05:22 +02:00
Hermès Bélusca-Maïto
4750cbe55b [SDK:INCLUDE] bugcodes.mc: Add missing UP_DRIVER_ON_MP_SYSTEM bugcheck code (#7744) 2025-04-04 13:04:51 +02:00
Hermès Bélusca-Maïto
3022d74beb [NTOS:EX/KE][HALX86] Add support for NUMPROC, BOOTPROC, MAXPROC, ONECPU boot switches (#6024)
These SMP-specific switches allow to test and control configurations
with various number of CPUs on multiprocessor systems.

- NUMPROC: maximum number of logical processors that can be started
  (including dynamically, not currently supported by ReactOS) at run-time.

- BOOTPROC: maximum number of logical processors that can be started at
  boot-time.

- MAXPROC: forces the OS to report the maximum possible number of CPUs
  as existing on the system.

- ONECPU (MP HAL-only boot switch): causes the HAL to only use one
  (the boot) CPU on a multiprocessor system. Attempting to start other
  processors will fail.

For more information, see:
https://www.geoffchappell.com/notes/windows/boot/bcd/osloader/numproc.htm
https://www.geoffchappell.com/notes/windows/license/processors.htm
https://rmscrypt.wordpress.com/2011/02/
https://codeinsecurity.wordpress.com/2022/04/07/cpu-socket-and-core-count-limits-in-windows-10-and-how-to-remove-them/

Generic references about BOOT.INI switches:
https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/boot-options-in-a-boot-ini-file
https://www.itprotoday.com/cloud-computing/what-switches-can-be-used-bootini
http://franck.kiechel.free.fr/dbr_eng/BootIni.htm

References about BCD options:
https://learn.microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set
http://www.mistyprojects.co.uk/documents/BCDEdit/files/commands.6.1.7601.htm#TYPES%20OSLOADER
2025-04-04 12:51:49 +02:00
Hermès Bélusca-Maïto
7093412f4e [NTOS] Build mproc.c _only_ for MP ntoskrnl, not for single-processor
The usage of the BUILD_MP cmake variable was inadequate.
2025-04-04 12:51:29 +02:00
Hermès Bélusca-Maïto
b0dd4ba09c [HALX86][HALARM] Minor formatting to HalInitSystem
Add CODE_SEG("INIT"), SAL2 annotations, remove extra-parenthesis...
2025-04-04 12:51:28 +02:00
Katayama Hirofumi MZ
1890ad20f8 [NTGDI][GDI32] AddFontResource: Support multiple files (#7833)
JIRA issue: CORE-17684
- Add HEAP_strdupA2W_buf and HEAP_strdupA2W_buf_free
  helper functions for quick string conversion.
- Optimize HEAP_... functions.
- Add IntConvertFontPaths helper function.
- Support multiple files in AddFontResource function.
- Add cFiles parameter to some internal font addition/
  removal functions.
- Half-implement NtGdiRemoveFontResourceW and
  RemoveFontResourceExW functions.
2025-04-04 19:30:18 +09:00
Whindmar Saksit
72bd9ef29a [BROWSEUI] Don't pass the internal PIDL to the shell for processing (#7859)
CORE-20063
2025-04-03 20:52:53 +02:00
Timo Kreuzer
98b26cc24a [NTDLL_APITEST] Fix NtCreateProfile tests for x64 2025-04-03 16:22:42 +00:00
Timo Kreuzer
0679260073 [HAL/APIC] Set the profiling interrupt handler
Fixes hang when running mtdll_apitest NtStartProfile.
2025-04-03 16:22:42 +00:00
Timo Kreuzer
dca5194279 [FTFD] Fix malloc/realloc/free wrappers
On x64 malloc needs to return a 16 byte aligned buffer, the previous code used an 8 byte header, making the allocations unaligned. This is now fixed with an improved header structure.
Also simplify realloc a bit and make it handle Object == NULL.
2025-04-03 16:22:09 +00:00
George Bișoc
91fadeb6c3 [STOBJECT] Explicitly tell the user the battery is fully charged
Short answer: our UI sucks bolas rojas.

Long answer: when the NT kernel informs the user-mode part of the system that the battery is no longer charging, the machine is directly powered up by the AC adapter.
This is understood by determining the presence of AC_LINE_ONLINE status bit in ACLineStatus member field, which is a Windows API construct.
In the NT world this is understood by checking the power state returned by the BATTERY_STATUS structure.

What's happening right now is that when the battery is fully charged, ROS UI simply displays "100% remaining" implying the battery is about to discharge, which is not the case.
This is extremely confusing to the user. AND WORST PART IS THAT IT'S XP/2003 DESIGN, AND I HATE IT UGGGHHH.
With this patch we're leaning towards Windows 10/11 way of informing the user the battery is fully charged. VIVA LA NT6!

CORE-18969
CORE-19452
2025-04-02 23:16:47 +02:00
Whindmar Saksit
5dbf87e2c1 [BROWSEUI] Handle resolution change when fullscreen (#7852)
CORE-20072
2025-04-02 18:18:23 +02:00
Whindmar Saksit
32fad87a08 [ROSAUTOTEST][SDK] ROS detection for apitests (#7613) 2025-04-02 15:17:18 +02:00
Whindmar Saksit
4965d6a8ac [USER32_APITEST] Add more PrivateExtractIcons tests (#7831) 2025-04-02 15:16:04 +02:00
Katayama Hirofumi MZ
3660920b7f [GDI32][NTGDI][SDK] ExtTextOut: Fix some type problems (#7856)
JIRA issue: CORE-19898
- Modify NtGdiExtTextOutW prototype.
- Add const to some paramters.
- Make Count parameter unsigned.
- Delete needless type casts.
2025-04-02 20:30:47 +09:00
Doug Lyons
7afcd2a8b7 [ROSAUTOTEST] Allow rosautotest to be in the same directory as its files and show its duration at the end. (#7823)
Example output:
[ROSAUTOTEST] System uptime 7.41 seconds

... Testing here...

[ROSAUTOTEST] System uptime at start was 7.41 seconds

[ROSAUTOTEST] System uptime at end was 1546.20 seconds
[ROSAUTOTEST] Duration was 25.65 minutes

Co-authored-by: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
2025-04-01 21:21:10 -05:00
Adam Słaboń
d66ad21ee0 [FREELDR][INSTALL] Update the FreeLoader installation message (#7853)
Update the installfreeldr message in accordance with the changes in 3d516e71d3.
2025-04-02 00:06:12 +03:00
Katayama Hirofumi MZ
87cd66a577 [NTGDI:FREETYPE] IntExtTextOutW: Renaming variables (#7851)
JIRA issue: CORE-19898
This PR is simply trivial renaming.
In IntExtTextOutW function:
s/SurfObj/psoDest/
s/SourceGlyphSurf/psoGlyph/
s/HSourceGlyph/hbmGlyph/
s/bitSize/glyphSize/
2025-04-02 03:54:42 +09:00
Whindmar Saksit
769462faaa [IEFRAME] Implement URL PIDL (#7850) 2025-04-01 16:09:25 +02:00
Doug Lyons
13657fdb5b [USER32][LIBPNG] Support PNG/Vista icons (Retry) (#7709)
CORE-18385
Retry of PR #7704

In USER32 change CMakeLists.txt to include libpng.
Improve libpng.spec to include additional needed defines.
Add code into mostly cursoricon.c to support PNG icons.

Co-authored-by: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
2025-03-31 12:55:53 -05:00
Whindmar Saksit
190782c3e0 [SHELL32] Fix some clang warnings (#7845) 2025-03-31 18:59:04 +02:00
Whindmar Saksit
aa4fac61c8 [BROWSEUI] Implement ShellBrowser F11 fullscreen mode (#7844) 2025-03-31 18:09:54 +02:00
Whindmar Saksit
cc8ec38a87 [SHELL32] Use SHGDN_FOREDITING when renaming in BrowseForFolder (#7840)
- Use SHGDN_FOREDITING when renaming.
- Handle rename change notification without full refresh.
- Don't use FS path when deleting.

CORE-20064
2025-03-30 23:11:27 +02:00
Eric Kohl
c5325f5016 [UMPNPMGR] Implement first part of PNP_AddEmptyLogConf
TODO: Adding a new configuration to an already existing configuration of the same type.
2025-03-30 17:16:00 +02:00
Katayama Hirofumi MZ
81d845fb2c [SHELL32] Implement PathProcessCommandW (#7818)
Follow-up of #7815. This function
affects ShellExec_RunDLLA/W
implementation.
JIRA issue: CORE-17659
- Implement PathProcessCommandW
  in shlexec.cpp.
- Adapt utils.h to non-C++.
2025-03-30 20:28:31 +09:00
Whindmar Saksit
467dec4d16 [CLEANMGR] Only allow one instance per drive (#7832)
CORE-18941
2025-03-29 16:58:18 +01:00
Whindmar Saksit
21b3382f31 [SHELL32] Allow shell to format blank partitions (#7810)
- Don't corrupt static (global) data when formatting more than one disk at the same time.
- Guess partition size to enable formatting blank partitions.
- Added info tip.
- Calls SetVolumeLabel.

CORE-17273
2025-03-29 16:35:03 +01:00
Whindmar Saksit
090d563488 [SHELL32] CFolderOptions Reset can call DefView directly if there is no browser (#7806)
CORE-20029
2025-03-28 23:15:01 +01:00
Hervé Poussineau
cfde03ec9b [VIDEOPRT] Write monitor EDID to registry
This will be used later by win32k to give only valid display modes
to user mode.
2025-03-28 23:10:42 +01:00
Justin Miller
177cbd81af Revert "[FREELDR] Pass the correct ACPI table for Windows (#7486)"
Sorry this is something I had to do, I should have investigated deeper
before approving it and that's on me so ill take this over and get this
done. and credit you once again. Thank you @ILauncherDev
This reverts commit 185225a5fc.
2025-03-28 07:20:45 +01:00
Whindmar Saksit
b6562a664b [SHELL32] DefView statusbar item file size fix in recycler and UNC (#7732)
- Display item sizes inside \\ UNC paths.
- Don't display anything in the location pane inside the Recycle Bin (CORE-20005).
- Don't display the size and location panes in My Computer
- Don't update the location pane on simple item selection changes.

CORE-20005
2025-03-27 18:29:44 +01:00
Timo Kreuzer
c7eba0c5c7 [SDK] Improve definition of (RTL_)CRITICAL_SECTION_DEBUG 2025-03-27 12:50:40 +00:00
Whindmar Saksit
a444572c3e [SHIMGVW] Display error message on delete failure (#7776)
CORE-20019
2025-03-27 13:43:58 +01:00
Mark Jansen
70422cda51 [SHELL32] Fix starting disk cleanup from drive properties
CORE-12314
2025-03-27 10:55:41 +01:00
Nguyen Trung Khanh
97e7efc020 [TASKKILL] Implement /t (tree) parameter (#2403)
CORE-15998
2025-03-26 17:04:49 +01:00
Mark Jansen
49c40a2941 [PROGMAN][MSPORTS][VFDLIB][CONSRV] Update resource encoding to be utf8 2025-03-26 16:39:43 +01:00
Mark Jansen
2e8f4e2c24 [SHELL32] Implement Recycle bin cleanup handler
CORE-18942
2025-03-26 13:58:40 +01:00
Mark Jansen
f9bedd5ca5 [CLEANMGR] Add basic cleanmgr implementation
CORE-18941
2025-03-26 13:58:40 +01:00
Mark Jansen
0cd7e2cfb0 [PSDK] Add missing parameter names 2025-03-26 13:58:40 +01:00
Mark Jansen
db9768f25d [PSDK] Add EmptyVC.idl 2025-03-26 13:58:40 +01:00
Serge Gautherie
c302dbcc96 [FORMAT] wmain(): Call GetLastError() immediately
and adapt STRING_ERROR_DRIVE_TYPE strings.
2025-03-26 13:37:53 +01:00
Serge Gautherie
421dd31d49 [FORMAT] wmain(): Clean GetDiskFreeSpaceExW() calls up 2025-03-26 13:37:53 +01:00
Serge Gautherie
982cf2be5e [FORMAT] wmain(): Clean GetVolumeInformationW() calls up
and immediately print file system out
2025-03-26 13:37:53 +01:00
Katayama Hirofumi MZ
d69a80fad7 [SHDOCVW] Follow-up of #7804: Improve AddUrlToFavorites (#7820)
JIRA issue: CORE-19824
JIRA issue: CORE-19867
JIRA issue: CORE-14172
- Use <strsafe.h>.
- Don't use CSIDL_COMMON_FAVORITES.
2025-03-26 20:13:36 +09:00
Katayama Hirofumi MZ
457642cc4a [FONTEXT] Refactor (#7821)
Improve code flexibility.
JIRA issue: CORE-12861
- Delete excessive virtual keywords
  and add overload keywords.
- Add InstallFontFiles helper function.
- Add strMsg parameter to
  DoInstallFontFile function.
- Move DoInstallFontFile and
  DoGetFontTitle functions outside
  the class.
- Delete needless fontext.h.
2025-03-26 18:58:12 +09:00
Marcin Jabłoński
be7d79768e [COMCTL32] Fix a heap corruption in EDIT_EM_ReplaceSel (#7598)
https://jira.reactos.org/browse/CORE-19743
2025-03-26 10:32:17 +01:00
Serge Gautherie
35ca454cab [NTOSKRNL] Add missing \n to DPRINT() calls (#6012)
Improve debug logs.
- Add missing \n to DPRINT() calls
- And demote/promote some DPRINT()/DPRINT1().
2025-03-26 10:23:15 +01:00
Whindmar Saksit
c1b8c4f96f [SHELL32] Correctly implement common desktop items PIDL (#7730)
The current implementation is broken, if a file/folder exists in both places, you always get the user item.

CORE-19861
2025-03-25 21:26:55 +01:00
Katayama Hirofumi MZ
151ba9ee8f [BROWSEUI][SHDOCVW][SDK] Fix 'Add Favorite' command (#7804)
JIRA issue: CORE-19824
JIRA issue: CORE-19867
- Add shdocvw import to browseui.
- Half-implement shdocvw!
  AddUrlToFavorites function.
- Add AddUrlToFavorites prototype
  to <shdocvw_undoc.h>.
- Fix browseui!CShellBrowser::
  OnAddToFavorites and
  shdocvw!CNSCBand::_AddFavorite
  by using AddUrlToFavorites.
2025-03-26 04:35:22 +09:00
Doug Lyons
0c6423da8d [RICHED20] txthost.c: Partial Wine Sync of RichEditWndProc_common (#7817)
Add extra parameters to 'struct host' to handle 'defer_release' and 'notify_level' and use these.
Fixes crash when using 'Enter' key in DevCpp installer license edit box.

Update and retrial of #7733. CORE-19991
Cherry pick of wine commit: 8138159f20
2025-03-25 13:15:59 -05:00
Hermès Bélusca-Maïto
48beb0433e [SETUPAPI] Add missing NULL parameter checks in SetupOpenInfFileW and SetupDiGetINFClassW (#7573)
Based on PR #5673, ROSTESTS-388

Co-authored-by: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
2025-03-25 17:41:23 +01:00
Mark Jansen
5ec739bf2e [RTL] Change comment to indicate a hack 2025-03-25 16:23:39 +01:00
Mark Jansen
6ab81dcc31 [VERIFIER] Clarify logging 2025-03-25 16:23:39 +01:00
Mark Jansen
0b8acaac31 [AVRF] Suppress notifications for providers 2025-03-25 16:23:39 +01:00
Mark Jansen
08d575adf9 [RTL] Notify verifier when freeing the process page heap 2025-03-25 16:23:39 +01:00
Mark Jansen
5821136dfa [AVRF] Hook up debug functions, add noisy stub for AVrfpGetStackTraceAddress 2025-03-25 16:23:39 +01:00
Mark Jansen
a7a504a466 [SDK] Add avrf stop codes and VERIFIER_STOP macro 2025-03-25 16:23:39 +01:00
Katayama Hirofumi MZ
367e4877f1 [BROWSEUI][SDK] Implement IAddressEditBox::SetCurrentDir (#7814)
JIRA issue: CORE-19704
- Rename and retype pidlLastParsed
  as CComHeapPtr
  <ITEMIDLIST_ABSOLUTE>
  m_pidlLastParsed.
- Implement
  CAddressEditBox::SetCurrentDir
  method.
- Simplify
  CAddressEditBox::ParseNow
  method.
- Modify IAddressEditBox interface.
2025-03-25 20:32:26 +09:00
Timo Kreuzer
776c660542 [NTDLL] Export RTL locale functions
The exports are NT6, but the table is initialized unconditionally, because the functions will be used later internally.
2025-03-25 09:55:17 +00:00
Timo Kreuzer
e01c32f3bd [RTL] Implement locale functions/tables
The locale table is currently hardcoded in rtl. On Vista+ (and Wine) this table is part of locale.nls, but we don't have that yet.
2025-03-25 09:55:17 +00:00
Timo Kreuzer
762a9f00bb [NTDLL_APITEST] Add test for Rtl locale functions 2025-03-25 09:55:17 +00:00
Timo Kreuzer
738ff9dc04 [NDK] Add some Vista+ Rtl locale functions 2025-03-25 09:55:17 +00:00
Timo Kreuzer
684072fe12 [NDK] Minor header improvements
- Remove some duplicated prototypes
- Fix a few mismatching annotations
2025-03-25 09:55:17 +00:00
Katayama Hirofumi MZ
9563c07146 [MSPAINT] Improve behaviour on memory shortage (#7780)
Improve UX on memory shortage.
JIRA issue: CORE-20020
- Clear history on memory shortage.
- Improve CCanvasWindow::OnPaint on memory
  shortage.
- Add null check in CCanvasWindow::DoDraw.
- Retire using of cache in CCanvasWindow.
2025-03-25 10:45:23 +09:00
Katayama Hirofumi MZ
c930c8c464 [GDI32] Implement RemoveFontResourceExA (#7813)
JIRA issue: CORE-17684
2025-03-25 10:38:17 +09:00
Katayama Hirofumi MZ
aee5cbdfe3 [SHELL32_APITEST] Add PathProcessCommand testcase (#7815)
JIRA issue: CORE-17659
2025-03-25 08:34:02 +09:00
Timo Kreuzer
9ab89bd8fa [UCRTBASE_WINETEST] Fix and add to build 2025-03-24 23:02:06 +00:00
Timo Kreuzer
5c47607ab2 [UCRTBASE_WINETEST] Import ucrtbase_winetest from wine-10.0 2025-03-24 23:02:06 +00:00
Timo Kreuzer
5b633d64f1 [UCRTBASE] Build without debug exports
Windows ships ucrtbase without debug exports and ucrtbased with debug exports. The wine test tests ucrtbase and loads it dynamically in some cases. Compiling it with _DEBUG requires it to be linked to ucrtbased, which causes problems, because it also dynamically loads ucrtbase, which will cause it to crash.
2025-03-24 23:02:06 +00:00
Timo Kreuzer
6a4dbedd1e [CMAKE] Support WITH_DBG and NO_DBG overrides in spec2def
This is to be able to build ucrtbase without debug and later ucrtbased with debug.
2025-03-24 23:02:06 +00:00
Timo Kreuzer
01cd8472c7 [UCRTBASE] Implement simplistic versions of some stubs
This is to allow ucrtbase_winetest to run without debug breaks.
Proper implementations will follow.
2025-03-24 23:02:06 +00:00
Timo Kreuzer
f81c82f5fa [VCSTARTUP] Implement atexit and _onexit
These must use a local table and cannot use the one from ucrtbase.
The table is initialized with a .CRT section initializer.
2025-03-24 23:02:06 +00:00
Timo Kreuzer
fce48c3014 [OLDNAMES] Fix up for ucrtbase
Some old names redirect to functions that are not exported by ucrtbase. Place them into a seperate asm file, so that they don't get pulled in, when any of the other ones is referenced.
2025-03-24 23:02:06 +00:00
Timo Kreuzer
5abc69f31d [PSEH] Make x64 PSEH independent of SDK headers 2025-03-24 23:02:06 +00:00
Timo Kreuzer
ad50a00020 [UCRTBASE] Fix broken imports from ntdll
Previously sprintf and _vsnprintf were imported from ntdll. These functions are defined as inline functions in ucrt headers, but linked directly by legacy CRT code.
2025-03-24 23:02:06 +00:00
Justin Miller
c37af4cfca [CODEOWNERS] add myself to codeowners for directx (#7816) 2025-03-24 23:08:34 +01:00
Timo Kreuzer
0fc0d9ebb1 [NTOS:KE] Skip an "optimization" on SMP 2025-03-24 21:33:48 +00:00
Timo Kreuzer
0016d65532 NTOS:KE] Make KiSetAffinityThread SMP ready 2025-03-24 21:33:48 +00:00
Timo Kreuzer
9292cad39a [NTOS:KE] Implement KiFindIdealProcessor 2025-03-24 21:33:48 +00:00
Timo Kreuzer
c1369e8c41 [NTOS:KE] Select proper processor in KiDeferredReadyThread 2025-03-24 21:33:48 +00:00
Denis Robert
8c9f250587 [SETUP:REACTOS] Update French (fr-FR) translation (#7564)
Update French translation in base/setup/reactos/lang

Co-authored-by: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
2025-03-24 22:26:07 +01:00
Whindmar Saksit
f222c2155d [SHELL32][SHDOCVW] Fix drive volume renaming (#7812)
* [SHELL32] Fix drive volume renaming

- Support renaming to empty volume name.
- Use SHGDN_FOREDITING in Explorer tree and DefView ("Volname" instead of "VolName (C:)").
- Added support for the ShowDriveLettersFirst setting.

CORE-17292

* Suggested changes
2025-03-24 22:01:22 +01:00
Daniel Victor
185225a5fc [FREELDR] Pass the correct ACPI table for Windows (#7486)
JIRA issue: CORE-11954 and CORE-18969

This PR passes the real ACPI table instead of a hardcoded (PVOID)1.
2025-03-24 21:49:39 +01:00
Doug Lyons
74599f6c97 [RICHED20] Fix MSVC Wordpad failure after riched20 Wine Sync to 6.10 (#7789)
JIRA issue: CORE-20006

Fix riched20 functionality when compiling with MSVC.
This fixed Wordpad and other programs that depend upon riched20.
2025-03-24 21:38:00 +01:00
Justin Miller
d7db8c9c80 [WIN32SS] Fix the extra VOID amendum to e7a9e7c 2025-03-24 21:32:41 +01:00
Justin Miller
b9b765038e [WIN32SS] Fix an added APIENTRY amendum to e7a9e7c 2025-03-24 21:27:57 +01:00
Justin Miller
e7a9e7ca3d [SDK][WIN32SS] Prepare d3dkmt functions up to Windows Vista (#5612)
Prepare the d3dkmt APIs up to Vista RTM
Build the skeleton needed for having userspace components talk to a WDDM KMD driver

Co-authored-by: Mark Jansen <mark.jansen@reactos.org>
Co-authored-by: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
2025-03-24 21:21:09 +01:00
Denis Robert
818842de06 [BASE] Update French (fr-FR) translation (#7563)
Updates French translation of base folder.
2025-03-24 21:10:02 +01:00
Thomas Faber
1b2eeb23e0 [NTOS:EX] Fix BufferSize validation in NtCreateProfile.
See https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/profile/bugdemo.htm
2025-03-24 20:56:30 +01:00
Thomas Faber
11d11f93ee [NTDLL_APITEST] Add tests for NtCreateProfile and NtStartProfile. 2025-03-24 20:56:30 +01:00
Mas Ahmad Muhammad
7b5e004dd6 [SETUP][USETUP] Update Indonesian (id-ID) translation (#7618)
Updating translation for: setup/reactos and setup/usetup.
2025-03-24 20:47:26 +01:00
Serge Gautherie
9ecd5fb6fe [FREELDR] DisplayBootTimeOptions(): Simplify concatenation checks (#4058) 2025-03-24 20:14:04 +01:00
Andrei Miloiu
ecb2293d6d [BUTTERFLIES] Improve Romanian (ro-RO) translation (#7363)
Improvements based on recent Romanian translation document revision 06e89b2.

This file was not translated in Romanian language in any Win version (neither XP/2k3+, nor in the previous ones). I tried to translate this file as close as possible in the way I did in the previous PRs.
2025-03-24 19:09:28 +01:00
Andrei Miloiu
1b63247b81 [DESK] Update Romanian (ro-RO) translation (#7584)
Improvements based on recent Romanian translation document revision 06e89b2.

This file exists in XP/2k3+, but there are many things I didn't find in desk.cpl. I found them in other files like explorer.exe. There were also many items I found nowhere. I tried to translate this file as close as possible in the way I did in the previous PRs.

I also fixed the accelerator collisions and added the missing ones.
2025-03-24 19:07:08 +01:00
Timo Kreuzer
4a5fdb9a3a [RSYM64] Nuke rsym64
It's purpose was to create x64 unwind information from DWARF debug info, but it was never fully working and is pointless now anyway, because x64 GCC does this itself properly.
2025-03-24 18:05:28 +00:00
Andrei Miloiu
5d30831fb8 [SETUP] Update Romanian (ro-RO) translation (#7660) 2025-03-24 19:05:11 +01:00
Justin Miller
35ed79f2d4 [GITHUB] Adjust the pullrequest template to include the buildbot testruns (#7754)
* [GITHUB] Adjust the pullrequest template

Co-authored-by: Hermès BÉLUSCA - MAÏTO <hermes.belusca-maito@reactos.org>
2025-03-24 18:23:41 +01:00
Mark Jansen
05d71fa69b [CERTUTIL] Add -asn verb 2025-03-24 18:00:06 +01:00
Ethem Çılgın
c35bb8dd73 [EXPLORER] Improve Turkish (tr-TR) translation (#7801)
Adapt Turkish translations from Windows and add the missing ‘Masaüstünü Göster’ translation as in Windows 10.
2025-03-24 14:06:30 +03:00
Katayama Hirofumi MZ
88d9285bd0 [SHELL32] Follow-up of #7805: Improve PathMakeUniqueName (#7809)
JIRA issue: CORE-19278
- Simplify formatString handling.
- Don't use magic number.
- Commonize some code.
2025-03-24 06:23:14 +09:00
Ratin Gao
cfcc8d85b2 [NEWDEV] Fix HardwareId match logic in UpdateDriverForPlugAndPlayDevicesW (#7808)
Match Hardware ID correctly. This fix is required to install the latest (7.1.6) Virtual Box Guest Additions drivers.

- Add Compatible IDs match, call SetupDiGetDeviceRegistryPropertyW twice, once for SPDRP_HARDWAREID and once for SPDRP_COMPATIBLEIDS.
- Use case-insensitive comparison (wcscmp -> _wcsicmp)
- Convert code file to UTF-8 encoding
2025-03-23 02:25:12 +01:00
Doug Lyons
ffa81857c2 [COMCTL32] ReactOS second stage listbox selection fix (#7793)
@I_Kill_Bugs patch
CORE-19814
Check for LBS_NOSEL flag for 'descr->style' in 'LISTBOX_PaintItem' and if FALSE, only then set 'selected'.
2025-03-22 19:33:50 -05:00
Ratin Gao
49a55a099e [SETUPAPI] Refactor SetupInstallServicesFromInfSectionExW (#7770)
Fix `SetupInstallServicesFromInfSectionEx`.

- Call SetupDiSetDeviceRegistryPropertyW only if DeviceInfoSet is valid
- DeviceInfoSet can be INVALID_HANDLE_VALUE, treat this as NULL
- Improve function declaration
2025-03-23 00:39:12 +01:00
Ratin Gao
7a9c744b70 [SETUPAPI] Stub implement SetupQueryInfVersionInformation (#7769)
Sync SetupQueryInfVersionInformation stubs to Wine.

The new synced stubs set ERROR_CALL_NOT_IMPLEMENTED as last error and return, rather than raise exception EXCEPTION_WINE_STUB (0x80000100), then the Virtual Box Guest Addition 7.1.6 setup progress can move on.
2025-03-23 00:17:50 +01:00
Justin Miller
6c7d2a2e25 [SDK] Fix RelWithDebInfo (#7811) 2025-03-22 23:12:52 +01:00
1798 changed files with 132097 additions and 68957 deletions

View File

@@ -1,19 +0,0 @@
{
"indentation": {
"type": "spaces",
"size": 4
},
"lineLength": 100,
"braceStyle": "allman",
"namingConventions": {
"functions": {
"public": "PascalCase",
"private": "_PascalCase"
},
"variables": {
"local": "camelCase",
"global": "PascalCase",
"constants": "UPPER_CASE"
}
}
}

View File

@@ -1,52 +0,0 @@
{
"editor": {
"defaultFormatter": null
},
"[c,cpp]": {
"editor": {
"tabSize": 4,
"insertSpaces": true,
"detectIndentation": false,
"trimAutoWhitespace": true,
"formatOnSave": false,
"formatOnType": true,
"defaultFormatter": "clang-format",
"rulers": [100],
"wordWrap": "off"
}
},
"files": {
"associations": {
"*.c": "c",
"*.h": "c",
"*.cpp": "cpp",
"*.hpp": "cpp"
},
"encoding": "utf8",
"trimTrailingWhitespace": true,
"insertFinalNewline": true,
"exclude": {
"**/.git": true,
"compile_commands.json": true,
"output-*": true,
"modules/optional": true,
"modules/3rdparty": true,
"modules/bootcd_extras": true,
"modules/livecd_extras": true,
"modules/hybridcd_extras": true,
"modules/[Aa][Hh][Kk]_[Tt]ests": true,
".cache": true,
".cproject": true,
".DS_Store": true,
".project": true,
".settings": true,
".vscode": true,
"sdk/tools/winesync/winesync.cfg": true,
"**/build": true,
"**/obj": true,
"**/bin": true,
"**/*.o": true,
"**/*.obj": true
}
}
}

View File

@@ -1,46 +0,0 @@
{
"projectType": "reactos",
"language": {
"c": {
"standard": "c99",
"warnings": ["all", "error", "pedantic", "unused"],
"formatter": "clang-format",
"linter": "clang-tidy"
},
"cpp": {
"standard": "c++11",
"warnings": ["all", "error", "pedantic", "unused"],
"formatter": "clang-format",
"linter": "clang-tidy"
}
},
"codingStyle": "reactos",
"formatOnSave": false,
"lintOnSave": false,
"paths": {
"source": [
"base",
"boot",
"dll",
"drivers",
"hal",
"ntoskrnl",
"subsystems",
"win32ss"
],
"include": [
"sdk/include"
],
"docs": [
"**/*.md",
"media/doc/*.md",
"media/doc/*.txt"
],
"tests": [
"modules/rostests"
],
"build": [
"output-*"
]
}
}

View File

@@ -17,3 +17,8 @@ _Use a TODO when your pull request is Work in Progress._
- [ ]
- [ ]
## Testbot runs (Filled in by Devs)
- [ ] KVM x86:
- [ ] KVM x64:

7
.github/labeler.yml vendored
View File

@@ -47,10 +47,7 @@ Win32SS:
"input method":
- changed-files:
- any-glob-to-any-file:
- base/applications/ctfmon/**
- dll/ime/**
- dll/win32/imm32/**
- dll/win32/msctf/**
- dll/win32/msutb/**
- base/ctf/**
- win32ss/user/imm32/**
- win32ss/user/ntuser/ime.c
- win32ss/user/user32/misc/imm.c

2
.gitignore vendored
View File

@@ -13,5 +13,3 @@ modules/[Aa][Hh][Kk]_[Tt]ests
.settings
.vscode
sdk/tools/winesync/winesync.cfg
.cursor/cache/
.cursor/logs/

View File

@@ -68,6 +68,9 @@ include(sdk/cmake/config.cmake)
# Compiler flags handling
include(sdk/cmake/compilerflags.cmake)
# set_wine_module function
include(sdk/cmake/set_wine_module.cmake)
add_definitions(
-D__REACTOS__
# swprintf without count argument is used in most of the codebase
@@ -157,7 +160,10 @@ if(NOT CMAKE_CROSSCOMPILING)
set(NATIVE_TARGETS asmpp bin2c widl gendib cabman fatten hpp isohybrid mkhive mkisofs obj2bin spec2def geninc mkshelllink utf16le xml2sdb)
if(NOT MSVC)
list(APPEND NATIVE_TARGETS rsym pefixup)
list(APPEND NATIVE_TARGETS pefixup)
if (ARCH STREQUAL "i386")
list(APPEND NATIVE_TARGETS rsym)
endif()
endif()
install(TARGETS ${NATIVE_TARGETS})

View File

@@ -116,6 +116,20 @@
# S: Abandoned
/ntoskrnl/cache/
# Client/Server Runtime Subsystem
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/sdk/include/reactos/subsys/csr/ @HBelusca
/subsystems/csr/ @HBelusca
/win32ss/user/ntuser/csr.* @HBelusca
# Clipboard Viewer
# M: HBelusca, Hermès Bélusca-Maïto
# R: Mondgestein, Ricardo Hanke
# S: Maintained
/base/applications/clipbrd/ @HBelusca
/base/applications/cmdutils/clip/ @HBelusca
# CMake Build Scripts
# M:
# R: learn-more, learn_more, Mark Jansen
@@ -124,6 +138,58 @@
/sdk/cmake/
*.cmake
# Command-line Utilities
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/applications/cmdutils/attrib/ @HBelusca
/base/applications/cmdutils/chcp/ @HBelusca
/base/applications/cmdutils/doskey/ @HBelusca
/base/applications/cmdutils/eventcreate/ @HBelusca
/base/applications/cmdutils/find/ @HBelusca
/base/applications/cmdutils/help/ @HBelusca
/base/applications/cmdutils/mode/ @HBelusca
/base/applications/cmdutils/more/ @HBelusca
/base/applications/cmdutils/taskkill/ @HBelusca
/base/applications/cmdutils/timeout/ @HBelusca
/sdk/lib/conutils/ @HBelusca
# Command-line Prompt Interpreter
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/shell/cmd/ @HBelusca
# Console Client/Server Subsystem, Terminal Emulator / Text-Mode
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/dll/cpl/console/ @HBelusca
/dll/win32/kernel32/client/console/ @HBelusca
/dll/win32/kernel32/include/console.h @HBelusca
/drivers/base/condrv/ @HBelusca
/drivers/setup/blue/ @HBelusca
/modules/rostests/winetests/kernel32/console.c @HBelusca
/sdk/include/psdk/wincon.h @HBelusca
/sdk/include/reactos/wincon_undoc.h @HBelusca
/sdk/include/reactos/drivers/condrv/ @HBelusca
/sdk/include/reactos/drivers/blue/ @HBelusca
/sdk/include/reactos/subsys/win/conmsg.h @HBelusca
/sdk/include/reactos/subsys/win/console.h @HBelusca
/win32ss/user/ntuser/console.c @HBelusca
/win32ss/user/winsrv/concfg/ @HBelusca
/win32ss/user/winsrv/consrv/ @HBelusca
# Event Log Subsystem
# M: HBelusca, Hermès Bélusca-Maïto
# M: EricKohl, ekohl, Eric Kohl
# S: Maintained
/base/services/eventlog/ @EricKohl @HBelusca
/dll/win32/advapi32/service/eventlog.c @EricKohl @HBelusca
/sdk/lib/evtlib/ @HBelusca
# Event Log Viewer
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/applications/mscutils/eventvwr/ @HBelusca
# File Patch API
# M: learn-more, learn_more, Mark Jansen
# S: Maintained
@@ -139,7 +205,7 @@
# Filesystem Filter Manager
# M: gedmurphy, Ged, Ged Murphy
# S: Maintained
/drivers/filters/fltmgr/ @gedmurphy
/drivers/filters/fltmgr/ @gedmurphy
# File Systems Run Time Library
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
@@ -150,11 +216,13 @@
/sdk/lib/drivers/ntoskrnl_vista/fsrtl.c @HeisSpiter
# Freeloader
# M:
# M: HBelusca, Hermès Bélusca-Maïto
# R: tkreuzer, ThePhysicist, Timo Kreuzer
# R: Extravert-ir, extravert34, Victor Perevertkin
# S: Maintained
/boot/freeldr/freeldr/ @tkreuzer @Extravert-ir
/boot/freeldr/freeldr/ @HBelusca @tkreuzer @Extravert-ir
/boot/rtl/ @HBelusca
/ntoskrnl/config/cmboot.c @HBelusca
# HAL / APIC
# M: tkreuzer, ThePhysicist, Timo Kreuzer
@@ -187,6 +255,12 @@
# S: Maintained
/drivers/storage/mountmgr/ @HeisSpiter
# MSConfig
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/applications/msconfig/ @HBelusca
/base/applications/msconfig_new/ @HBelusca
# Network Drivers
# M:
# R: ThFabba, Thomas Faber
@@ -215,11 +289,29 @@
# S: Maintained
/dll/ntdll/ @HeisSpiter @learn-more @ThFabba @tkreuzer
# NT Virtual DOS Machine
# M: HBelusca, Hermès Bélusca-Maïto
# R: reactos573, aandrejevic, Aleksandar Andrejevic
# S: Maintained
/dll/win32/kernel32/client/vdm.c @reactos573 @HBelusca
/dll/win32/kernel32/include/vdm.h @reactos573 @HBelusca
/sdk/include/reactos/subsys/win/vdm.h @reactos573 @HBelusca
/ntoskrnl/vdm/ @reactos573 @HBelusca
/sdk/include/reactos/libs/fast486/ @reactos573 @HBelusca
/sdk/lib/fast486/ @reactos573 @HBelusca
/subsystems/mvdm/ @reactos573 @HBelusca
/subsystems/win/basesrv/vdm.* @reactos573 @HBelusca
# Printing
# M: ColinFinck, Colin Finck
# S: Maintained
/win32ss/printing/ @ColinFinck
# Program Manager
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/shell/progman/ @HBelusca
# ReactOS API Tests
# M:
# R: learn-more, learn_more, Mark Jansen
@@ -232,7 +324,25 @@
# S: Maintained
/modules/rostests/kmtests/ @ThFabba
# ROS internals tools
# ReactOS Setup
# M: HBelusca, Hermès Bélusca-Maïto
# R: EricKohl, ekohl, Eric Kohl
# S: Maintained
/base/setup/ @HBelusca
/base/system/winlogon/setup.c @EricKohl
/dll/win32/setupapi/
/dll/win32/syssetup/ @EricKohl
/drivers/setup/ @HBelusca
/sdk/include/reactos/libs/syssetup/ @EricKohl
# ReactOS miscellaneous tools
# M:
# R: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/modules/rosapps/applications/cmdutils/cat/ @HBelusca
/modules/rosapps/applications/sysutils/utils/partinfo/ @HBelusca
# ReactOS internals tools
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
# S: Maintained
/modules/rosapps/applications/rosinternals/ @HeisSpiter
@@ -252,15 +362,26 @@
/modules/rostests/kmtests/ntos_se/ @GeoB99
/ntoskrnl/se/ @GeoB99
# Session Manager Subsystem
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/system/smss/ @HBelusca
/sdk/include/reactos/subsys/sm/ @HBelusca
/sdk/lib/smlib/ @HBelusca
# Shell
# M:
# R: learn-more, learn_more, Mark Jansen
# R: yagoulas, Giannis Adamopoulos
# R: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/shell/explorer/ @learn-more @yagoulas
/base/shell/rshell/ @learn-more @yagoulas
/dll/win32/browseui/ @learn-more @yagoulas
/dll/win32/shell32/ @learn-more @yagoulas
/dll/win32/shell32/CShellLink.* @HBelusca
/dll/win32/shell32/CUserNotification.* @HBelusca
/dll/win32/shell32/systray.cpp @HBelusca
# Shell Extensions
# M:
@@ -309,10 +430,34 @@
/modules/rosapps/applications/cmdutils/vfdcmd/ @HeisSpiter
/modules/rosapps/drivers/vfd/ @HeisSpiter
# Win32 file functions
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
# Win32 Subsystem
# M:
# R: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/dll/win32/kernel32/client/file/ @HeisSpiter
/sdk/include/reactos/winbase_undoc.h @HBelusca
/subsystems/win/basesrv/
/win32ss/user/winsrv/
/win32ss/user/winsrv/usersrv/harderror.c @HBelusca
# Win32 Subsystem - File functions
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
# R: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/dll/win32/kernel32/client/file/ @HeisSpiter
/dll/win32/kernel32/client/file/find.c @HBelusca
# Win32 Subsystem - Shutdown
# M: HBelusca, Hermès Bélusca-Maïto
# R: EricKohl, ekohl, Eric Kohl
# S: Maintained
/base/system/winlogon/sas.c @EricKohl @HBelusca
/base/system/winlogon/shutdown.c @EricKohl @HBelusca
/dll/win32/advapi32/misc/shutdown.c @EricKohl
/dll/win32/msgina/shutdown.c @EricKohl @HBelusca
/win32ss/user/ntuser/shutdown.* @HBelusca
/win32ss/user/user32/misc/exit.c @HBelusca
/win32ss/user/winsrv/consrv/shutdown.c @HBelusca
/win32ss/user/winsrv/usersrv/shutdown.c @HBelusca
# Windows Network File Systems functions
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
@@ -338,6 +483,11 @@
amd64/ @tkreuzer
/boot/freeldr/freeldr/arch/realmode/amd64.S @tkreuzer
# Wine DirectX
# M: DarkFire01, The_DarkFire_, Justin Miller
# S: Upstream
/dll/directx/wine/ @DarkFire01
# Translations
# This is the list of translation teams in ReactOS GitHub organization.
# If you want to be part of one - hit us at https://chat.reactos.org/

View File

@@ -1,5 +1,6 @@
add_subdirectory(applications)
add_subdirectory(ctf)
add_subdirectory(services)
add_subdirectory(setup)
add_subdirectory(shell)

View File

@@ -3,10 +3,10 @@ add_subdirectory(atactl)
add_subdirectory(cacls)
add_subdirectory(calc)
add_subdirectory(charmap)
add_subdirectory(cleanmgr)
add_subdirectory(clipbrd)
add_subdirectory(cmdutils)
add_subdirectory(control)
add_subdirectory(ctfmon)
add_subdirectory(drwtsn32)
add_subdirectory(dxdiag)
add_subdirectory(extrac32)

View File

@@ -801,11 +801,13 @@ MapWndProc(HWND hwnd,
infoPtr->CurrentFont.lfFaceName,
SIZEOF(lfFaceName));
SetFont(infoPtr, lfFaceName);
SetCaretXY(infoPtr, infoPtr->CaretX, infoPtr->CaretY, FALSE, TRUE);
break;
case FM_SETFONT:
infoPtr->CaretX = infoPtr->CaretY = infoPtr->iYStart = 0;
SetFont(infoPtr, (LPWSTR)lParam);
SetCaretXY(infoPtr, infoPtr->CaretX, infoPtr->CaretY, FALSE, TRUE);
break;
case FM_GETCHAR:

View File

@@ -0,0 +1,9 @@
project(cleanmgr)
# The main application
add_subdirectory(cleanmgr)
# Cleanup handlers
#add_subdirectory(dataclen) # Data Driven Cleaner

View File

@@ -0,0 +1,212 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CCleanupHandler implementation
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#include "cleanmgr.h"
CCleanupHandler::CCleanupHandler(CRegKey &subKey, const CStringW &keyName, const GUID &guid)
: hSubKey(subKey)
, KeyName(keyName)
, Guid(guid)
, dwFlags(0)
, Priority(0)
, StateFlags(0)
, SpaceUsed(0)
, ShowHandler(true)
, hIcon(NULL)
{
}
CCleanupHandler::~CCleanupHandler()
{
Deactivate();
::DestroyIcon(hIcon);
}
void
CCleanupHandler::Deactivate()
{
if (Handler)
{
DWORD dwFlags = 0;
Handler->Deactivate(&dwFlags);
if (dwFlags & EVCF_REMOVEFROMLIST)
UNIMPLEMENTED_DBGBREAK();
}
}
bool
CCleanupHandler::Initialize(LPCWSTR pcwszVolume)
{
if (FAILED_UNEXPECTEDLY(
::CoCreateInstance(Guid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IEmptyVolumeCache, &Handler))))
{
return false;
}
DWORD dwSize = sizeof(Priority);
if (hSubKey.QueryBinaryValue(L"Priority", &Priority, &dwSize) != ERROR_SUCCESS)
{
if (hSubKey.QueryDWORDValue(L"Priority", Priority) != ERROR_SUCCESS)
Priority = 200;
}
dwSize = sizeof(StateFlags);
if (hSubKey.QueryDWORDValue(L"StateFlags", StateFlags) != ERROR_SUCCESS)
StateFlags = 0;
WCHAR PathBuffer[MAX_PATH] = {};
ULONG nChars = _countof(PathBuffer);
if (hSubKey.QueryStringValue(L"IconPath", PathBuffer, &nChars) != ERROR_SUCCESS)
{
CStringW Tmp;
WCHAR GuidStr[50] = {};
if (StringFromGUID2(Guid, GuidStr, _countof(GuidStr)))
{
Tmp.Format(L"CLSID\\%s\\DefaultIcon", GuidStr);
CRegKey clsid;
nChars = _countof(PathBuffer);
if (clsid.Open(HKEY_CLASSES_ROOT, Tmp, KEY_READ) != ERROR_SUCCESS ||
clsid.QueryStringValue(NULL, PathBuffer, &nChars) != ERROR_SUCCESS)
{
PathBuffer[0] = UNICODE_NULL;
}
}
}
if (!PathBuffer[0])
StringCchCopyW(PathBuffer, _countof(PathBuffer), L"%systemroot%\\system32\\shell32.dll");
int Index = 0;
WCHAR *ptr = wcschr(PathBuffer, L',');
if (ptr)
{
*ptr++ = UNICODE_NULL;
Index = wcstol(ptr, NULL, 10);
}
HICON Large, Small;
UINT Result = ExtractIconExW(PathBuffer, Index, &Large, &Small, 1);
if (Result < 1)
Result = ExtractIconExW(L"%systemroot%\\system32\\shell32.dll", 0, &Large, &Small, 1);
if (Result >= 1)
{
hIcon = Small;
if (!hIcon)
{
hIcon = Large;
}
else
{
::DestroyIcon(Large);
}
}
// These options should come from the command line
// dwFlags |= EVCF_SETTINGSMODE;
// dwFlags |= EVCF_OUTOFDISKSPACE;
CComPtr<IEmptyVolumeCache2> spHandler2;
HRESULT hr = Handler->QueryInterface(IID_PPV_ARG(IEmptyVolumeCache2, &spHandler2));
if (SUCCEEDED(hr))
{
hr = spHandler2->InitializeEx(
hSubKey, pcwszVolume, KeyName, &wszDisplayName, &wszDescription, &wszBtnText, &dwFlags);
if (FAILED_UNEXPECTEDLY(hr))
return false;
// No files to clean will return S_FALSE;
if (hr != S_OK)
return false;
}
else
{
// Observed behavior:
// When Initialize is called, wszDescription is actually pointing to data
// wszDescription.AllocateBytes(0x400u);
hr = Handler->Initialize(hSubKey, pcwszVolume, &wszDisplayName, &wszDescription, &dwFlags);
if (FAILED_UNEXPECTEDLY(hr))
return false;
// No files to clean will return S_FALSE;
if (hr != S_OK)
return false;
CComPtr<IPropertyBag> spBag;
WCHAR GuidStr[50] = {};
nChars = _countof(GuidStr);
if (hSubKey.QueryStringValue(L"PropertyBag", GuidStr, &nChars) == ERROR_SUCCESS)
{
GUID guid = {};
if (!FAILED_UNEXPECTEDLY(CLSIDFromString(GuidStr, &guid)))
{
FAILED_UNEXPECTEDLY(
CoCreateInstance(guid, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IPropertyBag, &spBag)));
}
}
ReadProperty(L"Display", spBag, wszDisplayName);
ReadProperty(L"Description", spBag, wszDescription);
if (dwFlags & EVCF_HASSETTINGS)
{
ReadProperty(L"AdvancedButtonText", spBag, wszBtnText);
}
}
if ((dwFlags & EVCF_ENABLEBYDEFAULT) && !(StateFlags & HANDLER_STATE_SELECTED))
{
StateFlags |= HANDLER_STATE_SELECTED;
}
// For convenience
if (!wszDisplayName)
SHStrDupW(KeyName, &wszDisplayName);
return true;
}
void
CCleanupHandler::ReadProperty(LPCWSTR Name, IPropertyBag *pBag, CComHeapPtr<WCHAR> &storage)
{
if (storage)
return;
if (pBag)
{
CComVariant tmp;
tmp.vt = VT_BSTR;
HRESULT hr = pBag->Read(Name, &tmp, NULL);
if (!FAILED_UNEXPECTEDLY(hr) && tmp.vt == VT_BSTR)
{
SHStrDupW(tmp.bstrVal, &storage);
}
}
if (!storage)
{
WCHAR TmpStr[0x200] = {};
DWORD dwSize = _countof(TmpStr);
if (hSubKey.QueryStringValue(Name, TmpStr, &dwSize) == ERROR_SUCCESS)
{
WCHAR ResolvedStr[0x200] = {};
SHLoadIndirectString(TmpStr, ResolvedStr, _countof(ResolvedStr), NULL);
SHStrDupW(ResolvedStr, &storage);
}
}
}
BOOL
CCleanupHandler::HasSettings() const
{
return !!(dwFlags & EVCF_HASSETTINGS);
}
BOOL
CCleanupHandler::DontShowIfZero() const
{
return !!(dwFlags & EVCF_DONTSHOWIFZERO);
}

View File

@@ -0,0 +1,48 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CCleanupHandler definition
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#define HANDLER_STATE_SELECTED 1
struct CCleanupHandler
{
CCleanupHandler(CRegKey &subKey, const CStringW &keyName, const GUID &guid);
~CCleanupHandler();
void Deactivate();
bool
Initialize(LPCWSTR pcwszVolume);
void
ReadProperty(LPCWSTR Name, IPropertyBag *pBag, CComHeapPtr<WCHAR> &storage);
BOOL
HasSettings() const;
BOOL
DontShowIfZero() const;
CRegKey hSubKey;
CStringW KeyName;
GUID Guid;
CComHeapPtr<WCHAR> wszDisplayName;
CComHeapPtr<WCHAR> wszDescription;
CComHeapPtr<WCHAR> wszBtnText;
CStringW IconPath;
DWORD dwFlags;
DWORD Priority;
DWORD StateFlags;
CComPtr<IEmptyVolumeCache> Handler;
DWORDLONG SpaceUsed;
bool ShowHandler;
HICON hIcon;
};

View File

@@ -0,0 +1,163 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CCleanupHandlerList implementation
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#include "cleanmgr.h"
void CCleanupHandlerList::LoadHandlers(WCHAR Drive)
{
m_DriveStr.Format(L"%c:", Drive);
CRegKey VolumeCaches;
if (VolumeCaches.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\VolumeCaches", KEY_READ) != ERROR_SUCCESS)
return;
LONG ItemIndex = 0;
WCHAR szKeyName[MAX_PATH];
WCHAR wszVolume[] = { Drive, L':', L'\\', UNICODE_NULL };
while (TRUE)
{
DWORD dwSize = _countof(szKeyName);
if (VolumeCaches.EnumKey(ItemIndex++, szKeyName, &dwSize) != ERROR_SUCCESS)
{
break;
}
CRegKey hSubKey;
if (hSubKey.Open(VolumeCaches, szKeyName, KEY_READ) == ERROR_SUCCESS)
{
WCHAR GuidStr[50] = {};
dwSize = _countof(GuidStr);
if (hSubKey.QueryStringValue(NULL, GuidStr, &dwSize) != ERROR_SUCCESS)
{
continue;
}
GUID guid = {};
if (FAILED_UNEXPECTEDLY(CLSIDFromString(GuidStr, &guid)))
continue;
CCleanupHandler* handler = new CCleanupHandler(hSubKey, szKeyName, guid);
if (!handler->Initialize(wszVolume))
{
delete handler;
continue;
}
m_Handlers.AddTail(handler);
}
}
// Sort handlers
BOOL fChanged = m_Handlers.GetCount() > 0;
while (fChanged)
{
fChanged = FALSE;
for (size_t n = 0; n < m_Handlers.GetCount() - 1; n++)
{
POSITION leftPos = m_Handlers.FindIndex(n);
POSITION rightPos = m_Handlers.FindIndex(n+1);
CCleanupHandler* left = m_Handlers.GetAt(leftPos);
CCleanupHandler* right = m_Handlers.GetAt(rightPos);
if (right->Priority < left->Priority)
{
m_Handlers.SwapElements(leftPos, rightPos);
fChanged = TRUE;
}
else if (right->Priority == left->Priority)
{
CStringW leftStr(left->wszDisplayName);
if (leftStr.Compare(right->wszDisplayName) > 0)
{
m_Handlers.SwapElements(leftPos, rightPos);
fChanged = TRUE;
}
}
}
}
}
DWORDLONG
CCleanupHandlerList::ScanDrive(IEmptyVolumeCacheCallBack *picb)
{
CProgressDlg progress;
CString Caption;
Caption.Format(IDS_CALCULATING, m_DriveStr.GetString());
CStringW Title(MAKEINTRESOURCE(IDS_DISK_CLEANUP));
progress.Start((DWORD)m_Handlers.GetCount(), Title, Caption);
int ItemIndex = 0;
DWORDLONG TotalSpaceUsed = 0;
ForEach(
[&](CCleanupHandler *current)
{
Caption.Format(IDS_SCANNING, current->wszDisplayName.m_pData);
progress.Step(++ItemIndex, Caption);
HRESULT hr = current->Handler->GetSpaceUsed(&current->SpaceUsed, picb);
if (FAILED_UNEXPECTEDLY(hr))
{
current->ShowHandler = false;
current->StateFlags &= ~HANDLER_STATE_SELECTED;
return;
}
if (current->SpaceUsed == 0 && current->DontShowIfZero())
{
current->ShowHandler = false;
current->StateFlags &= ~HANDLER_STATE_SELECTED;
}
TotalSpaceUsed += current->SpaceUsed;
});
progress.Stop();
return TotalSpaceUsed;
}
void
CCleanupHandlerList::ExecuteCleanup(IEmptyVolumeCacheCallBack *picb)
{
CProgressDlg progress;
CString Caption;
Caption.Format(IDS_CLEANING_CAPTION, m_DriveStr.GetString());
DWORD TotalSelected = 0;
ForEach(
[&](CCleanupHandler *current)
{
if (current->StateFlags & HANDLER_STATE_SELECTED)
TotalSelected++;
});
CStringW Title(MAKEINTRESOURCE(IDS_DISK_CLEANUP));
progress.Start(TotalSelected, Title, Caption);
int ItemIndex = 0;
ForEach(
[&](CCleanupHandler *current)
{
if (!(current->StateFlags & HANDLER_STATE_SELECTED))
return;
Caption.Format(IDS_CLEANING, current->wszDisplayName.m_pData);
progress.Step(++ItemIndex, Caption);
// If there is nothing to clean, we might get STG_E_NOMOREFILES
if (current->SpaceUsed > 0)
{
HRESULT hr = current->Handler->Purge(-1, picb);
if (FAILED_UNEXPECTEDLY(hr))
return;
}
});
progress.Stop();
}

View File

@@ -0,0 +1,31 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CCleanupHandlerList definition
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
class CCleanupHandlerList
{
private:
CAtlList<CCleanupHandler *> m_Handlers;
CStringW m_DriveStr;
public:
void LoadHandlers(WCHAR Drive);
DWORDLONG ScanDrive(IEmptyVolumeCacheCallBack* picb);
void ExecuteCleanup(IEmptyVolumeCacheCallBack *picb);
template<typename Fn>
void ForEach(Fn callback)
{
for (POSITION it = m_Handlers.GetHeadPosition(); it; m_Handlers.GetNext(it))
{
CCleanupHandler *current = m_Handlers.GetAt(it);
callback(current);
}
}
};

View File

@@ -0,0 +1,54 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CEmptyVolumeCacheCallBack definition / implementation
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
// We don't really use this, but some windows handlers crash without it
struct CEmptyVolumeCacheCallBack
: public IEmptyVolumeCacheCallBack
{
STDMETHOD_(ULONG, AddRef)() throw()
{
return 2;
}
STDMETHOD_(ULONG, Release)() throw()
{
return 1;
}
STDMETHOD(QueryInterface)(
REFIID riid,
_COM_Outptr_ void** ppvObject) throw()
{
if (riid == IID_IUnknown || riid == IID_IEmptyVolumeCacheCallBack)
{
*ppvObject = (IUnknown*)this;
return S_OK;
}
*ppvObject = NULL;
return E_NOINTERFACE;
}
STDMETHODIMP ScanProgress(
_In_ DWORDLONG dwlSpaceUsed,
_In_ DWORD dwFlags,
_In_ LPCWSTR pcwszStatus) override
{
DPRINT("dwlSpaceUsed: %lld, dwFlags: %x\n", dwlSpaceUsed, dwFlags);
return S_OK;
}
STDMETHODIMP PurgeProgress(
_In_ DWORDLONG dwlSpaceFreed,
_In_ DWORDLONG dwlSpaceToFree,
_In_ DWORD dwFlags,
_In_ LPCWSTR pcwszStatus) override
{
DPRINT("dwlSpaceFreed: %lld, dwlSpaceToFree: %lld, dwFlags: %x\n", dwlSpaceFreed, dwlSpaceToFree, dwFlags);
return S_OK;
}
};

View File

@@ -0,0 +1,19 @@
add_executable(cleanmgr
cleanmgr.cpp
cleanmgr.h
cleanmgr.rc
resource.h
CEmptyVolumeCacheCallBack.hpp
CProgressDlg.hpp
CSelectDriveDlg.cpp
CCleanupHandler.cpp
CCleanupHandler.hpp
CCleanupHandlerList.cpp
CCleanupHandlerList.hpp
)
set_module_type(cleanmgr win32gui UNICODE)
target_link_libraries(cleanmgr uuid cpprt atl_classes)
add_importlibs(cleanmgr shlwapi oleaut32 ole32 shell32 comctl32 user32 advapi32 msvcrt kernel32 ntdll)
add_dependencies(cleanmgr psdk)
add_cd_file(TARGET cleanmgr DESTINATION reactos/system32 FOR all)

View File

@@ -0,0 +1,50 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Progress dialog implementation
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#pragma once
class CProgressDlg
{
CComPtr<IProgressDialog> m_spProgress;
DWORD m_dwTotal = 0;
public:
~CProgressDlg()
{
Stop();
}
void Start(DWORD dwTotalSteps, LPCWSTR Title, LPCWSTR Text)
{
HRESULT hr = CoCreateInstance(CLSID_ProgressDialog, NULL, CLSCTX_INPROC, IID_PPV_ARG(IProgressDialog, &m_spProgress));
if (FAILED_UNEXPECTEDLY(hr))
return;
m_dwTotal = dwTotalSteps;
m_spProgress->SetTitle(Title);
m_spProgress->SetLine(2, Text, TRUE, NULL);
m_spProgress->StartProgressDialog(NULL, NULL, PROGDLG_NOMINIMIZE, NULL);
m_spProgress->SetProgress(0, m_dwTotal);
}
void Step(DWORD dwProgress, LPCWSTR Text)
{
m_spProgress->SetProgress(dwProgress, m_dwTotal);
m_spProgress->SetLine(1, Text, TRUE, NULL);
}
void Stop()
{
if (m_spProgress)
{
m_spProgress->StopProgressDialog();
m_spProgress.Release();
}
}
};

View File

@@ -0,0 +1,80 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Drive selection dialog
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#include "cleanmgr.h"
class CSelectDriveDlg : public CDialogImpl<CSelectDriveDlg>
{
public:
enum { IDD = IDD_SELECTDRIVE };
BEGIN_MSG_MAP(CSelectDriveDlg)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDOK, OnEndDialog)
COMMAND_ID_HANDLER(IDCANCEL, OnEndDialog)
END_MSG_MAP()
CSelectDriveDlg()
:m_SelectedDrive(UNICODE_NULL)
{
}
LRESULT OnInitDialog(UINT, WPARAM, LPARAM, BOOL&)
{
// Try to find an existing instance of this dialog
WCHAR buf[300];
GetWindowTextW(buf, _countof(buf));
for (HWND hNext = NULL, hFind; (hFind = ::FindWindowExW(NULL, hNext, NULL, buf)) != NULL; hNext = hFind)
{
if (hFind != *this && ::IsWindowVisible(hFind))
{
::SetForegroundWindow(hFind);
EndDialog(IDCANCEL);
return FALSE;
}
}
CWindow cbo = GetDlgItem(IDC_DRIVES);
WCHAR VolumeNameBuffer[MAX_PATH + 1];
CStringW Tmp;
for (WCHAR Drive = 'A'; Drive <= 'Z'; ++Drive)
{
WCHAR RootPathName[] = { Drive,':','\\',0 };
UINT Type = GetDriveTypeW(RootPathName);
if (Type == DRIVE_FIXED)
{
GetVolumeInformationW(RootPathName, VolumeNameBuffer, _countof(VolumeNameBuffer), 0, 0, 0, 0, 0);
Tmp.Format(L"%s (%.2s)", VolumeNameBuffer, RootPathName);
int index = (int)cbo.SendMessage(CB_ADDSTRING, NULL, (LPARAM)Tmp.GetString());
cbo.SendMessage(CB_SETITEMDATA, index, Drive);
}
}
cbo.SendMessage(CB_SETCURSEL, 0);
return 1;
}
LRESULT OnEndDialog(WORD, WORD wID, HWND, BOOL&)
{
CWindow cbo = GetDlgItem(IDC_DRIVES);
m_SelectedDrive = (WCHAR)cbo.SendMessage(CB_GETITEMDATA, cbo.SendMessage(CB_GETCURSEL));
EndDialog(wID);
return 0;
}
WCHAR m_SelectedDrive;
};
void
SelectDrive(WCHAR &Drive)
{
CSelectDriveDlg dlgSelectDrive;
if (dlgSelectDrive.DoModal() == IDOK)
{
Drive = dlgSelectDrive.m_SelectedDrive;
}
}

View File

@@ -0,0 +1,328 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Disk cleanup entrypoint
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#include "cleanmgr.h"
// for listview with extend style LVS_EX_CHECKBOXES, State image 1 is the unchecked box, and state image 2 is the
// checked box. see this: https://docs.microsoft.com/en-us/windows/win32/controls/extended-list-view-styles
#define STATEIMAGETOINDEX(x) (((x)&LVIS_STATEIMAGEMASK) >> 12)
#define STATEIMAGE_UNCHECKED 1
#define STATEIMAGE_CHECKED 2
struct CCleanMgrProperties :
public CPropertyPageImpl<CCleanMgrProperties>
{
enum { IDD = IDD_PROPERTIES_MAIN };
CWindow m_HandlerListControl;
WCHAR m_Drive;
DWORDLONG m_TotalSpaceUsed;
CCleanupHandlerList* m_HandlerList;
bool m_IgnoreChanges = true;
CCleanMgrProperties(WCHAR Drive, DWORDLONG TotalSpaceUsed, CCleanupHandlerList *handlerList)
: m_Drive(Drive)
, m_TotalSpaceUsed(TotalSpaceUsed)
, m_HandlerList(handlerList)
{
}
int OnApply()
{
CStringW Title(MAKEINTRESOURCE(IDS_DISK_CLEANUP));
CStringW Text(MAKEINTRESOURCE(IDS_CONFIRM_DELETE));
if (MessageBoxW(Text, Title, MB_YESNO | MB_ICONQUESTION) != IDYES)
return PSNRET_INVALID;
return PSNRET_NOERROR;
}
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HICON hIcon = (HICON)::LoadImageW(
_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCEW(IDI_CLEANMGR), IMAGE_ICON, 0, 0,
LR_DEFAULTSIZE | LR_SHARED);
SendDlgItemMessage(IDC_DISKICON, STM_SETICON, (WPARAM)hIcon);
m_HandlerListControl = GetDlgItem(IDC_HANDLERLIST);
RECT rc;
m_HandlerListControl.GetClientRect(&rc);
rc.right -= GetSystemMetrics(SM_CXVSCROLL);
LV_COLUMN column = {};
column.mask = LVCF_FMT | LVCF_WIDTH;
column.fmt = LVCFMT_LEFT;
column.cx = rc.right * 80 / 100;
ListView_InsertColumn(m_HandlerListControl, 0, &column);
column.fmt = LVCFMT_RIGHT;
column.cx = rc.right * 20 / 100;
ListView_InsertColumn(m_HandlerListControl, 1, &column);
HIMAGELIST hImagelist = ImageList_Create(16, 16, ILC_MASK | ILC_COLOR32, 1, 1);
ListView_SetImageList(m_HandlerListControl, hImagelist, LVSIL_SMALL);
ListView_SetExtendedListViewStyleEx(m_HandlerListControl, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT, LVS_EX_CHECKBOXES | LVS_EX_FULLROWSELECT);
m_HandlerList->ForEach(
[&](CCleanupHandler *current)
{
if (!current->ShowHandler)
return;
LV_ITEM item = {};
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.lParam = (LPARAM)current;
item.pszText = (LPWSTR)current->wszDisplayName;
item.iItem = ListView_GetItemCount(m_HandlerListControl);
item.iImage = ImageList_AddIcon(hImagelist, current->hIcon);
item.iItem = ListView_InsertItem(m_HandlerListControl, &item);
ListView_SetCheckState(
m_HandlerListControl, item.iItem, !!(current->StateFlags & HANDLER_STATE_SELECTED));
item.mask = LVIF_TEXT;
WCHAR ByteSize[100] = {};
StrFormatByteSizeW(current->SpaceUsed, ByteSize, _countof(ByteSize));
ListView_SetItemText(m_HandlerListControl, item.iItem, 1, ByteSize);
});
// Now we should start responding to changes
m_IgnoreChanges = false;
// Select the first item
ListView_SetItemState(m_HandlerListControl, 0, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED);
UpdateSpaceUsed();
return TRUE;
}
CCleanupHandler* GetHandler(int Index)
{
LVITEMW item = {};
item.iItem = Index;
if (item.iItem >= 0)
{
item.mask = LVIF_PARAM;
ListView_GetItem(m_HandlerListControl, &item);
return (CCleanupHandler*)item.lParam;
}
return nullptr;
}
LRESULT OnDetails(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
{
CCleanupHandler *handler = GetHandler(ListView_GetNextItem(m_HandlerListControl, -1, LVIS_FOCUSED));
if (handler)
{
handler->Handler->ShowProperties(m_hWnd);
}
return 0L;
}
LRESULT OnHandlerItemchanged(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
if (idCtrl == IDC_HANDLERLIST)
{
// We are still initializing, don't respond to changes just yet!
if (m_IgnoreChanges)
return 0L;
LPNMLISTVIEW pnic = (LPNMLISTVIEW)pnmh;
// We only care about state changes
if (!(pnic->uChanged & LVIF_STATE))
return 0L;
INT ItemIndex = pnic->iItem;
if (ItemIndex == -1 || ItemIndex >= ListView_GetItemCount(pnic->hdr.hwndFrom))
{
return 0L;
}
bool GotSelected = (pnic->uNewState & LVIS_SELECTED) && !(pnic->uOldState & LVIS_SELECTED);
if (GotSelected)
{
CWindow DetailsButton = GetDlgItem(IDC_DETAILS);
CCleanupHandler* handler = (CCleanupHandler*)pnic->lParam;
SetDlgItemText(IDC_DESCRIPTION, handler->wszDescription ? handler->wszDescription : L"");
if (handler->HasSettings())
{
DetailsButton.ShowWindow(SW_SHOW);
DetailsButton.SetWindowText(handler->wszBtnText);
}
else
{
DetailsButton.ShowWindow(SW_HIDE);
}
}
int iOldState = STATEIMAGETOINDEX(pnic->uOldState);
int iNewState = STATEIMAGETOINDEX(pnic->uNewState);
if ((iOldState ^ iNewState) == (STATEIMAGE_UNCHECKED ^ STATEIMAGE_CHECKED))
{
CCleanupHandler* handler = (CCleanupHandler*)pnic->lParam;
if (iNewState == STATEIMAGE_CHECKED)
handler->StateFlags |= HANDLER_STATE_SELECTED;
else
handler->StateFlags &= ~HANDLER_STATE_SELECTED;
UpdateSpaceUsed();
}
}
return 0L;
}
void UpdateSpaceUsed()
{
CStringW tmp;
WCHAR ByteSize[100];
StrFormatByteSizeW(m_TotalSpaceUsed, ByteSize, _countof(ByteSize));
tmp.Format(IDS_TOTAL_CLEANABLE_CAPTION, ByteSize, m_Drive);
SetDlgItemText(IDC_TOTAL_CLEANABLE, tmp);
DWORDLONG SelectedGained = 0;
m_HandlerList->ForEach(
[&](CCleanupHandler *current)
{
if (current->StateFlags & HANDLER_STATE_SELECTED)
{
SelectedGained += current->SpaceUsed;
}
});
StrFormatByteSizeW(SelectedGained, ByteSize, _countof(ByteSize));
SetDlgItemText(IDC_SELECTED_GAINED, ByteSize);
}
BEGIN_MSG_MAP(CCleanMgrProperties)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
COMMAND_ID_HANDLER(IDC_DETAILS, OnDetails)
NOTIFY_HANDLER(IDC_HANDLERLIST, LVN_ITEMCHANGED, OnHandlerItemchanged)
CHAIN_MSG_MAP(CPropertyPageImpl<CCleanMgrProperties>) // Allow the default handler to call 'OnApply' etc
END_MSG_MAP()
};
class CCleanMgrModule : public ATL::CAtlExeModuleT< CCleanMgrModule >
{
public:
WCHAR m_Drive = UNICODE_NULL;
bool ParseCommandLine(
_In_z_ LPCTSTR lpCmdLine,
_Out_ HRESULT* pnRetCode) throw()
{
int argc = 0;
CLocalPtr<LPWSTR> argv(CommandLineToArgvW(lpCmdLine, &argc));
for (int n = 1; n < argc; ++n)
{
if ((argv[n][0] == '/' || argv[n][0] == '-') && towlower(argv[n][1]) == 'd')
{
if (iswalpha(argv[n][2]))
{
m_Drive = towupper(argv[n][2]);
continue;
}
if ((n + 1) < argc)
{
m_Drive = towupper(argv[n + 1][0]);
++n;
continue;
}
}
}
*pnRetCode = S_OK;
return true;
}
static inline UINT GetWindowProcessId(_In_ HWND hWnd)
{
DWORD pid;
return GetWindowThreadProcessId(hWnd, &pid) ? pid : 0;
}
static BOOL CALLBACK EnumSingleInstanceCallback(_In_ HWND hWnd, _In_ LPARAM lParam)
{
if (::IsWindowVisible(hWnd) && (LPARAM)GetWindowProcessId(hWnd) == lParam)
{
::SetForegroundWindow(hWnd);
return FALSE;
}
return TRUE;
}
HRESULT Run(_In_ int nShowCmd) throw()
{
if (m_Drive == UNICODE_NULL)
{
SelectDrive(m_Drive);
}
if (m_Drive == UNICODE_NULL)
return E_FAIL;
CStringW Title;
Title.Format(IDS_PROPERTIES_MAIN_TITLE, m_Drive);
HWND hWndInstance = ::CreateWindowExW(WS_EX_TOOLWINDOW, WC_STATIC, Title, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
for (HWND hNext = NULL, hFind; (hFind = ::FindWindowExW(NULL, hNext, WC_STATIC, Title)) != NULL; hNext = hFind)
{
if (hFind != hWndInstance)
{
::EnumWindows(EnumSingleInstanceCallback, GetWindowProcessId(hFind));
return S_FALSE;
}
}
CCleanupHandlerList Handlers;
CEmptyVolumeCacheCallBack CacheCallBack;
Handlers.LoadHandlers(m_Drive);
DWORDLONG TotalSpaceUsed = Handlers.ScanDrive(&CacheCallBack);
CCleanMgrProperties cleanMgr(m_Drive, TotalSpaceUsed, &Handlers);
HPROPSHEETPAGE hpsp[1] = { cleanMgr.Create() };
PROPSHEETHEADERW psh = { };
psh.dwSize = sizeof(psh);
psh.dwFlags = PSH_NOAPPLYNOW | PSH_USEICONID | PSH_NOCONTEXTHELP;
psh.hInstance = _AtlBaseModule.GetResourceInstance();
psh.pszIcon = MAKEINTRESOURCEW(IDI_CLEANMGR);
psh.pszCaption = Title;
psh.nPages = _countof(hpsp);
psh.phpage = hpsp;
if (PropertySheetW(&psh) >= 1)
{
::DestroyWindow(hWndInstance); // Allow new "cleanmgr /D" without waiting for these handlers
Handlers.ExecuteCleanup(&CacheCallBack);
}
else
{
::DestroyWindow(hWndInstance);
}
return S_OK;
}
};
CCleanMgrModule _AtlModule;
extern "C" int WINAPI wWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/,
LPWSTR /*lpCmdLine*/, int nShowCmd)
{
return _AtlModule.WinMain(nShowCmd);
}

View File

@@ -0,0 +1,66 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Main header file
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#pragma once
#ifndef STRICT
#define STRICT
#endif
#define _ATL_APARTMENT_THREADED
#define _ATL_NO_AUTOMATIC_NAMESPACE
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit
#define ATL_NO_ASSERT_ON_DESTROY_NONEXISTENT_WINDOW
#define _FORCENAMELESSUNION
#include <ndk/rtlfuncs.h>
#include <windef.h>
#include <winbase.h>
#include <shlobj.h>
#include <shlwapi.h>
#include <atlbase.h>
#include <atlcom.h>
#include <atlstr.h>
#include <strsafe.h>
#include <emptyvc.h>
#include <atlcoll.h>
using namespace ATL;
#define NDEBUG
#include <reactos/debug.h>
#include <reactos/shellutils.h>
#include <ui/rosdlgs.h>
template <class T> class CLocalPtr
: public CHeapPtr<T, CLocalAllocator>
{
public:
CLocalPtr() throw()
{
}
explicit CLocalPtr(_In_ T* pData) throw() :
CHeapPtr<T, CLocalAllocator>(pData)
{
}
};
#include "resource.h"
#include "CProgressDlg.hpp"
#include "CCleanupHandler.hpp"
#include "CCleanupHandlerList.hpp"
#include "CEmptyVolumeCacheCallBack.hpp"
// CSelectDriveDlg.cpp
void
SelectDrive(WCHAR &Drive);

View File

@@ -0,0 +1,64 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Resources
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#include <windef.h>
#include <winuser.h>
#include <commctrl.h>
#include "resource.h"
#define REACTOS_STR_FILE_DESCRIPTION "ReactOS Disk Cleanup"
#define REACTOS_STR_INTERNAL_NAME "cleanmgr"
#define REACTOS_STR_ORIGINAL_FILENAME "cleanmgr.exe"
#include <reactos/version.rc>
#include <reactos/manifest_exe.rc>
IDI_CLEANMGR ICON "resources/cleanmgr.ico"
#pragma code_page(65001)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
STRINGTABLE
BEGIN
IDS_PROPERTIES_MAIN_TITLE "Disk Cleanup for (%c:)"
IDS_TOTAL_CLEANABLE_CAPTION "You can use Disk Cleanup to free up to %s of disk space on (%c:)."
IDS_DISK_CLEANUP "Disk Cleanup"
IDS_CONFIRM_DELETE "Are you sure you want to delete these files permanently?"
IDS_CALCULATING "Disk Cleanup is calculating how much space can be gained on (%s)."
IDS_SCANNING "Scanning: %s"
IDS_CLEANING_CAPTION "Disk Cleanup is cleaning up files on %s."
IDS_CLEANING "Cleaning: %s"
END
IDD_PROPERTIES_MAIN DIALOGEX 0, 0, 235, 215
STYLE DS_SETFONT | DS_FIXEDSYS | DS_CENTER | WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION "Disk Cleanup"
FONT 8, "MS Shell Dlg", 400, 0, 0x0
BEGIN
CONTROL "",IDC_DISKICON,"Static",SS_ICON,6,6,20,20
LTEXT "You can use Disk Cleanup to free up to 0.0MB of disk space on drive C.",IDC_TOTAL_CLEANABLE,36,6,192,18
LTEXT "Files to delete:",IDC_STATIC,6,30,222,8
CONTROL "",IDC_HANDLERLIST,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_NOCOLUMNHEADER | WS_BORDER | WS_TABSTOP,6,42,222,66
LTEXT "Total amount of disk space gained:",IDC_STATIC,6,114,144,8
RTEXT "",IDC_SELECTED_GAINED,156,114,73,8
GROUPBOX "Description",IDC_STATIC,6,126,222,84
LTEXT "",IDC_DESCRIPTION,12,138,210,54
PUSHBUTTON "Details...",IDC_DETAILS,150,192,74,14
END
IDD_SELECTDRIVE DIALOGEX 0, 0, 177, 74
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Disk Cleanup - Select Drive"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,30,48,50,14
PUSHBUTTON "E&xit",IDCANCEL,96,48,50,14
LTEXT "Select the drive to clean up.",IDC_STATIC,12,6,150,8
COMBOBOX IDC_DRIVES,12,24,150,90,CBS_DROPDOWNLIST | CBS_HASSTRINGS | CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
END

View File

@@ -0,0 +1,30 @@
/*
* PROJECT: ReactOS Disk Cleanup
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: Resource definitions
* COPYRIGHT: Copyright 2023-2025 Mark Jansen <mark.jansen@reactos.org>
*/
#define IDC_STATIC -1
#define IDI_CLEANMGR 100
#define IDD_PROPERTIES_MAIN 200
#define IDC_DISKICON 201
#define IDC_TOTAL_CLEANABLE 202
#define IDC_HANDLERLIST 203
#define IDC_SELECTED_GAINED 204
#define IDC_DESCRIPTION 205
#define IDC_DETAILS 206
#define IDD_SELECTDRIVE 220
#define IDC_DRIVES 221
#define IDS_PROPERTIES_MAIN_TITLE 1000
#define IDS_TOTAL_CLEANABLE_CAPTION 1001
#define IDS_DISK_CLEANUP 1002
#define IDS_CONFIRM_DELETE 1003
#define IDS_CALCULATING 1004
#define IDS_SCANNING 1005
#define IDS_CLEANING_CAPTION 1006
#define IDS_CLEANING 1007

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -2,12 +2,14 @@
include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/conutils)
list(APPEND SOURCE
certutil.c
asn.cpp
certutil.cpp
hashfile.cpp
precomp.h)
add_executable(certutil ${SOURCE})
set_module_type(certutil win32cui UNICODE)
target_link_libraries(certutil conutils ${PSEH_LIB})
add_importlibs(certutil advapi32 msvcrt kernel32)
add_importlibs(certutil crypt32 advapi32 msvcrt kernel32)
add_pch(certutil precomp.h SOURCE)
add_cd_file(TARGET certutil DESTINATION reactos/system32 FOR all)

View File

@@ -0,0 +1,508 @@
/*
* PROJECT: ReactOS certutil
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CertUtil asn implementation
* COPYRIGHT: Copyright 2020 Mark Jansen (mark.jansen@reactos.org)
*
* NOTES:
* To keep it simple, Tag and Class are combined in one identifier
* See for more details:
* https://en.wikipedia.org/wiki/X.690#BER_encoding
* https://www.strozhevsky.com/free_docs/asn1_by_simple_words.pdf
* http://mikk.net/~chris/asn1.pdf
*
* And for a test suite:
* https://github.com/YuryStrozhevsky/asn1-test-suite
*/
#include "precomp.h"
#include <math.h>
#include <wincrypt.h>
#include <stdlib.h>
#define ASN_TAG_IS_CONSTRUCTED 0x20
#define ASN_TAG_BITSTRING 0x03
#define ASN_TAG_OCTET_STRING 0x04
#define ASN_TAG_OBJECT_ID 0x06
#define ASN_TAG_SEQUENCE_RAW 0x10
#define ASN_TAG_SET_RAW 0x11
#define ASN_TAG_SEQUENCE 0x30
#define ASN_TAG_SET 0x31
#define ASN_TAG_CONTEXT_SPECIFIC 0x80
#define ASN_TAG_CONTEXT_SPECIFIC_N(n) (ASN_TAG_CONTEXT_SPECIFIC | (n))
#define ASN_TAG_OPTIONAL 0xA0
#define ASN_TAG_OPTIONAL_N(n) (ASN_TAG_OPTIONAL | (n))
/* NOTE: These names are not the names listed in f.e. the wikipedia pages,
they are made to look like MS's names for this */
LPCWSTR TagToName(DWORD dwTag)
{
switch (dwTag)
{
case 0x0: return L"EOC";
case 0x1: return L"BOOL";
case 0x2: return L"INTEGER";
case ASN_TAG_BITSTRING: return L"BIT_STRING";
case ASN_TAG_OCTET_STRING: return L"OCTET_STRING";
case 0x5: return L"NULL";
case ASN_TAG_OBJECT_ID: return L"OBJECT_ID";
case 0x7: return L"Object Descriptor";
case 0x8: return L"EXTERNAL";
case 0x9: return L"REAL";
case 0xA: return L"ENUMERATED";
case 0xB: return L"EMBEDDED PDV";
case 0xC: return L"UTF8String";
case 0xD: return L"RELATIVE-OID";
case 0xE: return L"TIME";
case 0xF: return L"Reserved";
case ASN_TAG_SEQUENCE_RAW: __debugbreak(); return L"SEQUENCE_RAW";
case ASN_TAG_SET_RAW: __debugbreak(); return L"SET_RAW";
case 0x12: return L"NumericString";
case 0x13: return L"PRINTABLE_STRING";
case 0x14: return L"T61String";
case 0x15: return L"VideotexString";
case 0x16: return L"IA5String";
case 0x17: return L"UTC_TIME";
case 0x18: return L"GeneralizedTime";
case 0x19: return L"GraphicString";
case 0x1A: return L"VisibleString";
case 0x1B: return L"GeneralString";
case 0x1C: return L"UniversalString";
case 0x1D: return L"CHARACTER STRING";
case 0x1E: return L"BMPString";
case 0x1F: return L"DATE";
case 0x20: return L"CONSTRUCTED";
case ASN_TAG_SEQUENCE: return L"SEQUENCE";
case ASN_TAG_SET: return L"SET";
case ASN_TAG_CONTEXT_SPECIFIC_N(0): return L"CONTEXT_SPECIFIC[0]";
case ASN_TAG_CONTEXT_SPECIFIC_N(1): return L"CONTEXT_SPECIFIC[1]";
case ASN_TAG_CONTEXT_SPECIFIC_N(2): return L"CONTEXT_SPECIFIC[2]";
case ASN_TAG_CONTEXT_SPECIFIC_N(3): return L"CONTEXT_SPECIFIC[3]";
case ASN_TAG_CONTEXT_SPECIFIC_N(4): return L"CONTEXT_SPECIFIC[4]";
case ASN_TAG_CONTEXT_SPECIFIC_N(5): return L"CONTEXT_SPECIFIC[5]";
case ASN_TAG_CONTEXT_SPECIFIC_N(6): return L"CONTEXT_SPECIFIC[6]";
case ASN_TAG_CONTEXT_SPECIFIC_N(7): return L"CONTEXT_SPECIFIC[7]";
case ASN_TAG_CONTEXT_SPECIFIC_N(8): return L"CONTEXT_SPECIFIC[8]";
case ASN_TAG_CONTEXT_SPECIFIC_N(9): return L"CONTEXT_SPECIFIC[9]";
/* Experiments show that Windows' certutil only goes up to 9 */
case ASN_TAG_OPTIONAL_N(0): return L"OPTIONAL[0]";
case ASN_TAG_OPTIONAL_N(1): return L"OPTIONAL[1]";
case ASN_TAG_OPTIONAL_N(2): return L"OPTIONAL[2]";
case ASN_TAG_OPTIONAL_N(3): return L"OPTIONAL[3]";
case ASN_TAG_OPTIONAL_N(4): return L"OPTIONAL[4]";
case ASN_TAG_OPTIONAL_N(5): return L"OPTIONAL[5]";
case ASN_TAG_OPTIONAL_N(6): return L"OPTIONAL[6]";
case ASN_TAG_OPTIONAL_N(7): return L"OPTIONAL[7]";
case ASN_TAG_OPTIONAL_N(8): return L"OPTIONAL[8]";
case ASN_TAG_OPTIONAL_N(9): return L"OPTIONAL[9]";
/* Experiments show that Windows' certutil only goes up to 9 */
default:
return L"???";
}
}
BOOL Move(DWORD dwLen, PBYTE& pData, DWORD& dwSize)
{
if (dwSize < dwLen)
return FALSE;
pData += dwLen;
dwSize -= dwLen;
return TRUE;
}
BOOL ParseTag(PBYTE& pData, DWORD& dwSize, DWORD& dwTagAndClass)
{
if (dwSize == 0)
return FALSE;
/* Is this a long form? */
if ((pData[0] & 0x1f) != 0x1f)
{
/* No, so extract the tag and class (in one identifier) */
dwTagAndClass = pData[0];
return Move(1, pData, dwSize);
}
DWORD dwClass = (pData[0] & 0xE0) >> 5;
dwTagAndClass = 0;
DWORD n;
for (n = 1; n < dwSize; ++n)
{
dwTagAndClass <<= 7;
dwTagAndClass |= (pData[n] & 0x7f);
if (!(pData[n] & 0x80))
{
break;
}
}
Move(n, pData, dwSize);
/* Any number bigger than this, we shift data out! */
if (n > 4)
return FALSE;
/* Just drop this in the hightest bits*/
dwTagAndClass |= (dwClass << (32-3));
return TRUE;
}
BOOL ParseLength(PBYTE& pData, DWORD& dwSize, DWORD& dwLength)
{
if (dwSize == 0)
return FALSE;
if (!(pData[0] & 0x80))
{
dwLength = pData[0];
return Move(1, pData, dwSize);
}
DWORD dwBytes = pData[0] & 0x7f;
if (dwBytes == 0 || dwBytes > 8 || dwBytes + 1 > dwSize)
{
return FALSE;
}
dwLength = 0;
for (DWORD n = 0; n < dwBytes; ++n)
{
dwLength <<= 8;
dwLength += pData[1 + n];
}
return Move(dwBytes + 1, pData, dwSize);
}
DWORD HexDump(PBYTE pRoot, PBYTE pData, DWORD dwSize, PWSTR wszPrefix)
{
while (TRUE)
{
SIZE_T Address = pData - pRoot;
ConPrintf(StdOut, L"%04x: ", Address);
ConPuts(StdOut, wszPrefix);
for (DWORD n = 0; n < min(dwSize, 0x10); ++n)
{
ConPrintf(StdOut, L"%02x ", pData[n]);
}
if (dwSize <= 0x10)
break;
Move(0x10, pData, dwSize);
ConPuts(StdOut, L"\n");
}
return 3 * dwSize;
}
void PrintTag(PBYTE pRoot, PBYTE pHeader, DWORD dwTag, DWORD dwTagLength, PBYTE pData, PWSTR wszPrefix)
{
DWORD dwRemainder = HexDump(pRoot, pHeader, pData - pHeader, wszPrefix);
LPCWSTR wszTag = TagToName(dwTag);
DWORD dwPadding = dwRemainder + wcslen(wszPrefix);
while (dwPadding > 50)
dwPadding -= 50;
ConPrintf(StdOut, L"%*s; %s (%x Bytes)\n", 50 - dwPadding, L"", wszTag, dwTagLength);
}
struct OID_NAMES
{
CHAR* Oid;
LPCWSTR Names[20];
DWORD NumberOfNames;
};
BOOL WINAPI CryptOIDEnumCallback(_In_ PCCRYPT_OID_INFO pInfo, _Inout_opt_ void *pvArg)
{
OID_NAMES* Names = (OID_NAMES*)pvArg;
if (pInfo && pInfo->pszOID && !_stricmp(pInfo->pszOID, Names->Oid))
{
if (Names->NumberOfNames < RTL_NUMBER_OF(Names->Names))
{
for (DWORD n = 0; n < Names->NumberOfNames; ++n)
{
// We already have this..
if (!_wcsicmp(Names->Names[n], pInfo->pwszName))
return TRUE;
}
Names->Names[Names->NumberOfNames++] = pInfo->pwszName;
}
}
return TRUE;
}
void PrintOID(PBYTE pRoot, PBYTE pHeader, PBYTE pData, DWORD dwSize, PWSTR wszPrefix)
{
/* CryptFindOIDInfo expects the OID to be in ANSI.. */
CHAR szOID[250];
CHAR* ptr = szOID;
size_t cchRemaining = RTL_NUMBER_OF(szOID);
/* CryptFindOIDInfo just returns the first, we want multiple */
OID_NAMES Names = {0};
if (dwSize == 0)
return;
DWORD dwValue = 0, count = 0;
for (DWORD n = 0; n < dwSize; ++n)
{
dwValue <<= 7;
dwValue |= pData[n] & 0x7f;
if (pData[n] & 0x80)
{
if (++count >= 4)
break;
continue;
}
count = 0;
/* First & second octet have a special encoding */
if (ptr == szOID)
{
DWORD id1 = dwValue / 40;
DWORD id2 = dwValue % 40;
/* The first one can only be 0, 1 or 2, so handle special case: tc24.ber */
if (id1 > 2)
{
id2 += (id1 - 2) * 40;
id1 = 2;
}
StringCchPrintfExA(ptr, cchRemaining, &ptr, &cchRemaining, 0, "%d.%d", id1, id2);
}
else
{
StringCchPrintfExA(ptr, cchRemaining, &ptr, &cchRemaining, 0, ".%d", dwValue);
}
dwValue = 0;
}
if (dwValue || count)
{
/* We cannot format this, so just add abort */
return;
}
SIZE_T Address = pData - pRoot;
/* Pad with spaces instead of printing the address again */
DWORD addrDigits = (DWORD)log10((double)Address) + 1;
ConPrintf(StdOut, L"%*s ", max(addrDigits, 4), L"");
ConPrintf(StdOut, L"%s; %S", wszPrefix, szOID);
Names.Oid = szOID;
/* The order does not match a naive call with '0'... */
CryptEnumOIDInfo(0, 0, &Names, CryptOIDEnumCallback);
for (DWORD n = 0; n < Names.NumberOfNames; ++n)
{
if (n == 0)
ConPrintf(StdOut, L" %s", Names.Names[n]);
else if (n == 1)
ConPrintf(StdOut, L" (%s", Names.Names[n]);
else
ConPrintf(StdOut, L" / %s", Names.Names[n]);
}
ConPrintf(StdOut, L"%s\n", Names.NumberOfNames > 1 ? L")" : L"");
}
BOOL ParseAsn(PBYTE pRoot, PBYTE pData, DWORD dwSize, PWSTR wszPrefix, BOOL fPrint)
{
while (dwSize)
{
PBYTE pHeader = pData;
DWORD dwTagAndClass;
if (!ParseTag(pData, dwSize, dwTagAndClass))
{
if (fPrint)
ConPrintf(StdOut, L"CertUtil: -asn command failed to parse tag near 0x%x\n", pHeader - pRoot);
return FALSE;
}
DWORD dwTagLength;
if (!ParseLength(pData, dwSize, dwTagLength))
{
if (fPrint)
ConPrintf(StdOut, L"CertUtil: -asn command failed to parse tag length near 0x%x\n", pHeader - pRoot);
return FALSE;
}
if (dwTagLength > dwSize)
{
if (fPrint)
ConPrintf(StdOut, L"CertUtil: -asn command malformed tag length near 0x%x\n", pHeader - pRoot);
return FALSE;
}
if (fPrint)
PrintTag(pRoot, pHeader, dwTagAndClass, dwTagLength, pData, wszPrefix);
size_t len = wcslen(wszPrefix);
StringCchCatW(wszPrefix, MAX_PATH, dwTagLength != dwSize ? L"| " : L" ");
if (dwTagAndClass & ASN_TAG_IS_CONSTRUCTED)
{
if (!ParseAsn(pRoot, pData, dwTagLength, wszPrefix, fPrint))
{
return FALSE;
}
}
else
{
if (fPrint)
{
/* Special case for a bit string / octet string */
if ((dwTagAndClass == ASN_TAG_BITSTRING || dwTagAndClass == ASN_TAG_OCTET_STRING) && dwTagLength)
{
if (dwTagAndClass == ASN_TAG_BITSTRING)
{
/* First, we print the 'unused bits' field of the bit string */
HexDump(pRoot, pData, 1, wszPrefix);
ConPuts(StdOut, L"\n");
/* Move past it */
Move(1, pData, dwSize);
dwTagLength--;
}
/* Do we have any data left? */
if (dwTagLength)
{
/* Try to parse this as ASN */
if (ParseAsn(pRoot, pData, dwTagLength, wszPrefix, FALSE))
{
/* We succeeded, this _could_ be ASN, so display it as if it is */
if (!ParseAsn(pRoot, pData, dwTagLength, wszPrefix, TRUE))
{
/* Uhhh, did someone edit the data? */
ConPrintf(StdOut, L"CertUtil: -asn command unexpected failure parsing tag near 0x%x\n", pData - pRoot);
return FALSE;
}
/* Move past what we just parsed */
Move(dwTagLength, pData, dwSize);
/* Lie about this so that we don't also print a hexdump */
dwTagLength = 0;
}
}
}
/* Is there any data (left) to print? */
if (dwTagLength)
{
HexDump(pRoot, pData, dwTagLength, wszPrefix);
ConPuts(StdOut, L"\n");
StringCchCatW(wszPrefix, MAX_PATH, L" ");
/* Do we have additional formatters? */
switch (dwTagAndClass)
{
case ASN_TAG_OBJECT_ID:
PrintOID(pRoot, pHeader, pData, dwTagLength, wszPrefix);
break;
default:
break;
}
}
}
}
wszPrefix[len] = '\0';
if (!Move(dwTagLength, pData, dwSize))
{
/* This should not be possible, it was checked before! */
return FALSE;
}
}
return TRUE;
}
BOOL asn_dump(LPCWSTR Filename)
{
HANDLE hFile = CreateFileW(Filename, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
ConPrintf(StdOut, L"CertUtil: -asn command failed to open: %d\n", GetLastError());
return FALSE;
}
DWORD dwSize = GetFileSize(hFile, NULL);
if (dwSize == INVALID_FILE_SIZE)
{
ConPrintf(StdOut, L"CertUtil: -asn command failed to get file size: %d\n", GetLastError());
CloseHandle(hFile);
return FALSE;
}
if (dwSize == 0)
{
ConPrintf(StdOut, L"CertUtil: -asn command got an empty file\n");
CloseHandle(hFile);
return FALSE;
}
PBYTE pData = (PBYTE)LocalAlloc(0, dwSize);
if (!pData)
{
ConPrintf(StdOut, L"CertUtil: -asn command failed to allocate: %d\n", GetLastError());
CloseHandle(hFile);
return FALSE;
}
DWORD cbRead;
BOOL fRead = ReadFile(hFile, pData, dwSize, &cbRead, NULL);
DWORD dwErr = GetLastError();
CloseHandle(hFile);
if (!fRead || cbRead != dwSize)
{
ConPrintf(StdOut, L"CertUtil: -asn command failed to read: %d\n", dwErr);
LocalFree(pData);
return FALSE;
}
WCHAR Buffer[MAX_PATH] = {0};
BOOL fSucceeded = ParseAsn(pData, pData, dwSize, Buffer, TRUE);
LocalFree(pData);
return fSucceeded;
}

View File

@@ -0,0 +1,107 @@
/*
* PROJECT: ReactOS certutil
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CertUtil commandline handling
* COPYRIGHT: Copyright 2020 Mark Jansen (mark.jansen@reactos.org)
*
* Note: Only -hashfile and -asn are implemented for now, the rest is not present!
*/
#include "precomp.h"
#include <wincrypt.h>
#include <stdlib.h>
typedef struct
{
LPCWSTR Name;
BOOL (*pfn)(LPCWSTR Filename);
} Verb;
Verb verbs[] = {
{ L"hashfile", hash_file },
{ L"asn", asn_dump },
};
static void print_usage()
{
ConPuts(StdOut, L"Verbs:\n");
ConPuts(StdOut, L" -hashfile -- Display cryptographic hash over a file\n");
ConPuts(StdOut, L" -asn -- Display ASN.1 encoding of a file\n");
ConPuts(StdOut, L"\n");
ConPuts(StdOut, L"CertUtil -? -- Display a list of all verbs\n");
ConPuts(StdOut, L"CertUtil -hashfile -? -- Display help text for the 'hashfile' verb\n");
}
Verb* MatchVerb(LPCWSTR arg)
{
if (arg[0] != '-' && arg[0] != '/')
return NULL;
for (size_t n = 0; n < RTL_NUMBER_OF(verbs); ++n)
{
if (!_wcsicmp(verbs[n].Name, arg + 1))
{
return verbs + n;
}
}
return NULL;
}
int wmain(int argc, WCHAR *argv[])
{
int n;
/* Initialize the Console Standard Streams */
ConInitStdStreams();
if (argc == 1) /* i.e. no commandline arguments given */
{
print_usage();
return EXIT_SUCCESS;
}
for (n = 1; n < argc; ++n)
{
if (!_wcsicmp(argv[n], L"-?"))
{
print_usage();
return EXIT_SUCCESS;
}
Verb* verb = MatchVerb(argv[n]);
if (verb)
{
if (argc != 3)
{
ConPrintf(StdOut, L"CertUtil: -%s expected 1 argument, got %d\n", verb->Name, argc - 2);
return EXIT_FAILURE;
}
if (!_wcsicmp(argv[n+1], L"-?"))
{
print_usage();
return EXIT_SUCCESS;
}
if (!verb->pfn(argv[n+1]))
{
/* The verb prints the failure */
return EXIT_FAILURE;
}
ConPrintf(StdOut, L"CertUtil: -%s command completed successfully\n", verb->Name);
return EXIT_SUCCESS;
}
else
{
ConPrintf(StdOut, L"CertUtil: Unknown verb: %s\n", argv[n]);
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}

View File

@@ -1,10 +1,8 @@
/*
* PROJECT: ReactOS certutil
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: CertUtil stub
* LICENSE: MIT (https://spdx.org/licenses/MIT)
* PURPOSE: CertUtil hashfile implementation
* COPYRIGHT: Copyright 2020 Mark Jansen (mark.jansen@reactos.org)
*
* Note: Only -hashfile is implemented for now, the rest is not present!
*/
#include "precomp.h"
@@ -12,7 +10,7 @@
#include <stdlib.h>
static BOOL hash_file(LPCWSTR Filename)
BOOL hash_file(LPCWSTR Filename)
{
HCRYPTPROV hProv;
BOOL bSuccess = FALSE;
@@ -87,69 +85,3 @@ static BOOL hash_file(LPCWSTR Filename)
return bSuccess;
}
static void print_usage()
{
ConPuts(StdOut, L"Verbs:\n");
ConPuts(StdOut, L" -hashfile -- Display cryptographic hash over a file\n");
ConPuts(StdOut, L"\n");
ConPuts(StdOut, L"CertUtil -? -- Display a list of all verbs\n");
ConPuts(StdOut, L"CertUtil -hashfile -? -- Display help text for the 'hashfile' verb\n");
}
int wmain(int argc, WCHAR *argv[])
{
int n;
/* Initialize the Console Standard Streams */
ConInitStdStreams();
if (argc == 1) /* i.e. no commandline arguments given */
{
print_usage();
return EXIT_SUCCESS;
}
for (n = 1; n < argc; ++n)
{
if (!_wcsicmp(argv[n], L"-?"))
{
print_usage();
return EXIT_SUCCESS;
}
else if (!_wcsicmp(argv[n], L"-hashfile"))
{
if (argc == 3)
{
if (!_wcsicmp(argv[n+1], L"-?"))
{
print_usage();
return EXIT_SUCCESS;
}
else
{
if (!hash_file(argv[n+1]))
{
/* hash_file prints the failure itself */
return EXIT_FAILURE;
}
ConPuts(StdOut, L"CertUtil: -hashfile command completed successfully\n");
return EXIT_SUCCESS;
}
}
else
{
ConPrintf(StdOut, L"CertUtil: -hashfile expected 1 argument, got %d\n", argc - 2);
return EXIT_FAILURE;
}
}
else
{
ConPrintf(StdOut, L"CertUtil: Unknown verb: %s\n", argv[n]);
return EXIT_FAILURE;
}
}
return EXIT_SUCCESS;
}

View File

@@ -7,10 +7,14 @@
#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <winuser.h>
#include <strsafe.h>
#include <conutils.h>
BOOL hash_file(LPCWSTR Filename);
BOOL asn_dump(LPCWSTR Filename);
#endif /* __CERTUTIL_PRECOMP_H */

View File

@@ -1,5 +1,5 @@
add_definitions(-DCSCRIPT_BUILD -D__WINESRC__)
add_definitions(-DCSCRIPT_BUILD)
set(wscript_folder ${REACTOS_SOURCE_DIR}/base/applications/cmdutils/wscript)
include_directories(${wscript_folder})
@@ -20,3 +20,4 @@ add_importlibs(cscript shell32 oleaut32 ole32 advapi32 user32 msvcrt kernel32 nt
add_dependencies(cscript stdole2 cscript_idlheader)
add_pch(cscript ${wscript_folder}/precomp.h SOURCE)
add_cd_file(TARGET cscript DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(cscript) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -15,28 +15,7 @@
#include <winbase.h>
#include <winuser.h>
#include <wincon.h>
/* Console API functions which are absent from wincon.h */
#define EXENAME_LENGTH (255 + 1)
VOID
WINAPI
ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName);
DWORD
WINAPI
GetConsoleCommandHistoryW(LPWSTR lpHistory,
DWORD cbHistory,
LPCWSTR lpExeName);
DWORD
WINAPI
GetConsoleCommandHistoryLengthW(LPCWSTR lpExeName);
BOOL
WINAPI
SetConsoleNumberOfCommandsW(DWORD dwNumCommands,
LPCWSTR lpExeName);
#include <wincon_undoc.h>
#include "doskey.h"

View File

@@ -2,40 +2,40 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_USAGE "Compares two files or sets of files and displays the differences between\n\
them.\n\
IDS_USAGE "Compare deux fichiers ou un ensemble de fichiers et affiche les différences\n\
entre eux.\n\
\n\
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]\n\
[drive1:][path1]filename1 [drive2:][path2]filename2\n\
FC /B [drive1:][path1]filename1 [drive2:][path2]filename2\n\
\n\
/A Displays only first and last lines for each set of differences.\n\
/B Performs a binary comparison.\n\
/C Disregards the case of letters.\n\
/L Compares files as ASCII text.\n\
/LBn Sets the maximum consecutive mismatches to the specified\n\
number of lines (default: 100).\n\
/N Displays the line numbers on an ASCII comparison.\n\
/OFF[LINE] Doesn't skip files with offline attribute set.\n\
/T Doesn't expand tabs to spaces (default: expand).\n\
/U Compare files as UNICODE text files.\n\
/W Compresses white space (tabs and spaces) for comparison.\n\
/nnnn Specifies the number of consecutive lines that must match\n\
after a mismatch (default: 2).\n\
/A Affiche uniquement la première et la dernière ligne pour chaque ensemble de différences.\n\
/B Effectue une comparaison binaire.\n\
/C Ne tient pas compte de la casse des lettres.\n\
/L Compare les fichiers sous forme de texte ASCII.\n\
/LBn Définit le nombre maximal de différences consécutives\n\
au nombre de lignes spécifié (par défaut : 100).\n\
/N Affiche les numéros de ligne sur une comparaison ASCII.\n\
/OFF[LINE] N'ignore pas les fichiers ayant l'attribut hors-ligne.\n\
/T Ne transforme pas les tabulations en espaces (par défaut : transformer).\n\
/U Compare les fichiers en tant que fichiers texte UNICODE.\n\
/W Compresse les espaces blancs (tabulations et espaces) pour la comparaison.\n\
/nnnn Spécifie le nombre de lignes consécutives qui doivent correspondre\n\
après une différence (par défaut : 2).\n\
[drive1:][path1]filename1\n\
Specifies the first file or set of files to compare.\n\
Spécifie le premier fichier ou ensemble de fichiers à comparer.\n\
[drive2:][path2]filename2\n\
Specifies the second file or set of files to compare.\n"
IDS_NO_DIFFERENCE "FC: no differences encountered\n"
IDS_LONGER_THAN "FC: %ls longer than %ls\n"
IDS_COMPARING "Comparing files %ls and %ls\n"
IDS_OUT_OF_MEMORY "FC: Out of memory\n"
IDS_CANNOT_READ "FC: cannot read from %ls\n"
IDS_INVALID_SWITCH "FC: Invalid Switch\n"
IDS_CANNOT_OPEN "FC: cannot open %ls - No such file or folder\n"
IDS_NEEDS_FILES "FC: Insufficient number of file specifications\n"
IDS_CANT_USE_WILDCARD "Wildcard ('*' and '?') are not supported yet\n"
IDS_DIFFERENT "FC: File %ls and %ls are different\n"
IDS_TOO_LARGE "FC: File %ls too large\n"
IDS_RESYNC_FAILED "Resync failed. Files are too different.\n"
Spécifie le second fichier ou ensemble de fichiers à comparer.\n"
IDS_NO_DIFFERENCE "FC: Aucune différence constatée\n"
IDS_LONGER_THAN "FC: %ls plus grand que %ls\n"
IDS_COMPARING "Compare les fichiers %ls et %ls\n"
IDS_OUT_OF_MEMORY "FC: Dépassement de mémoire\n"
IDS_CANNOT_READ "FC: Ne peut pas lire depuis %ls\n"
IDS_INVALID_SWITCH "FC: Option invalide\n"
IDS_CANNOT_OPEN "FC: Ne peut pas ouvrir %ls - Fichier ou répertoire inexistant\n"
IDS_NEEDS_FILES "FC: Nombre insuffisant de fichiers spécifiés\n"
IDS_CANT_USE_WILDCARD "Les caractères joker ('*' et '?') ne sont pas encore supportés\n"
IDS_DIFFERENT "FC: Les fichiers %ls et %ls sont différents\n"
IDS_TOO_LARGE "FC: Fichier %ls trop grand\n"
IDS_RESYNC_FAILED "La resynchronisation a échoué. Les fichiers sont trop différents.\n"
END

View File

@@ -2,40 +2,39 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE
BEGIN
IDS_USAGE "Compares two files or sets of files and displays the differences between\n\
them.\n\
IDS_USAGE "2つのファイルまたはファイル セットを比較し、それらの違いを表示します。\n\
\n\
FC [/A] [/C] [/L] [/LBn] [/N] [/OFF[LINE]] [/T] [/U] [/W] [/nnnn]\n\
[drive1:][path1]filename1 [drive2:][path2]filename2\n\
FC /B [drive1:][path1]filename1 [drive2:][path2]filename2\n\
[ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2\n\
FC /B [ドライブ1:][パス1]ファイル名1 [ドライブ2:][パス2]ファイル名2\n\
\n\
/A Displays only first and last lines for each set of differences.\n\
/B Performs a binary comparison.\n\
/C Disregards the case of letters.\n\
/L Compares files as ASCII text.\n\
/LBn Sets the maximum consecutive mismatches to the specified\n\
number of lines (default: 100).\n\
/N Displays the line numbers on an ASCII comparison.\n\
/OFF[LINE] Doesn't skip files with offline attribute set.\n\
/T Doesn't expand tabs to spaces (default: expand).\n\
/U Compare files as UNICODE text files.\n\
/W Compresses white space (tabs and spaces) for comparison.\n\
/nnnn Specifies the number of consecutive lines that must match\n\
after a mismatch (default: 2).\n\
[drive1:][path1]filename1\n\
Specifies the first file or set of files to compare.\n\
[drive2:][path2]filename2\n\
Specifies the second file or set of files to compare.\n"
IDS_NO_DIFFERENCE "FC: no differences encountered\n"
IDS_LONGER_THAN "FC: %ls longer than %ls\n"
IDS_COMPARING "Comparing files %ls and %ls\n"
IDS_OUT_OF_MEMORY "FC: Out of memory\n"
IDS_CANNOT_READ "FC: cannot read from %ls\n"
IDS_INVALID_SWITCH "FC: Invalid Switch\n"
IDS_CANNOT_OPEN "FC: cannot open %ls - No such file or folder\n"
IDS_NEEDS_FILES "FC: Insufficient number of file specifications\n"
IDS_CANT_USE_WILDCARD "Wildcard ('*' and '?') are not supported yet\n"
IDS_DIFFERENT "FC: File %ls and %ls are different\n"
IDS_TOO_LARGE "FC: File %ls too large\n"
IDS_RESYNC_FAILED "Resync failed. Files are too different.\n"
/A 各差分集合の最初の行と最後の行のみを表示します。\n\
/B バイナリ比較を実行します。\n\
/C 大文字と小文字を区別しません。\n\
/L ファイルを ASCII テキストとして比較します。\n\
/LBn 連続する不一致の最大数を指定された行数に設定します\n\
(デフォルト: 100)\n\
/N ASCII 比較の行番号を表示します。\n\
/OFF[LINE] オフライン属性が設定されたファイルをスキップしません。\n\
/T タブをスペースに展開しません (デフォルト: 展開する)。\n\
/U ファイルを UNICODE テキスト ファイルとして比較します。\n\
/W 比較のために空白 (タブとスペース) を圧縮します。\n\
/nnnn 不一致の後に一致する必要がある連続行の数を指定します\n\
(デフォルト: 2)\n\
[ドライブ1:][パス1]ファイル名1\n\
比較する最初のファイルまたはファイル集合を指定します。\n\
[ドライブ2:][パス2]ファイル名2\n\
比較する 2 番目のファイルまたはファイル集合を指定します。\n"
IDS_NO_DIFFERENCE "FC: 違いは見つかりませんでした\n"
IDS_LONGER_THAN "FC: %ls は %ls より長いです\n"
IDS_COMPARING "ファイル %ls %ls を比較しています\n"
IDS_OUT_OF_MEMORY "FC: メモリ不足\n"
IDS_CANNOT_READ "FC: %ls から読み取れません\n"
IDS_INVALID_SWITCH "FC: 無効なスイッチ\n"
IDS_CANNOT_OPEN "FC: %ls を開けません - そのようなファイルまたはフォルダはありません\n"
IDS_NEEDS_FILES "FC: ファイル指定が必要です\n"
IDS_CANT_USE_WILDCARD "ワイルドカード(「*」と「?」)はまだサポートされていません\n"
IDS_DIFFERENT "FC: ファイル %ls %ls は異なります\n"
IDS_TOO_LARGE "FC: ファイル %ls が大きすぎます\n"
IDS_RESYNC_FAILED "再同期に失敗しました。ファイルが違いすぎます。\n"
END

View File

@@ -4,14 +4,14 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE
BEGIN
IDS_NO_ENTRY "This command is not supported by the help utility.\nTry ""%s /?"".\n"
IDS_NO_ENTRY "このコマンドはヘルプ ユーティリティではサポートされていません。\n「%s /?」を試してください。\n"
END
STRINGTABLE
BEGIN
IDS_USAGE "Provides Help information for ReactOS commands.\n\n\
HELP [command]\n\n\
command - Display help information for this command.\n"
IDS_USAGE "ReactOS コマンドのヘルプ情報を提供します。\n\n\
HELP [コマンド]\n\n\
コマンド - このコマンドのヘルプ情報を表示します。\n"
IDS_HELP1 "利用可能なすべてのコマンドの一覧と、その説明。\n\n\
help コマンド\n\
コマンド /? 特定のコマンドに関する詳細情報\n\n\
@@ -43,7 +43,7 @@ IF バッチ プログラム中で条件処理を実行します。\n\
LABEL ディスクのボリューム ラベルを表示または変更します。\n\
MD ディレクトリを作成します。\n\
MKDIR ディレクトリを作成します。\n\
MKLINK Creates a filesystem link object.\n\
MKLINK ファイルシステム リンク オブジェクトを作成します。\n\
MOVE ファイルを移動およびファイルとディレクトリ名を変更します。\n\
PATH 実行可能ファイルの検索パスを表示または設定します。\n\
PAUSE バッチ プログラムの処理を一時停止し、メッセージを表示します。\n\

View File

@@ -2,9 +2,9 @@
remove_definitions(-D_WIN32_WINNT=0x502)
add_definitions(-D_WIN32_WINNT=0x600)
add_definitions(-D__WINESRC__)
add_executable(reg add.c copy.c delete.c export.c import.c query.c reg.c reg.rc)
set_module_type(reg win32cui UNICODE)
target_link_libraries(reg wine oldnames)
add_importlibs(reg advapi32 advapi32_vista user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET reg DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(reg) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -2,180 +2,180 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Usage:\n\
REG [operation] [parameters]\n\n\
Supported operations:\n\
STRING_USAGE, "使い方:\n\
REG [操作] [引数]\n\n\
サポートされた操作:\n\
ADD | COPY | DELETE | EXPORT | IMPORT | QUERY\n\n\
For help on a specific operation, type:\n\
REG [operation] /?\n\n"
特定の操作に関するヘルプを表示するには、次のように入力します。\n\
REG [操作] /?\n\n"
STRING_ADD_USAGE, "REG ADD <key> [/v value_name | /ve] [/t type] [/s separator] [/d data] [/f]\n\n\
Adds a key to the registry or adds a new value to a given registry key.\n\n\
<key>\n\
The registry key to add or, if either [/v] or [/ve] is specified,\n\
the key in which to add the new registry data.\n\n\
Format: ROOT\\Subkey\n\n\
ROOT: A predefined registry key. This must be one of the following:\n\n\
STRING_ADD_USAGE, "REG ADD <キー> [/v 値名 | /ve] [/t 種類] [/s 区切り] [/d データ] [/f]\n\n\
レジストリにキーを追加するか、指定されたレジストリ キーに新しい値を追加します。\n\n\
<キー>\n\
追加するレジストリ キー、または [/v] または [/ve] のいずれかが指定されて\n\
いる場合は、新しいレジストリ データを追加するキー。\n\n\
形式: <ルート>\\<サブキー>\n\n\
<ルート>: 定義済みのレジストリ キー。次のいずれかである必要があります。\n\n\
HKEY_LOCAL_MACHINE | HKLM\n\
HKEY_CURRENT_USER | HKCU\n\
HKEY_CLASSES_ROOT | HKCR\n\
HKEY_USERS | HKU\n\
HKEY_CURRENT_CONFIG | HKCC\n\n\
Subkey: The full path to a registry key under a given ROOT key.\n\n\
/v <value_name>\n\
The name of the registry value to add.\n\n\
<サブキー>: 指定された <ルート> キーの下のレジストリ キーへの完全なパス。\n\n\
/v <値名>\n\
追加するレジストリ値の名前。\n\n\
/ve\n\
Add an unnamed registry value. This option modifies the (Default)\n\
registry value.\n\n\
/t <type>\n\
The type of data to add to the registry. If [/t] is specified,\n\
<type> must be one of the following:\n\n\
名前のないレジストリ値を追加します。このオプションは(既定の)レジストリ\n\
値を変更します。\n\n\
/t <種類>\n\
レジストリに追加するデータの種類。 [/t] が指定されている場合、<種類> は\n\
次のいずれかである必要があります。\n\n\
REG_SZ | REG_MULTI_SZ | REG_EXPAND_SZ\n\
REG_DWORD | REG_BINARY | REG_NONE\n\n\
If [/t] is not specified, the default data type is REG_SZ.\n\n\
/s <separator>\n\
The character used to separate strings in REG_MULTI_SZ data.\n\
If [/s] is not specified, the default separator is \\0.\n\n\
/d <data>\n\
The data to add to the new registry value.\n\n\
[/t]が指定されていない場合、デフォルトのデータ型は REG_SZ になります。\n\n\
/s <区切り>\n\
REG_MULTI_SZ データ内の文字列を区切るために使用される文字。\n\
[/s] が指定されていない場合、デフォルトの区切り文字は \\0 になります。\n\n\
/d <データ>\n\
新しいレジストリ値に追加するデータ。\n\n\
/f\n\
Modify the registry without prompting for confirmation.\n\n"
確認を求めずにレジストリを変更します。\n\n"
STRING_DELETE_USAGE, "REG DELETE <key> [/v value_name | /ve | /va] [/f]\n\n\
Deletes a registry key (including all subkeys and values), or deletes\n\
one or more values from a given registry key.\n\n\
STRING_DELETE_USAGE, "REG DELETE <キー> [/v 値名 | /ve | /va] [/f]\n\n\
レジストリ キー (すべてのサブキーと値を含む) を削除するか、指定された\n\
レジストリ キーから 1 つ以上の値を削除します。\n\n\
<key>\n\
The registry key to delete or, if one of [/v], [/ve] or [/va] is\n\
specified, the registry key in which to delete one or more values.\n\n\
Format: ROOT\\Subkey\n\n\
ROOT: A predefined registry key. This must be one of the following:\n\n\
削除するレジストリ キー、または [/v][/ve][/va] のいずれかが指定されて\n\
いる場合は、1 つ以上の値を削除するレジストリ キー。\n\n\
形式: <ルート>\\<サブキー>\n\n\
ルート: 定義済みのレジストリ キー。次のいずれかである必要があります。\n\n\
HKEY_LOCAL_MACHINE | HKLM\n\
HKEY_CURRENT_USER | HKCU\n\
HKEY_CLASSES_ROOT | HKCR\n\
HKEY_USERS | HKU\n\
HKEY_CURRENT_CONFIG | HKCC\n\n\
Subkey: The full path to a registry key under a given ROOT key.\n\n\
/v <value_name>\n\
The name of the registry value to delete.\n\n\
サブキー: 指定された <ルート> キーの下のレジストリ キーへの完全なパス。\n\n\
/v <値名>\n\
削除するレジストリ値の名前。\n\n\
/ve\n\
Delete an unnamed registry value. This option deletes the (Default)\n\
registry value.\n\n\
名前のないレジストリ値を削除します。このオプションは、(既定の) \n\
レジストリ値を削除します。\n\n\
/va\n\
Delete all values from a registry key.\n\n\
レジストリ キーからすべての値を削除します。\n\n\
/f\n\
Delete a registry key (including all subkeys and values) without\n\
prompting for confirmation.\n\n"
確認を求めることなくレジストリ キー (すべてのサブキーと値を含む) を削除します。\n\n"
STRING_QUERY_USAGE, "REG QUERY <key> [/v value_name | /ve] [/s]\n\n\
Queries a specified registry key and lists all immediate subkeys, values\n\
and data within that key. Use [/s] to recursively query each subkey.\n\n\
<key>\n\
The registry key to query.\n\n\
Format: ROOT\\Subkey\n\n\
ROOT: A predefined registry key. This must be one of the following:\n\n\
STRING_QUERY_USAGE, "REG QUERY <キー> [/v 値名 | /ve] [/s]\n\n\
指定されたレジストリキーを照会し、そのキーに含まれるすべてのサブキー、値、\n\
およびデータを一覧表示します。[/s] を使用すると、各サブキーを再帰的に照会できます。\n\n\
<キー>\n\
照会するレジストリ キー。\n\n\
形式: <ルート>\\<サブキー>\n\n\
<ルート>: 定義済みのレジストリ キー。次のいずれかである必要があります。\n\n\
HKEY_LOCAL_MACHINE | HKLM\n\
HKEY_CURRENT_USER | HKCU\n\
HKEY_CLASSES_ROOT | HKCR\n\
HKEY_USERS | HKU\n\
HKEY_CURRENT_CONFIG | HKCC\n\n\
Subkey: The full path to a registry key under a given ROOT key.\n\n\
/v <value_name>\n\
The name of the registry value to query. If neither [/v] nor [/ve] is\n\
specified, all values under <key> are listed.\n\n\
<サブキー>: 指定された <ルート> キーの下のレジストリ キーへの完全なパス。\n\n\
/v <値名>\n\
照会するレジストリ値の名前。[/v] [/ve] も指定されていない場合は、\n\
<キー> の下のすべての値がリストされます。\n\n\
/ve\n\
Query an unnamed registry value. This option queries the (Default)\n\
registry value.\n\n\
名前のないレジストリ値を照会します。このオプションは、(既定の) \n\
レジストリ値を照会します。\n\n\
/s\n\
List all registry entries under <key> and its subkeys.\n\n"
<キー> とそのサブキーの下にあるすべてのレジストリ エントリを一覧表示します。\n\n"
STRING_SUCCESS, "操作は正常に完了しました\n"
STRING_INVALID_KEY, "エラー: キー名が無効です\n"
STRING_INVALID_CMDLINE, "エラー: コマンド ライン引数が無効です\n"
STRING_NO_REMOTE, "エラー: リモート マシンにキーを追加できませんでした\n"
STRING_VALUE_NONEXIST, "エラー: システムは指定されたキーまたは値を見つけられませんでした\n"
STRING_UNSUPPORTED_TYPE, "reg: Unsupported registry data type [%1]\n"
STRING_MISSING_NUMBER, "reg: The option [/d] must be followed by a valid numeric value\n"
STRING_MISSING_HEXDATA, "reg: The option [/d] must be followed by a valid hexadecimal value\n"
STRING_UNHANDLED_TYPE, "reg: Unhandled registry data type [/t 0x%1!x!, /d %2]\n"
STRING_OVERWRITE_VALUE, "The registry value '%1' already exists. Do you want to overwrite it?"
STRING_UNSUPPORTED_TYPE, "reg: サポートされていないレジストリ データ型 [%1]\n"
STRING_MISSING_NUMBER, "reg: オプション[/d]の後には有効な数値を続ける必要があります\n"
STRING_MISSING_HEXDATA, "reg: オプション[/d]の後には有効な16進数値を続ける必要があります\n"
STRING_UNHANDLED_TYPE, "reg: 未処理のレジストリデータ型 [/t 0x%1!x!, /d %2]\n"
STRING_OVERWRITE_VALUE, "レジストリ値 '%1' は既に存在します。上書きしますか?"
STRING_YES, "Y"
STRING_NO, "N"
STRING_ALL, "A"
STRING_YESNO, " (Yes|No)"
STRING_YESNOALL, " (Yes|No|All)"
STRING_CANCELLED, "reg: The registry operation was cancelled\n"
STRING_DEFAULT_VALUE, "(Default)"
STRING_DELETE_VALUE, "Are you sure you want to delete the registry value '%1'?"
STRING_DELETE_VALUEALL, "Are you sure you want to delete all registry values in '%1'?"
STRING_DELETE_SUBKEY, "Are you sure you want to delete the registry key '%1'?"
STRING_INVALID_STRING, "reg: The option [/d] must be followed by a valid string\n"
STRING_VALUEALL_FAILED, "reg: Unable to delete all registry values in '%1'\n"
STRING_MATCHES_FOUND, "Search complete. Number of matches found: %1!d!\n"
STRING_INVALID_SYNTAX, "reg: Invalid syntax. "
STRING_INVALID_OPTION, "reg: Invalid option [%1]. "
STRING_REG_HELP, "Type ""REG /?"" for help.\n"
STRING_FUNC_HELP, "Type ""REG %1 /?"" for help.\n"
STRING_VALUE_NOT_SET, "(value not set)"
STRING_YESNO, " (はい(Y)|いいえ(N))"
STRING_YESNOALL, " (はい(Y)|いいえ(N)|すべて(A))"
STRING_CANCELLED, "reg: レジストリ操作はキャンセルされました\n"
STRING_DEFAULT_VALUE, "(デフォルト)"
STRING_DELETE_VALUE, "レジストリ値 '%1' を削除してもよろしいですか?"
STRING_DELETE_VALUEALL, "'%1' 内のすべてのレジストリ値を削除してもよろしいですか?"
STRING_DELETE_SUBKEY, "レジストリ キー '%1' を削除してもよろしいですか?"
STRING_INVALID_STRING, "reg: オプション[/d]の後に有効な文字列を続ける必要があります\n"
STRING_VALUEALL_FAILED, "reg: '%1' のすべてのレジストリ値を削除できません\n"
STRING_MATCHES_FOUND, "検索が完了しました。一致した件数: %1!d!\n"
STRING_INVALID_SYNTAX, "reg: 無効な文法"
STRING_INVALID_OPTION, "reg: 無効なオプション [%1]. "
STRING_REG_HELP, "ヘルプを表示するには、「REG /?」と入力してください。\n"
STRING_FUNC_HELP, "ヘルプを表示するには「REG %1 /?」と入力してください.\n"
STRING_VALUE_NOT_SET, "(未設定の値)"
STRING_IMPORT_USAGE, "REG IMPORT <file>\n\n\
Imports keys, values and data from a given file into the registry.\n\n\
<file>\n\
The name and path of the registry file to import.\n\n"
STRING_IMPORT_USAGE, "REG IMPORT <ファイル>\n\n\
指定されたファイルからキー、値、データをレジストリにインポートします。\n\n\
<ファイル>\n\
インポートするレジストリ ファイルの名前とパス。\n\n"
STRING_FILE_NOT_FOUND, "reg: The file '%1' was not found.\n"
STRING_ESCAPE_SEQUENCE, "reg: Unrecognized escape sequence [\\%1!c!]\n"
STRING_FILE_NOT_FOUND, "reg: ファイル '%1' が見つかりませんでした。\n"
STRING_ESCAPE_SEQUENCE, "reg: 認識されないエスケープシーケンス [\\%1!c!]\n"
STRING_EXPORT_USAGE, "REG EXPORT <key> <file> [/y]\n\n\
Exports a specified registry key (including all subkeys and values)\n\
to a file.\n\n\
<key>\n\
The registry key to export.\n\n\
Format: ROOT\\Subkey\n\n\
ROOT: A predefined registry key. This must be one of the following:\n\n\
STRING_EXPORT_USAGE, "REG EXPORT <キー> <ファイル> [/y]\n\n\
指定されたレジストリ キー (すべてのサブキーと値を含む) をファイルに\n\
エクスポートします。\n\n\
<キー>\n\
エクスポートするレジストリ キー。\n\n\
形式: <ルート>\\<サブキー>\n\n\
<ルート>: 定義済みのレジストリ キー。次のいずれかである必要があります。\n\n\
HKEY_LOCAL_MACHINE | HKLM\n\
HKEY_CURRENT_USER | HKCU\n\
HKEY_CLASSES_ROOT | HKCR\n\
HKEY_USERS | HKU\n\
HKEY_CURRENT_CONFIG | HKCC\n\n\
Subkey: The full path to a registry key under a given ROOT key.\n\n\
<file>\n\
The name and path of the registry file that will be created.\n\
This file must have a .reg extension.\n\n\
<サブキー>: 指定された <ルート> キーの下のレジストリ キーへの完全なパス。\n\n\
<ファイル>\n\
作成されるレジストリ ファイルの名前とパス。\n\
このファイルには .reg 拡張子が必要です。\n\n\
/y\n\
Overwrite <file> without prompting for confirmation.\n\n"
確認のプロンプトを表示せずに <ファイル> を上書きします。\n\n"
STRING_INVALID_SYSTEM_KEY, "reg: Invalid system key\n"
STRING_OVERWRITE_FILE, "The file '%1' already exists. Do you want to overwrite it?"
STRING_KEY_NONEXIST, "reg: Unable to find the specified registry key\n"
STRING_KEY_IMPORT_FAILED, "reg: Unable to import the registry key '%1'\n"
STRING_INVALID_SYSTEM_KEY, "reg: 無効なシステム キー\n"
STRING_OVERWRITE_FILE, "ファイル '%1' は既に存在します。上書きしますか?"
STRING_KEY_NONEXIST, "reg: 指定されたレジストリキーが見つかりません\n"
STRING_KEY_IMPORT_FAILED, "reg: レジストリキーをインポートできません '%1'\n"
STRING_REG_VIEW_USAGE, " /reg:32\n\
Access the registry using the 32-bit view.\n\n\
32 ビット ビューを使用してレジストリにアクセスします。\n\n\
/reg:64\n\
Access the registry using the 64-bit view.\n\n"
STRING_ACCESS_DENIED, "reg: Unable to access or create the specified registry key\n"
64 ビット ビューを使用してレジストリにアクセスします。\n\n"
STRING_ACCESS_DENIED, "reg: 指定されたレジストリキーにアクセスまたは作成できません\n"
STRING_COPY_USAGE, "REG COPY <key1> <key2> [/s] [/f]\n\n\
Copies the contents of a specified registry key to another location.\n\
By default, this operation only copies registry values. Use [/s] to\n\
recursively copy all subkeys and values.\n\n\
<key1>, <key2>\n\
Registry keys specifying the source (<key1>) and destination (<key2>)\n\
of the data. If <key2> does not exist, it is created.\n\n\
Format: ROOT\\Subkey\n\n\
ROOT: A predefined registry key. This must be one of the following:\n\n\
STRING_COPY_USAGE, "REG COPY <キー1> <キー2> [/s] [/f]\n\n\
指定されたレジストリ キーの内容を別の場所にコピーします。\n\
デフォルトでは、この操作はレジストリ値のみをコピーします。[/s] を使用して、\n\
すべてのサブキーと値を再帰的にコピーします。\n\n\
<キー1>, <キー2>\n\
データのコピー元(<キー1>) とコピー先 (<キー2>) を指定するレジストリ キー。\n\
<キー2> が存在しない場合は作成されます。\n\n\
形式: <ルート>\\<サブキー>\n\n\
<ルート>: 定義済みのレジストリ キー。次のいずれかである必要があります。\n\n\
HKEY_LOCAL_MACHINE | HKLM\n\
HKEY_CURRENT_USER | HKCU\n\
HKEY_CLASSES_ROOT | HKCR\n\
HKEY_USERS | HKU\n\
HKEY_CURRENT_CONFIG | HKCC\n\n\
Subkey: The full path to a registry key under a given ROOT key.\n\n\
<サブキー>: 指定された <ルート> キーの下のレジストリ キーへの完全なパス。\n\n\
/s\n\
Copy all subkeys and values from <key1> to <key2>.\n\n\
<キー1> から <キー2> にすべてのサブキーと値をコピーします。\n\n\
/f\n\
Overwrite all registry data in <key2> without prompting for confirmation.\n\
This option does not modify subkeys and values that only exist in <key2>.\n\n"
確認のプロンプトを表示せずに、<キー2> 内のすべてのレジストリ\n\
データを上書きします。\n\
このオプションは、<キー2> にのみ存在するサブキーと値を変更しません。\n\n"
STRING_COPY_SRC_DEST_SAME, "reg: The source and destination keys cannot be the same\n"
STRING_COPY_CONFIRM, "The value '%1\\%2' already exists in the destination key. Do you want to overwrite it?"
STRING_COPY_SRC_DEST_SAME, "reg: コピー元キーとコピー先キーは同じにすることはできません\n"
STRING_COPY_CONFIRM, " '%1\\%2' はコピー先キーに既に存在します。上書きしますか?"
}

View File

@@ -1,7 +1,7 @@
add_definitions(-D__WINESRC__)
add_executable(taskkill taskkill.c taskkill.rc)
target_link_libraries(taskkill wine)
set_module_type(taskkill win32cui UNICODE)
add_importlibs(taskkill psapi user32 msvcrt kernel32 ntdll)
add_importlibs(taskkill user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET taskkill DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(taskkill) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -2,7 +2,7 @@ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im Prozess Name | /pid Prozess ID]\n"
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im Prozess Name | /pid Prozess ID] [/t]\n"
STRING_INVALID_OPTION, "Fehler: Unbekannte oder ungülige Kommandozeilenoption angegeben.\n"
STRING_INVALID_PARAM, "Fehler: Ungültiger Kommandozeilenparameter angegeben.\n"
STRING_MISSING_OPTION, "Fehler: Eine der Optionen /im oder /pid muss angegeben werden.\n"
@@ -16,6 +16,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Fehler: Prozessliste kann nicht aufgebaut werden.\n"
STRING_TERMINATE_FAILED, "Fehler: Prozess ""%1"" kann nicht beendet werden.\n"
STRING_SELF_TERMINATION, "Fehler: Der Prozess kann sich nicht selbst beenden.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

@@ -2,7 +2,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID]\n"
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID] [/t]\n"
STRING_INVALID_OPTION, "Error: Unknown or invalid command line option specified.\n"
STRING_INVALID_PARAM, "Error: Invalid command line parameter specified.\n"
STRING_MISSING_OPTION, "Error: One of options /im or /pid must be specified.\n"
@@ -10,12 +10,16 @@ STRINGTABLE
STRING_MUTUAL_EXCLUSIVE, "Error: Options /im and /pid are mutually exclusive.\n"
STRING_CLOSE_PID_SEARCH, "Close message sent to top-level windows of process with PID %1!u!.\n"
STRING_CLOSE_PROC_SRCH, "Close message sent to top-level windows of process ""%1"" with PID %2!u!.\n"
STRING_TERM_PID_SEARCH, "Process with PID %1!u! was forcibly terminated.\n"
STRING_TERM_PROC_SEARCH, "Process ""%1"" with PID %2!u! was forcibly terminated.\n"
STRING_TERM_PID_SEARCH, "The process with PID %1!u! has been terminated.\n"
STRING_TERM_PROC_SEARCH, "The process ""%1"" with PID %2!u! has been terminated.\n"
STRING_SEARCH_FAILED, "Error: Could not find process ""%1"".\n"
STRING_ENUM_FAILED, "Error: Unable to enumerate the process list.\n"
STRING_TERMINATE_FAILED, "Error: Unable to terminate process ""%1"".\n"
STRING_SELF_TERMINATION, "Error: Process self-termination is not permitted.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

@@ -9,7 +9,7 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Uso: taskkill [/?] [/f] [/im NomeProcesso | /pid IDProcesso]\n"
STRING_USAGE, "Uso: taskkill [/?] [/f] [/im NomeProcesso | /pid IDProcesso] [/t]\n"
STRING_INVALID_OPTION, "Errore: L'opzione specificata è invalida o sconosciuta.\n"
STRING_INVALID_PARAM, "Errore: Il parametro di comando a riga è invalido.\n"
STRING_MISSING_OPTION, "Errore: Specifica una delle opzioni /im oppure /pid.\n"
@@ -23,6 +23,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Errore: Impossibile enumerare la lista dei processi.\n"
STRING_TERMINATE_FAILED, "Errore: Impossibile terminare il processo ""%1"".\n"
STRING_SELF_TERMINATION, "Errore: L'auto-terminazione non è consentita.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

@@ -9,7 +9,7 @@ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Sposób użycia: taskkill [/?] [/f] [/im nazwa_procesu | /pid id_procesu]\n"
STRING_USAGE, "Sposób użycia: taskkill [/?] [/f] [/im nazwa_procesu | /pid id_procesu] [/t]\n"
STRING_INVALID_OPTION, "Błąd: Określono nieznaną lub nieprawidłową opcję.\n"
STRING_INVALID_PARAM, "Błąd: Nieprawidłowy parametr.\n"
STRING_MISSING_OPTION, "Błąd: Nie określono opcji /im ani /pid.\n"
@@ -23,6 +23,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Błąd: Nie można wyliczyć listy procesów.\n"
STRING_TERMINATE_FAILED, "Błąd: Nie można zakończyć procesu ""%1"".\n"
STRING_SELF_TERMINATION, "Błąd: Proces nie może zakończyć sam siebie.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Błąd: Nieprawidłowa składnia. Opcja '%1' nie jest dozwolona więcej niż '%2!d!' razy.\n"
STRING_INVALID_SYNTAX, "Błąd: Nieprawidłowa składnia.\n"
}

View File

@@ -10,7 +10,7 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Utilizare: taskkill [/?] [/f] [/im NumeProces | /pid IdProces]\n"
STRING_USAGE, "Utilizare: taskkill [/?] [/f] [/im NumeProces | /pid IdProces] [/t]\n"
STRING_INVALID_OPTION, "Eroare: Opțiune specificată nevalidă sau necunoscută.\n"
STRING_INVALID_PARAM, "Eroare: Parametrul de comandă specificat este nevalid.\n"
STRING_MISSING_OPTION, "Eroare: Trebuie specificată una dintre opțiunile /im sau /pid.\n"
@@ -24,6 +24,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Eroare: Nu se poate enumera lista de procese.\n"
STRING_TERMINATE_FAILED, "Eroare: Procesul «%1» nu poate fi oprit.\n"
STRING_SELF_TERMINATION, "Eroare: Auto-terminarea nu este permisă.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Eroare: Sintaxă nevalidă. Opțiunea '%1' nu este permisă mai mult de '%2!d!' dată(dăți).\n"
STRING_INVALID_SYNTAX, "Eroare: Sintaxă nevalidă.\n"
}

View File

@@ -4,7 +4,7 @@ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Использование: TASKKILL [/F] [/IM <образ> | /PID <процесс>]\n"
STRING_USAGE, "Использование: TASKKILL [/F] [/IM <образ> | /PID <процесс>] [/t]\n"
STRING_INVALID_OPTION, "Ошибка: Указаны неверные параметры командной строки.\n"
STRING_INVALID_PARAM, "Ошибка: Указаны неверные параметры командной строки.\n"
STRING_MISSING_OPTION, "Ошибка: Должен быть указан параметр /im или /pid.\n"
@@ -18,6 +18,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Ошибка: Не удается получить список процессов.\n"
STRING_TERMINATE_FAILED, "Ошибка: Не удается завершить процесс ""%1"".\n"
STRING_SELF_TERMINATION, "Ошибка: Процесс не может завершить сам себя.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Ошибка: Неверный синтаксис. Нельзя использовать опцию '%1' больше '%2!d!' раз(а).\n"
STRING_INVALID_SYNTAX, "Ошибка: Неверный синтаксис.\n"
}

View File

@@ -6,7 +6,7 @@ LANGUAGE LANG_ALBANIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID]\n"
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID] [/t]\n"
STRING_INVALID_OPTION, "Gabim: Panjohur ose i pavlefshëm opsioni linjes komandes i specifikuar.\n"
STRING_INVALID_PARAM, "Gabim: Pavlefshëm parametri i specifikuar ne linjen e komandes.\n"
STRING_MISSING_OPTION, "Gabim: Njera nga opsionet /im ose /pid duhet te specifikohet.\n"
@@ -20,6 +20,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Gabim: Në pamundësi për të numëruar listën proceseve.\n"
STRING_TERMINATE_FAILED, "Gabim: Pamundur mbyllja e proceseve ""%1"".\n"
STRING_SELF_TERMINATION, "Gabim: Procesi vetë-përfundimi nuk është i lejuar.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

@@ -4,7 +4,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Kullanım: taskkill [/?] [/f] [/im işlem adı | /pid işlem kimliği]\n"
STRING_USAGE, "Kullanım: taskkill [/?] [/f] [/im işlem adı | /pid işlem kimliği] [/t]\n"
STRING_INVALID_OPTION, "Hata: Bilinmeyen veya geçersiz komut satırı seçeneği belirtildi.\n"
STRING_INVALID_PARAM, "Hata: Geçersiz komut satırı değişkeni belirtildi.\n"
STRING_MISSING_OPTION, "Hata: /im ve /pid seçeneklerinden biri belirtilmeli.\n"
@@ -18,6 +18,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "Hata: İşlem numaralandırılamıyor.\n"
STRING_TERMINATE_FAILED, "Hata: ""%1"" işlemi sonlandırılamıyor.\n"
STRING_SELF_TERMINATION, "Hata: İşlemi kendi kendine sonlandırmaya izin verilmedi.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Hata: Geçersiz sözdizimi. '%1' seçeneğine '%2!d!'den fazla kez izin verilmiyor..\n"
STRING_INVALID_SYNTAX, "Hata: Geçersiz sözdizimi.\n"
}

View File

@@ -7,7 +7,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
STRINGTABLE
{
STRING_USAGE, "用法taskkill [/?] [/f] [/im 进程名称 | /pid 进程 ID]\n"
STRING_USAGE, "用法taskkill [/?] [/f] [/im 进程名称 | /pid 进程 ID] [/t]\n"
STRING_INVALID_OPTION, "错误:指定了未知或无效的命令行选项。\n"
STRING_INVALID_PARAM, "错误:指定了无效的命令行参数。\n"
STRING_MISSING_OPTION, "错误:必须指定选项 /im 或 /pid。\n"
@@ -21,6 +21,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "错误:无法枚举进程列表。\n"
STRING_TERMINATE_FAILED, "错误:无法终止进程“%1”。\n"
STRING_SELF_TERMINATION, "错误:不允许终止自身。\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "错误:无效语法。选项“%1”不允许超过“%2!d!”次。\n"
STRING_INVALID_SYNTAX, "错误:无效语法。\n"
}

View File

@@ -11,7 +11,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL
STRINGTABLE
{
STRING_USAGE, "用法: taskkill [/?] [/f] [/im 處理程序名稱 | /pid PID]\n"
STRING_USAGE, "用法: taskkill [/?] [/f] [/im 處理程序名稱 | /pid PID] [/t]\n"
STRING_INVALID_OPTION, "錯誤: 指定了不明或不正確的命令列選項。\n"
STRING_INVALID_PARAM, "錯誤: 指定了不正確的命令列參數。\n"
STRING_MISSING_OPTION, "錯誤: 必須指定選項 /im 或 /pid 的其中之一。\n"
@@ -25,6 +25,10 @@ STRINGTABLE
STRING_ENUM_FAILED, "錯誤: 無法列舉處理程序清單。\n"
STRING_TERMINATE_FAILED, "錯誤: 無法終止處理程序 '%1'。\n"
STRING_SELF_TERMINATION, "錯誤: 處理程序不允許自我終止。\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "錯誤: 無效的語法。'%1' 選項不允許超過 '%2!d!' 次。\n"
STRING_INVALID_SYNTAX, "錯誤: 無效的語法。\n"
}

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,8 @@
#define STRING_ENUM_FAILED 112
#define STRING_TERMINATE_FAILED 113
#define STRING_SELF_TERMINATION 114
#define STRING_PARAM_TOO_MUCH 115
#define STRING_INVALID_SYNTAX 116
#define STRING_CLOSE_CHILD 115
#define STRING_TERM_CHILD 116
#define STRING_TERM_CHILD_FAILED 117
#define STRING_PARAM_TOO_MUCH 118
#define STRING_INVALID_SYNTAX 119

View File

@@ -1,7 +1,7 @@
add_definitions(-D__WINESRC__)
add_executable(wmic main.c wmic.rc)
target_link_libraries(wmic wine)
set_module_type(wmic win32cui UNICODE)
add_importlibs(wmic oleaut32 ole32 user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET wmic DESTINATION reactos/system32/wbem FOR all)
set_wine_module_FIXME(wmic) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -1,6 +1,4 @@
add_definitions(-D__WINESRC__)
list(APPEND SOURCE
arguments.c
host.c
@@ -18,3 +16,4 @@ add_importlibs(wscript shell32 oleaut32 ole32 user32 advapi32 msvcrt kernel32 nt
add_dependencies(wscript stdole2 wscript_idlheader)
add_pch(wscript precomp.h SOURCE)
add_cd_file(TARGET wscript DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(wscript) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -1,7 +1,7 @@
add_definitions(-D__WINESRC__)
add_executable(xcopy xcopy.c xcopy.rc)
target_link_libraries(xcopy wine)
set_module_type(xcopy win32cui UNICODE)
add_importlibs(xcopy shell32 user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET xcopy DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(xcopy) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -50,7 +50,7 @@ où :\n\
[/A] Copie uniquement les fichiers qui ont l'attribut archive défini\n\
[/M] Copie uniquement les fichiers qui ont l'attribut archive défini ; supprime\n\
\tensuite l'attribut\n\
[/K] Copy file attributes, without this attributes are not preserved.\n\
[/K] Copie les attributs de fichiers. Sans ce paramètre les attributs ne sont pas conservés.\n\
[/D | /D:m-d-y] Copie uniquement les nouveaux fichiers, ou ceux modifiés après la date spécifiée.\n\
\t\tSi aucune date n'est spécifiée, copie uniquement lorsque le fichier de destination est plus ancien\n\
\t\tque le fichier source\n\n"

View File

@@ -42,7 +42,7 @@ BEGIN
EDITTEXT IDC_STATIC_MEM, 155, 130, 210, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_SWAP, 155, 140, 210, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_VERSION, 155, 150, 210, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
CHECKBOX "Check for WHQL digital signatures", IDC_WHQL_SIGN_CHECK, 15, 170, 135, 10, WS_DISABLED
CHECKBOX "WHQL デジタル署名を確認する", IDC_WHQL_SIGN_CHECK, 15, 170, 135, 10, WS_DISABLED
END
IDD_DISPLAY_DIALOG DIALOGEX 0, 0, 462, 220
@@ -127,7 +127,7 @@ BEGIN
EDITTEXT IDC_STATIC_ADAPTER_PROVIDER, 335, 60, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "ReactX の機能", IDC_STATIC, 5, 97, 452, 70
CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 110, 125, 80, 17
RTEXT "Hardware Sound\nAcceleration Level:", IDC_STATIC, 10, 125, 90, 20, WS_DISABLED
RTEXT "ハードウェア音声\n加速レベル:", IDC_STATIC, 10, 125, 90, 20, WS_DISABLED
PUSHBUTTON "DirectSound のテスト", IDC_BUTTON_TESTDSOUND, 270, 125, 80, 14, WS_DISABLED
GROUPBOX "注意", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_TEXT_DSOUNDINFO, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
@@ -137,17 +137,17 @@ IDD_MUSIC_DIALOG DIALOGEX 0, 0, 462, 220
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
RTEXT "General MIDI DLS Collection:", IDC_STATIC, 0, 0, 100, 10
RTEXT "General MIDI DLS コレクション:", IDC_STATIC, 0, 0, 100, 10
EDITTEXT IDC_MIDI_DLS_COLLECTION, 105, 0, 250, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "Music Ports", IDC_STATIC, 5, 10, 452, 85
GROUPBOX "ReactX Features", IDC_STATIC, 5, 97, 452, 70
LTEXT "Default Port Acceleration:", IDC_STATIC, 15, 120, 95, 17
GROUPBOX "音楽ポート", IDC_STATIC, 5, 10, 452, 85
GROUPBOX "ReactXの機能", IDC_STATIC, 5, 97, 452, 70
LTEXT "デフォルトのポート高速化:", IDC_STATIC, 15, 120, 95, 17
LTEXT "", IDC_STATIC_DEFAULT_PORT_ACCELERATION, 115, 120, 50, 10
PUSHBUTTON "Disable", IDC_BUTTON_DISABLEDMUSIC, 75, 135, 80, 14, WS_DISABLED
LTEXT "Test using this port:", IDC_STATIC, 180, 105, 100, 10
PUSHBUTTON "無効にする", IDC_BUTTON_DISABLEDMUSIC, 75, 135, 80, 14, WS_DISABLED
LTEXT "このポートを使用してテストします:", IDC_STATIC, 180, 105, 100, 10
LISTBOX IDC_DMUSIC_TEST_LIST, 180, 115, 180, 45, LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Test DirectMusic", IDC_BUTTON_TESTDMUSIC, 370, 145, 80, 14, WS_DISABLED
GROUPBOX "Notes", IDC_STATIC, 5, 170, 452, 50
PUSHBUTTON "DirectMusic をテストする", IDC_BUTTON_TESTDMUSIC, 370, 145, 80, 14, WS_DISABLED
GROUPBOX "注記", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_MUSIC_NOTES, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -170,11 +170,11 @@ FONT 9, "MS UI Gothic"
BEGIN
GROUPBOX "登録済み DirectPlay サービス プロバイダ", IDC_STATIC, 5, 0, 452, 75
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 15, 12, 432, 55
GROUPBOX "Registered Lobbyable DirectPlay Applications", IDC_STATIC, 5, 77, 452, 55
GROUPBOX "ReactX Features", IDC_STATIC, 5, 133, 452, 35
PUSHBUTTON "DirectPlay Voice Options", IDC_BUTTON_VOICE_OPTIONS, 10, 145, 90, 14, WS_DISABLED
PUSHBUTTON "Test DirectPlay", IDC_BUTTON_TESTDPLAY, 130, 145, 80, 14, WS_DISABLED
GROUPBOX "Notes", IDC_STATIC, 5, 170, 452, 50
GROUPBOX "登録済みのロビー可能な DirectPlay アプリ", IDC_STATIC, 5, 77, 452, 55
GROUPBOX "ReactX の機能", IDC_STATIC, 5, 133, 452, 35
PUSHBUTTON "DirectPlay 音声オプション", IDC_BUTTON_VOICE_OPTIONS, 10, 145, 90, 14, WS_DISABLED
PUSHBUTTON "DirectPlay をテストする", IDC_BUTTON_TESTDPLAY, 130, 145, 80, 14, WS_DISABLED
GROUPBOX "注記", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_NETWORK_NOTES, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -182,11 +182,11 @@ IDD_HELP_DIALOG DIALOGEX 0, 0, 462, 220
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
LTEXT "Still can't find the information you're looking for? Here are some additional things you can do:", IDC_STATIC, 5, 0, 300, 10
PUSHBUTTON "System Information", IDC_BUTTON_SYSINFO, 5, 20, 80, 14, WS_DISABLED
LTEXT "Displays additional system information", IDC_STATIC, 90, 23, 300, 10
PUSHBUTTON "Refresh Rate Override", IDC_BUTTON_DDRAW_REFRESH, 5, 40, 80, 14, WS_DISABLED
LTEXT "Overrides the Refresh Rate for DirectDraw", IDC_STATIC, 90, 43, 300, 10
LTEXT "探している情報がまだ見つかりませんか? 以下の方法をお試しください。", IDC_STATIC, 5, 0, 300, 10
PUSHBUTTON "システム情報", IDC_BUTTON_SYSINFO, 5, 20, 80, 14, WS_DISABLED
LTEXT "追加のシステム情報を表示します", IDC_STATIC, 90, 23, 300, 10
PUSHBUTTON "リフレッシュ レートのオーバーライド", IDC_BUTTON_DDRAW_REFRESH, 5, 40, 80, 14, WS_DISABLED
LTEXT "DirectDrawのリフレッシュ レートを上書きします", IDC_STATIC, 90, 43, 300, 10
END
STRINGTABLE
@@ -238,17 +238,17 @@ BEGIN
IDS_DDFULLSCREEN_DESCRIPTION "このテストでは、DirectDraw を使って全画面表示モードで描画します。移動している白い矩形が描画されます。続行しますか?"
IDS_DDFULLSCREEN_RESULT "全画面表示モードで移動している白い矩形が見えましたか?"
IDS_FORMAT_ADAPTER_MEM "%u MB"
IDS_FORMAT_ADAPTER_MODE "%d x %d (%u bit)(%uHz)"
IDS_FORMAT_ADAPTER_MODE "%d x %d (%u ビット) (%uHz)"
IDS_OPTION_NO "いいえ"
IDS_D3DTEST_DESCRIPTION "Direct3D インタフェーステストを開始しようとしています。続行しますか?"
IDS_D3DTEST_D3Dx "このテストはハードウェア アクセラーレータ Direct3D %u インターフェイスを使います。"
IDS_OS_VERSION "%s %s (%d.%d, Build %d)"
IDS_DMUSIC_DESC "Description"
IDS_DMUSIC_TYPE "Type"
IDS_DMUSIC_KERNEL "Kernel Mode"
IDS_DMUSIC_IO "In/Out"
IDS_DMUSIC_DLS "Supports DLS"
IDS_DMUSIC_EXT "External"
IDS_DMUSIC_PORT "Default Port"
IDS_DDDISABLE_MSG "This will disable all hardware acceleration for DirectDraw on all display devices.\nDo you wish to continue?\n"
IDS_OS_VERSION "%s %s (%d.%d, ビルド %d)"
IDS_DMUSIC_DESC "説明"
IDS_DMUSIC_TYPE "種類"
IDS_DMUSIC_KERNEL "カーネル モード"
IDS_DMUSIC_IO "入出力"
IDS_DMUSIC_DLS "DLS をサポート"
IDS_DMUSIC_EXT "外部"
IDS_DMUSIC_PORT "デフォルトのポート"
IDS_DDDISABLE_MSG "これにより、すべてのディスプレイ デバイス上の DirectDraw のすべてのハードウェア アクセラレーションが無効になります。\n続行しますか?\n"
END

View File

@@ -1,7 +1,7 @@
add_definitions(-D__WINESRC__)
add_executable(extrac32 extrac32.c)
target_link_libraries(extrac32 wine)
set_module_type(extrac32 win32gui UNICODE)
add_importlibs(extrac32 shell32 setupapi shlwapi user32 msvcrt kernel32 ntdll)
add_cd_file(TARGET extrac32 DESTINATION reactos/system32 FOR all)
set_wine_module_FIXME(extrac32) # CORE-5743: No ARRAY_SIZE macro

View File

@@ -18,12 +18,12 @@ BEGIN
IDS_ERROR_NOMEM "Mémoire insuffisante pour terminer l'opération."
IDS_ERROR_NOFONT "Le fichier %1 n'est pas un fichier de polices valide."
IDS_ERROR_NOCLASS "Impossible d'initialiser la classe de fenêtre."
IDS_ERROR_ISINSTALLED "This font is already installed!"
IDS_ERROR_FONTCPY "Failed to copy the font file!"
IDS_ERROR_OPENKEY "Failed to open the fonts registry key!"
IDS_ERROR_REGISTER "Failed to register the new font!"
IDS_SUCCESS "Success"
IDS_COMPLETED "Font installation completed."
IDS_ERROR_ISINSTALLED "Cette police est déjà installée !"
IDS_ERROR_FONTCPY "Échec lors de la copie du fichier police !"
IDS_ERROR_OPENKEY "Échec lors de l'ouverture de la clé de registre de la police !"
IDS_ERROR_REGISTER "Échec lors de l'enregistrement de la nouvelle police !"
IDS_SUCCESS "Succès"
IDS_COMPLETED "Installation de la police effectuée."
IDS_FILTER_LIST "Toutes polices supportées (*.fon;*.fnt;*.ttf;*.ttc;*.otf;*.otc)\0*.fon;*.fnt;*.ttf;*.ttc;*.otf;*.otc\0\
Fichier de polices (*.fon;*.fnt)\0*.fon;*.fnt\0\
Fichier de polices TrueType (*.ttf)\0*.ttf\0\

View File

@@ -2,6 +2,7 @@
add_rc_deps(kbswitch.rc ${CMAKE_CURRENT_SOURCE_DIR}/res/kbswitch.ico)
add_executable(kbswitch kbswitch.c kbswitch.rc)
set_module_type(kbswitch win32gui UNICODE)
target_link_libraries(kbswitch wine)
add_importlibs(kbswitch advapi32 imm32 user32 shell32 shlwapi gdi32 msvcrt kernel32)
add_cd_file(TARGET kbswitch DESTINATION reactos/system32 FOR all)

View File

@@ -1,14 +1,17 @@
/*
* PROJECT: ReactOS Keyboard Layout Switcher
* FILE: base/applications/kbswitch/kbsdll/kbsdll.c
* PROGRAMMER: Dmitry Chapyshev <dmitry@reactos.org>
*
* PROJECT: ReactOS Keyboard Layout Switcher
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Switching Keyboard Layouts
* COPYRIGHT: Copyright Dmitry Chapyshev (dmitry@reactos.org)
* Copyright Colin Finck (mail@colinfinck.de)
* Copyright 2022-2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "../kbswitch.h"
HHOOK hWinHook = NULL;
HHOOK hShellHook = NULL;
HHOOK hKeyboardLLHook = NULL;
HINSTANCE hInstance = NULL;
HWND hKbSwitchWnd = NULL;
@@ -18,77 +21,108 @@ PostMessageToMainWnd(UINT Msg, WPARAM wParam, LPARAM lParam)
PostMessage(hKbSwitchWnd, Msg, wParam, lParam);
}
LRESULT CALLBACK
WinHookProc(int code, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK
WinHookProc(INT code, WPARAM wParam, LPARAM lParam)
{
if (code < 0)
{
return CallNextHookEx(hWinHook, code, wParam, lParam);
}
switch (code)
{
case HCBT_ACTIVATE:
case HCBT_SETFOCUS:
{
HWND hwndFocus = (HWND)wParam;
if (hwndFocus && hwndFocus != hKbSwitchWnd)
{
PostMessageToMainWnd(WM_WINDOW_ACTIVATE, wParam, lParam);
}
PostMessageToMainWnd(WM_WINDOW_ACTIVATE, (WPARAM)hwndFocus, 0);
break;
}
break;
}
return CallNextHookEx(hWinHook, code, wParam, lParam);
}
LRESULT CALLBACK
ShellHookProc(int code, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK
ShellHookProc(INT code, WPARAM wParam, LPARAM lParam)
{
if (code < 0)
{
return CallNextHookEx(hShellHook, code, wParam, lParam);
}
switch (code)
{
case HSHELL_WINDOWACTIVATED:
{
PostMessageToMainWnd(WM_WINDOW_ACTIVATE, wParam, 0);
break;
}
case HSHELL_LANGUAGE:
{
PostMessageToMainWnd(WM_LANG_CHANGED, wParam, lParam);
break;
}
break;
}
return CallNextHookEx(hShellHook, code, wParam, lParam);
}
BOOL WINAPI
KbSwitchSetHooks(VOID)
static LRESULT CALLBACK
KeyboardLLHook(INT code, WPARAM wParam, LPARAM lParam)
{
hWinHook = SetWindowsHookEx(WH_CBT, WinHookProc, hInstance, 0);
hShellHook = SetWindowsHookEx(WH_SHELL, ShellHookProc, hInstance, 0);
if (code < 0)
return CallNextHookEx(hKeyboardLLHook, code, wParam, lParam);
if (!hWinHook || !hShellHook)
if (code == HC_ACTION)
{
return FALSE;
KBDLLHOOKSTRUCT *pKbStruct = (KBDLLHOOKSTRUCT *)lParam;
if (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)
{
BOOL bShiftPressed = GetAsyncKeyState(VK_SHIFT) < 0;
BOOL bAltPressed = GetAsyncKeyState(VK_MENU) < 0;
BOOL bCtrlPressed = GetAsyncKeyState(VK_CONTROL) < 0;
// Detect Alt+Shift and Ctrl+Shift
if ((pKbStruct->vkCode == VK_SHIFT && bAltPressed) ||
(pKbStruct->vkCode == VK_MENU && bShiftPressed) ||
(pKbStruct->vkCode == VK_SHIFT && bCtrlPressed) ||
(pKbStruct->vkCode == VK_CONTROL && bShiftPressed))
{
PostMessageToMainWnd(WM_LANG_CHANGED, 0, 0);
}
}
}
return TRUE;
return CallNextHookEx(hKeyboardLLHook, code, wParam, lParam);
}
VOID WINAPI
KbSwitchDeleteHooks(VOID)
BOOL APIENTRY
KbSwitchSetHooks(_In_ BOOL bDoHook)
{
if (hWinHook)
if (bDoHook)
{
UnhookWindowsHookEx(hWinHook);
hWinHook = NULL;
hWinHook = SetWindowsHookEx(WH_CBT, WinHookProc, hInstance, 0);
hShellHook = SetWindowsHookEx(WH_SHELL, ShellHookProc, hInstance, 0);
hKeyboardLLHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardLLHook, hInstance, 0);
if (hWinHook && hShellHook && hKeyboardLLHook)
return TRUE;
}
/* Unhook */
if (hKeyboardLLHook)
{
UnhookWindowsHookEx(hKeyboardLLHook);
hKeyboardLLHook = NULL;
}
if (hShellHook)
{
UnhookWindowsHookEx(hShellHook);
hShellHook = NULL;
}
if (hWinHook)
{
UnhookWindowsHookEx(hWinHook);
hWinHook = NULL;
}
return !bDoHook;
}
BOOL WINAPI
@@ -103,9 +137,7 @@ DllMain(IN HINSTANCE hinstDLL,
hInstance = hinstDLL;
hKbSwitchWnd = FindWindow(szKbSwitcherName, NULL);
if (!hKbSwitchWnd)
{
return FALSE;
}
}
break;
}

View File

@@ -1,2 +1 @@
@ stdcall KbSwitchSetHooks()
@ stdcall KbSwitchDeleteHooks()
1 stdcall KbSwitchSetHooks(long)

View File

@@ -1,18 +1,20 @@
/*
* PROJECT: Keyboard Layout Switcher
* FILE: base/applications/kbswitch/kbswitch.c
* PURPOSE: Switching Keyboard Layouts
* PROGRAMMERS: Dmitry Chapyshev (dmitry@reactos.org)
* Colin Finck (mail@colinfinck.de)
* Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
* PROJECT: ReactOS Keyboard Layout Switcher
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Switching Keyboard Layouts
* COPYRIGHT: Copyright Dmitry Chapyshev (dmitry@reactos.org)
* Copyright Colin Finck (mail@colinfinck.de)
* Copyright 2022-2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#include "kbswitch.h"
#include <shlobj.h>
#include <shlwapi_undoc.h>
#include <imm.h>
#include <imm32_undoc.h>
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(internat);
/*
* This program kbswitch is a mimic of Win2k's internat.exe.
* However, there are some differences.
@@ -29,27 +31,49 @@
#define WM_NOTIFYICONMSG (WM_USER + 248)
PKBSWITCHSETHOOKS KbSwitchSetHooks = NULL;
PKBSWITCHDELETEHOOKS KbSwitchDeleteHooks = NULL;
UINT ShellHookMessage = 0;
#define TIMER_ID_LANG_CHANGED_DELAYED 0x10000
#define TIMER_LANG_CHANGED_DELAY 200
HINSTANCE hInst;
HANDLE hProcessHeap;
FN_KbSwitchSetHooks KbSwitchSetHooks = NULL;
HINSTANCE g_hInst = NULL;
HMODULE g_hHookDLL = NULL;
INT g_nCurrentLayoutNum = 1;
HICON g_hTrayIcon = NULL;
HWND g_hwndLastActive = NULL;
INT g_cKLs = 0;
HKL g_ahKLs[64];
HMENU g_hPopupMenu = NULL;
UINT g_uTaskbarRestartMsg = 0;
UINT g_uShellHookMessage = 0;
typedef struct
/* Debug logging */
ULONG NTAPI
vDbgPrintExWithPrefix(IN PCCH Prefix,
IN ULONG ComponentId,
IN ULONG Level,
IN PCCH Format,
IN va_list ap)
{
CHAR Buffer[512];
SIZE_T PrefixLength = strlen(Prefix);
strncpy(Buffer, Prefix, PrefixLength);
_vsnprintf(Buffer + PrefixLength, _countof(Buffer) - PrefixLength, Format, ap);
Buffer[_countof(Buffer) - 1] = ANSI_NULL; /* Avoid buffer overrun */
OutputDebugStringA(Buffer);
return 0;
}
typedef struct tagSPECIAL_ID
{
DWORD dwLayoutId;
HKL hKL;
TCHAR szKLID[CCH_LAYOUT_ID + 1];
} SPECIAL_ID, *PSPECIAL_ID;
SPECIAL_ID g_SpecialIds[80];
#define MAX_SPECIAL_IDS 256
SPECIAL_ID g_SpecialIds[MAX_SPECIAL_IDS];
INT g_cSpecialIds = 0;
static VOID LoadSpecialIds(VOID)
@@ -69,7 +93,7 @@ static VOID LoadSpecialIds(VOID)
for (dwIndex = 0; dwIndex < 1000; ++dwIndex)
{
dwSize = ARRAYSIZE(szKLID);
dwSize = _countof(szKLID);
if (RegEnumKeyEx(hKey, dwIndex, szKLID, &dwSize, NULL, NULL, NULL, NULL) != ERROR_SUCCESS)
break;
@@ -88,15 +112,15 @@ static VOID LoadSpecialIds(VOID)
g_SpecialIds[g_cSpecialIds].dwLayoutId = wLayoutId;
g_SpecialIds[g_cSpecialIds].hKL = hKL;
StringCchCopy(g_SpecialIds[g_cSpecialIds].szKLID,
ARRAYSIZE(g_SpecialIds[g_cSpecialIds].szKLID), szKLID);
_countof(g_SpecialIds[g_cSpecialIds].szKLID), szKLID);
++g_cSpecialIds;
}
RegCloseKey(hLayoutKey);
if (g_cSpecialIds >= ARRAYSIZE(g_SpecialIds))
if (g_cSpecialIds >= _countof(g_SpecialIds))
{
OutputDebugStringA("g_SpecialIds is full!");
ERR("g_SpecialIds is full!");
break;
}
}
@@ -133,18 +157,22 @@ GetKLIDFromHKL(HKL hKL, LPTSTR szKLID, SIZE_T KLIDLength)
}
}
static HKL GetActiveKL(VOID)
{
/* FIXME: Get correct console window's HKL when console window */
HWND hwndTarget = (g_hwndLastActive ? g_hwndLastActive : GetForegroundWindow());
DWORD dwTID = GetWindowThreadProcessId(hwndTarget, NULL);
return GetKeyboardLayout(dwTID);
}
static VOID UpdateLayoutList(HKL hKL OPTIONAL)
{
INT iKL;
if (!hKL)
{
HWND hwndTarget = (g_hwndLastActive ? g_hwndLastActive : GetForegroundWindow());
DWORD dwTID = GetWindowThreadProcessId(hwndTarget, NULL);
hKL = GetKeyboardLayout(dwTID);
}
hKL = GetActiveKL();
g_cKLs = GetKeyboardLayoutList(ARRAYSIZE(g_ahKLs), g_ahKLs);
g_cKLs = GetKeyboardLayoutList(_countof(g_ahKLs), g_ahKLs);
g_nCurrentLayoutNum = -1;
for (iKL = 0; iKL < g_cKLs; ++iKL)
@@ -156,7 +184,7 @@ static VOID UpdateLayoutList(HKL hKL OPTIONAL)
}
}
if (g_nCurrentLayoutNum == -1 && g_cKLs < ARRAYSIZE(g_ahKLs))
if (g_nCurrentLayoutNum == -1 && g_cKLs < _countof(g_ahKLs))
{
g_nCurrentLayoutNum = g_cKLs;
g_ahKLs[g_cKLs++] = hKL;
@@ -166,15 +194,9 @@ static VOID UpdateLayoutList(HKL hKL OPTIONAL)
static HKL GetHKLFromLayoutNum(INT nLayoutNum)
{
if (0 <= (nLayoutNum - 1) && (nLayoutNum - 1) < g_cKLs)
{
return g_ahKLs[nLayoutNum - 1];
}
else
{
HWND hwndTarget = (g_hwndLastActive ? g_hwndLastActive : GetForegroundWindow());
DWORD dwTID = GetWindowThreadProcessId(hwndTarget, NULL);
return GetKeyboardLayout(dwTID);
}
return GetActiveKL();
}
static VOID
@@ -202,9 +224,9 @@ GetLayoutName(INT nLayoutNum, LPTSTR szName, SIZE_T NameLength)
DWORD dwBufLen;
TCHAR szBuf[MAX_PATH], szKLID[CCH_LAYOUT_ID + 1];
GetKLIDFromLayoutNum(nLayoutNum, szKLID, ARRAYSIZE(szKLID));
GetKLIDFromLayoutNum(nLayoutNum, szKLID, _countof(szKLID));
StringCchPrintf(szBuf, ARRAYSIZE(szBuf),
StringCchPrintf(szBuf, _countof(szBuf),
_T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szBuf, 0, KEY_READ, &hKey) != ERROR_SUCCESS)
@@ -245,7 +267,7 @@ static BOOL GetImeFile(LPTSTR szImeFile, SIZE_T cchImeFile, LPCTSTR szKLID)
if (szKLID[0] != TEXT('E') && szKLID[0] != TEXT('e'))
return FALSE; /* Not an IME HKL */
StringCchPrintf(szBuf, ARRAYSIZE(szBuf),
StringCchPrintf(szBuf, _countof(szBuf),
_T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szKLID);
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, szBuf, 0, KEY_QUERY_VALUE, &hKey) != ERROR_SUCCESS)
@@ -336,7 +358,7 @@ CreateTrayIcon(LPTSTR szKLID, LPCTSTR szImeFile OPTIONAL)
if (szImeFile && szImeFile[0])
{
if (GetSystemLibraryPath(szPath, ARRAYSIZE(szPath), szImeFile))
if (GetSystemLibraryPath(szPath, _countof(szPath), szImeFile))
return FakeExtractIcon(szPath, cxIcon, cyIcon);
}
@@ -345,7 +367,7 @@ CreateTrayIcon(LPTSTR szKLID, LPCTSTR szImeFile OPTIONAL)
if (GetLocaleInfo(LangID,
LOCALE_SABBREVLANGNAME | LOCALE_NOUSEROVERRIDE,
szBuf,
ARRAYSIZE(szBuf)) == 0)
_countof(szBuf)) == 0)
{
szBuf[0] = szBuf[1] = _T('?');
}
@@ -421,13 +443,13 @@ AddTrayIcon(HWND hwnd)
NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1, NIF_ICON | NIF_MESSAGE | NIF_TIP };
TCHAR szKLID[CCH_LAYOUT_ID + 1], szName[MAX_PATH], szImeFile[80];
GetKLIDFromLayoutNum(g_nCurrentLayoutNum, szKLID, ARRAYSIZE(szKLID));
GetLayoutName(g_nCurrentLayoutNum, szName, ARRAYSIZE(szName));
GetImeFile(szImeFile, ARRAYSIZE(szImeFile), szKLID);
GetKLIDFromLayoutNum(g_nCurrentLayoutNum, szKLID, _countof(szKLID));
GetLayoutName(g_nCurrentLayoutNum, szName, _countof(szName));
GetImeFile(szImeFile, _countof(szImeFile), szKLID);
tnid.uCallbackMessage = WM_NOTIFYICONMSG;
tnid.hIcon = CreateTrayIcon(szKLID, szImeFile);
StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName);
StringCchCopy(tnid.szTip, _countof(tnid.szTip), szName);
Shell_NotifyIcon(NIM_ADD, &tnid);
@@ -455,11 +477,11 @@ UpdateTrayIcon(HWND hwnd, LPTSTR szKLID, LPTSTR szName)
NOTIFYICONDATA tnid = { sizeof(tnid), hwnd, 1, NIF_ICON | NIF_MESSAGE | NIF_TIP };
TCHAR szImeFile[80];
GetImeFile(szImeFile, ARRAYSIZE(szImeFile), szKLID);
GetImeFile(szImeFile, _countof(szImeFile), szKLID);
tnid.uCallbackMessage = WM_NOTIFYICONMSG;
tnid.hIcon = CreateTrayIcon(szKLID, szImeFile);
StringCchCopy(tnid.szTip, ARRAYSIZE(tnid.szTip), szName);
StringCchCopy(tnid.szTip, _countof(tnid.szTip), szName);
Shell_NotifyIcon(NIM_MODIFY, &tnid);
@@ -486,11 +508,11 @@ ActivateLayout(HWND hwnd, ULONG uLayoutNum, HWND hwndTarget OPTIONAL, BOOL bNoAc
if (uLayoutNum == 0 || uLayoutNum > 0xFF) /* Invalid */
return;
GetKLIDFromLayoutNum(uLayoutNum, szKLID, ARRAYSIZE(szKLID));
GetKLIDFromLayoutNum(uLayoutNum, szKLID, _countof(szKLID));
LangID = (LANGID)_tcstoul(szKLID, NULL, 16);
/* Switch to the new keyboard layout */
GetLocaleInfo(LangID, LOCALE_SLANGUAGE, szLangName, ARRAYSIZE(szLangName));
GetLocaleInfo(LangID, LOCALE_SLANGUAGE, szLangName, _countof(szLangName));
UpdateTrayIcon(hwnd, szKLID, szLangName);
if (hwndTarget && !bNoActivate)
@@ -525,10 +547,10 @@ BuildLeftPopupMenu(VOID)
for (iKL = 0; iKL < g_cKLs; ++iKL)
{
GetKLIDFromHKL(g_ahKLs[iKL], szKLID, ARRAYSIZE(szKLID));
GetImeFile(szImeFile, ARRAYSIZE(szImeFile), szKLID);
GetKLIDFromHKL(g_ahKLs[iKL], szKLID, _countof(szKLID));
GetImeFile(szImeFile, _countof(szImeFile), szKLID);
if (!GetLayoutName(iKL + 1, szName, ARRAYSIZE(szName)))
if (!GetLayoutName(iKL + 1, szName, _countof(szName)))
continue;
mii.fMask = MIIM_ID | MIIM_STRING;
@@ -561,30 +583,35 @@ SetHooks(VOID)
return FALSE;
}
KbSwitchSetHooks = (PKBSWITCHSETHOOKS) GetProcAddress(g_hHookDLL, "KbSwitchSetHooks");
KbSwitchDeleteHooks = (PKBSWITCHDELETEHOOKS) GetProcAddress(g_hHookDLL, "KbSwitchDeleteHooks");
#define IHOOK_SET 1
KbSwitchSetHooks = (FN_KbSwitchSetHooks)GetProcAddress(g_hHookDLL, MAKEINTRESOURCEA(IHOOK_SET));
if (KbSwitchSetHooks == NULL || KbSwitchDeleteHooks == NULL)
if (!KbSwitchSetHooks || !KbSwitchSetHooks(TRUE))
{
ERR("SetHooks failed\n");
return FALSE;
}
return KbSwitchSetHooks();
TRACE("SetHooks OK\n");
return TRUE;
}
VOID
DeleteHooks(VOID)
{
if (KbSwitchDeleteHooks)
if (KbSwitchSetHooks)
{
KbSwitchDeleteHooks();
KbSwitchDeleteHooks = NULL;
KbSwitchSetHooks(FALSE);
KbSwitchSetHooks = NULL;
}
if (g_hHookDLL)
{
FreeLibrary(g_hHookDLL);
g_hHookDLL = NULL;
}
TRACE("DeleteHooks OK\n");
}
static UINT GetLayoutNum(HKL hKL)
@@ -612,9 +639,9 @@ UpdateLanguageDisplay(HWND hwnd, HKL hKL)
TCHAR szKLID[MAX_PATH], szLangName[MAX_PATH];
LANGID LangID;
GetKLIDFromHKL(hKL, szKLID, ARRAYSIZE(szKLID));
GetKLIDFromHKL(hKL, szKLID, _countof(szKLID));
LangID = (LANGID)_tcstoul(szKLID, NULL, 16);
GetLocaleInfo(LangID, LOCALE_SLANGUAGE, szLangName, ARRAYSIZE(szLangName));
GetLocaleInfo(LangID, LOCALE_SLANGUAGE, szLangName, _countof(szLangName));
UpdateTrayIcon(hwnd, szKLID, szLangName);
g_nCurrentLayoutNum = GetLayoutNum(hKL);
@@ -622,20 +649,12 @@ UpdateLanguageDisplay(HWND hwnd, HKL hKL)
}
HWND
GetTargetWindow(HWND hwndFore)
GetTargetWindow(HWND hwndFore OPTIONAL)
{
TCHAR szClass[64];
HWND hwndIME;
HWND hwndTarget = hwndFore;
if (hwndTarget == NULL)
hwndTarget = GetForegroundWindow();
GetClassName(hwndTarget, szClass, ARRAYSIZE(szClass));
if (_tcsicmp(szClass, szKbSwitcherName) == 0)
HWND hwndTarget = (hwndFore ? hwndFore : GetForegroundWindow());
if (IsWndClassName(hwndTarget, szKbSwitcherName))
hwndTarget = g_hwndLastActive;
hwndIME = ImmGetDefaultIMEWnd(hwndTarget);
return (hwndIME ? hwndIME : hwndTarget);
return hwndTarget;
}
UINT
@@ -650,222 +669,229 @@ UpdateLanguageDisplayCurrent(HWND hwnd, HWND hwndFore)
static BOOL RememberLastActive(HWND hwnd, HWND hwndFore)
{
TCHAR szClass[64];
hwndFore = GetAncestor(hwndFore, GA_ROOT);
if (!IsWindowVisible(hwndFore) || !GetClassName(hwndFore, szClass, ARRAYSIZE(szClass)))
if (!IsWindowVisible(hwndFore))
return FALSE;
if (_tcsicmp(szClass, szKbSwitcherName) == 0 ||
_tcsicmp(szClass, TEXT("Shell_TrayWnd")) == 0)
if (IsWndClassName(hwndFore, szKbSwitcherName) ||
IsWndClassName(hwndFore, TEXT("Shell_TrayWnd")))
{
return FALSE; /* Special window */
}
/* FIXME: CONWND needs special handling */
if (_tcsicmp(szClass, TEXT("ConsoleWindowClass")) == 0)
{
HKL hKL = GetKeyboardLayout(0);
UpdateLanguageDisplay(hwnd, hKL);
}
g_hwndLastActive = hwndFore;
return TRUE;
}
LRESULT CALLBACK
WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
// WM_CREATE
static INT
KbSwitch_OnCreate(HWND hwnd)
{
static HMENU s_hMenu = NULL, s_hRightPopupMenu = NULL;
static UINT s_uTaskbarRestart;
POINT pt;
HMENU hLeftPopupMenu;
switch (Message)
if (!SetHooks())
{
case WM_CREATE:
{
if (!SetHooks())
{
MessageBox(NULL, TEXT("SetHooks failed."), NULL, MB_ICONERROR);
return -1;
}
MessageBox(NULL, TEXT("SetHooks failed."), NULL, MB_ICONERROR);
return -1; /* Failed */
}
LoadSpecialIds();
LoadSpecialIds();
UpdateLayoutList(NULL);
AddTrayIcon(hwnd);
UpdateLayoutList(NULL);
AddTrayIcon(hwnd);
ActivateLayout(hwnd, g_nCurrentLayoutNum, NULL, TRUE);
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
break;
}
ActivateLayout(hwnd, g_nCurrentLayoutNum, NULL, TRUE);
g_uTaskbarRestartMsg = RegisterWindowMessage(TEXT("TaskbarCreated"));
case WM_LANG_CHANGED: /* Comes from kbsdll.dll and this module */
{
UpdateLayoutList((HKL)lParam);
UpdateLanguageDisplay(hwnd, (HKL)lParam);
break;
}
return 0; /* Success */
}
case WM_WINDOW_ACTIVATE: /* Comes from kbsdll.dll and this module */
{
HWND hwndFore = GetForegroundWindow();
if (RememberLastActive(hwnd, hwndFore))
return UpdateLanguageDisplayCurrent(hwnd, hwndFore);
break;
}
// WM_DESTROY
static void
KbSwitch_OnDestroy(HWND hwnd)
{
KillTimer(hwnd, TIMER_ID_LANG_CHANGED_DELAYED);
DeleteHooks();
if (g_hPopupMenu)
DestroyMenu(g_hPopupMenu);
DeleteTrayIcon(hwnd);
PostQuitMessage(0);
}
case WM_NOTIFYICONMSG:
{
switch (lParam)
{
case WM_RBUTTONUP:
case WM_LBUTTONUP:
{
UpdateLayoutList(NULL);
// WM_TIMER
static void
KbSwitch_OnTimer(HWND hwnd, UINT_PTR nTimerID)
{
if (nTimerID == TIMER_ID_LANG_CHANGED_DELAYED)
{
KillTimer(hwnd, nTimerID);
HKL hKL = GetActiveKL();
UpdateLayoutList(hKL);
UpdateLanguageDisplay(hwnd, hKL);
}
}
GetCursorPos(&pt);
SetForegroundWindow(hwnd);
// WM_NOTIFYICONMSG
static void
KbSwitch_OnNotifyIconMsg(HWND hwnd, UINT uMouseMsg)
{
if (uMouseMsg != WM_LBUTTONUP && uMouseMsg != WM_RBUTTONUP)
return;
if (lParam == WM_LBUTTONUP)
{
/* Rebuild the left popup menu on every click to take care of keyboard layout changes */
hLeftPopupMenu = BuildLeftPopupMenu();
TrackPopupMenu(hLeftPopupMenu, 0, pt.x, pt.y, 0, hwnd, NULL);
DestroyMenu(hLeftPopupMenu);
}
else
{
if (!s_hRightPopupMenu)
{
s_hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_POPUP));
s_hRightPopupMenu = GetSubMenu(s_hMenu, 0);
}
TrackPopupMenu(s_hRightPopupMenu, 0, pt.x, pt.y, 0, hwnd, NULL);
}
UpdateLayoutList(NULL);
PostMessage(hwnd, WM_NULL, 0, 0);
break;
}
}
break;
}
POINT pt;
GetCursorPos(&pt);
case WM_COMMAND:
switch (LOWORD(wParam))
{
case ID_EXIT:
{
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
}
SetForegroundWindow(hwnd);
case ID_PREFERENCES:
{
INT_PTR ret = (INT_PTR)ShellExecute(hwnd, NULL,
TEXT("control.exe"), TEXT("input.dll"),
NULL, SW_SHOWNORMAL);
if (ret <= 32)
MessageBox(hwnd, _T("Can't start input.dll"), NULL, MB_ICONERROR);
break;
}
INT nID;
if (uMouseMsg == WM_LBUTTONUP)
{
/* Rebuild the left popup menu on every click to take care of keyboard layout changes */
HMENU hLeftPopupMenu = BuildLeftPopupMenu();
nID = TrackPopupMenu(hLeftPopupMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);
DestroyMenu(hLeftPopupMenu);
}
else /* WM_RBUTTONUP */
{
if (!g_hPopupMenu)
g_hPopupMenu = LoadMenu(g_hInst, MAKEINTRESOURCE(IDR_POPUP));
case ID_NEXTLAYOUT:
{
HWND hwndTarget = (HWND)lParam, hwndTargetSave = NULL;
DWORD dwThreadID;
HKL hKL;
UINT uNum;
TCHAR szClass[64];
BOOL bCONWND = FALSE;
HMENU hSubMenu = GetSubMenu(g_hPopupMenu, 0);
nID = TrackPopupMenu(hSubMenu, TPM_RETURNCMD, pt.x, pt.y, 0, hwnd, NULL);
}
if (hwndTarget == NULL)
hwndTarget = g_hwndLastActive;
PostMessage(hwnd, WM_NULL, 0, 0);
/* FIXME: CONWND needs special handling */
if (hwndTarget &&
GetClassName(hwndTarget, szClass, ARRAYSIZE(szClass)) &&
_tcsicmp(szClass, TEXT("ConsoleWindowClass")) == 0)
{
bCONWND = TRUE;
hwndTargetSave = hwndTarget;
hwndTarget = NULL;
}
if (nID)
PostMessage(hwnd, WM_COMMAND, nID, 0);
}
if (hwndTarget)
{
dwThreadID = GetWindowThreadProcessId(hwndTarget, NULL);
hKL = GetKeyboardLayout(dwThreadID);
uNum = GetLayoutNum(hKL);
if (uNum != 0)
g_nCurrentLayoutNum = uNum;
}
ActivateLayout(hwnd, GetNextLayout(), hwndTarget, TRUE);
/* FIXME: CONWND needs special handling */
if (bCONWND)
ActivateLayout(hwnd, g_nCurrentLayoutNum, hwndTargetSave, TRUE);
break;
}
default:
{
if (1 <= LOWORD(wParam) && LOWORD(wParam) <= 1000)
{
if (!IsWindow(g_hwndLastActive))
{
g_hwndLastActive = NULL;
}
ActivateLayout(hwnd, LOWORD(wParam), g_hwndLastActive, FALSE);
}
break;
}
}
// WM_COMMAND
static void
KbSwitch_OnCommand(HWND hwnd, UINT nID)
{
switch (nID)
{
case ID_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
break;
case WM_SETTINGCHANGE:
case ID_PREFERENCES:
{
if (wParam == SPI_SETNONCLIENTMETRICS)
{
PostMessage(hwnd, WM_WINDOW_ACTIVATE, wParam, lParam);
break;
}
}
break;
case WM_DESTROY:
{
DeleteHooks();
DestroyMenu(s_hMenu);
DeleteTrayIcon(hwnd);
PostQuitMessage(0);
INT_PTR ret = (INT_PTR)ShellExecute(hwnd, NULL,
TEXT("control.exe"), TEXT("input.dll"),
NULL, SW_SHOWNORMAL);
if (ret <= 32)
MessageBox(hwnd, _T("Can't start input.dll"), NULL, MB_ICONERROR);
break;
}
default:
{
if (Message == s_uTaskbarRestart)
if (1 <= nID && nID <= 1000)
{
UpdateLayoutList(NULL);
AddTrayIcon(hwnd);
break;
if (!IsWindow(g_hwndLastActive))
{
g_hwndLastActive = NULL;
}
ActivateLayout(hwnd, nID, g_hwndLastActive, FALSE);
}
else if (Message == ShellHookMessage)
{
if (wParam == HSHELL_LANGUAGE)
PostMessage(hwnd, WM_LANG_CHANGED, wParam, lParam);
else if (wParam == HSHELL_WINDOWACTIVATED)
PostMessage(hwnd, WM_WINDOW_ACTIVATE, wParam, lParam);
break;
}
return DefWindowProc(hwnd, Message, wParam, lParam);
break;
}
}
}
// WM_LANG_CHANGED
static LRESULT
KbSwitch_OnLangChanged(HWND hwnd, HWND hwndTarget OPTIONAL, HKL hKL OPTIONAL)
{
TRACE("WM_LANG_CHANGED: hwndTarget:%p, hKL:%p\n", hwndTarget, hKL);
/* Delayed action */
KillTimer(hwnd, TIMER_ID_LANG_CHANGED_DELAYED);
SetTimer(hwnd, TIMER_ID_LANG_CHANGED_DELAYED, TIMER_LANG_CHANGED_DELAY, NULL);
return 0;
}
// WM_WINDOW_ACTIVATE
static LRESULT
KbSwitch_OnWindowActivate(HWND hwnd, HWND hwndTarget OPTIONAL, LPARAM lParam OPTIONAL)
{
TRACE("WM_WINDOW_ACTIVATE: hwndTarget:%p, lParam:%p\n", hwndTarget, lParam);
HWND hwndFore = hwndTarget ? hwndTarget : GetForegroundWindow();
if (RememberLastActive(hwnd, hwndFore))
return UpdateLanguageDisplayCurrent(hwnd, hwndFore);
return 0;
}
// WM_SETTINGCHANGE
static void
KbSwitch_OnSettingChange(HWND hwnd, WPARAM wParam, LPARAM lParam)
{
if (wParam == SPI_SETNONCLIENTMETRICS)
PostMessage(hwnd, WM_WINDOW_ACTIVATE, 0, 0);
}
static LRESULT
KbSwitch_OnDefault(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (uMsg == g_uTaskbarRestartMsg)
{
UpdateLayoutList(NULL);
AddTrayIcon(hwnd);
return 0;
}
if (uMsg == g_uShellHookMessage)
{
TRACE("g_uShellHookMessage: wParam:%p, lParam:%p\n", wParam, lParam);
if (wParam == HSHELL_LANGUAGE)
PostMessage(hwnd, WM_LANG_CHANGED, 0, 0);
else if (wParam == HSHELL_WINDOWACTIVATED || wParam == HSHELL_RUDEAPPACTIVATED)
PostMessage(hwnd, WM_WINDOW_ACTIVATE, 0, 0);
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
LRESULT CALLBACK
WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
return KbSwitch_OnCreate(hwnd);
case WM_TIMER:
KbSwitch_OnTimer(hwnd, (UINT_PTR)wParam);
break;
case WM_LANG_CHANGED: /* Comes from kbsdll.dll and this module */
return KbSwitch_OnLangChanged(hwnd, (HWND)wParam, (HKL)lParam);
case WM_WINDOW_ACTIVATE: /* Comes from kbsdll.dll and this module */
return KbSwitch_OnWindowActivate(hwnd, (HWND)wParam, lParam);
case WM_NOTIFYICONMSG:
KbSwitch_OnNotifyIconMsg(hwnd, (UINT)lParam);
break;
case WM_COMMAND:
KbSwitch_OnCommand(hwnd, LOWORD(wParam));
break;
case WM_SETTINGCHANGE:
KbSwitch_OnSettingChange(hwnd, wParam, lParam);
break;
case WM_DESTROY:
KbSwitch_OnDestroy(hwnd);
break;
default:
return KbSwitch_OnDefault(hwnd, uMsg, wParam, lParam);
}
return 0;
}
@@ -881,6 +907,7 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh
switch (GetUserDefaultUILanguage())
{
case MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT):
TRACE("LAYOUT_RTL\n");
SetProcessDefaultLayout(LAYOUT_RTL);
break;
default:
@@ -889,16 +916,19 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh
hMutex = CreateMutex(NULL, FALSE, szKbSwitcherName);
if (!hMutex)
{
ERR("!hMutex\n");
return 1;
}
if (GetLastError() == ERROR_ALREADY_EXISTS)
{
ERR("Another instance is already running\n");
CloseHandle(hMutex);
return 1;
}
hInst = hInstance;
hProcessHeap = GetProcessHeap();
g_hInst = hInstance;
ZeroMemory(&WndClass, sizeof(WndClass));
WndClass.lpfnWndProc = WndProc;
@@ -912,8 +942,14 @@ _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdSh
}
hwnd = CreateWindow(szKbSwitcherName, NULL, 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL);
ShellHookMessage = RegisterWindowMessage(L"SHELLHOOK");
RegisterShellHookWindow(hwnd);
g_uShellHookMessage = RegisterWindowMessage(L"SHELLHOOK");
if (!RegisterShellHookWindow(hwnd))
{
ERR("RegisterShellHookWindow failed\n");
DestroyWindow(hwnd);
CloseHandle(hMutex);
return 1;
}
while (GetMessage(&msg, NULL, 0, 0))
{

View File

@@ -1,6 +1,6 @@
#pragma once
#include <stdarg.h>
#include <stdlib.h>
#include <windef.h>
#include <winbase.h>
#include <winuser.h>
@@ -10,20 +10,30 @@
#include <shellapi.h>
#include <tchar.h>
#include <strsafe.h>
#include <ime/indicml.h> /* INDICATOR_CLASS, INDICM_... */
#include "resource.h"
// Character Count of a layout ID like "00000409"
#define CCH_LAYOUT_ID 8
#define CCH_LAYOUT_ID 8 // Character Count of a layout ID like "00000409"
#define CCH_ULONG_DEC 10 // Maximum Character Count of a ULONG in decimal
// Maximum Character Count of a ULONG in decimal
#define CCH_ULONG_DEC 10
#define WM_KEY_PRESSED (WM_USER + 10100)
#define WM_LANG_CHANGED (WM_USER + 10200)
#define WM_WINDOW_ACTIVATE (WM_USER + 10300)
typedef BOOL (WINAPI *PKBSWITCHSETHOOKS) (VOID);
typedef VOID (WINAPI *PKBSWITCHDELETEHOOKS) (VOID);
typedef BOOL (APIENTRY *FN_KbSwitchSetHooks)(BOOL bDoHook);
TCHAR szKbSwitcherName[] = _T("kbswitcher");
const TCHAR szKbSwitcherName[] = INDICATOR_CLASS;
static inline BOOL
IsWndClassName(_In_opt_ HWND hwndTarget, PCTSTR pszName)
{
TCHAR szClass[32];
GetClassName(hwndTarget, szClass, _countof(szClass));
return lstrcmpi(szClass, pszName) == 0;
}
static inline BOOL
IsConsoleWnd(_In_opt_ HWND hwndTarget)
{
return IsWndClassName(hwndTarget, TEXT("ConsoleWindowClass"));
}

View File

@@ -9,4 +9,3 @@
/* Menu items */
#define ID_EXIT 10001
#define ID_PREFERENCES 10002
#define ID_NEXTLAYOUT 10003

View File

@@ -18,7 +18,7 @@ BEGIN
END
POPUP "&View"
BEGIN
MENUITEM "Single-Window &Mode", IDM_SWITCHVIEW
MENUITEM "&Mode fenêtre unique", IDM_SWITCHVIEW
END
POPUP "Périp&hérique"
BEGIN

View File

@@ -28,11 +28,11 @@ BEGIN
CONTROL "Exécuter le fichier &WIN.INI", IDC_CBX_WIN_INI, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 98, 316, 10
CONTROL "C&harger les services système", IDC_CBX_LOAD_SYSTEM_SERVICES, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 110, 316, 10
CONTROL "&Charger les éléments de démarrage", IDC_CBX_LOAD_STARTUP_ITEMS, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 122, 316, 10
CONTROL "&Utiliser la configuration de démarrage dorigine", IDC_CBX_USE_ORIGINAL_BOOTCFG, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 35, 134, 316, 10
CONTROL "&Utiliser la configuration de démarrage d'origine", IDC_CBX_USE_ORIGINAL_BOOTCFG, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 35, 134, 316, 10
PUSHBUTTON "Exéc&uter la restauration du système", IDC_BTN_SYSTEM_RESTORE_START, 146, 156, 124, 14
PUSHBUTTON "E&xtraire le fichier...", IDC_BTN_FILE_EXTRACTION, 275, 156, 85, 14
GROUPBOX "Sélection du mode de démarrage ", IDC_STATIC, 5, 5, 356, 145
LTEXT "Charger tous les pilotes de périphériques et tous les services", IDC_STATIC, 25, 30, 322, 10
LTEXT "Charger tous les pilotes de périphérique et tous les services", IDC_STATIC, 25, 30, 322, 10
LTEXT "Charger seulement les pilotes de périphérique et les services de base", IDC_STATIC, 25, 58, 322, 10
END

View File

@@ -4,7 +4,7 @@
* PURPOSE: Event Log Viewer main file.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#include "eventvwr.h"
@@ -1440,7 +1440,7 @@ LONG EventLogFilter_Release(IN PEVENTLOGFILTER EventLogFilter)
void
TrimNulls(LPWSTR s)
{
WCHAR *c;
PWCHAR c;
if (s != NULL)
{
@@ -1451,17 +1451,20 @@ TrimNulls(LPWSTR s)
}
}
DWORD
SIZE_T
GetExpandedFilePathName(
IN LPCWSTR ComputerName OPTIONAL,
IN LPCWSTR lpFileName,
OUT LPWSTR lpFullFileName OPTIONAL,
IN DWORD nSize)
_In_opt_ PCWSTR ComputerName,
_In_ PCWSTR FileName,
_Out_writes_z_(nSize) PWSTR pFullFileName,
_In_ SIZE_T nSize)
{
SIZE_T dwLength;
if (nSize == 0)
return 0;
/* Determine the needed size after expansion of any environment strings */
dwLength = ExpandEnvironmentStringsW(lpFileName, NULL, 0);
dwLength = ExpandEnvironmentStringsW(FileName, NULL, 0);
if (dwLength == 0)
{
/* We failed, bail out */
@@ -1487,15 +1490,14 @@ GetExpandedFilePathName(
if (dwLength > nSize)
{
/* No, return the needed size in characters (includes NULL-terminator) */
*pFullFileName = UNICODE_NULL;
return dwLength;
}
/* Now expand the file path */
ASSERT(dwLength <= nSize);
/* Expand any existing environment strings */
if (ExpandEnvironmentStringsW(lpFileName, lpFullFileName, dwLength) == 0)
if (ExpandEnvironmentStringsW(FileName, pFullFileName, dwLength) == 0)
{
/* We failed, bail out */
return 0;
@@ -1508,16 +1510,16 @@ GetExpandedFilePathName(
/* Note that we previously skipped any potential leading backslashes */
/* Replace ':' by '$' in the drive letter */
if (*lpFullFileName && lpFullFileName[1] == L':')
lpFullFileName[1] = L'$';
if (*pFullFileName && pFullFileName[1] == L':')
pFullFileName[1] = L'$';
/* Prepend the computer name */
MoveMemory(lpFullFileName + 2 + wcslen(ComputerName) + 1,
lpFullFileName, dwLength * sizeof(WCHAR) - (2 + wcslen(ComputerName) + 1) * sizeof(WCHAR));
lpFullFileName[0] = L'\\';
lpFullFileName[1] = L'\\';
wcsncpy(lpFullFileName + 2, ComputerName, wcslen(ComputerName));
lpFullFileName[2 + wcslen(ComputerName)] = L'\\';
MoveMemory(pFullFileName + 2 + wcslen(ComputerName) + 1,
pFullFileName, dwLength * sizeof(WCHAR) - (2 + wcslen(ComputerName) + 1) * sizeof(WCHAR));
pFullFileName[0] = L'\\';
pFullFileName[1] = L'\\';
wcsncpy(pFullFileName + 2, ComputerName, wcslen(ComputerName));
pFullFileName[2 + wcslen(ComputerName)] = L'\\';
}
/* Return the number of stored characters (includes NULL-terminator) */
@@ -1525,27 +1527,38 @@ GetExpandedFilePathName(
}
BOOL
GetEventMessageFileDLL(IN LPCWSTR lpLogName,
IN LPCWSTR SourceName,
IN LPCWSTR EntryName,
OUT PWCHAR lpModuleName) // TODO: Add IN DWORD BufLen
GetEventMessageFileDLL(
_In_ PCWSTR LogName,
_In_ PCWSTR SourceName,
_In_ PCWSTR EntryName,
_Out_writes_z_(cchName) PWSTR pModuleName,
_In_ SIZE_T cchName)
{
BOOL Success = FALSE;
LONG Result;
DWORD dwType, dwSize;
WCHAR szModuleName[MAX_PATH];
WCHAR szKeyName[MAX_PATH];
PWSTR KeyPath;
SIZE_T cbKeyPath;
HKEY hLogKey = NULL;
HKEY hSourceKey = NULL;
StringCbCopyW(szKeyName, sizeof(szKeyName), EVENTLOG_BASE_KEY);
StringCbCatW(szKeyName, sizeof(szKeyName), lpLogName);
if (cchName == 0)
return FALSE;
Result = RegOpenKeyExW(hkMachine,
szKeyName,
0,
KEY_READ,
&hLogKey);
cbKeyPath = (wcslen(EVENTLOG_BASE_KEY) + wcslen(LogName) + 1) * sizeof(WCHAR);
KeyPath = HeapAlloc(GetProcessHeap(), 0, cbKeyPath);
if (!KeyPath)
{
ShowWin32Error(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
StringCbCopyW(KeyPath, cbKeyPath, EVENTLOG_BASE_KEY);
StringCbCatW(KeyPath, cbKeyPath, LogName);
Result = RegOpenKeyExW(hkMachine, KeyPath, 0, KEY_READ, &hLogKey);
HeapFree(GetProcessHeap(), 0, KeyPath);
if (Result != ERROR_SUCCESS)
return FALSE;
@@ -1554,11 +1567,9 @@ GetEventMessageFileDLL(IN LPCWSTR lpLogName,
0,
KEY_QUERY_VALUE,
&hSourceKey);
RegCloseKey(hLogKey);
if (Result != ERROR_SUCCESS)
{
RegCloseKey(hLogKey);
return FALSE;
}
dwSize = sizeof(szModuleName);
Result = RegQueryValueExW(hSourceKey,
@@ -1569,34 +1580,42 @@ GetEventMessageFileDLL(IN LPCWSTR lpLogName,
&dwSize);
if ((Result != ERROR_SUCCESS) || (dwType != REG_EXPAND_SZ && dwType != REG_SZ))
{
szModuleName[0] = UNICODE_NULL;
*szModuleName = UNICODE_NULL;
}
else
{
/* NULL-terminate the string and expand it */
szModuleName[dwSize / sizeof(WCHAR) - 1] = UNICODE_NULL;
GetExpandedFilePathName(lpComputerName, szModuleName, lpModuleName, ARRAYSIZE(szModuleName));
Success = TRUE;
Success =
(GetExpandedFilePathName(lpComputerName, szModuleName,
pModuleName, cchName) != 0 && *pModuleName);
}
RegCloseKey(hSourceKey);
RegCloseKey(hLogKey);
return Success;
}
BOOL
GetEventCategory(IN LPCWSTR KeyName,
IN LPCWSTR SourceName,
IN PEVENTLOGRECORD pevlr,
OUT PWCHAR CategoryName) // TODO: Add IN DWORD BufLen
GetEventCategory(
_In_ PCWSTR KeyName,
_In_ PCWSTR SourceName,
_In_ PEVENTLOGRECORD pevlr,
_Out_writes_z_(cchName) PWSTR CategoryName,
_In_ SIZE_T cchName)
{
BOOL Success = FALSE;
WCHAR szMessageDLL[MAX_PATH];
LPWSTR lpMsgBuf = NULL;
LPWSTR lpMsgBuf;
if (!GetEventMessageFileDLL(KeyName, SourceName, EVENT_CATEGORY_MESSAGE_FILE, szMessageDLL))
if (cchName == 0)
return FALSE;
if (!GetEventMessageFileDLL(KeyName, SourceName, EVENT_CATEGORY_MESSAGE_FILE,
szMessageDLL, _countof(szMessageDLL)))
{
goto Quit;
}
/* Retrieve the message string without appending extra newlines */
lpMsgBuf =
@@ -1612,7 +1631,7 @@ GetEventCategory(IN LPCWSTR KeyName,
TrimNulls(lpMsgBuf);
/* Copy the category name */
StringCchCopyW(CategoryName, MAX_PATH, lpMsgBuf);
StringCchCopyW(CategoryName, cchName, lpMsgBuf);
/* Free the buffer allocated by FormatMessage */
LocalFree(lpMsgBuf);
@@ -1626,7 +1645,7 @@ Quit:
{
if (pevlr->EventCategory != 0)
{
StringCchPrintfW(CategoryName, MAX_PATH, L"(%lu)", pevlr->EventCategory);
StringCchPrintfW(CategoryName, cchName, L"(%lu)", pevlr->EventCategory);
Success = TRUE;
}
}
@@ -1634,12 +1653,14 @@ Quit:
return Success;
}
BOOL // NOTE: Used by evtdetctl.c
GetEventMessage(IN LPCWSTR KeyName,
IN LPCWSTR SourceName,
IN PEVENTLOGRECORD pevlr,
OUT PWCHAR EventText) // TODO: Add IN DWORD BufLen
// NOTE: Used by evtdetctl.c
BOOL
GetEventMessage(
_In_ PCWSTR KeyName,
_In_ PCWSTR SourceName,
_In_ PEVENTLOGRECORD pevlr,
_Out_writes_z_(cchText) PWSTR EventText,
_In_ SIZE_T cchText)
{
BOOL Success = FALSE;
DWORD i;
@@ -1647,26 +1668,36 @@ GetEventMessage(IN LPCWSTR KeyName,
WCHAR SourceModuleName[1024];
WCHAR ParameterModuleName[1024];
BOOL IsParamModNameCached = FALSE;
LPWSTR lpMsgBuf = NULL;
LPWSTR lpMsgBuf;
LPWSTR szStringArray, szMessage;
LPWSTR *szArguments;
if (cchText == 0)
return FALSE;
/* Get the event string array */
szStringArray = (LPWSTR)((LPBYTE)pevlr + pevlr->StringOffset);
/* NOTE: GetEventMessageFileDLL can return a comma-separated list of DLLs */
if (!GetEventMessageFileDLL(KeyName, SourceName, EVENT_MESSAGE_FILE, SourceModuleName))
if (!GetEventMessageFileDLL(KeyName, SourceName, EVENT_MESSAGE_FILE,
SourceModuleName, _countof(SourceModuleName)))
{
goto Quit;
}
/* Allocate space for insertion strings */
szArguments = HeapAlloc(GetProcessHeap(), 0, pevlr->NumStrings * sizeof(LPVOID));
if (!szArguments)
goto Quit;
// TODO: Revisit this whole IsParamModNameCached later,
// see commits c1ecc98f60 (r71368) and d5ba2a3784 (r71958).
*ParameterModuleName = UNICODE_NULL; // TEMP fix in case GetEventMessageFileDLL fails.
if (!IsParamModNameCached)
{
/* Now that the parameter file list is loaded, no need to reload it at the next run! */
IsParamModNameCached = GetEventMessageFileDLL(KeyName, SourceName, EVENT_PARAMETER_MESSAGE_FILE, ParameterModuleName);
IsParamModNameCached = GetEventMessageFileDLL(KeyName, SourceName, EVENT_PARAMETER_MESSAGE_FILE,
ParameterModuleName, _countof(ParameterModuleName));
// FIXME: If the string loading failed the first time, no need to retry it just after???
}
@@ -1679,7 +1710,7 @@ GetEventMessage(IN LPCWSTR KeyName,
/*
* HACK:
* We do some hackish preformatting of the cached event strings...
* That's because after we pass the string to FormatMessage
* That's because below, we pass the string to FormatMessage
* (via GetMessageStringFromDllList) with the FORMAT_MESSAGE_ARGUMENT_ARRAY
* flag, instead of ignoring the insertion parameters and do the formatting
* by ourselves. Therefore, the resulting string should have the parameter
@@ -1737,7 +1768,7 @@ GetEventMessage(IN LPCWSTR KeyName,
}
/* Copy the event text */
StringCchCopyW(EventText, EVENT_MESSAGE_EVENTTEXT_BUFFER, lpMsgBuf);
StringCchCopyW(EventText, cchText, lpMsgBuf);
/* Free the buffer allocated by FormatMessage */
LocalFree(lpMsgBuf);
@@ -1748,17 +1779,31 @@ GetEventMessage(IN LPCWSTR KeyName,
Quit:
if (!Success)
{
/* Get a read-only pointer to the "event-not-found" string */
lpMsgBuf = HeapAlloc(GetProcessHeap(), 0, EVENT_MESSAGE_EVENTTEXT_BUFFER * sizeof(WCHAR));
LoadStringW(hInst, IDS_EVENTSTRINGIDNOTFOUND, lpMsgBuf, EVENT_MESSAGE_EVENTTEXT_BUFFER);
StringCchPrintfW(EventText, EVENT_MESSAGE_EVENTTEXT_BUFFER, lpMsgBuf, (pevlr->EventID & 0xFFFF), SourceName);
/* Get a read-only pointer to the "Event-Not-Found" string */
SIZE_T cchResLen =
LoadStringW(hInst, IDS_EVENTSTRINGIDNOTFOUND, (PWSTR)&szMessage, 0);
lpMsgBuf = HeapAlloc(GetProcessHeap(), 0, (cchResLen + 1) * sizeof(WCHAR));
if (lpMsgBuf)
{
StringCchCopyNW(lpMsgBuf, cchResLen + 1, szMessage, cchResLen);
szMessage = lpMsgBuf;
}
else
{
/* Use a hardcoded format string */
szMessage = L"Event ID ( %lu ), Source ( %s )\n\n";
}
StringCchPrintfW(EventText, cchText, szMessage, (pevlr->EventID & 0xFFFF), SourceName);
if (lpMsgBuf)
HeapFree(GetProcessHeap(), 0, lpMsgBuf);
/* Append the strings */
szMessage = szStringArray;
for (i = 0; i < pevlr->NumStrings; i++)
{
StringCchCatW(EventText, EVENT_MESSAGE_EVENTTEXT_BUFFER, szMessage);
StringCchCatW(EventText, EVENT_MESSAGE_EVENTTEXT_BUFFER, L"\n");
StringCchCatW(EventText, cchText, szMessage);
StringCchCatW(EventText, cchText, L"\n");
szMessage += wcslen(szMessage) + 1;
}
}
@@ -1767,49 +1812,56 @@ Quit:
}
VOID
GetEventType(IN WORD dwEventType,
OUT PWCHAR eventTypeText) // TODO: Add IN DWORD BufLen
GetEventType(
_In_ WORD dwEventType,
_Out_writes_z_(cchText) PWSTR pszEventType,
_In_ SIZE_T cchText)
{
switch (dwEventType)
{
case EVENTLOG_ERROR_TYPE:
LoadStringW(hInst, IDS_EVENTLOG_ERROR_TYPE, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_ERROR_TYPE, pszEventType, cchText);
break;
case EVENTLOG_WARNING_TYPE:
LoadStringW(hInst, IDS_EVENTLOG_WARNING_TYPE, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_WARNING_TYPE, pszEventType, cchText);
break;
case EVENTLOG_INFORMATION_TYPE:
LoadStringW(hInst, IDS_EVENTLOG_INFORMATION_TYPE, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_INFORMATION_TYPE, pszEventType, cchText);
break;
case EVENTLOG_SUCCESS:
LoadStringW(hInst, IDS_EVENTLOG_SUCCESS, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_SUCCESS, pszEventType, cchText);
break;
case EVENTLOG_AUDIT_SUCCESS:
LoadStringW(hInst, IDS_EVENTLOG_AUDIT_SUCCESS, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_AUDIT_SUCCESS, pszEventType, cchText);
break;
case EVENTLOG_AUDIT_FAILURE:
LoadStringW(hInst, IDS_EVENTLOG_AUDIT_FAILURE, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_AUDIT_FAILURE, pszEventType, cchText);
break;
default:
LoadStringW(hInst, IDS_EVENTLOG_UNKNOWN_TYPE, eventTypeText, MAX_LOADSTRING);
LoadStringW(hInst, IDS_EVENTLOG_UNKNOWN_TYPE, pszEventType, cchText);
break;
}
}
BOOL
GetEventUserName(IN PEVENTLOGRECORD pelr,
IN OUT PSID *pLastSid,
OUT PWCHAR pszUser) // TODO: Add IN DWORD BufLen
GetEventUserName(
_In_ PEVENTLOGRECORD pelr,
_Inout_ PSID *pLastSid,
_Out_writes_z_(cchUser) PWSTR pszUser,
_In_ SIZE_T cchUser)
{
PSID pCurrentSid;
PWSTR StringSid;
WCHAR szName[1024];
WCHAR szDomain[1024];
SID_NAME_USE peUse;
DWORD cchName = ARRAYSIZE(szName);
DWORD cchDomain = ARRAYSIZE(szDomain);
DWORD cchName = _countof(szName);
DWORD cchDomain = _countof(szDomain);
BOOL Success = FALSE;
if (cchUser == 0)
return FALSE;
/* Point to the SID */
pCurrentSid = (PSID)((LPBYTE)pelr + pelr->UserSidOffset);
@@ -1840,15 +1892,15 @@ GetEventUserName(IN PEVENTLOGRECORD pelr,
&cchDomain,
&peUse))
{
StringCchCopyW(pszUser, MAX_PATH, szName);
StringCchCopyW(pszUser, cchUser, szName);
Success = TRUE;
}
else if (ConvertSidToStringSidW(pCurrentSid, &StringSid))
{
/* Copy the string only if the user-provided buffer is big enough */
if (wcslen(StringSid) + 1 <= MAX_PATH) // + 1 for NULL-terminator
if (wcslen(StringSid) + 1 <= cchUser) // + 1 for NULL-terminator
{
StringCchCopyW(pszUser, MAX_PATH, StringSid);
StringCchCopyW(pszUser, cchUser, StringSid);
Success = TRUE;
}
else
@@ -1978,7 +2030,6 @@ EnumEventsThread(IN LPVOID lpParameter)
BOOL bResult = TRUE; /* Read succeeded */
HANDLE hProcessHeap = GetProcessHeap();
PSID pLastSid = NULL;
INT nItems;
UINT uStep = 0, uStepAt = 0, uPos = 0;
@@ -1998,7 +2049,8 @@ EnumEventsThread(IN LPVOID lpParameter)
SYSTEMTIME time;
LVITEMW lviEventItem;
EnableEventDetailsButtons(hwndEventDetails, FALSE);
/* Disable the Previous/Next buttons */
SendMessageW(hwndEventDetails, EVT_DISPLAY, FALSE, (LPARAM)-1);
/* Save the current event log filter globally */
EventLogFilter_AddRef(EventLogFilter);
@@ -2190,15 +2242,19 @@ EnumEventsThread(IN LPVOID lpParameter)
GetTimeFormatW(LOCALE_USER_DEFAULT, 0, &time, NULL, szLocalTime, ARRAYSIZE(szLocalTime));
/* Get the username that generated the event, and filter it */
lpszUsername = GetEventUserName(pEvlrTmp, &pLastSid, szUsername) ? szUsername : szNoUsername;
lpszUsername = GetEventUserName(pEvlrTmp, &pLastSid,
szUsername, _countof(szUsername))
? szUsername : szNoUsername;
if (!FilterByString(EventLogFilter->Users, lpszUsername))
goto SkipEvent;
// TODO: Filter by event ID and category
GetEventType(pEvlrTmp->EventType, szEventTypeText);
GetEventType(pEvlrTmp->EventType, szEventTypeText, _countof(szEventTypeText));
lpszCategoryName = GetEventCategory(EventLog->LogName, lpszSourceName, pEvlrTmp, szCategory) ? szCategory : szNoCategory;
lpszCategoryName = GetEventCategory(EventLog->LogName, lpszSourceName, pEvlrTmp,
szCategory, _countof(szCategory))
? szCategory : szNoCategory;
StringCbPrintfW(szEventID, sizeof(szEventID), L"%u", (pEvlrTmp->EventID & 0xFFFF));
StringCbPrintfW(szCategoryID, sizeof(szCategoryID), L"%u", pEvlrTmp->EventCategory);
@@ -2265,9 +2321,6 @@ Quit:
/* All events loaded */
Cleanup:
nItems = ListView_GetItemCount(hwndListView);
EnableEventDetailsButtons(hwndEventDetails, (nItems > 0));
ShowWindow(hwndStatusProgress, SW_HIDE);
SendMessageW(hwndListView, LVM_PROGRESS, 0, FALSE);
@@ -2298,6 +2351,11 @@ Cleanup:
/* Resume list view redraw */
SendMessageW(hwndListView, WM_SETREDRAW, TRUE, 0);
/* Re-enable the Previous/Next buttons, keeping the current event details
* displayed, if any. Don't auto-select the first list item but wait for
* the user to do it. */
SendMessageW(hwndEventDetails, EVT_DISPLAY, FALSE, 0);
EventLogFilter_Release(EventLogFilter);
CloseHandle(hStopEnumEvent);
@@ -2710,14 +2768,16 @@ MyRegisterClass(HINSTANCE hInstance)
BOOL
GetDisplayNameFileAndID(IN LPCWSTR lpLogName,
OUT PWCHAR lpModuleName, // TODO: Add IN DWORD BufLen
OUT PDWORD pdwMessageID)
GetDisplayNameFileAndID(
_In_ PCWSTR LogName,
_Out_writes_z_(cchName) PWSTR pModuleName,
_In_ SIZE_T cchName,
_Out_ PDWORD pdwMessageID)
{
BOOL Success = FALSE;
LONG Result;
HKEY hLogKey;
WCHAR *KeyPath;
PWSTR KeyPath;
SIZE_T cbKeyPath;
DWORD dwType, cbData;
DWORD dwMessageID = 0;
@@ -2726,7 +2786,10 @@ GetDisplayNameFileAndID(IN LPCWSTR lpLogName,
/* Use a default value for the message ID */
*pdwMessageID = 0;
cbKeyPath = (wcslen(EVENTLOG_BASE_KEY) + wcslen(lpLogName) + 1) * sizeof(WCHAR);
if (cchName == 0)
return FALSE;
cbKeyPath = (wcslen(EVENTLOG_BASE_KEY) + wcslen(LogName) + 1) * sizeof(WCHAR);
KeyPath = HeapAlloc(GetProcessHeap(), 0, cbKeyPath);
if (!KeyPath)
{
@@ -2735,7 +2798,7 @@ GetDisplayNameFileAndID(IN LPCWSTR lpLogName,
}
StringCbCopyW(KeyPath, cbKeyPath, EVENTLOG_BASE_KEY);
StringCbCatW(KeyPath, cbKeyPath, lpLogName);
StringCbCatW(KeyPath, cbKeyPath, LogName);
Result = RegOpenKeyExW(hkMachine, KeyPath, 0, KEY_QUERY_VALUE, &hLogKey);
HeapFree(GetProcessHeap(), 0, KeyPath);
@@ -2754,14 +2817,15 @@ GetDisplayNameFileAndID(IN LPCWSTR lpLogName,
&cbData);
if ((Result != ERROR_SUCCESS) || (dwType != REG_EXPAND_SZ && dwType != REG_SZ))
{
szModuleName[0] = UNICODE_NULL;
*szModuleName = UNICODE_NULL;
}
else
{
/* NULL-terminate the string and expand it */
szModuleName[cbData / sizeof(WCHAR) - 1] = UNICODE_NULL;
GetExpandedFilePathName(lpComputerName, szModuleName, lpModuleName, ARRAYSIZE(szModuleName));
Success = TRUE;
Success =
(GetExpandedFilePathName(lpComputerName, szModuleName,
pModuleName, cchName) != 0 && *pModuleName);
}
/*
@@ -2938,8 +3002,8 @@ BuildLogListAndFilterList(IN LPCWSTR lpComputerName)
/* Get the display name for the event log */
lpDisplayName = NULL;
ZeroMemory(szModuleName, sizeof(szModuleName));
if (GetDisplayNameFileAndID(LogName, szModuleName, &dwMessageID))
*szModuleName = UNICODE_NULL;
if (GetDisplayNameFileAndID(LogName, szModuleName, _countof(szModuleName), &dwMessageID))
{
/* Retrieve the message string without appending extra newlines */
lpDisplayName =
@@ -3342,7 +3406,7 @@ WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
MB_OK | MB_ICONERROR);
break;
}
SendMessageW(hwndEventDetails, EVT_DISPLAY, 0, (LPARAM)pnmv->iItem);
SendMessageW(hwndEventDetails, EVT_DISPLAY, TRUE, (LPARAM)pnmv->iItem);
}
break;
}
@@ -3855,9 +3919,9 @@ InitPropertiesDlg(HWND hDlg, PEVENTLOG EventLog)
LPWSTR FileName;
HKEY hLogKey;
WCHAR *KeyPath;
DWORD cbData;
PWSTR KeyPath;
SIZE_T cbKeyPath;
DWORD cbData;
if (EventLog->Permanent)
{
@@ -3927,7 +3991,7 @@ Quit:
if (FileName && *FileName)
{
/* Expand the file name. If the log file is on a remote computer, retrieve the network share form of the file name. */
GetExpandedFilePathName(EventLog->ComputerName, FileName, wszBuf, ARRAYSIZE(wszBuf));
GetExpandedFilePathName(EventLog->ComputerName, FileName, wszBuf, _countof(wszBuf));
FileName = wszBuf;
}
else
@@ -4038,7 +4102,7 @@ SavePropertiesDlg(HWND hDlg, PEVENTLOG EventLog)
LONG Result;
DWORD dwMaxSize = 0, dwRetention = 0;
HKEY hLogKey;
WCHAR *KeyPath;
PWSTR KeyPath;
SIZE_T cbKeyPath;
if (!EventLog->Permanent)
@@ -4347,9 +4411,9 @@ EventDetails(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
cxOld = rcWnd.right - rcWnd.left;
cyOld = rcWnd.bottom - rcWnd.top;
/* Show event info in dialog control */
iEventItem = (lParam != 0 ? ((PEVENTDETAIL_INFO)lParam)->iEventItem : 0);
SendMessageW(hWndDetailsCtrl, EVT_DISPLAY, 0, (LPARAM)iEventItem);
/* Display the event info in the dialog */
iEventItem = (lParam != 0 ? ((PEVENTDETAIL_INFO)lParam)->iEventItem : -1);
SendMessageW(hWndDetailsCtrl, EVT_DISPLAY, TRUE, (LPARAM)iEventItem);
// SetWindowPos(hWndDetailsCtrl, NULL,
// 0, 0,

View File

@@ -4,7 +4,7 @@
* PURPOSE: Event Log Viewer header.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#ifndef _EVENTVWR_PCH_

View File

@@ -4,7 +4,7 @@
* PURPOSE: Event Details Control.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#include "eventvwr.h"
@@ -12,19 +12,36 @@
#include <shellapi.h>
/**
* @brief
* ReactOS-only feature:
* Enable or disable support for copying event info text using space padding
* between header titles and data, when pressing the SHIFT key while clicking
* on the "Copy" button, instead of using TABs as separators.
*
* @see CopyEventEntry().
**/
#define COPY_EVTTEXT_SPACE_PADDING_MODE
// FIXME:
#define EVENT_MESSAGE_EVENTTEXT_BUFFER (1024*10)
extern WCHAR szTitle[];
extern HWND hwndListView;
extern BOOL
GetEventMessage(IN LPCWSTR KeyName,
IN LPCWSTR SourceName,
IN PEVENTLOGRECORD pevlr,
OUT PWCHAR EventText);
GetEventMessage(
_In_ PCWSTR KeyName,
_In_ PCWSTR SourceName,
_In_ PEVENTLOGRECORD pevlr,
_Out_writes_z_(cchText) PWSTR EventText,
_In_ SIZE_T cchText);
typedef struct _DETAILDATA
{
/* The event record being displayed */
PEVENTLOGRECORD pevlr;
/* Data initialized from EVENTDETAIL_INFO */
PEVENTLOGFILTER EventLogFilter;
INT iEventItem;
@@ -38,60 +55,71 @@ typedef struct _DETAILDATA
} DETAILDATA, *PDETAILDATA;
static
VOID
DisplayEventData(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData);
static
VOID
DisplayEvent(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData)
{
/* Mapping of ListView column index to corresponding dialog control ID */
static const WORD lvColsToDlgItemIDs[] =
{
IDC_EVENTTYPESTATIC, IDC_EVENTDATESTATIC, IDC_EVENTTIMESTATIC,
IDC_EVENTSOURCESTATIC, IDC_EVENTCATEGORYSTATIC, IDC_EVENTIDSTATIC,
IDC_EVENTUSERSTATIC, IDC_EVENTCOMPUTERSTATIC,
};
PEVENTLOGRECORD pevlr;
PEVENTLOGFILTER EventLogFilter = pDetailData->EventLogFilter;
INT iItem = pDetailData->iEventItem;
LVITEMW li;
PEVENTLOGRECORD pevlr;
USHORT i;
BOOL bEventData;
WCHAR szEventType[MAX_PATH];
WCHAR szTime[MAX_PATH];
WCHAR szDate[MAX_PATH];
WCHAR szUser[MAX_PATH];
WCHAR szComputer[MAX_PATH];
WCHAR szSource[MAX_PATH];
WCHAR szCategory[MAX_PATH];
WCHAR szEventID[MAX_PATH];
WCHAR szEventText[EVENT_MESSAGE_EVENTTEXT_BUFFER];
/* Retrieve and cache the pointer to the selected event item */
LVITEMW li;
li.mask = LVIF_PARAM;
li.iItem = iItem;
li.iSubItem = 0;
ListView_GetItem(hwndListView, &li);
pevlr = pDetailData->pevlr = (PEVENTLOGRECORD)li.lParam;
pevlr = (PEVENTLOGRECORD)li.lParam;
ListView_GetItemText(hwndListView, iItem, 0, szEventType, ARRAYSIZE(szEventType));
ListView_GetItemText(hwndListView, iItem, 1, szDate, ARRAYSIZE(szDate));
ListView_GetItemText(hwndListView, iItem, 2, szTime, ARRAYSIZE(szTime));
ListView_GetItemText(hwndListView, iItem, 3, szSource, ARRAYSIZE(szSource));
ListView_GetItemText(hwndListView, iItem, 4, szCategory, ARRAYSIZE(szCategory));
ListView_GetItemText(hwndListView, iItem, 5, szEventID, ARRAYSIZE(szEventID));
ListView_GetItemText(hwndListView, iItem, 6, szUser, ARRAYSIZE(szUser));
ListView_GetItemText(hwndListView, iItem, 7, szComputer, ARRAYSIZE(szComputer));
SetDlgItemTextW(hDlg, IDC_EVENTDATESTATIC, szDate);
SetDlgItemTextW(hDlg, IDC_EVENTTIMESTATIC, szTime);
SetDlgItemTextW(hDlg, IDC_EVENTUSERSTATIC, szUser);
SetDlgItemTextW(hDlg, IDC_EVENTSOURCESTATIC, szSource);
SetDlgItemTextW(hDlg, IDC_EVENTCOMPUTERSTATIC, szComputer);
SetDlgItemTextW(hDlg, IDC_EVENTCATEGORYSTATIC, szCategory);
SetDlgItemTextW(hDlg, IDC_EVENTIDSTATIC, szEventID);
SetDlgItemTextW(hDlg, IDC_EVENTTYPESTATIC, szEventType);
for (i = 0; i < _countof(lvColsToDlgItemIDs); ++i)
{
PWSTR pszBuffer = szEventText;
if (lvColsToDlgItemIDs[i] == IDC_EVENTSOURCESTATIC)
{
/* Use a separate buffer to store the source; used below */
pszBuffer = szSource;
ListView_GetItemText(hwndListView, iItem, i,
szSource, _countof(szSource));
}
else
{
ListView_GetItemText(hwndListView, iItem, i,
szEventText, _countof(szEventText));
}
SetDlgItemTextW(hDlg, lvColsToDlgItemIDs[i], pszBuffer);
}
bEventData = (pevlr->DataLength > 0);
EnableDlgItem(hDlg, IDC_BYTESRADIO, bEventData);
EnableDlgItem(hDlg, IDC_WORDRADIO, bEventData);
EnableDlgItem(hDlg, IDC_WORDSRADIO, bEventData);
// FIXME: At the moment we support only one event log in the filter
GetEventMessage(EventLogFilter->EventLogs[0]->LogName, szSource, pevlr, szEventText);
GetEventMessage(EventLogFilter->EventLogs[0]->LogName, szSource, pevlr,
szEventText, _countof(szEventText));
SetDlgItemTextW(hDlg, IDC_EVENTTEXTEDIT, szEventText);
DisplayEventData(hDlg, pDetailData);
}
static
@@ -179,22 +207,17 @@ DisplayEventData(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData)
{
PEVENTLOGRECORD pevlr = pDetailData->pevlr;
BOOL bDisplayWords = pDetailData->bDisplayWords;
INT iItem = pDetailData->iEventItem;
LVITEMW li;
PEVENTLOGRECORD pevlr;
LPBYTE pData;
UINT i, uOffset;
UINT uBufferSize, uLineLength;
PWCHAR pTextBuffer, pLine;
li.mask = LVIF_PARAM;
li.iItem = iItem;
li.iSubItem = 0;
ListView_GetItem(hwndListView, &li);
if (!pevlr)
return;
pevlr = (PEVENTLOGRECORD)li.lParam;
if (pevlr->DataLength == 0)
{
SetDlgItemTextW(hDlg, IDC_EVENTDATAEDIT, L"");
@@ -241,83 +264,291 @@ DisplayEventData(
HeapFree(GetProcessHeap(), 0, pTextBuffer);
}
static
HFONT
CreateMonospaceFont(VOID)
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
static inline
int my_cType3ToWidth(WORD wType, wchar_t ucs)
{
LOGFONTW tmpFont = {0};
HFONT hFont;
HDC hDC;
hDC = GetDC(NULL);
tmpFont.lfHeight = -MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72);
tmpFont.lfWeight = FW_NORMAL;
wcscpy(tmpFont.lfFaceName, L"Courier New");
hFont = CreateFontIndirectW(&tmpFont);
ReleaseDC(NULL, hDC);
return hFont;
if (wType & C3_HALFWIDTH)
return 1;
else if (wType & (C3_FULLWIDTH | C3_KATAKANA | C3_HIRAGANA | C3_IDEOGRAPH))
return 2;
/*
* HACK for Wide Hangul characters not recognized by GetStringTypeW(CT_CTYPE3)
* See:
* https://unicode.org/reports/tr11/
* https://www.unicode.org/Public/UCD/latest/ucd/EastAsianWidth.txt
* https://www.unicode.org/Public/UCD/latest/ucd/extracted/DerivedEastAsianWidth.txt
* (or the /Public/UNIDATA/ files)
*/
else if ((ucs >= 0x1100 && ucs <= 0x115F) || (ucs >= 0x302E && ucs <= 0x302F) ||
(ucs >= 0x3131 && ucs <= 0x318E) || (ucs >= 0x3260 && ucs <= 0x327F) ||
(ucs >= 0xA960 && ucs <= 0xA97C) || (ucs >= 0xAC00 && ucs <= 0xD7A3))
return 2;
else if (wType & (C3_SYMBOL | C3_KASHIDA | C3_LEXICAL | C3_ALPHA))
return 1;
else // if (wType & (C3_NONSPACING | C3_DIACRITIC | C3_VOWELMARK | C3_HIGHSURROGATE | C3_LOWSURROGATE | C3_NOTAPPLICABLE))
return 0;
}
int my_wcwidth(wchar_t ucs)
{
WORD wType = 0;
GetStringTypeW(CT_CTYPE3, &ucs, sizeof(ucs)/sizeof(WCHAR), &wType);
return my_cType3ToWidth(wType, ucs);
}
int my_wcswidth(const wchar_t *pwcs, size_t n)
{
int width = 0;
PWORD pwType, pwt;
pwType = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, n * sizeof(WORD));
if (!pwType)
return 0;
if (!GetStringTypeW(CT_CTYPE3, pwcs, n, pwType))
goto Quit;
for (pwt = pwType; n-- > 0; ++pwt, ++pwcs)
{
width += my_cType3ToWidth(*pwt, *pwcs);
}
Quit:
HeapFree(GetProcessHeap(), 0, pwType);
return width;
}
#endif // COPY_EVTTEXT_SPACE_PADDING_MODE
/**
* @brief
* Retrieves the already-gathered event information, structure it in
* text format and copy it into the clipboard for user consumption.
*
* The copied event information has the following text format, where
* each text line ends with CR-LF newlines:
* ```
* Event Type: <event_type>\r\n
* Event Source: <event_source>\r\n
* Event Category: <event_cat>\r\n
* Event ID: <event_id>\r\n
* Date: <event_date>\r\n
* Time: <event_time>\r\n
* User: <event_user>\r\n
* Computer: <event_computer>\r\n
* Description:\r\n
* <event_description>\r\n
* Data:\r\n
* <event...
* ...data...
* ...if any>\r\n
* ```
*
* For the single-line fields, the spacing between the header title and
* information is either a TAB (default), to facilitate data import in
* spreadsheet programs, or space-padding (when the user presses the
* SHIFT key while copying the data) to prettify information display.
* (This latter functionality is supported only if the program is compiled
* with the @b COPY_EVTTEXT_SPACE_PADDING_MODE define.)
**/
static
VOID
CopyEventEntry(HWND hWnd)
CopyEventEntry(
_In_ HWND hWnd)
{
WCHAR tmpHeader[512];
WCHAR szEventType[MAX_PATH];
WCHAR szSource[MAX_PATH];
WCHAR szCategory[MAX_PATH];
WCHAR szEventID[MAX_PATH];
WCHAR szDate[MAX_PATH];
WCHAR szTime[MAX_PATH];
WCHAR szUser[MAX_PATH];
WCHAR szComputer[MAX_PATH];
WCHAR evtDesc[EVENT_MESSAGE_EVENTTEXT_BUFFER];
ULONG size = 0;
LPWSTR output;
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
static const LONG nTabWidth = 4;
#endif
static const WCHAR szCRLF[] = L"\r\n";
struct
{
WORD uHdrID; // Header string resource ID.
WORD nDlgItemID; // Dialog control ID containing the corresponding info.
WORD bSameLine : 1; // Info follows header on same line (TRUE) or not (FALSE).
WORD bOptional : 1; // Omit if info is empty (TRUE) or keep it (FALSE).
PCWCH pchHdrText; // Pointer to header string resource.
SIZE_T cchHdrLen; // Header string length (number of characters).
SIZE_T cchInfoLen; // Info string length (number of characters).
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
UINT nHdrWidth; // Display width of the header string.
UINT nSpacesPad; // Padding after header in number of spaces.
#endif
} CopyData[] =
{
{IDS_COPY_EVTTYPE, IDC_EVENTTYPESTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTSRC , IDC_EVENTSOURCESTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTCAT , IDC_EVENTCATEGORYSTATIC, TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTID , IDC_EVENTIDSTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTDATE, IDC_EVENTDATESTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTTIME, IDC_EVENTTIMESTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTUSER, IDC_EVENTUSERSTATIC , TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTCOMP, IDC_EVENTCOMPUTERSTATIC, TRUE , FALSE, NULL, 0, 0},
{IDS_COPY_EVTTEXT, IDC_EVENTTEXTEDIT , FALSE, FALSE, NULL, 0, 0},
{IDS_COPY_EVTDATA, IDC_EVENTDATAEDIT , FALSE, TRUE , NULL, 0, 0},
};
USHORT i;
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
BOOL bUsePad; // Use space padding (TRUE) or not (FALSE, default).
UINT nMaxHdrWidth = 0;
#endif
SIZE_T size = 0;
PWSTR output;
PWSTR pszDestEnd;
size_t cchRemaining;
HGLOBAL hMem;
/* Try to open the clipboard */
if (!OpenClipboard(hWnd))
return;
/* Get the formatted text needed to place the content into */
size += LoadStringW(hInst, IDS_COPY, tmpHeader, ARRAYSIZE(tmpHeader));
/* Grab all the information and get it ready for the clipboard */
size += GetDlgItemTextW(hWnd, IDC_EVENTTYPESTATIC, szEventType, ARRAYSIZE(szEventType));
size += GetDlgItemTextW(hWnd, IDC_EVENTSOURCESTATIC, szSource, ARRAYSIZE(szSource));
size += GetDlgItemTextW(hWnd, IDC_EVENTCATEGORYSTATIC, szCategory, ARRAYSIZE(szCategory));
size += GetDlgItemTextW(hWnd, IDC_EVENTIDSTATIC, szEventID, ARRAYSIZE(szEventID));
size += GetDlgItemTextW(hWnd, IDC_EVENTDATESTATIC, szDate, ARRAYSIZE(szDate));
size += GetDlgItemTextW(hWnd, IDC_EVENTTIMESTATIC, szTime, ARRAYSIZE(szTime));
size += GetDlgItemTextW(hWnd, IDC_EVENTUSERSTATIC, szUser, ARRAYSIZE(szUser));
size += GetDlgItemTextW(hWnd, IDC_EVENTCOMPUTERSTATIC, szComputer, ARRAYSIZE(szComputer));
size += GetDlgItemTextW(hWnd, IDC_EVENTTEXTEDIT, evtDesc, ARRAYSIZE(evtDesc));
size++; /* Null-termination */
size *= sizeof(WCHAR);
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
/* Use space padding only if the user presses SHIFT */
bUsePad = !!(GetKeyState(VK_SHIFT) & 0x8000);
#endif
/*
* Consolidate the information into one big piece and
* sort out the memory needed to write to the clipboard.
* Grab all the information and get it ready for the clipboard.
*/
hMem = GlobalAlloc(GMEM_MOVEABLE, size);
if (hMem == NULL) goto Quit;
/* Calculate the necessary string buffer size */
for (i = 0; i < _countof(CopyData); ++i)
{
/* Retrieve the event info string length (without NUL terminator) */
CopyData[i].cchInfoLen = GetWindowTextLengthW(GetDlgItem(hWnd, CopyData[i].nDlgItemID));
/* If no data is present and is optional, ignore it */
if ((CopyData[i].cchInfoLen == 0) && CopyData[i].bOptional)
continue;
/* Load the header string from resources */
CopyData[i].cchHdrLen = LoadStringW(hInst, CopyData[i].uHdrID, (PWSTR)&CopyData[i].pchHdrText, 0);
size += CopyData[i].cchHdrLen;
if (CopyData[i].bSameLine)
{
/* The header and info are on the same line */
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
if (bUsePad)
{
/* Retrieve the maximum header string displayed
* width for computing space padding later */
CopyData[i].nHdrWidth = my_wcswidth(CopyData[i].pchHdrText, CopyData[i].cchHdrLen);
nMaxHdrWidth = max(nMaxHdrWidth, CopyData[i].nHdrWidth);
}
else
#endif
{
/* Count a TAB separator */
size++;
}
}
else
{
/* The data is on a separate line, count a newline */
size += _countof(szCRLF)-1;
}
/* Count the event info string and the newline that follows it */
size += CopyData[i].cchInfoLen;
size += _countof(szCRLF)-1;
}
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
if (bUsePad)
{
/* Round nMaxHdrWidth to the next TAB width, and
* compute the space padding for each field */
UINT nSpaceWidth = 1; // my_wcwidth(L' ');
nMaxHdrWidth = ((nMaxHdrWidth / nTabWidth) + 1) * nTabWidth;
for (i = 0; i < _countof(CopyData); ++i)
{
/* If no data is present and is optional, ignore it */
if ((CopyData[i].cchInfoLen == 0) && CopyData[i].bOptional)
continue;
/* If the data is on a separate line, ignore padding */
if (!CopyData[i].bSameLine)
continue;
/* Compute the padding */
CopyData[i].nSpacesPad = (nMaxHdrWidth - CopyData[i].nHdrWidth) / nSpaceWidth;
size += CopyData[i].nSpacesPad;
}
}
#endif // COPY_EVTTEXT_SPACE_PADDING_MODE
/* Add NUL-termination */
size++;
/*
* Consolidate the information into a single buffer to copy in the clipboard.
*/
hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE, size * sizeof(WCHAR));
if (!hMem)
goto Quit;
output = GlobalLock(hMem);
if (output == NULL)
if (!output)
{
GlobalFree(hMem);
goto Quit;
}
StringCbPrintfW(output, size,
tmpHeader, szEventType, szSource, szCategory, szEventID,
szDate, szTime, szUser, szComputer, evtDesc);
/* Build the string */
pszDestEnd = output;
cchRemaining = size;
for (i = 0; i < _countof(CopyData); ++i)
{
SIZE_T sizeDataStr;
/* If no data is present and is optional, ignore it */
if ((CopyData[i].cchInfoLen == 0) && CopyData[i].bOptional)
continue;
/* Copy the header string */
StringCchCopyNExW(pszDestEnd, cchRemaining,
CopyData[i].pchHdrText, CopyData[i].cchHdrLen,
&pszDestEnd, &cchRemaining, 0);
if (CopyData[i].bSameLine)
{
/* The header and info are on the same line, add
* either the space padding or the TAB separator */
#ifdef COPY_EVTTEXT_SPACE_PADDING_MODE
if (bUsePad)
{
UINT j = CopyData[i].nSpacesPad;
while (j--)
{
*pszDestEnd++ = L' ';
cchRemaining--;
}
}
else
#endif
{
*pszDestEnd++ = L'\t';
cchRemaining--;
}
}
else
{
/* The data is on a separate line, add a newline */
StringCchCopyExW(pszDestEnd, cchRemaining, szCRLF,
&pszDestEnd, &cchRemaining, 0);
}
/* Copy the event info */
sizeDataStr = min(cchRemaining, CopyData[i].cchInfoLen + 1);
sizeDataStr = GetDlgItemTextW(hWnd, CopyData[i].nDlgItemID, pszDestEnd, sizeDataStr);
pszDestEnd += sizeDataStr;
cchRemaining -= sizeDataStr;
/* A newline follows the data */
StringCchCopyExW(pszDestEnd, cchRemaining, szCRLF,
&pszDestEnd, &cchRemaining, 0);
}
/* NUL-terminate the buffer */
*pszDestEnd++ = UNICODE_NULL;
cchRemaining--;
GlobalUnlock(hMem);
@@ -651,7 +882,7 @@ OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
hItemWnd = GetDlgItem(hDlg, IDC_WORDRADIO);
hItemWnd = GetDlgItem(hDlg, IDC_WORDSRADIO);
GetWindowRect(hItemWnd, &rect);
MapWindowPoints(HWND_DESKTOP /*NULL*/, hDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
// OffsetRect(&rect, 0, y);
@@ -728,6 +959,67 @@ OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
}
}
static
VOID
EnableNavigationArrows(
_In_ HWND hDlg,
_In_ BOOL bEnable)
{
/* Enable Previous/Next only if there is more than one item in the list */
if (bEnable)
bEnable &= (ListView_GetItemCount(hwndListView) > 1);
EnableDlgItem(hDlg, IDC_PREVIOUS, bEnable);
EnableDlgItem(hDlg, IDC_NEXT, bEnable);
}
static
VOID
ClearContents(
_In_ HWND hDlg)
{
/* Disable the Previous/Next and Copy buttons */
EnableNavigationArrows(hDlg, FALSE);
EnableDlgItem(hDlg, IDC_COPY, FALSE);
/* Disable the Bytes/Words mode buttons */
EnableDlgItem(hDlg, IDC_BYTESRADIO, FALSE);
EnableDlgItem(hDlg, IDC_WORDSRADIO, FALSE);
/* Clear the data fields */
SetDlgItemTextW(hDlg, IDC_EVENTDATESTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTTIMESTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTUSERSTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTSOURCESTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTCOMPUTERSTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTCATEGORYSTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTIDSTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTTYPESTATIC, L"");
SetDlgItemTextW(hDlg, IDC_EVENTTEXTEDIT, L"");
SetDlgItemTextW(hDlg, IDC_EVENTDATAEDIT, L"");
}
static
HFONT
CreateMonospaceFont(VOID)
{
LOGFONTW tmpFont = {0};
HFONT hFont;
HDC hDC;
hDC = GetDC(NULL);
tmpFont.lfHeight = -MulDiv(8, GetDeviceCaps(hDC, LOGPIXELSY), 72);
tmpFont.lfWeight = FW_NORMAL;
wcscpy(tmpFont.lfFaceName, L"Courier New");
hFont = CreateFontIndirectW(&tmpFont);
ReleaseDC(NULL, hDC);
return hFont;
}
static
VOID
InitDetailsDlgCtrl(HWND hDlg, PDETAILDATA pData)
@@ -759,8 +1051,22 @@ InitDetailsDlgCtrl(HWND hDlg, PDETAILDATA pData)
/* Note that the RichEdit control never gets themed under WinXP+; one would have to write code to simulate Edit-control theming */
SendDlgItemMessageW(hDlg, pData->bDisplayWords ? IDC_WORDRADIO : IDC_BYTESRADIO, BM_SETCHECK, BST_CHECKED, 0);
SendDlgItemMessageW(hDlg, pData->bDisplayWords ? IDC_WORDSRADIO : IDC_BYTESRADIO, BM_SETCHECK, BST_CHECKED, 0);
SendDlgItemMessageW(hDlg, IDC_EVENTDATAEDIT, WM_SETFONT, (WPARAM)pData->hMonospaceFont, (LPARAM)TRUE);
//ClearContents(hDlg);
if (pData->iEventItem != -1)
{
EnableNavigationArrows(hDlg, TRUE);
EnableDlgItem(hDlg, IDC_COPY, TRUE);
}
else
{
EnableNavigationArrows(hDlg, FALSE);
EnableDlgItem(hDlg, IDC_COPY, FALSE);
}
EnableDlgItem(hDlg, IDC_BYTESRADIO, FALSE);
EnableDlgItem(hDlg, IDC_WORDSRADIO, FALSE);
}
/* Message handler for Event Details control */
@@ -806,6 +1112,8 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
pData->scPos.x = pData->scPos.y = 0;
InitDetailsDlgCtrl(hDlg, pData);
/* NOTE: Showing the event (if any) is currently delayed to later */
// SendMessageW(hDlg, EVT_DISPLAY, TRUE, (LPARAM)pData->iEventItem);
// OnSize(hDlg, pData, pData->cxOld, pData->cyOld);
return (INT_PTR)TRUE;
@@ -821,17 +1129,58 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return (INT_PTR)TRUE;
case EVT_SETFILTER:
{
/* Disable the display first, before changing the current filter */
pData->pevlr = NULL;
pData->iEventItem = -1;
ClearContents(hDlg);
pData->EventLogFilter = (PEVENTLOGFILTER)lParam;
return (INT_PTR)TRUE;
}
case EVT_DISPLAY:
{
pData->iEventItem = (INT)lParam;
if (pData->EventLogFilter)
if (wParam)
{
/* Show event info in control */
DisplayEvent(hDlg, pData);
DisplayEventData(hDlg, pData);
INT iEventItem = (INT)lParam;
/* If no filter is set, don't change anything */
if (!pData->EventLogFilter)
return (INT_PTR)TRUE;
/* If we re-enable display from previously disabled state, re-enable the buttons */
if ((pData->iEventItem == -1) && (iEventItem != -1))
{
EnableNavigationArrows(hDlg, TRUE);
EnableDlgItem(hDlg, IDC_COPY, TRUE);
}
else
/* If we disable display from previously enabled state, clear and disable it */
if ((pData->iEventItem != -1) && (iEventItem == -1))
{
ClearContents(hDlg);
}
/* Set the new item */
pData->pevlr = NULL;
pData->iEventItem = iEventItem;
/* Display the event info, if there is one */
if (pData->iEventItem != -1)
DisplayEvent(hDlg, pData);
}
else
{
/* Enable or disable the Previous/Next buttons,
* but keep the existing contents, if any */
EnableNavigationArrows(hDlg, (lParam != -1));
// HACK: Disable the Bytes/Words mode buttons
// because we won't have access anymore to the
// event data. (This will be fixed in the future.)
pData->pevlr = NULL; // Invalidate also the cache.
EnableDlgItem(hDlg, IDC_BYTESRADIO, FALSE);
EnableDlgItem(hDlg, IDC_WORDSRADIO, FALSE);
}
return (INT_PTR)TRUE;
}
@@ -843,25 +1192,33 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case IDC_NEXT:
{
BOOL bPrev = (LOWORD(wParam) == IDC_PREVIOUS);
INT iItem, iSel, nItems = ListView_GetItemCount(hwndListView);
WCHAR szText[200];
INT nItems = ListView_GetItemCount(hwndListView);
INT iItem, iSel;
if (nItems <= 0) /* No items? */
break;
/* Get the index of the first selected item */
iSel = ListView_GetNextItem(hwndListView, -1, LVNI_SELECTED);
/* Select the previous/next item from our current one */
iItem = ListView_GetNextItem(hwndListView, -1, LVNI_ALL | LVNI_SELECTED);
iItem = ListView_GetNextItem(hwndListView, iItem,
iItem = ListView_GetNextItem(hwndListView, iSel,
(bPrev ? LVNI_ABOVE : LVNI_BELOW));
if (iItem < 0 || iItem >= nItems)
{
LoadStringW(hInst,
(bPrev ? IDS_CONTFROMEND : IDS_CONTFROMBEGINNING),
szText, _countof(szText));
if (MessageBoxW(hDlg, szText, szTitle, MB_YESNO | MB_ICONQUESTION) == IDNO)
break;
/* Confirm selection restart only if an item was previously
* selected. If not, just proceed with default selection. */
if (iSel != -1)
{
WCHAR szText[200];
LoadStringW(hInst,
(bPrev ? IDS_CONTFROMEND : IDS_CONTFROMBEGINNING),
szText, _countof(szText));
if (MessageBoxW(hDlg, szText, szTitle, MB_YESNO | MB_ICONQUESTION) != IDYES)
break;
}
/* Determine from where to restart */
/* Determine where to restart from */
iItem = (bPrev ? (nItems - 1) : 0);
}
@@ -883,14 +1240,12 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
LVIS_FOCUSED | LVIS_SELECTED);
ListView_EnsureVisible(hwndListView, iItem, FALSE);
pData->pevlr = NULL;
pData->iEventItem = iItem;
/* Show event info in control */
/* Display the event info */
if (pData->EventLogFilter)
{
DisplayEvent(hDlg, pData);
DisplayEventData(hDlg, pData);
}
return (INT_PTR)TRUE;
}
@@ -900,15 +1255,11 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return (INT_PTR)TRUE;
case IDC_BYTESRADIO:
case IDC_WORDRADIO:
{
case IDC_WORDSRADIO:
pData->bDisplayWords = (LOWORD(wParam) == IDC_WORDSRADIO);
if (pData->EventLogFilter)
{
pData->bDisplayWords = (LOWORD(wParam) == IDC_WORDRADIO);
DisplayEventData(hDlg, pData);
}
return (INT_PTR)TRUE;
}
default:
break;
@@ -959,11 +1310,3 @@ CreateEventDetailsCtrl(HINSTANCE hInstance,
MAKEINTRESOURCEW(IDD_EVENTDETAILS_CTRL),
hParentWnd, EventDetailsCtrl, lParam);
}
VOID
EnableEventDetailsButtons(HWND hWnd, BOOL bEnable)
{
EnableDlgItem(hWnd, IDC_PREVIOUS, bEnable);
EnableDlgItem(hWnd, IDC_NEXT, bEnable);
EnableDlgItem(hWnd, IDC_COPY, bEnable);
}

View File

@@ -4,7 +4,7 @@
* PURPOSE: Event Details Control.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#pragma once
@@ -24,5 +24,3 @@ HWND
CreateEventDetailsCtrl(HINSTANCE hInstance,
HWND hParentWnd,
LPARAM lParam);
VOID EnableEventDetailsButtons(HWND hWnd, BOOL bEnable);

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Описание:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "&Данни:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Байтове", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDRADIO, 85, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDSRADIO, 85, 140, 34, 8
LTEXT "&Данни:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -81,17 +81,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Datum:", IDC_STATIC, 8, 5, 31, 8
LTEXT "&Datum:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Zdroj:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Zdroj:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Čas:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Č&as:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kategorie:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Kategorie:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Typ:", IDC_STATIC, 8, 25, 31, 8
LTEXT "T&yp:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "ID události:", IDC_STATIC, 103, 25, 36, 8
LTEXT "&ID události:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Uživatel:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Popis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Byty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Slova", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -203,7 +203,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "byty" // "%s bytes"
IDS_BYTES_FORMAT "bajtů" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Typ: %s\r\n\
Zdroj: %s\r\n\
Kategorie: %s\r\n\
ID: %s\r\n\
Datum: %s\r\n\
Čas: %s\r\n\
Uživatel: %s\r\n\
Počítač: %s\r\n\
Popis:\r\n%s"
IDS_COPY_EVTTYPE "Typ:"
IDS_COPY_EVTSRC "Zdroj:"
IDS_COPY_EVTCAT "Kategorie:"
IDS_COPY_EVTID "ID události:"
IDS_COPY_EVTDATE "Datum:"
IDS_COPY_EVTTIME "Čas:"
IDS_COPY_EVTUSER "Uživatel:"
IDS_COPY_EVTCOMP "Počítač:"
IDS_COPY_EVTTEXT "Popis:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -82,21 +82,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Datum:", IDC_STATIC, 8, 5, 31, 8
LTEXT "&Datum:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Quelle:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Quelle:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Zeit:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Zeit:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kategorie:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Kategorie:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Typ:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Typ:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ereignis-ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "E&reignis-ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Benutzer:", IDC_STATIC, 8, 35, 36, 8
LTEXT "B&enutzer:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "C&omputer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Bezeichnung:", IDC_STATIC, 8, 65, 45, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&aten:", IDC_DETAILS_STATIC, 8, 140, 24, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Wörter", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&aten:", IDC_DETAILS_STATIC, 8, 140, 24, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Typ: %s\r\n\
Quelle: %s\r\n\
Kategorie: %s\r\n\
Ereignis-ID: %s\r\n\
Datum: %s\r\n\
Zeit: %s\r\n\
Benutzer: %s\r\n\
Computer: %s\r\n\
Beschreibung:\r\n%s"
IDS_COPY_EVTTYPE "Typ:"
IDS_COPY_EVTSRC "Quelle:"
IDS_COPY_EVTCAT "Kategorie:"
IDS_COPY_EVTID "Ereignis-ID:"
IDS_COPY_EVTDATE "Datum:"
IDS_COPY_EVTTIME "Zeit:"
IDS_COPY_EVTUSER "Benutzer:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Beschreibung:"
IDS_COPY_EVTDATA "Daten:"
END
STRINGTABLE

View File

@@ -81,17 +81,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
LTEXT "&Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Πηγή:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Πη&γή:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ώρα:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Ώρα:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Τύπος:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Τύπος:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Χρήστης:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Περιγραφή:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Δ&εδομένα:", IDC_DETAILS_STATIC, 8, 140, 40, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 87, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 87, 140, 34, 8
LTEXT "Δ&εδομένα:", IDC_DETAILS_STATIC, 8, 140, 40, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -83,21 +83,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Date:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ate:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Source:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Source:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Time:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Ti&me:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Category:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Category:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Type:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Typ&e:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Event ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&User:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "C&omputer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -107,9 +107,9 @@ BEGIN
LTEXT "&Description:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -223,16 +223,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -84,17 +84,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Fecha:", IDC_STATIC, 8, 5, 31, 8
LTEXT "&Fecha:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Origen:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Origen:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Hora:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Hora:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categoría:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categoría:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "ID de evento:", IDC_STATIC, 103, 25, 36, 8
LTEXT "&ID de evento:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Usuario:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -108,9 +108,9 @@ BEGIN
LTEXT "&Descripción:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&atos:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&atos:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -224,16 +224,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Tipo de evento: %s\r\n\
Fuente del evento: %s\r\n\
Categ. del evento: %s\r\n\
ID del evento: %s\r\n\
Fecha: %s\r\n\
Hora: %s\r\n\
Usuario: %s\r\n\
Equipo: %s\r\n\
Descripción:\r\n%s"
IDS_COPY_EVTTYPE "Tipo de evento:"
IDS_COPY_EVTSRC "Fuente del evento:"
IDS_COPY_EVTCAT "Categ. del evento:"
IDS_COPY_EVTID "ID de evento:"
IDS_COPY_EVTDATE "Fecha:"
IDS_COPY_EVTTIME "Hora:"
IDS_COPY_EVTUSER "Usuario:"
IDS_COPY_EVTCOMP "Equipo:"
IDS_COPY_EVTTEXT "Descripción:"
IDS_COPY_EVTDATA "Datos:"
END
STRINGTABLE

View File

@@ -50,12 +50,12 @@ IDM_EVENTWR_CTX MENU
BEGIN
POPUP ""
BEGIN
MENUITEM "&Open Event Log...", IDM_OPEN_EVENTLOG
MENUITEM "&Save Event Log as...", IDM_SAVE_EVENTLOG
MENUITEM "&Ouvrir le journal d'événements...", IDM_OPEN_EVENTLOG
MENUITEM "Enregistrer le journal d'événements &sous...", IDM_SAVE_EVENTLOG
MENUITEM SEPARATOR
MENUITEM "&Clear all Events", IDM_CLEAR_EVENTS
MENUITEM "&Rename\tF2", IDM_RENAME_EVENTLOG
MENUITEM "Log Se&ttings...", IDM_EVENTLOG_SETTINGS
MENUITEM "&Effacer tous les événements", IDM_CLEAR_EVENTS
MENUITEM "&Renommer\tF2", IDM_RENAME_EVENTLOG
MENUITEM "&Paramètres du journal...", IDM_EVENTLOG_SETTINGS
END
END
@@ -82,21 +82,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Date :", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ate :", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Source :", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Source :", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Heure :", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Heure :", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Catégorie :", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Catégorie :", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Type :", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Type :", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Événement :", IDC_STATIC, 103, 25, 36, 8
LTEXT "É&vénement :", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Utilisateur :", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ordinateur :", IDC_STATIC, 8, 45, 36, 8
LTEXT "O&rdinateur :", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Description :", IDC_STATIC, 8, 65, 45, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Données :", IDC_DETAILS_STATIC, 8, 140, 35, 8//FIXME: add accel
AUTORADIOBUTTON "&Octets", IDC_BYTESRADIO, 50, 140, 34, 8
AUTORADIOBUTTON "&Mots", IDC_WORDRADIO, 88, 140, 34, 8
AUTORADIOBUTTON "&Mots", IDC_WORDSRADIO, 88, 140, 34, 8
LTEXT "Do&nnées :", IDC_DETAILS_STATIC, 8, 140, 35, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -168,8 +168,8 @@ BEGIN
IDS_CLEAREVENTS_MSG "Voulez-vous enregistrer ce journal d'événements avant de l'effacer ?"
IDS_RESTOREDEFAULTS "Voulez-vous vraiment réinitialiser tous les paramètres pour ce journal aux valeurs par défaut ?"
IDS_EVENTSTRINGIDNOTFOUND "La description pour l'événement d'ID ( %lu ) dans la source ( %s ) ne peut être trouvée. L'ordinateur local pourrait ne pas avoir les informations registres nécessaires ou les fichiers DLL de message pour afficher les messages depuis un ordinateur distant.\n\nLes informations suivantes font partie de l'événement :\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
IDS_CONTFROMBEGINNING "Vous avez atteint la fin du journal d'événements. Voulez-vous continuer depuis le début ?"
IDS_CONTFROMEND "Vous avez atteint le début du journal d'événements. Voulez-vous continuer depuis la fin ?"
END
STRINGTABLE
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Type d'événement : %s\r\n\
Source de l'événement : %s\r\n\
Catégorie de l'événement : %s\r\n\
ID de l'événement : %s\r\n\
Date : %s\r\n\
Heure : %s\r\n\
Utilisateur : %s\r\n\
Ordinateur : %s\r\n\
Description :\r\n%s"
IDS_COPY_EVTTYPE "Type de l'événement :"
IDS_COPY_EVTSRC "Source de l'événement :"
IDS_COPY_EVTCAT "Catégorie de l'événement :"
IDS_COPY_EVTID "ID de l'événement :"
IDS_COPY_EVTDATE "Date :"
IDS_COPY_EVTTIME "Heure :"
IDS_COPY_EVTUSER "Utilisateur :"
IDS_COPY_EVTCOMP "Ordinateur :"
IDS_COPY_EVTTEXT "Description :"
IDS_COPY_EVTDATA "Données :"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "תיאור:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "נתונים:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "בתים", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "נתונים:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -82,21 +82,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Sorgente:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Sorgente:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ore:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Ore:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "T&ipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "IDEvento:", IDC_STATIC, 103, 25, 36, 8
LTEXT "ID &Evento:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&UTente:", IDC_STATIC, 8, 35, 36, 8
LTEXT "&Utente:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "Co&mputer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Descrizione:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ati:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ti:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "説明(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "データ(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "バイト(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "データ(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
イベントの種類: %s\r\n\
イベントのソース: %s\r\n\
イベントのカテゴリ: %s\r\n\
イベント ID: %s\r\n\
日付: %s\r\n\
時刻: %s\r\n\
ユーザー: %s\r\n\
コンピューター: %s\r\n\
説明:\r\n%s"
IDS_COPY_EVTTYPE "イベントの種類:"
IDS_COPY_EVTSRC "イベントのソース:"
IDS_COPY_EVTCAT "イベントのカテゴリ:"
IDS_COPY_EVTID "イベント ID:"
IDS_COPY_EVTDATE "日付:"
IDS_COPY_EVTTIME "時刻:"
IDS_COPY_EVTUSER "ユーザー:"
IDS_COPY_EVTCOMP "コンピューター:"
IDS_COPY_EVTTEXT "説明:"
IDS_COPY_EVTDATA "データ:"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "설명(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "데이터(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "바이트(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "데이터(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Dato:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ato:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kilde:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Kilde:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tid:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Ti&d:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kategori:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Katego&ri:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Type:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Typ&e:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Hendelse ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "&Hendelse ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Bruker:", IDC_STATIC, 8, 35, 36, 8
LTEXT "Br&uker:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Datamaskin:", IDC_STATIC, 8, 45, 36, 8
LTEXT "Data&maskin:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Beskrivelse:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Tegn", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "Teg&n", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -108,9 +108,9 @@ BEGIN
LTEXT "&Opis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ane:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&ane:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -224,16 +224,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Typ zdarzenia: %s\r\n\
Źródło zdarzenia: %s\r\n\
Kategoria zdarzenia: %s\r\n\
Idnetyfikator Zdarzenia: %s\r\n\
Data: %s\r\n\
Czas: %s\r\n\
Użytkownik: %s\r\n\
Komputer: %s\r\n\
Opis:\r\n%s"
IDS_COPY_EVTTYPE "Typ zdarzenia:"
IDS_COPY_EVTSRC "Źródło zdarzenia:"
IDS_COPY_EVTCAT "Kategoria zdarzenia:"
IDS_COPY_EVTID "Identyfikator zdarzenia:"
IDS_COPY_EVTDATE "Data:"
IDS_COPY_EVTTIME "Czas:"
IDS_COPY_EVTUSER "Użytkownik:"
IDS_COPY_EVTCOMP "Komputer:"
IDS_COPY_EVTTEXT "Opis:"
IDS_COPY_EVTDATA "Dane:"
END
STRINGTABLE

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Fonte:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Fonte:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tempo:", IDC_STATIC, 8, 15, 31, 8
LTEXT "T&empo:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Usuário:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computador:", IDC_STATIC, 8, 45, 36, 8
LTEXT "Co&mputador:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Descrição:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -211,7 +211,7 @@ STRINGTABLE
BEGIN
IDS_COLUMNTYPE "Tipo"
IDS_COLUMNDATE "Data"
IDS_COLUMNTIME "Hora"
IDS_COLUMNTIME "Tempo"
IDS_COLUMNSOURCE "Fonte"
IDS_COLUMNCATEGORY "Categoria"
IDS_COLUMNEVENT "Evento"
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Tipo de evento:"
IDS_COPY_EVTSRC "Fonte do evento:"
IDS_COPY_EVTCAT "Categoria:"
IDS_COPY_EVTID "ID do evento:"
IDS_COPY_EVTDATE "Data:"
IDS_COPY_EVTTIME "Tempo:"
IDS_COPY_EVTUSER "Usuário:"
IDS_COPY_EVTCOMP "Computador:"
IDS_COPY_EVTTEXT "Descrição:"
IDS_COPY_EVTDATA "Dados:"
END
STRINGTABLE

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 50, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Origem:", IDC_STATIC, 103, 5, 36, 8
LTEXT "O&rigem:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Hora:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Hora:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 50, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 50, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Utilizador:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 50, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computador:", IDC_STATIC, 8, 45, 40, 8
LTEXT "Co&mputador:", IDC_STATIC, 8, 45, 40, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 50, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Descrição:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -203,7 +203,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "bytes" // "%s bytes"
IDS_BYTES_FORMAT "bajtów" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Tipo de evento: %s\r\n\
Origem do evento: %s\r\n\
Categoria: %s\r\n\
ID do Evento: %s\r\n\
Data: %s\r\n\
Hora: %s\r\n\
Utilizador: %s\r\n\
Computador: %s\r\n\
Descrição:\r\n%s"
IDS_COPY_EVTTYPE "Tipo de evento:"
IDS_COPY_EVTSRC "Origem do evento:"
IDS_COPY_EVTCAT "Categoria:"
IDS_COPY_EVTID "ID do evento:"
IDS_COPY_EVTDATE "Data:"
IDS_COPY_EVTTIME "Hora:"
IDS_COPY_EVTUSER "Utilizador:"
IDS_COPY_EVTCOMP "Computador:"
IDS_COPY_EVTTEXT "Descrição:"
IDS_COPY_EVTDATA "Dados:"
END
STRINGTABLE

View File

@@ -83,21 +83,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Dată:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ată:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Sursă:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Sursă:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Oră:", IDC_STATIC, 8, 15, 31, 8
LTEXT "O&ră:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categorie:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categorie:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tip:", IDC_STATIC, 8, 25, 31, 8
LTEXT "T&ip:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "ID Eveniment:", IDC_STATIC, 103, 25, 36, 8
LTEXT "ID &eveniment:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Utilizator:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Calculator:", IDC_STATIC, 8, 45, 36, 8
LTEXT "Ca&lculator:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -107,9 +107,9 @@ BEGIN
LTEXT "&Descriere:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ate:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&8 biți", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&16 biți", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&16 biți", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&te:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -205,7 +205,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "octeți" // "%s bytes"
IDS_BYTES_FORMAT "octeţi" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END
@@ -218,21 +218,21 @@ BEGIN
IDS_COLUMNCATEGORY "Categorie"
IDS_COLUMNEVENT "Eveniment"
IDS_COLUMNUSER "Utilizator"
IDS_COLUMNCOMPUTER "Computer"
IDS_COLUMNCOMPUTER "Calculator"
END
STRINGTABLE
BEGIN
IDS_COPY "\
Tip eveniment: %s\r\n\
Sursă eveniment: %s\r\n\
Categorie eveniment: %s\r\n\
ID eveniment: %s\r\n\
Dată: %s\r\n\
Oră: %s\r\n\
Utilizator: %s\r\n\
Computer: %s\r\n\
Descriere:\r\n%s"
IDS_COPY_EVTTYPE "Tip eveniment:"
IDS_COPY_EVTSRC "Sursă eveniment:"
IDS_COPY_EVTCAT "Categorie eveniment:"
IDS_COPY_EVTID "ID eveniment:"
IDS_COPY_EVTDATE "Dată:"
IDS_COPY_EVTTIME "Oră:"
IDS_COPY_EVTUSER "Utilizator:"
IDS_COPY_EVTCOMP "Calculator:"
IDS_COPY_EVTTEXT "Descriere:"
IDS_COPY_EVTDATA "Date:"
END
STRINGTABLE

View File

@@ -109,9 +109,9 @@ BEGIN
LTEXT "&Описание:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "&Данные:", IDC_DETAILS_STATIC, 8, 140, 30, 8
AUTORADIOBUTTON "&Байты", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDRADIO, 87, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDSRADIO, 87, 140, 34, 8
LTEXT "&Данные:", IDC_DETAILS_STATIC, 8, 140, 30, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -225,16 +225,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Тип события: %s\r\n\
Источник события: %s\r\n\
Категория события: %s\r\n\
ID события: %s\r\n\
Дата: %s\r\n\
Время: %s\r\n\
Пользователь: %s\r\n\
Компьютер: %s\r\n\
Описание:\n%s"
IDS_COPY_EVTTYPE "Тип события:"
IDS_COPY_EVTSRC "Источник события:"
IDS_COPY_EVTCAT "Категория события:"
IDS_COPY_EVTID "ID события:"
IDS_COPY_EVTDATE "Дата:"
IDS_COPY_EVTTIME "Время:"
IDS_COPY_EVTUSER "Пользователь:"
IDS_COPY_EVTCOMP "Компьютер:"
IDS_COPY_EVTTEXT "Описание:"
IDS_COPY_EVTDATA "Данные:"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Popis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Ú&daje:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Slová", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Slová", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Ú&daje:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -203,7 +203,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "bytes" // "%s bytes"
IDS_BYTES_FORMAT "bajtov" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -81,33 +81,33 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Burimi:", IDC_STATIC, 103, 5, 36, 8
LTEXT "B&urimi:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ora:", IDC_STATIC, 8, 15, 31, 8
LTEXT "O&ra:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kategoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Kategoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipi:", IDC_STATIC, 8, 25, 31, 8
LTEXT "T&ipi:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "NgjarjeID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "&Ngjarje ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Përdoruesi:", IDC_STATIC, 8, 35, 36, 8//FIXME: add accel
LTEXT "Për&doruesi:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Kompjuteri:", IDC_STATIC, 8, 45, 36, 8//FIXME: add accel
LTEXT "Ko&mpjuteri:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
PUSHBUTTON "", IDC_NEXT, 230, 21, 28, 14, BS_ICON
PUSHBUTTON "", IDC_COPY, 230, 37, 28, 14, BS_ICON
LTEXT "Përshkrimi:", IDC_STATIC, 8, 65, 39, 8//FIXME: add accel
LTEXT "&Përshkrimi:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Beskrivning:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Byte", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -221,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "Açıklama:", IDC_STATIC, 8, 65, 39, 8//FIXME: add accel
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Veri:", IDC_DETAILS_STATIC, 8, 140, 20, 8//FIXME: add accel
AUTORADIOBUTTON "&Baytlar", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "Sö&zcük", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "Sö&zcükler", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Veri:", IDC_DETAILS_STATIC, 8, 140, 20, 8//FIXME: add accel
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Olay Türü: %s\r\n\
Olay Kaynağı: %s\r\n\
Olay Kategorisi: %s\r\n\
Olay Kimliği: %s\r\n\
Tarih: %s\r\n\
Saat: %s\r\n\
Kullanıcı: %s\r\n\
Bilgisayar: %s\r\n\
Tanım:\r\n%s"
IDS_COPY_EVTTYPE "Olay Türü:"
IDS_COPY_EVTSRC "Olay Kaynağı:"
IDS_COPY_EVTCAT "Olay Kategorisi:"
IDS_COPY_EVTID "Olay Kimliği:"
IDS_COPY_EVTDATE "Tarih:"
IDS_COPY_EVTTIME "Saat:"
IDS_COPY_EVTUSER "Kullanıcı:"
IDS_COPY_EVTCOMP "Bilgisayar:"
IDS_COPY_EVTTEXT "Tanım:"
IDS_COPY_EVTDATA "Veri:"
END
STRINGTABLE

View File

@@ -107,9 +107,9 @@ BEGIN
LTEXT "&Опис:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Байти", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Д&aта:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Байт", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Слово", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -223,16 +223,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
END
STRINGTABLE

View File

@@ -107,9 +107,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "数据(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "字节(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "字(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "字(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "数据(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
事件类型: %s\r\n\
事件源: %s\r\n\
事件类别: %s\r\n\
事件 ID %s\r\n\
日期: %s\r\n\
时间: %s\r\n\
用户: %s\r\n\
电脑: %s\r\n\
描述:\r\n%s"
IDS_COPY_EVTTYPE "事件类型:"
IDS_COPY_EVTSRC "事件源:"
IDS_COPY_EVTCAT "事件类别:"
IDS_COPY_EVTID "事件 ID"
IDS_COPY_EVTDATE "日期:"
IDS_COPY_EVTTIME "时间:"
IDS_COPY_EVTUSER "用户:"
IDS_COPY_EVTCOMP "电脑:"
IDS_COPY_EVTTEXT "描述:"
IDS_COPY_EVTDATA "数据:"
END
STRINGTABLE

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "位元組(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "位元(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -117,7 +117,7 @@ STYLE DS_SHELLFONT | WS_POPUP | WS_CAPTION
CAPTION "一般"
FONT 9, "新細明體"
BEGIN
LTEXT "顯示名稱(&D):", IDC_STATIC, 7, 9, 60, 8
LTEXT "顯示名稱(&D)", IDC_STATIC, 7, 9, 60, 8
EDITTEXT IDC_DISPLAYNAME, 67, 7, 178, 12, ES_LEFT | ES_AUTOHSCROLL | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP
LTEXT "記錄檔名稱(&L)", IDC_STATIC, 7, 25, 60, 8
EDITTEXT IDC_LOGNAME, 67, 23, 178, 12, ES_LEFT | ES_AUTOHSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP
@@ -126,7 +126,7 @@ BEGIN
// The following 4 IDC_STATIC shall have accels in ReactOS, although MS doesn't have accels for them.
// Translation note: First fill out ALL accels that MS has in this dialog for your language,
// and only then as a final step use some remaining unused letters for those 4 controls!
LTEXT "大小(&S)", IDC_STATIC, 7, 57, 60, 8
LTEXT "大小(&S)", IDC_STATIC, 7, 57, 60, 8
EDITTEXT IDC_SIZE_LABEL, 67, 57, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "建立日期(&C)", IDC_STATIC, 7, 69, 60, 8
EDITTEXT IDC_CREATED_LABEL, 67, 69, 178, 12, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -179,14 +179,14 @@ BEGIN
\n\
EventVwr [電腦名稱] [/L:<事件記錄檔案>] [/?]\n\
\n\
""電腦名稱"" : 指定要連線的遠端電腦\n\
""電腦名稱"" 指定要連線的遠端電腦\n\
\t以擷取要顯示的事件。如果未指定名稱\n\
\t則使用本地電腦。\n\
\n\
/L:<事件記錄檔案> : 指定要開啟的事件記錄檔案。\n\
/L:<事件記錄檔案> 指定要開啟的事件記錄檔案。\n\
\t只支援 .evt 格式檔案 (NT ≤ 5.2)。\n\
\n\
/? : 顯示這個説明訊息。\n\
/? 顯示這個説明訊息。\n\
"
IDS_EVENTLOGFILE "事件記錄檔案"
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
事件種類: %s\r\n\
事件源: %s\r\n\
事件種類: %s\r\n\
事件 ID: %s\r\n\
日期: %s\r\n\
時間: %s\r\n\
使用者: %s\r\n\
電腦: %s\r\n\
描述:\r\n%s"
IDS_COPY_EVTTYPE "事件種類:"
IDS_COPY_EVTSRC "事件源:"
IDS_COPY_EVTCAT "事件種類:"
IDS_COPY_EVTID "事件 ID"
IDS_COPY_EVTDATE "日期:"
IDS_COPY_EVTTIME "時間:"
IDS_COPY_EVTUSER "使用者:"
IDS_COPY_EVTCOMP "電腦:"
IDS_COPY_EVTTEXT "描述:"
IDS_COPY_EVTDATA "資料:"
END
STRINGTABLE

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "位元組(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "位元(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -222,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY "\
事件種類: %s\r\n\
事件源: %s\r\n\
事件種類: %s\r\n\
事件 ID: %s\r\n\
日期: %s\r\n\
時間: %s\r\n\
使用者: %s\r\n\
電腦: %s\r\n\
描述:\r\n%s"
IDS_COPY_EVTTYPE "事件種類:"
IDS_COPY_EVTSRC "事件源:"
IDS_COPY_EVTCAT "事件種類:"
IDS_COPY_EVTID "事件 ID"
IDS_COPY_EVTDATE "日期:"
IDS_COPY_EVTTIME "時間:"
IDS_COPY_EVTUSER "使用者:"
IDS_COPY_EVTCOMP "電腦:"
IDS_COPY_EVTTEXT "描述:"
IDS_COPY_EVTDATA "資料:"
END
STRINGTABLE

View File

@@ -50,7 +50,7 @@
#define IDC_EVENTTEXTEDIT 1011
#define IDC_DETAILS_STATIC -2
#define IDC_BYTESRADIO 1012
#define IDC_WORDRADIO 1013
#define IDC_WORDSRADIO 1013
#define IDC_EVENTDATAEDIT 1014
#define IDC_DISPLAYNAME 1015
#define IDC_LOGNAME 1016
@@ -130,7 +130,16 @@
#define IDS_COLUMNUSER 226
#define IDS_COLUMNCOMPUTER 227
#define IDS_COPY 240
#define IDS_COPY_EVTTYPE 240
#define IDS_COPY_EVTSRC 241
#define IDS_COPY_EVTCAT 242
#define IDS_COPY_EVTID 243
#define IDS_COPY_EVTDATE 244
#define IDS_COPY_EVTTIME 245
#define IDS_COPY_EVTUSER 246
#define IDS_COPY_EVTCOMP 247
#define IDS_COPY_EVTTEXT 248
#define IDS_COPY_EVTDATA 249
#define IDS_NONE 250
#define IDS_NOT_AVAILABLE 251

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Някои услуги зависят от други услуги, водачи (driver) и зареждат други групи. Ако някоя системна съставка е спряна или не работи правилно, зависимите от нея услуги може да бъдат засегнати.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Тази услуга зависи от следните съставки", IDC_STATIC, 8, 57, 236, 9
LTEXT "Тази услуга зависи от следните съставки:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -157,6 +157,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Některé služby závisí na jiných službách, systémových ovladačích nebo načítají jiné skupiny služeb. Zastavené nebo nesprávně fungující součásti systému mohou ovlivnit závislé služby.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Tato služba závisí na následujících součástech:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Einige Dienste sind von anderen Diensten, Systemtreibern und Ladegruppen abhängig. Falls eine Systemkomponente anhält oder nicht einwandfrei ausgeführt wird, kann dies Auswirkungen auf abhängige Dienste haben.", IDC_STATIC, 8, 7, 238, 38
LTEXT "Dieser Dienst ist von folgenden Systemkomponenten abhängig", IDC_STATIC, 8, 57, 236, 9
LTEXT "Dieser Dienst ist von folgenden Systemkomponenten abhängig:", IDC_STATIC, 8, 57, 236, 9
LTEXT "Die folgenden Komponenten sind von diesem Dienst abhängig:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Some services depend on other services, system drivers and load order groups. If a system component is stopped or it is not running properly, dependant services can be affected.", IDC_STATIC, 8, 7, 238, 26
LTEXT "This service depends on the following components", IDC_STATIC, 8, 57, 236, 9
LTEXT "This service depends on the following components:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Some services depend on other services, system drivers and load order groups. If a system component is stopped or it is not running properly, dependant services can be affected.", IDC_STATIC, 8, 7, 238, 26
LTEXT "This service depends on the following components", IDC_STATIC, 8, 57, 236, 9
LTEXT "&This service depends on the following components:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The &following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

Some files were not shown because too many files have changed in this diff Show More