mirror of
https://github.com/reactos/reactos
synced 2025-10-07 17:02:50 +02:00
Compare commits
202 Commits
FixRelWith
...
powermeter
Author | SHA1 | Date | |
---|---|---|---|
|
8ef528a24c | ||
|
9b70d4380c | ||
|
c27a2fc7cb | ||
|
f8efb5d474 | ||
|
d1aa59982d | ||
|
a6558c0562 | ||
|
bd2d3b8603 | ||
|
0a6bcfc9ff | ||
|
8b6907f2a6 | ||
|
85afe48c3e | ||
|
efbdd483b3 | ||
|
7eb8535edf | ||
|
78e04c07b8 | ||
|
e452980e0e | ||
|
35fd771c84 | ||
|
faaac75546 | ||
|
f1f01771b6 | ||
|
884f73fb04 | ||
|
0f6e982ad7 | ||
|
2c057d9bc1 | ||
|
94fc56c038 | ||
|
860262952d | ||
|
fcc2247774 | ||
|
6faee56f86 | ||
|
d3456f5060 | ||
|
4cbd5d1b44 | ||
|
73b019a390 | ||
|
fb6191b71a | ||
|
4514e748f0 | ||
|
f135cab83e | ||
|
2c2cdfddd3 | ||
|
d489f1a170 | ||
|
0e21c6f3fd | ||
|
005f75bd61 | ||
|
a7d86fe3a7 | ||
|
b42b015cc6 | ||
|
2fe3073697 | ||
|
3fe4b41f20 | ||
|
fa7890f39d | ||
|
aa60e56199 | ||
|
aa6c33b21c | ||
|
5a10ec60be | ||
|
2e85425c53 | ||
|
0e58b59794 | ||
|
1f27911997 | ||
|
f60128b69d | ||
|
edecbf4799 | ||
|
a8f4a76c7b | ||
|
8851d86847 | ||
|
7611e49b9d | ||
|
7ec2e1cd2f | ||
|
2696f1a29f | ||
|
ec45b8fde8 | ||
|
fca88bb94d | ||
|
d0a7e496aa | ||
|
42c7e4f66a | ||
|
d27f5971c5 | ||
|
48027a8058 | ||
|
7b23673851 | ||
|
31a693a035 | ||
|
67e5343daf | ||
|
016c5fd083 | ||
|
3d9b919814 | ||
|
26e0a5472f | ||
|
7026466324 | ||
|
be56c5c328 | ||
|
23ad93627b | ||
|
2f380814d3 | ||
|
80eb313eed | ||
|
00983aa86f | ||
|
79f281e74f | ||
|
00f4a0f89b | ||
|
dd53e7f79e | ||
|
18fc5a1391 | ||
|
3b8cfa42c1 | ||
|
5022a451df | ||
|
9a0ff8b21b | ||
|
1b564c1ba8 | ||
|
111c8cc62a | ||
|
2f805d7a02 | ||
|
a3899d8151 | ||
|
94a650cdf7 | ||
|
1519a676bd | ||
|
4089e90890 | ||
|
f669426bf4 | ||
|
52719b52ae | ||
|
182f353b2f | ||
|
ff7bf747bf | ||
|
ecf4001e6f | ||
|
9aa299bea4 | ||
|
2ec3a199af | ||
|
208dfd22c6 | ||
|
8d7eca9482 | ||
|
ac3ecb2b2d | ||
|
774b3a6e1d | ||
|
1e6e5529c6 | ||
|
7efab12e6f | ||
|
125f94d8ab | ||
|
4750cbe55b | ||
|
3022d74beb | ||
|
7093412f4e | ||
|
b0dd4ba09c | ||
|
1890ad20f8 | ||
|
72bd9ef29a | ||
|
98b26cc24a | ||
|
0679260073 | ||
|
dca5194279 | ||
|
91fadeb6c3 | ||
|
5dbf87e2c1 | ||
|
32fad87a08 | ||
|
4965d6a8ac | ||
|
3660920b7f | ||
|
7afcd2a8b7 | ||
|
d66ad21ee0 | ||
|
87cd66a577 | ||
|
769462faaa | ||
|
13657fdb5b | ||
|
190782c3e0 | ||
|
aa4fac61c8 | ||
|
cc8ec38a87 | ||
|
c5325f5016 | ||
|
81d845fb2c | ||
|
467dec4d16 | ||
|
21b3382f31 | ||
|
090d563488 | ||
|
cfde03ec9b | ||
|
177cbd81af | ||
|
b6562a664b | ||
|
c7eba0c5c7 | ||
|
a444572c3e | ||
|
70422cda51 | ||
|
97e7efc020 | ||
|
49c40a2941 | ||
|
2e8f4e2c24 | ||
|
f9bedd5ca5 | ||
|
0cd7e2cfb0 | ||
|
db9768f25d | ||
|
c302dbcc96 | ||
|
421dd31d49 | ||
|
982cf2be5e | ||
|
d69a80fad7 | ||
|
457642cc4a | ||
|
be7d79768e | ||
|
35ca454cab | ||
|
c1b8c4f96f | ||
|
151ba9ee8f | ||
|
0c6423da8d | ||
|
48beb0433e | ||
|
5ec739bf2e | ||
|
6ab81dcc31 | ||
|
0b8acaac31 | ||
|
08d575adf9 | ||
|
5821136dfa | ||
|
a7a504a466 | ||
|
367e4877f1 | ||
|
776c660542 | ||
|
e01c32f3bd | ||
|
762a9f00bb | ||
|
738ff9dc04 | ||
|
684072fe12 | ||
|
9563c07146 | ||
|
c930c8c464 | ||
|
aee5cbdfe3 | ||
|
9ab89bd8fa | ||
|
5c47607ab2 | ||
|
5b633d64f1 | ||
|
6a4dbedd1e | ||
|
01cd8472c7 | ||
|
f81c82f5fa | ||
|
fce48c3014 | ||
|
5abc69f31d | ||
|
ad50a00020 | ||
|
c37af4cfca | ||
|
0fc0d9ebb1 | ||
|
0016d65532 | ||
|
9292cad39a | ||
|
c1369e8c41 | ||
|
8c9f250587 | ||
|
f222c2155d | ||
|
185225a5fc | ||
|
74599f6c97 | ||
|
d7db8c9c80 | ||
|
b9b765038e | ||
|
e7a9e7ca3d | ||
|
818842de06 | ||
|
1b2eeb23e0 | ||
|
11d11f93ee | ||
|
7b5e004dd6 | ||
|
9ecd5fb6fe | ||
|
ecb2293d6d | ||
|
1b63247b81 | ||
|
4a5fdb9a3a | ||
|
5d30831fb8 | ||
|
35ed79f2d4 | ||
|
05d71fa69b | ||
|
c35bb8dd73 | ||
|
88d9285bd0 | ||
|
cfcc8d85b2 | ||
|
ffa81857c2 | ||
|
49a55a099e | ||
|
7a9c744b70 | ||
|
6c7d2a2e25 |
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
5
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -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:
|
@@ -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})
|
||||
|
156
CODEOWNERS
156
CODEOWNERS
@@ -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,56 @@
|
||||
/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/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 +203,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 +214,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 +253,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 +287,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 +322,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 +360,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:
|
||||
@@ -311,8 +430,30 @@
|
||||
|
||||
# Win32 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/ @HeisSpiter
|
||||
/dll/win32/kernel32/client/file/find.c @HBelusca
|
||||
|
||||
# Win32 Subsystem - User Server
|
||||
# M:
|
||||
# R: HBelusca, Hermès Bélusca-Maïto
|
||||
# S: Maintained
|
||||
/win32ss/user/winsrv/
|
||||
/win32ss/user/winsrv/usersrv/harderror.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 +479,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/
|
||||
|
@@ -3,6 +3,7 @@ add_subdirectory(atactl)
|
||||
add_subdirectory(cacls)
|
||||
add_subdirectory(calc)
|
||||
add_subdirectory(charmap)
|
||||
add_subdirectory(cleanmgr)
|
||||
add_subdirectory(clipbrd)
|
||||
add_subdirectory(cmdutils)
|
||||
add_subdirectory(control)
|
||||
|
@@ -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:
|
||||
|
9
base/applications/cleanmgr/CMakeLists.txt
Normal file
9
base/applications/cleanmgr/CMakeLists.txt
Normal file
@@ -0,0 +1,9 @@
|
||||
|
||||
project(cleanmgr)
|
||||
|
||||
# The main application
|
||||
add_subdirectory(cleanmgr)
|
||||
|
||||
# Cleanup handlers
|
||||
#add_subdirectory(dataclen) # Data Driven Cleaner
|
||||
|
212
base/applications/cleanmgr/cleanmgr/CCleanupHandler.cpp
Normal file
212
base/applications/cleanmgr/cleanmgr/CCleanupHandler.cpp
Normal 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);
|
||||
}
|
||||
|
48
base/applications/cleanmgr/cleanmgr/CCleanupHandler.hpp
Normal file
48
base/applications/cleanmgr/cleanmgr/CCleanupHandler.hpp
Normal 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;
|
||||
};
|
||||
|
163
base/applications/cleanmgr/cleanmgr/CCleanupHandlerList.cpp
Normal file
163
base/applications/cleanmgr/cleanmgr/CCleanupHandlerList.cpp
Normal 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(¤t->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();
|
||||
}
|
31
base/applications/cleanmgr/cleanmgr/CCleanupHandlerList.hpp
Normal file
31
base/applications/cleanmgr/cleanmgr/CCleanupHandlerList.hpp
Normal 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);
|
||||
}
|
||||
}
|
||||
};
|
@@ -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;
|
||||
}
|
||||
};
|
19
base/applications/cleanmgr/cleanmgr/CMakeLists.txt
Normal file
19
base/applications/cleanmgr/cleanmgr/CMakeLists.txt
Normal 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)
|
50
base/applications/cleanmgr/cleanmgr/CProgressDlg.hpp
Normal file
50
base/applications/cleanmgr/cleanmgr/CProgressDlg.hpp
Normal 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();
|
||||
}
|
||||
}
|
||||
};
|
80
base/applications/cleanmgr/cleanmgr/CSelectDriveDlg.cpp
Normal file
80
base/applications/cleanmgr/cleanmgr/CSelectDriveDlg.cpp
Normal 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;
|
||||
}
|
||||
}
|
328
base/applications/cleanmgr/cleanmgr/cleanmgr.cpp
Normal file
328
base/applications/cleanmgr/cleanmgr/cleanmgr.cpp
Normal 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);
|
||||
}
|
66
base/applications/cleanmgr/cleanmgr/cleanmgr.h
Normal file
66
base/applications/cleanmgr/cleanmgr/cleanmgr.h
Normal 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);
|
64
base/applications/cleanmgr/cleanmgr/cleanmgr.rc
Normal file
64
base/applications/cleanmgr/cleanmgr/cleanmgr.rc
Normal 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
|
||||
|
30
base/applications/cleanmgr/cleanmgr/resource.h
Normal file
30
base/applications/cleanmgr/cleanmgr/resource.h
Normal 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
|
BIN
base/applications/cleanmgr/cleanmgr/resources/cleanmgr.ico
Normal file
BIN
base/applications/cleanmgr/cleanmgr/resources/cleanmgr.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 58 KiB |
@@ -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)
|
||||
|
508
base/applications/cmdutils/certutil/asn.cpp
Normal file
508
base/applications/cmdutils/certutil/asn.cpp
Normal 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;
|
||||
}
|
||||
|
107
base/applications/cmdutils/certutil/certutil.cpp
Normal file
107
base/applications/cmdutils/certutil/certutil.cpp
Normal 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;
|
||||
}
|
@@ -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;
|
||||
}
|
@@ -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 */
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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"
|
||||
}
|
||||
|
@@ -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
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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
|
||||
|
@@ -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"
|
||||
|
@@ -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
|
||||
|
@@ -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\
|
||||
|
@@ -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
|
||||
|
@@ -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 d’origine", 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
|
||||
|
||||
|
@@ -807,6 +807,9 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
|
||||
InitDetailsDlgCtrl(hDlg, pData);
|
||||
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_BYTESRADIO), FALSE);
|
||||
EnableWindow(GetDlgItem(hDlg, IDC_WORDRADIO), FALSE);
|
||||
|
||||
// OnSize(hDlg, pData, pData->cxOld, pData->cyOld);
|
||||
return (INT_PTR)TRUE;
|
||||
}
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -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
|
||||
|
||||
|
@@ -159,7 +159,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Algunos servicios dependen de otros servicios, controladores del sistema y grupos de orden de carga. Si se detiene un componente del sistema o no funciona correctamente, es posible que otros servicios que dependan de éstos resulten afectados.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Éste servicio depende de los siguientes componentes", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Éste servicio depende de los siguientes componentes:", 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
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Certains services dépendent d'autres services, pilotes système et groupes d'ordre de chargement. Si un composant système est arrêté ou ne fonctionne pas correctement, les services dépendants peuvent être affectés.", IDC_STATIC, 8, 7, 238, 36
|
||||
LTEXT "Ce service dépend des composants système suivants", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "&Ce service dépend des composants système suivants:", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Les c&omposants système suivants dépendent de ce service:", IDC_STATIC, 8, 140, 236, 9
|
||||
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
|
||||
END
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "שירותים מסוימים תלויים בשירותים אחרים, במנהלים של התקנים של המערכת ובקבוצות סדר טעינה. אם רכיב מערכת הופסק או שאינו פועל כראוי, ייתכן ששירותים התלויים בו יושפעו.", 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
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Beberapa layanan bergantung pada layanan lainnya, driver sistem dan grup urutan pengambilan. Jika komponen sistem dihentikan atau tidak berjalan dengan benar, layanan yang bergantung akan dipengaruhi.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Layanan ini tergantung pada komponen berikut", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Layanan ini tergantung pada komponen berikut:", 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
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Alcuni servizi dipendono da altri servizi, driver di sistema e gruppi di ordine di caricamento. Se un componente di sistema viene fermato o non sta funzionando regolarmente, i servizi dipendenti possono venire influenzati.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Questo servizio dipende dai seguenti componenti", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Questo servizio dipende dai seguenti componenti:", 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
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "他のサービス、システム ドライバ、読み込み順グループなどに依存しているサービスがあります。システム コンポーネントが停止するか、または正常に実行されない場合、依存するサービスが影響されている場合があります。", 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
|
||||
|
||||
|
@@ -159,6 +159,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "일부 서비스는 다른 서비스나 시스템 드라이버, 그룹 등에 종속되어 있습니다. 만약 시스템 컴포넌트가 정지되었거나 제대로 동작하지 않는다면, 종속된 서비스에 영향을 끼칠 수 있습니다.", IDC_STATIC, 8, 7, 238, 26
|
||||
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
|
||||
|
||||
|
@@ -156,7 +156,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Noen tjenester depend på andre tjenester, system drivere og laster system grupper. Hvis system komponenten er stoppet eller ikke kjøre riktig, dependant services can be affected.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Denne tjenesten depends på følgende komponenter", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Denne tjenesten depends på følgende komponenter:", 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
|
||||
|
||||
|
@@ -166,7 +166,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Niektóre usługi są zależne od innych usług, sterowników systemowych i grup kolejności ładowania. Jeżeli składnik systemu jest zatrzymany lub nie działa prawidłowo, zależne od niego usługi nie uruchomią się.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Ta usługa jest zależna od następujących składników systemu", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Ta usługa jest zależna od następujących składników systemu:", 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
|
||||
|
||||
|
@@ -157,6 +157,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Alguns serviços dependem de outros serviços, controladores de sistema e grupos de ordenamento de carregamento. Se um componente do sistema for parado ou não estiver a ser executado correctamente, os serviços dependentes podem ser afectados.", IDC_STATIC, 8, 7, 238, 34
|
||||
LTEXT "Este serviço depende dos seguintes componentes do sistema:", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
|
||||
LTEXT "Os seguintes componentes do sistema dependem deste serviço:", IDC_DEPEND_SERVICE, 8, 138, 236, 13
|
||||
END
|
||||
|
||||
|
@@ -165,7 +165,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Unele servicii depind de alte servicii sau de module de sistem și de ordinea încărcării în grup. Dacă o componentă de sistem este oprită sau nu rulează corespunzător, serviciile dependente pot fi și ele afectate.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Acest serviciu depinde de următoarele componente", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Acest serviciu depinde de următoarele componente:", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Următoarele componente depind de acest serviciu:", IDC_STATIC, 8, 140, 236, 9
|
||||
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
|
||||
END
|
||||
|
||||
|
@@ -157,6 +157,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Некоторые службы зависят от других. Если служба остановлена или неправильно работает, это отражается на зависимых от нее службах.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Эта служба зависит от следующих компонентов:", IDC_STATIC, 8, 59, 236, 9
|
||||
LTEXT "Следующие компоненты зависят от этой службы:", IDC_STATIC, 8, 140, 236, 9
|
||||
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
|
||||
END
|
||||
|
||||
|
@@ -161,7 +161,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
|
||||
|
||||
|
@@ -161,7 +161,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Disa shërbime varen nga shërbimet e tjera, driverat e sistemit dhe ngarkimet grupet te renditura. Nëse një komponent sistem është i ndalur ose ajo nuk është në drejtimin e duhur, shërbimet e varur mund të preken.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Ky shërbim varet nga komponentet në vijim", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Ky shërbim varet nga komponentet në vijim:", 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
|
||||
|
||||
|
@@ -163,7 +163,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Några tjänster är beroende av andra tjänster, systemdrivrutiner och laddsystemsgrupper. Om systemkomponenten är stoppad eller inte kör korrekt, kan tjänster som är beroende av den bli påverkade.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Denna tjänsten är beroende av följande komponenter", IDC_STATIC, 8, 57, 236, 9
|
||||
LTEXT "Denna tjänsten är beroende av följande komponenter:", 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
|
||||
|
||||
|
@@ -164,7 +164,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "การให้บริการบางอย่างขึ้นกับบริการอื่นๆด้วย, ตัวขับเคลื่อนของระบบ และการดึงข้อมูลตามลำดับกลุ่ม ถ้าส่วนประกอบต่างๆของระบบหยุดทำงานลง หรือไม่ทำงานตามสมควร การให้บริการแบบไม่กำหนดเองจะมีผลทันที", 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
|
||||
|
||||
|
@@ -159,6 +159,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Birtakım hizmetler, başka hizmetlere, sistem sürücülerine ve yükleme sırası bileşenlerine bağımlıdır. Eğer bir sistem bileşeni, durdurulmuşsa ya da düzgün çalışmıyorsa bağımlı hizmetler etkilenebilir.", IDC_STATIC, 8, 7, 238, 26
|
||||
LTEXT "Bu hizmet aşağıdaki bileşenlere bağımlıdır:", 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
|
||||
|
||||
|
@@ -164,7 +164,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "Деякі служби залежать від інших служб, системних драйверів або списку завантаження груп служб. Якщо служба зупинена або неправильно працює, це впливає на залежні від неї служби.", 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
|
||||
|
||||
|
@@ -158,7 +158,8 @@ BEGIN
|
||||
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "一些服务依赖于其他服务,系统驱动程序和加载顺序组。如果一个系统组件被停止或者没有正确运行,依赖它的服务也会被影响。", 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
|
||||
|
||||
|
@@ -165,6 +165,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "一些服務依賴於其他服務,系統驅動程式和載入順序組。如果一個系統元件被停止或者沒有正確執行,依賴它的服務也會受到影響。", IDC_STATIC, 8, 7, 238, 26
|
||||
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
|
||||
|
||||
|
@@ -165,6 +165,7 @@ BEGIN
|
||||
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
|
||||
LTEXT "一些服務依賴於其他服務,系統驅動程式和載入順序組。如果一個系統元件被停止或者沒有正確運行,被其依賴的服務也會被影響。", IDC_STATIC, 8, 7, 238, 26
|
||||
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
|
||||
|
||||
|
@@ -16,16 +16,11 @@ CCanvasWindow::CCanvasWindow()
|
||||
, m_hitCanvasSizeBox(HIT_NONE)
|
||||
, m_ptOrig { -1, -1 }
|
||||
{
|
||||
m_ahbmCached[0] = m_ahbmCached[1] = NULL;
|
||||
m_rcResizing.SetRectEmpty();
|
||||
}
|
||||
|
||||
CCanvasWindow::~CCanvasWindow()
|
||||
{
|
||||
if (m_ahbmCached[0])
|
||||
::DeleteObject(m_ahbmCached[0]);
|
||||
if (m_ahbmCached[1])
|
||||
::DeleteObject(m_ahbmCached[1]);
|
||||
}
|
||||
|
||||
RECT CCanvasWindow::GetBaseRect()
|
||||
@@ -119,16 +114,30 @@ VOID CCanvasWindow::zoomTo(INT newZoom, LONG left, LONG top)
|
||||
Invalidate(TRUE);
|
||||
}
|
||||
|
||||
VOID CCanvasWindow::DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint)
|
||||
BOOL CCanvasWindow::DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint)
|
||||
{
|
||||
// This is the target area we have to draw on
|
||||
CRect rcCanvasDraw;
|
||||
rcCanvasDraw.IntersectRect(&rcClient, &rcPaint);
|
||||
|
||||
// Calculate image size
|
||||
CRect rcImage;
|
||||
GetImageRect(rcImage);
|
||||
SIZE sizeImage = { imageModel.GetWidth(), imageModel.GetHeight() };
|
||||
|
||||
// We use a memory bitmap to reduce flickering
|
||||
HBITMAP hbmCache1 = CreateDIBWithProperties(rcClient.right, rcClient.bottom);
|
||||
if (!hbmCache1)
|
||||
return FALSE; // Out of memory
|
||||
HBITMAP hbmCache2 = CreateDIBWithProperties(sizeImage.cx, sizeImage.cy);
|
||||
if (!hbmCache2)
|
||||
{
|
||||
::DeleteObject(hbmCache1);
|
||||
return FALSE; // Out of memory
|
||||
}
|
||||
|
||||
HDC hdcMem0 = ::CreateCompatibleDC(hDC);
|
||||
m_ahbmCached[0] = CachedBufferDIB(m_ahbmCached[0], rcClient.right, rcClient.bottom);
|
||||
HGDIOBJ hbm0Old = ::SelectObject(hdcMem0, m_ahbmCached[0]);
|
||||
HGDIOBJ hbm0Old = ::SelectObject(hdcMem0, hbmCache1);
|
||||
|
||||
// Fill the background on hdcMem0
|
||||
::FillRect(hdcMem0, &rcCanvasDraw, (HBRUSH)(COLOR_APPWORKSPACE + 1));
|
||||
@@ -138,11 +147,6 @@ VOID CCanvasWindow::DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint)
|
||||
if (!selectionModel.m_bShow && !::IsWindowVisible(textEditWindow))
|
||||
drawSizeBoxes(hdcMem0, &rcBase, FALSE, &rcCanvasDraw);
|
||||
|
||||
// Calculate image size
|
||||
CRect rcImage;
|
||||
GetImageRect(rcImage);
|
||||
SIZE sizeImage = { imageModel.GetWidth(), imageModel.GetHeight() };
|
||||
|
||||
// Calculate the target area on the image
|
||||
CRect rcImageDraw = rcCanvasDraw;
|
||||
CanvasToImage(rcImageDraw);
|
||||
@@ -154,8 +158,7 @@ VOID CCanvasWindow::DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint)
|
||||
|
||||
// hdcMem1 <-- imageModel
|
||||
HDC hdcMem1 = ::CreateCompatibleDC(hDC);
|
||||
m_ahbmCached[1] = CachedBufferDIB(m_ahbmCached[1], sizeImage.cx, sizeImage.cy);
|
||||
HGDIOBJ hbm1Old = ::SelectObject(hdcMem1, m_ahbmCached[1]);
|
||||
HGDIOBJ hbm1Old = ::SelectObject(hdcMem1, hbmCache2);
|
||||
::BitBlt(hdcMem1, rcImageDraw.left, rcImageDraw.top, rcImageDraw.Width(), rcImageDraw.Height(),
|
||||
imageModel.GetDC(), rcImageDraw.left, rcImageDraw.top, SRCCOPY);
|
||||
|
||||
@@ -208,6 +211,10 @@ VOID CCanvasWindow::DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint)
|
||||
// Clean up hdcMem0
|
||||
::SelectObject(hdcMem0, hbm0Old);
|
||||
::DeleteDC(hdcMem0);
|
||||
::DeleteObject(hbmCache2);
|
||||
::DeleteObject(hbmCache1);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID CCanvasWindow::updateScrollRange()
|
||||
@@ -691,9 +698,22 @@ LRESULT CCanvasWindow::OnPaint(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
|
||||
RECT rcClient;
|
||||
GetClientRect(&rcClient);
|
||||
|
||||
static BOOL s_bShowedOutOfMemory = FALSE; // Don't show "Out Of Memory" message multiple time
|
||||
|
||||
PAINTSTRUCT ps;
|
||||
HDC hDC = BeginPaint(&ps);
|
||||
DoDraw(hDC, rcClient, ps.rcPaint);
|
||||
|
||||
if (DoDraw(hDC, rcClient, ps.rcPaint))
|
||||
{
|
||||
s_bShowedOutOfMemory = FALSE;
|
||||
}
|
||||
else if (!s_bShowedOutOfMemory)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
s_bShowedOutOfMemory = TRUE;
|
||||
imageModel.ClearHistory(); // Reduce memory usage
|
||||
}
|
||||
|
||||
EndPaint(&ps);
|
||||
return 0;
|
||||
}
|
||||
|
@@ -57,12 +57,11 @@ public:
|
||||
protected:
|
||||
HITTEST m_hitCanvasSizeBox;
|
||||
POINT m_ptOrig; // The origin of drag start
|
||||
HBITMAP m_ahbmCached[2]; // The cached buffer bitmaps
|
||||
CRect m_rcResizing; // Resizing rectagle
|
||||
|
||||
HITTEST CanvasHitTest(POINT pt);
|
||||
RECT GetBaseRect();
|
||||
VOID DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint);
|
||||
BOOL DoDraw(HDC hDC, RECT& rcClient, RECT& rcPaint);
|
||||
VOID OnHVScroll(WPARAM wParam, INT fnBar);
|
||||
|
||||
LRESULT OnSize(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
||||
|
@@ -230,6 +230,7 @@ HBITMAP InitializeImage(LPCWSTR name, LPWIN32_FIND_DATAW pFound, BOOL isFile)
|
||||
if (hBitmap == NULL)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
imageModel.ClearHistory();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@@ -130,6 +130,7 @@ void ImageModel::PushImageForUndo()
|
||||
if (hbm == NULL)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
ClearHistory();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -143,6 +144,7 @@ void ImageModel::PushImageForUndo(HBITMAP hbm)
|
||||
if (hbm == NULL)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
ClearHistory();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -201,6 +203,7 @@ void ImageModel::Crop(int nWidth, int nHeight, int nOffsetX, int nOffsetY)
|
||||
if (!hbmNew)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
ClearHistory();
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -44,7 +44,7 @@ BEGIN
|
||||
MENUITEM "&Copier\tCtrl+C", IDM_EDITCOPY
|
||||
MENUITEM "C&oller\tCtrl+V", IDM_EDITPASTE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Crop &selection", IDM_CROPSELECTION
|
||||
MENUITEM "Ro&gner la sélection", IDM_CROPSELECTION
|
||||
MENUITEM "&Effacer la sélection\tDel", IDM_EDITDELETESELECTION
|
||||
MENUITEM "&Inverser la sélection", IDM_EDITINVERTSELECTION
|
||||
MENUITEM "&Sélectionner tout\tCtrl+A", IDM_EDITSELECTALL
|
||||
@@ -110,7 +110,7 @@ BEGIN
|
||||
MENUITEM "&Copier\tCtrl+C", IDM_EDITCOPY
|
||||
MENUITEM "C&oller\tCtrl+V", IDM_EDITPASTE
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Crop &selection", IDM_CROPSELECTION
|
||||
MENUITEM "Ro&gner la sélection", IDM_CROPSELECTION
|
||||
MENUITEM "&Effacer la sélection\tDel", IDM_EDITDELETESELECTION
|
||||
MENUITEM "&Sélectionner tout\tCtrl+A", IDM_EDITSELECTALL
|
||||
MENUITEM SEPARATOR
|
||||
@@ -269,8 +269,8 @@ BEGIN
|
||||
IDS_UNDERLINE "Underline"
|
||||
IDS_VERTICAL "Vertical"
|
||||
IDS_PRINTRES "%d x %d pixel/cm"
|
||||
IDS_CANTPASTE "Failed to paste from the clipboard. The data format is either incorrect or not supported."
|
||||
IDS_SAVEERROR "Failed to save the bitmap to file:\n\n%s"
|
||||
IDS_CANTSENDMAIL "Failed to send a mail."
|
||||
IDS_LOSECOLOR "The color information will be lost in this operation. Are you sure to proceed?"
|
||||
IDS_CANTPASTE "Échec lors de la copie depuis le presse-papiers. Les données sont soit incorrectes soit non supportées."
|
||||
IDS_SAVEERROR "Échec lors de la sauvegarde dans le fichier :\n\n%s"
|
||||
IDS_CANTSENDMAIL "Échec lors de l'envoi d'un mail."
|
||||
IDS_LOSECOLOR "Les informations de couleurs vont être perdues dans cette opération. Êtes-vous sûr de continuer ?"
|
||||
END
|
||||
|
@@ -957,9 +957,14 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
|
||||
HBITMAP hbmCopy = selectionModel.GetSelectionContents();
|
||||
HGLOBAL hGlobal = BitmapToClipboardDIB(hbmCopy);
|
||||
if (hGlobal)
|
||||
{
|
||||
::SetClipboardData(CF_DIB, hGlobal);
|
||||
}
|
||||
else
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
imageModel.ClearHistory();
|
||||
}
|
||||
::DeleteObject(hbmCopy);
|
||||
}
|
||||
|
||||
@@ -1093,6 +1098,7 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
|
||||
if (!hbmSelection)
|
||||
{
|
||||
ShowOutOfMemory();
|
||||
imageModel.ClearHistory();
|
||||
break;
|
||||
}
|
||||
SaveDIBToFile(hbmSelection, szFileName, FALSE);
|
||||
|
@@ -55,7 +55,7 @@ BEGIN
|
||||
IDS_HIGHCOLOR15 "32,768 Couleurs (15 bit)"
|
||||
IDS_HIGHCOLOR16 "65,536 Couleurs (16 bit)"
|
||||
IDS_HIGHCOLOR24 "16,777,216 Couleurs (24 bit)"
|
||||
IDS_HIGHCOLOR32 "Highest Quality (32 bit)"
|
||||
IDS_HIGHCOLOR32 "La plus haute qualité (32 bit)"
|
||||
IDS_PIXEL "%lux%lu Pixels"
|
||||
IDS_FULLSCREEN "Plein écran"
|
||||
IDS_BROWSESERVER "<Parcourir pour plus...>"
|
||||
|
@@ -32,7 +32,7 @@ Options :\n\
|
||||
IDS_CTRL_C "Ctrl-C\n"
|
||||
IDS_NO_RESOURCES "Ressources libres disponibles insuffisantes.\n"
|
||||
IDS_MISSING_ADDRESS "L'adresse IP doit être spécifiée.\n"
|
||||
IDS_MISSING_VALUE "Une valeur doit être spécifie pour l'option %s.\n"
|
||||
IDS_MISSING_VALUE "Une valeur doit être spécifiée pour l'option %s.\n"
|
||||
IDS_BAD_OPTION "Option incorrecte %s.\n"
|
||||
IDS_BAD_PARAMETER "Paramètre incorrect %s.\n"
|
||||
IDS_BAD_VALUE "Valeur incorrecte pour l'option %s, elle doit être entre %u et %u.\n"
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -38,4 +38,7 @@ Optionen:\n\
|
||||
IDS_HOP_RESPONSE " Antwort: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Zielhost nicht erreichbar.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Zielnetz nicht erreichbar.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -8,7 +8,7 @@ Usage: tracert [-d] [-h sauts_max] [-j liste_dhôtes] [-w délai] nom_de_la_cibl
|
||||
Options :\n\
|
||||
-d Ne pas résoudre les adresses en noms d'hôtes.\n\
|
||||
-h sauts_max Nombre de sauts maximum pour atteindre la cible.\n\
|
||||
-j liste_dhôtes Intinéraire source imprécis dans la liste d'hôtes.\n\
|
||||
-j liste_dhôtes Itinéraire source imprécis dans la liste d'hôtes.\n\
|
||||
-w délai Délai d'expiration en millisecondes pour chaque réponse.\n\
|
||||
-4 Force l'utilisation d'IPv4.\n\
|
||||
-6 Force l'utilisation d'IPv6.\n\
|
||||
@@ -33,4 +33,7 @@ Options :\n\
|
||||
IDS_HOP_RESPONSE " rapporte : "
|
||||
IDS_DEST_HOST_UNREACHABLE "Hôte de destination inatteignable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Réseau de destination inatteignable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -39,4 +39,7 @@ Opzioni:\n\
|
||||
IDS_HOP_RESPONSE " rapporti: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destinazione ospite irraggiungibile.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destinazione rete irraggiungibile.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Opcje:\n\
|
||||
IDS_HOP_RESPONSE " raporty: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Host docelowy nieosiągalny.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Sieć docelowa nieosiągalna.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -39,4 +39,7 @@ Opțiuni:\n\
|
||||
IDS_HOP_RESPONSE " rapoarte: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destinație gazdă inaccesibilă.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destinație rețea inaccesibilă.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -34,4 +34,7 @@ BEGIN
|
||||
IDS_HOP_RESPONSE " сообщает: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Заданный узел недоступен.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Заданная сеть недоступна.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -34,4 +34,7 @@ Seçenekler:\n\
|
||||
IDS_HOP_RESPONSE " raporlar: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Hedef cihaza erişilemiyor.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Hedef ağa erişilemiyor.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ Options:\n\
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
|
||||
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -33,4 +33,7 @@ BEGIN
|
||||
IDS_HOP_RESPONSE " 报告: "
|
||||
IDS_DEST_HOST_UNREACHABLE "目标主机不可达。\n"
|
||||
IDS_DEST_NET_UNREACHABLE "目标网络不可达。\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
@@ -39,4 +39,7 @@ BEGIN
|
||||
IDS_HOP_RESPONSE " reports: "
|
||||
IDS_DEST_HOST_UNREACHABLE "無法連線至目標主機。\n"
|
||||
IDS_DEST_NET_UNREACHABLE "無法連線至目標網路。\n"
|
||||
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
|
||||
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
|
||||
IDS_MISSING_TARGET "A target name or address must be specified.\n"
|
||||
END
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user