Compare commits

..

1 Commits

Author SHA1 Message Date
Justin Miller
0ad869b74f [SDK] Temporarily work around buildbot issue 2025-02-27 14:45:39 -08:00
2080 changed files with 72300 additions and 146401 deletions

3
.gitattributes vendored
View File

@@ -30,9 +30,6 @@
*.TXT text
*.y text
# Files with these extensions must always have LF (Unix) line endings.
*.sh text eol=lf
# Files with these extensions end up in the built ReactOS system, so they
# need to have CRLF line endings.
*.bat text eol=crlf

View File

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

7
.github/labeler.yml vendored
View File

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

View File

@@ -68,9 +68,6 @@ 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
@@ -160,10 +157,7 @@ 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 pefixup)
if (ARCH STREQUAL "i386")
list(APPEND NATIVE_TARGETS rsym)
endif()
list(APPEND NATIVE_TARGETS rsym pefixup)
endif()
install(TARGETS ${NATIVE_TARGETS})

View File

@@ -116,20 +116,6 @@
# 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
@@ -138,58 +124,6 @@
/sdk/cmake/
*.cmake
# Command-line Utilities
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/applications/cmdutils/attrib/ @HBelusca
/base/applications/cmdutils/chcp/ @HBelusca
/base/applications/cmdutils/doskey/ @HBelusca
/base/applications/cmdutils/eventcreate/ @HBelusca
/base/applications/cmdutils/find/ @HBelusca
/base/applications/cmdutils/help/ @HBelusca
/base/applications/cmdutils/mode/ @HBelusca
/base/applications/cmdutils/more/ @HBelusca
/base/applications/cmdutils/taskkill/ @HBelusca
/base/applications/cmdutils/timeout/ @HBelusca
/sdk/lib/conutils/ @HBelusca
# Command-line Prompt Interpreter
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/shell/cmd/ @HBelusca
# Console Client/Server Subsystem, Terminal Emulator / Text-Mode
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/dll/cpl/console/ @HBelusca
/dll/win32/kernel32/client/console/ @HBelusca
/dll/win32/kernel32/include/console.h @HBelusca
/drivers/base/condrv/ @HBelusca
/drivers/setup/blue/ @HBelusca
/modules/rostests/winetests/kernel32/console.c @HBelusca
/sdk/include/psdk/wincon.h @HBelusca
/sdk/include/reactos/wincon_undoc.h @HBelusca
/sdk/include/reactos/drivers/condrv/ @HBelusca
/sdk/include/reactos/drivers/blue/ @HBelusca
/sdk/include/reactos/subsys/win/conmsg.h @HBelusca
/sdk/include/reactos/subsys/win/console.h @HBelusca
/win32ss/user/ntuser/console.c @HBelusca
/win32ss/user/winsrv/concfg/ @HBelusca
/win32ss/user/winsrv/consrv/ @HBelusca
# Event Log Subsystem
# M: HBelusca, Hermès Bélusca-Maïto
# M: EricKohl, ekohl, Eric Kohl
# S: Maintained
/base/services/eventlog/ @EricKohl @HBelusca
/dll/win32/advapi32/service/eventlog.c @EricKohl @HBelusca
/sdk/lib/evtlib/ @HBelusca
# Event Log Viewer
# M: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/base/applications/mscutils/eventvwr/ @HBelusca
# File Patch API
# M: learn-more, learn_more, Mark Jansen
# S: Maintained
@@ -205,7 +139,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
@@ -216,13 +150,11 @@
/sdk/lib/drivers/ntoskrnl_vista/fsrtl.c @HeisSpiter
# Freeloader
# M: HBelusca, Hermès Bélusca-Maïto
# M:
# R: tkreuzer, ThePhysicist, Timo Kreuzer
# R: Extravert-ir, extravert34, Victor Perevertkin
# S: Maintained
/boot/freeldr/freeldr/ @HBelusca @tkreuzer @Extravert-ir
/boot/rtl/ @HBelusca
/ntoskrnl/config/cmboot.c @HBelusca
/boot/freeldr/freeldr/ @tkreuzer @Extravert-ir
# HAL / APIC
# M: tkreuzer, ThePhysicist, Timo Kreuzer
@@ -255,12 +187,6 @@
# 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
@@ -289,29 +215,11 @@
# 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
@@ -324,25 +232,7 @@
# S: Maintained
/modules/rostests/kmtests/ @ThFabba
# 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
# ROS internals tools
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
# S: Maintained
/modules/rosapps/applications/rosinternals/ @HeisSpiter
@@ -362,26 +252,15 @@
/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:
@@ -430,34 +309,10 @@
/modules/rosapps/applications/cmdutils/vfdcmd/ @HeisSpiter
/modules/rosapps/drivers/vfd/ @HeisSpiter
# Win32 Subsystem
# M:
# R: HBelusca, Hermès Bélusca-Maïto
# S: Maintained
/sdk/include/reactos/winbase_undoc.h @HBelusca
/subsystems/win/basesrv/
/win32ss/user/winsrv/
/win32ss/user/winsrv/usersrv/harderror.c @HBelusca
# Win32 Subsystem - File functions
# 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/find.c @HBelusca
# Win32 Subsystem - Shutdown
# M: HBelusca, Hermès Bélusca-Maïto
# R: EricKohl, ekohl, Eric Kohl
# S: Maintained
/base/system/winlogon/sas.c @EricKohl @HBelusca
/base/system/winlogon/shutdown.c @EricKohl @HBelusca
/dll/win32/advapi32/misc/shutdown.c @EricKohl
/dll/win32/msgina/shutdown.c @EricKohl @HBelusca
/win32ss/user/ntuser/shutdown.* @HBelusca
/win32ss/user/user32/misc/exit.c @HBelusca
/win32ss/user/winsrv/consrv/shutdown.c @HBelusca
/win32ss/user/winsrv/usersrv/shutdown.c @HBelusca
/dll/win32/kernel32/client/file/ @HeisSpiter
# Windows Network File Systems functions
# M: HeisSpiter, Heis Spiter, Pierre Schweitzer
@@ -483,11 +338,6 @@
amd64/ @tkreuzer
/boot/freeldr/freeldr/arch/realmode/amd64.S @tkreuzer
# Wine DirectX
# M: DarkFire01, The_DarkFire_, Justin Miller
# S: Upstream
/dll/directx/wine/ @DarkFire01
# Translations
# This is the list of translation teams in ReactOS GitHub organization.
# If you want to be part of one - hit us at https://chat.reactos.org/

View File

@@ -1,356 +0,0 @@
# Coding Style
This article describes general coding style guidelines, which should be used for new ReactOS code. These guidelines apply exclusively to C and C++ source files. The Members of ReactOS agreed on this document in the October 2013 meeting.
As much existing ReactOS code as possible should be converted to this style unless there are reasons against doing this (like if the code is going to be rewritten from scratch in the near future). See [Notes on reformatting existing code](#notes-on-reformatting-existing-code) for more details.
Code synchronized with other sources (like Wine) must not be rewritten. [3rd Party Files.txt](https://github.com/reactos/reactos/blob/master/media/doc/3rd%20Party%20Files.txt) and [WINESYNC.txt](https://github.com/reactos/reactos/blob/master/media/doc/WINESYNC.txt) files can be used for tracking synchronized files.
## File Structure
1. Every ReactOS source code file should include a file header like this:
```
/*
* PROJECT: ReactOS Kernel
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Does cool things like Memory Management
* COPYRIGHT: Copyright 2017 Arno Nymous <abc@mailaddress.com>
* Copyright 2017 Mike Blablabla <mike@blabla.com>
*/
```
Please use SPDX license identifiers available at https://spdx.org/licenses.
This makes our source file parseable by licensing tools!
You should add yourself to the `COPYRIGHT` section of a file if you did a major contribution to it and could take responsibility for the whole file or a part of it. Not more than 3 people shall be in that list for each file.
`FILE` line of the old header should be removed.
2. [Doxygen](https://doxygen.reactos.org/) documentation generator is used for ReactOS codebase, so use a proper header for functions, see [API Documentation](https://reactos.org/wiki/Documentation_Guidelines#API_Documentation) for details.
## Indentation and line width
1. Line width must be at most **100 characters**.
2. Do not add a space or tab at the end of any line.
3. Indent with **4 spaces**, don't use tabs!
4. Indent both a case label and the case statement of a switch statement.
**Right:**
```c
switch (Condition)
{
case 1:
DoSomething();
break;
case 2:
{
DoMany();
ManyMore();
OtherThings();
break;
}
}
```
**Wrong:**
```c
switch(Condition)
{
case 1:
DoSomething();
break;
case 2:
DoMany();
ManyMore();
OtherThings();
break;
}
```
5. When a function call does not fit onto a line, align arguments like this:
```c
FunctionCall(arg1,
arg2,
arg3);
```
6. Function headers should have this format (preserving the order as in the example):
```c
static // scope identifier
CODE_SEG("PAGE") // section placement
// other attributes
BOOLEAN // return type
FASTCALL // calling convention
IsOdd(
_In_ UINT32 Number);
```
## Spacing
1. Do not use spaces around unary operators.
**Right:** `i++;`
**Wrong:** `i ++;`
2. Place spaces around binary and ternary operators.
**Right:** `a = b + c;`
**Wrong:** `a=b+c;`
3. Do not place spaces before comma and semicolon.
**Right:**
```c
for (int i = 0; i < 5; i++)
DoSomething();
func1(a, b);
```
**Wrong:**
```c
for (int i = 0; i < 5 ; i++)
DoSomething();
func1(a , b) ;
```
4. Place spaces between control statements and their parentheses.
**Right:**
```c
if (Condition)
DoSomething();
```
**Wrong:**
```c
if(Condition)
DoSomething();
```
5. Do not place spaces between a function and its parentheses, or between a parenthesis and its content.
**Right:**
```c
func(a, b);
```
**Wrong:**
```c
func (a, b);
func( a, b );
```
## Line breaking
1. Each statement should get its own line.
**Right:**
```c
x++;
y++;
if (Condition)
DoSomething();
```
**Wrong:**
```c
x++; y++;
if (Condition) DoSomething();
```
## Braces
1. Always put braces (`{` and `}`) on their own lines.
2. One-line control clauses may use braces, but this is not a requirement. An exception are one-line control clauses including additional comments.
**Right:**
```c
if (Condition)
DoSomething();
if (Condition)
{
DoSomething();
}
if (Condition)
{
// This is a comment
DoSomething();
}
if (A_Very || (Very && Long || Condition) &&
On_Many && Lines)
{
DoSomething();
}
if (Condition)
DoSomething();
else
DoSomethingElse();
if (Condition)
{
DoSomething();
}
else
{
DoSomethingElse();
YetAnother();
}
```
**Wrong:**
```c
if (Condition) {
DoSomething();
}
if (Condition)
// This is a comment
DoSomething();
if (A_Very || (Very && Long || Condition) &&
On_Many && Lines)
DoSomething();
if (Condition)
DoSomething();
else {
DoSomethingElse();
YetAnother();
}
```
## Control structures
1. Don't use inverse logic in control clauses.
**Right:** `if (i == 1)`
**Wrong:** `if (1 == i)`
2. Avoid too many levels of cascaded control structures. Prefer a "linear style" over a "tree style". Use `goto` when it helps to make the code cleaner (e.g. for cleanup paths).
**Right:**
```c
if (!func1())
return;
i = func2();
if (i == 0)
return;
j = func3();
if (j == 1)
return;
...
```
**Wrong:**
```c
if (func1())
{
i = func2();
if (func2())
{
j = func3();
if (func3())
{
...
}
}
}
```
## Naming
1. Capitalize names of variables and functions. Hungarian Notation may be used when developing for Win32, but it is not required. If you don't use it, the first letter of a name must be a capital too (no lowerCamelCase). Do not use underscores as separators either.
**Right:**
```c
PLIST_ENTRY FirstEntry;
VOID NTAPI IopDeleteIoCompletion(PVOID ObjectBody);
PWSTR pwszTest;
```
**Wrong:**
```c
PLIST_ENTRY first_entry;
VOID NTAPI iop_delete_io_completion(PVOID objectBody);
PWSTR pwsztest;
```
2. Avoid abbreviating function and variable names, use descriptive verbs where possible.
3. Precede boolean values with meaningful verbs like "is" and "did" if possible and if it fits the usage.
**Right:**
```c
BOOLEAN IsValid;
BOOLEAN DidSendData;
```
**Wrong:**
```c
BOOLEAN Valid;
BOOLEAN SentData;
```
## Commenting
1. Avoid line-wasting comments, which could fit into a single line.
**Right:**
```c
// This is a one-line comment
/* This is a C-style comment */
// This is a comment over multiple lines.
// We don't define any strict rules for it.
```
**Wrong:**
```c
//
// This comment wastes two lines
//
```
## Null, false and 0
1. The null pointer should be written as `NULL`. In the rare case that your environment recommends a different null pointer (e.g. C++11 `nullptr`), you may use this one of course. Just don't use the value `0`.
2. Win32/NT Boolean values should be written as `TRUE` and `FALSE`. In the rare case that you use C/C++ `bool` variables, you should write them as `true` and `false`.
3. When you need to terminate ANSI or OEM string, or check for its terminator, use `ANSI_NULL`. If the string is Unicode or Wide string, use `UNICODE_NULL`.
## Notes on reformatting existing code
- Never totally reformat a file and put a code change into it. Do this in separate commits.
- If a commit only consists of formatting changes, say this clearly in the commit message by preceding it with *[FORMATTING]*.
## Other points
- Do not use `LARGE_INTEGER`/`ULARGE_INTEGER` unless needed for using APIs. Use `INT64`/`UINT64` instead
- Use `#pragma once` instead of guard defines in headers
- Don't specify a calling convention for a function unless required (usually for APIs or exported symbols)
## Using an automatic code style tool
TO BE ADDED BY User:Zefklop
## Points deliberately left out
Additional ideas were suggested during the discussion of this document, but a consensus couldn't be reached on them. Therefore we refrain from enforcing any rules on these points:
- TO BE ADDED BY User:Hbelusca
## See also
- [Kernel Coding Style](https://reactos.org/wiki/Kernel_Coding_Style)
- [GNU Indent](https://reactos.org/wiki/GNU_Indent)

View File

@@ -7,8 +7,8 @@
---
<p align=center>
<a href="https://reactos.org/project-news/reactos-0415-released/">
<img alt="ReactOS 0.4.15 Release" src="https://img.shields.io/badge/release-0.4.15-0688CB.svg"></a>
<a href="https://reactos.org/project-news/reactos-0414-released/">
<img alt="ReactOS 0.4.14 Release" src="https://img.shields.io/badge/release-0.4.14-0688CB.svg"></a>
<a href="https://reactos.org/download/">
<img alt="Download ReactOS" src="https://img.shields.io/badge/download-latest-0688CB.svg"></a>
<a href="https://sourceforge.net/projects/reactos/">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,40 +2,40 @@ LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
STRINGTABLE
BEGIN
IDS_USAGE "Compare deux fichiers ou un ensemble de fichiers et affiche les différences\n\
entre eux.\n\
IDS_USAGE "Compares two files or sets of files and displays the differences between\n\
them.\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 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\
/A Displays only first and last lines for each set of differences.\n\
/B Performs a binary comparison.\n\
/C Disregards the case of letters.\n\
/L Compares files as ASCII text.\n\
/LBn Sets the maximum consecutive mismatches to the specified\n\
number of lines (default: 100).\n\
/N Displays the line numbers on an ASCII comparison.\n\
/OFF[LINE] Doesn't skip files with offline attribute set.\n\
/T Doesn't expand tabs to spaces (default: expand).\n\
/U Compare files as UNICODE text files.\n\
/W Compresses white space (tabs and spaces) for comparison.\n\
/nnnn Specifies the number of consecutive lines that must match\n\
after a mismatch (default: 2).\n\
[drive1:][path1]filename1\n\
Spécifie le premier fichier ou ensemble de fichiers à comparer.\n\
Specifies the first file or set of files to compare.\n\
[drive2:][path2]filename2\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"
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"
END

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,7 +2,7 @@ LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE
{
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID] [/t]\n"
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID]\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,16 +10,12 @@ 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, "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_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_SEARCH_FAILED, "Error: Could not find process ""%1"".\n"
STRING_ENUM_FAILED, "Error: Unable to enumerate the process list.\n"
STRING_TERMINATE_FAILED, "Error: Unable to terminate process ""%1"".\n"
STRING_SELF_TERMINATION, "Error: Process self-termination is not permitted.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

@@ -9,7 +9,7 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Uso: taskkill [/?] [/f] [/im NomeProcesso | /pid IDProcesso] [/t]\n"
STRING_USAGE, "Uso: taskkill [/?] [/f] [/im NomeProcesso | /pid IDProcesso]\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,10 +23,6 @@ STRINGTABLE
STRING_ENUM_FAILED, "Errore: Impossibile enumerare la lista dei processi.\n"
STRING_TERMINATE_FAILED, "Errore: Impossibile terminare il processo ""%1"".\n"
STRING_SELF_TERMINATION, "Errore: L'auto-terminazione non è consentita.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

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

View File

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

View File

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

View File

@@ -6,7 +6,7 @@ LANGUAGE LANG_ALBANIAN, SUBLANG_NEUTRAL
STRINGTABLE
{
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID] [/t]\n"
STRING_USAGE, "Usage: taskkill [/?] [/f] [/im ProcessName | /pid ProcessID]\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,10 +20,6 @@ STRINGTABLE
STRING_ENUM_FAILED, "Gabim: Në pamundësi për të numëruar listën proceseve.\n"
STRING_TERMINATE_FAILED, "Gabim: Pamundur mbyllja e proceseve ""%1"".\n"
STRING_SELF_TERMINATION, "Gabim: Procesi vetë-përfundimi nuk është i lejuar.\n"
// STRING_CLOSE_CHILD, "Sent termination signal to process with PID %1!u!, child of PID %2!u!.\n"
STRING_CLOSE_CHILD, "Close message sent to top-level windows of process with PID %1!u!, child of PID %2!u!.\n"
STRING_TERM_CHILD, "The process with PID %1!u! (child process of PID %2!u!) has been terminated.\n"
STRING_TERM_CHILD_FAILED, "Error: Unable to terminate process with PID %1!u!, child of PID %2!u!.\n"
STRING_PARAM_TOO_MUCH, "Error: Invalid syntax. '%1' option is not allowed more than '%2!d!' time(s).\n"
STRING_INVALID_SYNTAX, "Error: Invalid syntax.\n"
}

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@@ -35,8 +35,6 @@
#define STRING_ENUM_FAILED 112
#define STRING_TERMINATE_FAILED 113
#define STRING_SELF_TERMINATION 114
#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
#define STRING_PARAM_TOO_MUCH 115
#define STRING_INVALID_SYNTAX 116

View File

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

View File

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

View File

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

View File

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

View File

@@ -7,7 +7,6 @@
#include "precomp.h"
#include "CRegWatcher.h"
#include <ime/indicml.h>
// The event handles to use in watching
HANDLE CRegWatcher::s_ahWatchEvents[WATCHENTRY_MAX] = { NULL };
@@ -207,7 +206,7 @@ CRegWatcher::KillInternat()
}
// Kill the "Indicator" window (that internat.exe creates)
HWND hwndInternat = ::FindWindow(INDICATOR_CLASS, NULL);
HWND hwndInternat = ::FindWindow(TEXT("Indicator"), NULL);
if (hwndInternat)
::PostMessage(hwndInternat, WM_CLOSE, 0, 0);
}

View File

@@ -15,7 +15,6 @@
#include <tchar.h>
#include <strsafe.h>
#include <msctf.h>
#include <msctf_undoc.h>
#include <ctfutb.h>
#include <ctffunc.h>
#include <cicbase.h>

View File

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -40,9 +40,6 @@
#ifdef LANGUAGE_IT_IT
#include "lang/it-IT.rc"
#endif
#ifdef LANGUAGE_JA_JP
#include "lang/ja-JP.rc"
#endif
#ifdef LANGUAGE_PL_PL
#include "lang/pl-PL.rc"
#endif

View File

@@ -1,7 +0,0 @@
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE
BEGIN
IDS_APP_TITLE "ReactOS クラッシュレポーター"
IDS_USER_ALERT_MESSAGE "アプリケーション %ls がクラッシュしました。このクラッシュに関する情報は次の場所に保存されました:\n\n%ls"
END

View File

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

View File

@@ -3,7 +3,7 @@
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Romanian resource file
* TRANSLATORS: Copyright 2011-2019 Ștefan Fulea <stefan.fulea@mail.com>
* Copyright 2023-2025 Andrei Miloiu <miloiuandrei@gmail.com>
* Copyright 2023 Andrei Miloiu <miloiuandrei@gmail.com>
*/
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
@@ -11,22 +11,22 @@ LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
IDD_MAIN_DIALOG DIALOGEX 0, 0, 478, 280
STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
CAPTION "Instrument de diagnosticare ReactX"
CAPTION "Diagnostic ReactX"
FONT 8, "MS Shell Dlg"
BEGIN
CONTROL "Tab1", IDC_TAB_CONTROL, "SysTabControl32", WS_TABSTOP, 2, 2, 474, 250
PUSHBUTTON "&Ajutor", IDC_BUTTON_HELP, 2, 260, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED
DEFPUSHBUTTON "&Pagina următoare", IDC_BUTTON_NEXT, 187, 260, 120, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "&Salvare a tuturor informațiilor…", IDC_BUTTON_SAVE_INFO, 311, 260, 110, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED
PUSHBUTTON "Î&nchidere", IDC_BUTTON_EXIT, 425, 260, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "&Manual…", IDC_BUTTON_HELP, 2, 260, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED
DEFPUSHBUTTON "&Următorul compartiment", IDC_BUTTON_NEXT, 187, 260, 120, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "S&alvare informații…", IDC_BUTTON_SAVE_INFO, 311, 260, 110, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_DISABLED
PUSHBUTTON "Î&nchide", IDC_BUTTON_EXIT, 425, 260, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
IDD_SYSTEM_DIALOG DIALOGEX 0, 0, 462, 220
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Acest instrument raportează informații detaliate despre componentele ReactX și driverele instalate pe sistem.", IDC_STATIC, 5, 0, 443, 17
LTEXT "Dacă întâmpinați o problemă cu ReactX și știți ce este, atunci faceți clic pe fila corespunzătoare de mai sus. Dacă nu, puteți face clic pe butonul ""Pagina următoare"" de mai jos pentru a vizita fiecare pagină în succesiune.", IDC_STATIC, 5, 15, 443, 25
LTEXT "Acest instrument oferă informații detaliate despre componentele ReactX și drivere instalate în sistem.", IDC_STATIC, 5, 0, 443, 17
LTEXT "Dacă aveți la cunoștință careva probleme la o anumită categorie, mergeți la compartimentul corespunzător de mai sus. Altfel, puteți utiliza butonul „Următorul compartiment” de mai jos pentru a trece secvențial prin fiecare categorie.", IDC_STATIC, 5, 15, 443, 25
GROUPBOX "Informații despre sistem", IDC_STATIC, 5, 35, 452, 150, SS_RIGHT
LTEXT "Data/Ora curentă:", IDC_STATIC, 70, 50, 80, 10, SS_RIGHT
LTEXT "Numele calculatorului:", IDC_STATIC, 70, 60, 80, 10, SS_RIGHT
@@ -60,11 +60,11 @@ BEGIN
GROUPBOX "Dispozitiv", IDC_STATIC, 5, 0, 250, 95
RTEXT "Nume:", IDC_STATIC, 20, 10, 70, 10
RTEXT "Producător:", IDC_STATIC, 20, 20, 70, 10
RTEXT "Tipul chip-ului:", IDC_STATIC, 20, 30, 70, 10
RTEXT "Tipul DAC:", IDC_STATIC, 20, 40, 70, 10
RTEXT "Mem. tot. aprox.:", IDC_STATIC, 20, 50, 70, 10
RTEXT "Mod afișare curentă:", IDC_STATIC, 20, 60, 70, 10
RTEXT "Monitor:", IDC_STATIC, 20, 70, 70, 10
RTEXT "Tipul cipului:", IDC_STATIC, 20, 30, 70, 10
RTEXT "Tipul CDA:", IDC_STATIC, 20, 40, 70, 10
RTEXT "Memorie aprox.:", IDC_STATIC, 20, 50, 70, 10
RTEXT "Afișare curentă:", IDC_STATIC, 20, 60, 70, 10
RTEXT "Ecran:", IDC_STATIC, 20, 70, 70, 10
EDITTEXT IDC_STATIC_ADAPTER_ID, 95, 10, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_VENDOR, 95, 20, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_CHIP, 95, 30, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -73,10 +73,10 @@ BEGIN
EDITTEXT IDC_STATIC_ADAPTER_MODE, 95, 60, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_MONITOR, 95, 70, 150, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "Driver", IDC_STATIC, 260, 0, 197, 95
RTEXT "Driver principal:", IDC_STATIC, 275, 10, 55, 10
RTEXT "Driver primar:", IDC_STATIC, 275, 10, 55, 10
RTEXT "Versiune:", IDC_STATIC, 275, 20, 55, 10
RTEXT "Dată:", IDC_STATIC, 275, 30, 55, 10
RTEXT "Logo WHQL:", IDC_STATIC, 275, 40, 55, 10
RTEXT "Semnăt. WHQL:", IDC_STATIC, 275, 40, 55, 10
RTEXT "Mini-VDD:", IDC_STATIC, 275, 50, 55, 10
RTEXT "VDD:", IDC_STATIC, 275, 60, 55, 10
RTEXT "Versiune DDI:", IDC_STATIC, 275, 70, 55, 10
@@ -87,18 +87,18 @@ BEGIN
EDITTEXT IDC_STATIC_ADAPTER_MINIVDD, 335, 50, 120, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_VDD, 335, 60, 120, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_DDI, 335, 70, 120, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "Caracteristici ReactX", IDC_STATIC, 5, 97, 452, 70
GROUPBOX "Funcționalități ReactX", IDC_STATIC, 5, 97, 452, 70
RTEXT "Accelerare DirectDraw:", IDC_STATIC, 15, 115, 110, 12
RTEXT "Accelerare Direct3D:", IDC_STATIC, 15, 130, 110, 12
RTEXT "Accelerare a texturilor AGP:", IDC_STATIC, 15, 145, 110, 12
RTEXT "Accelerare Textură AGP:", IDC_STATIC, 15, 145, 110, 12
LTEXT "", IDC_STATIC_DDSTATE, 130, 115, 40, 10
LTEXT "", IDC_STATIC_D3DSTATE, 130, 130, 40, 10
LTEXT "", IDC_STATIC_AGPSTATE, 130, 145, 40, 10
PUSHBUTTON "Activare", IDC_BUTTON_DDRAW, 170, 112, 60, 14, WS_DISABLED
PUSHBUTTON "Activare", IDC_BUTTON_D3D, 170, 128, 60, 14, WS_DISABLED
PUSHBUTTON "Activare", IDC_BUTTON_AGP, 170, 144, 60, 14, WS_DISABLED
PUSHBUTTON "Testare DirectDraw", IDC_BUTTON_TESTDD, 250, 112, 80, 14
PUSHBUTTON "Testare Direct3D", IDC_BUTTON_TEST3D, 250, 128, 80, 14
PUSHBUTTON "Activează", IDC_BUTTON_DDRAW, 170, 112, 60, 14, WS_DISABLED
PUSHBUTTON "Activează", IDC_BUTTON_D3D, 170, 128, 60, 14, WS_DISABLED
PUSHBUTTON "Activează", IDC_BUTTON_AGP, 170, 144, 60, 14, WS_DISABLED
PUSHBUTTON "Testează DirectDraw", IDC_BUTTON_TESTDD, 250, 112, 80, 14
PUSHBUTTON "Testează Direct3D", IDC_BUTTON_TEST3D, 250, 128, 80, 14
GROUPBOX "Note", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_TEXT_INFO, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -124,7 +124,7 @@ BEGIN
RTEXT "Nume:", IDC_STATIC, 275, 10, 55, 10
RTEXT "Versiune:", IDC_STATIC, 275, 20, 55, 10
RTEXT "Dată:", IDC_STATIC, 275, 30, 55, 10
RTEXT "Logo WHQL:", IDC_STATIC, 275, 40, 55, 10
RTEXT "Semnătură WHQL:", IDC_STATIC, 275, 40, 55, 10
RTEXT "Alte fișiere:", IDC_STATIC, 275, 50, 55, 10
RTEXT "Furnizor:", IDC_STATIC, 275, 60, 55, 10
EDITTEXT IDC_STATIC_DSOUND_DRIVER, 335, 10, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -133,10 +133,10 @@ BEGIN
EDITTEXT IDC_STATIC_DSOUND_LOGO, 335, 40, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_DSOUND_FILES, 335, 50, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
EDITTEXT IDC_STATIC_ADAPTER_PROVIDER, 335, 60, 100, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "Caracteristici ReactX", IDC_STATIC, 5, 97, 452, 70
GROUPBOX "Funcționalități ReactX", IDC_STATIC, 5, 97, 452, 70
CONTROL "", IDC_SLIDER_DSOUND, "msctls_trackbar32", TBS_BOTTOM | TBS_AUTOTICKS | WS_TABSTOP, 110, 125, 80, 17
RTEXT "Hardware de sunet\nNivel de accelerare:", IDC_STATIC, 10, 125, 90, 20, WS_DISABLED
PUSHBUTTON "Testare DirectSound", IDC_BUTTON_TESTDSOUND, 270, 125, 80, 14, WS_DISABLED
RTEXT "Echipament de sunet\nNivel de accelerare::", IDC_STATIC, 10, 125, 90, 20, WS_DISABLED
PUSHBUTTON "Testează DirectSound", IDC_BUTTON_TESTDSOUND, 270, 125, 80, 14, WS_DISABLED
GROUPBOX "Note", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_TEXT_DSOUNDINFO, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -148,13 +148,13 @@ BEGIN
RTEXT "Colecție de MIDI DLS generală:", IDC_STATIC, 0, 0, 100, 10
EDITTEXT IDC_MIDI_DLS_COLLECTION, 105, 0, 250, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
GROUPBOX "Porturi de muzică", IDC_STATIC, 5, 10, 452, 85
GROUPBOX "Caracteristici ReactX", IDC_STATIC, 5, 97, 452, 70
GROUPBOX "Funcționalități ReactX", IDC_STATIC, 5, 97, 452, 70
LTEXT "Port de accelerare implicit:", IDC_STATIC, 15, 120, 95, 17
LTEXT "", IDC_STATIC_DEFAULT_PORT_ACCELERATION, 115, 120, 50, 10
PUSHBUTTON "Dezactivează", IDC_BUTTON_DISABLEDMUSIC, 75, 135, 80, 14, WS_DISABLED
LTEXT "Testare utilizare port:", IDC_STATIC, 180, 105, 100, 10
LISTBOX IDC_DMUSIC_TEST_LIST, 180, 115, 180, 45, LBS_NOINTEGRALHEIGHT | LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "Testare DirectMusic", IDC_BUTTON_TESTDMUSIC, 370, 145, 80, 14, WS_DISABLED
PUSHBUTTON "Testează DirectMusic", IDC_BUTTON_TESTDMUSIC, 370, 145, 80, 14, WS_DISABLED
GROUPBOX "Note", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_MUSIC_NOTES, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -176,12 +176,12 @@ IDD_NETWORK_DIALOG DIALOGEX 0, 0, 462, 220
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Furnizori de servicii DirectPlay înregistrați", IDC_STATIC, 5, 0, 452, 75
GROUPBOX "Furnizori înregistrați de servicii DirectPlay", IDC_STATIC, 5, 0, 452, 75
CONTROL "", IDC_LIST_PROVIDER, "SysListView32", LVS_REPORT | WS_CHILD | WS_BORDER | WS_TABSTOP, 15, 12, 432, 55
GROUPBOX "Aplicații Lobbyable DirectPlay înregistrate", IDC_STATIC, 5, 77, 452, 55
GROUPBOX "Caracteristici ReactX", IDC_STATIC, 5, 133, 452, 35
GROUPBOX "Aplicații înregistrate pentru DirectPlay", IDC_STATIC, 5, 77, 452, 55
GROUPBOX "Funcționalități ReactX", IDC_STATIC, 5, 133, 452, 35
PUSHBUTTON "Opțiuni de voce DirectPlay", IDC_BUTTON_VOICE_OPTIONS, 10, 145, 90, 14, WS_DISABLED
PUSHBUTTON "Testare DirectPlay", IDC_BUTTON_TESTDPLAY, 130, 145, 80, 14, WS_DISABLED
PUSHBUTTON "Testează DirectPlay", IDC_BUTTON_TESTDPLAY, 130, 145, 80, 14, WS_DISABLED
GROUPBOX "Note", IDC_STATIC, 5, 170, 452, 50
EDITTEXT IDC_NETWORK_NOTES, 15, 182, 432, 30, ES_LEFT | WS_BORDER | ES_READONLY | WS_TABSTOP
END
@@ -190,73 +190,73 @@ IDD_HELP_DIALOG DIALOGEX 0, 0, 462, 220
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Încă nu găsiți informațiile pe care le căutați? Iată câteva lucruri suplimentare pe care le puteți face:", IDC_STATIC, 5, 0, 300, 10
LTEXT "Încă nu ați găsit informația necesară? Iată câteva lucruri suplimentare pe care le puteți face:", IDC_STATIC, 5, 0, 300, 10
PUSHBUTTON "Informații de sistem", IDC_BUTTON_SYSINFO, 5, 20, 80, 14, WS_DISABLED
LTEXT "Afișează informații suplimentare de sistem", IDC_STATIC, 90, 23, 300, 10
PUSHBUTTON "Ajust. rata de împrosp.", IDC_BUTTON_DDRAW_REFRESH, 5, 40, 80, 14, WS_DISABLED
LTEXT "Ignoră rata de reîmprospătare pentru DirectDraw", IDC_STATIC, 90, 43, 300, 10
LTEXT "Afișează informații suplimantare de sistem", IDC_STATIC, 90, 23, 300, 10
PUSHBUTTON "Ajustează rata de împrospătare", IDC_BUTTON_DDRAW_REFRESH, 5, 40, 80, 14, WS_DISABLED
LTEXT "Ajustează rata de împrospătare pentru DirectDraw", IDC_STATIC, 90, 43, 300, 10
END
STRINGTABLE
BEGIN
IDS_MAIN_DIALOG "Instrument de diagnosticare ReactX"
IDS_MAIN_DIALOG "Diagnostic ReactX"
IDS_SYSTEM_DIALOG "Sistem"
IDS_DISPLAY_DIALOG "Afișaj"
IDS_DISPLAY_DIALOG "Ecran"
IDS_SOUND_DIALOG "Sunet"
IDS_MUSIC_DIALOG "Muzică"
IDS_INPUT_DIALOG "Intrare"
IDS_INPUT_DIALOG "Intrări"
IDS_NETWORK_DIALOG "Rețea"
IDS_HELP_DIALOG "Ajutor"
IDS_FORMAT_MB "%I64uMB de RAM"
IDS_FORMAT_SWAP "%I64u (de) MB folosit (folosiți), %I64u (de) MB disponibil(i)"
IDS_FORMAT_UNIPROC "%s (%u CPU)"
IDS_FORMAT_MPPROC "%s (%u CPUs)"
IDS_VERSION_UNKNOWN "Versiune necunoscută"
IDS_HELP_DIALOG "Asistență"
IDS_FORMAT_MB "%I64u Mo memorie"
IDS_FORMAT_SWAP "%I64u Mo utilizată, %I64u Mo disponibilă"
IDS_FORMAT_UNIPROC "%s (%u procesor)"
IDS_FORMAT_MPPROC "%s (%u procesoare)"
IDS_VERSION_UNKNOWN "Versiune neidentificată"
IDS_DEVICE_STATUS_ATTACHED "Conectat"
IDS_DEVICE_STATUS_MISSING "Deconectat"
IDS_DEVICE_STATUS_UNKNOWN "Necunoscut"
IDS_DEVICE_NAME "Numele dispozitivului"
IDS_DEVICE_STATUS_UNKNOWN "Neidentificat"
IDS_DEVICE_NAME "Nume dispozitiv"
IDS_DEVICE_STATUS "Stare"
IDS_DEVICE_CONTROLLER "ID controller-ului"
IDS_DEVICE_MANUFACTURER "ID-ul producătorului"
IDS_DEVICE_PRODUCT "ID-ul produsului"
IDS_DEVICE_FORCEFEEDBACK "Forțare a driverului de feedback"
IDS_DEVICE_CONTROLLER "ID controlor"
IDS_DEVICE_MANUFACTURER "ID producător"
IDS_DEVICE_PRODUCT "ID produs"
IDS_DEVICE_FORCEFEEDBACK "Forțează reacția driverului"
IDS_NOT_APPLICABLE "n/a"
IDS_OPTION_YES "Da"
IDS_DIRECTPLAY_COL_NAME1 "Nume"
IDS_DIRECTPLAY_COL_NAME2 "Registru"
IDS_DIRECTPLAY_COL_NAME3 "Fișier"
IDS_DIRECTPLAY_COL_NAME4 "Versiune"
IDS_DIRECTPLAY8_MODEMSP "Furnizor de servicii de modem DirectPlay8"
IDS_DIRECTPLAY8_SERIALSP "Furnizor de servicii seriale DirectPlay8"
IDS_DIRECTPLAY8_IPXSP "Furnizor de servicii DirectPlay8 IPX"
IDS_DIRECTPLAY8_TCPSP "DirectPlay8 TCP/IP Service Provider"
IDS_DIRECTPLAY8_MODEMSP "Furnizor de serviciu Modem-DirectPlay8"
IDS_DIRECTPLAY8_SERIALSP "Furnizor de serviciu Serial-DirectPlay8"
IDS_DIRECTPLAY8_IPXSP "Furnizor de serviciu IPX-DirectPlay8"
IDS_DIRECTPLAY8_TCPSP "Furnizor de serviciu TCP/IP-DirectPlay8"
IDS_DIRECTPLAY_TCPCONN "Conexiune de Internet TCP/IP pentru DirectPlay"
IDS_DIRECTPLAY_IPXCONN "Conexiune IPX pentru DirectPlay"
IDS_DIRECTPLAY_MODEMCONN "Conexiune de modem pentru DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Conexiune serială pentru DirectPlay"
IDS_REG_SUCCESS "OK"
IDS_DIRECTPLAY_MODEMCONN "Conexiune Modem pentru DirectPlay"
IDS_DIRECTPLAY_SERIALCONN "Conexiune Serială pentru DirectPlay"
IDS_REG_SUCCESS "Î&nchide"
IDS_REG_FAIL "Eroare"
IDS_DDTEST_ERROR "Testul de randare DirectDraw a eșuat.\nVă rugăm să consultați notele pentru mai multe informații."
IDS_DDTEST_DESCRIPTION "Acesta va porni testarea interfeței DirectDraw. Doriți să continuați?"
IDS_DDPRIMARY_DESCRIPTION "Acest test va folosi DirectDraw pentru a desena pe suprafața principală.\nAr trebui desenate dreptunghiuri alb-negru. Doriți să continuați?"
IDS_DDPRIMARY_RESULT "Ați văzut dreptunghiuri alb-negru?"
IDS_DDOFFSCREEN_DESCRIPTION "Acest test va folosi DirectDraw pentru a desena un tampon în afara ecranului. Ar trebui desenat un dreptunghi alb în mișcare. Doriți să continuați?"
IDS_DDOFFSCREEN_RESULT "Ați văzut dreptunghi alb în mișcare?"
IDS_DDFULLSCREEN_DESCRIPTION "Acest test va folosi DirectDraw pentru a desena în modul ecran complet. Ar trebui desenat un dreptunghi alb în mișcare. Doriți să continuați?"
IDS_DDFULLSCREEN_RESULT "Ați văzut dreptunghi alb în mișcare în modul ecran complet?"
IDS_FORMAT_ADAPTER_MEM "%u (de) MB"
IDS_FORMAT_ADAPTER_MODE "%d x %d (%u (de) biți)(%uHz)"
IDS_DDTEST_ERROR "Testul a eșuat!"
IDS_DDTEST_DESCRIPTION "Urmează testele de interfață DirectDraw. Continuați?"
IDS_DDPRIMARY_DESCRIPTION "Testul următor va utiliza DirectDraw pentru a desena dreptunghiuri albe și negre pe suprafața primară. Continuați?"
IDS_DDPRIMARY_RESULT "Dreptunghiurile albe și negre au fost vizibile?"
IDS_DDOFFSCREEN_DESCRIPTION "Testul următor va utiliza DirectDraw pentru desenarea unui dreptunghi alb în mișcare utilizând o memorie tampon din afara ecranului. Continuați?"
IDS_DDOFFSCREEN_RESULT "Dreptunghiul alb în mișcare a fost vizibil?"
IDS_DDFULLSCREEN_DESCRIPTION "Testul următor va utiliza DirectDraw pentru desenarea unui dreptunghi alb în mișcare utilizând tot ecranul. Continuați?"
IDS_DDFULLSCREEN_RESULT "Pe ecranul complet, dreptunghiul alb în mișcare a fost vizibil?"
IDS_FORMAT_ADAPTER_MEM "%u Mo"
IDS_FORMAT_ADAPTER_MODE "%d x %d (%u biți)(%uHz)"
IDS_OPTION_NO "Nu"
IDS_D3DTEST_DESCRIPTION "Acesta va porni testarea interfeței Direct3D. Doriți să continuați?"
IDS_D3DTEST_D3Dx "Acest test va folosi interfața Direct3D %u accelerată hardware."
IDS_OS_VERSION "%s %s (%d.%d, Subversiunea %d)"
IDS_D3DTEST_DESCRIPTION "Urmează testul de interfață Direct3D. Continuați?"
IDS_D3DTEST_D3Dx "Testul următor va utiliza interfața Direct3D %u cu accelerare de echipament fizic."
IDS_OS_VERSION "%s %s (%d.%d, Build %d)"
IDS_DMUSIC_DESC "Descriere"
IDS_DMUSIC_TYPE "Tip"
IDS_DMUSIC_KERNEL "Modul nucleu"
IDS_DMUSIC_IO "I/E"
IDS_DMUSIC_DLS "Suportă DLS"
IDS_DMUSIC_KERNEL "Mod nucleu"
IDS_DMUSIC_IO "In/Ex"
IDS_DMUSIC_DLS "DLS de suport"
IDS_DMUSIC_EXT "Extern"
IDS_DMUSIC_PORT "Port implicit"
IDS_DDDISABLE_MSG "Acesta va dezactiva toată accelerarea hardware pentru DirectDraw pe toate dispozitivele de afișare.\nDoriți să continuați?\n"
IDS_DDDISABLE_MSG "Accelerările fizice DirectDraw vor fi dezactivate pentru toate dispozitivele.\nDoriți să continuați?\n"
END

View File

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

View File

@@ -40,9 +40,6 @@
#ifdef LANGUAGE_IT_IT
#include "lang/it-IT.rc"
#endif
#ifdef LANGUAGE_JA_JP
#include "lang/ja-JP.rc"
#endif
#ifdef LANGUAGE_LT_LT
#include "lang/lt-LT.rc"
#endif

View File

@@ -1,13 +0,0 @@
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STRINGTABLE
BEGIN
IDS_USAGE "FINDSTR: 文字列を含むファイルのすべての行を出力します。\n\n\
FIND [ /C ] [ /I ] [ /N ] [ /V ] ""文字列"" [ ファイル... ]\n\
/C 文字列を含む行の個数を数えます\n\
/I 大文字小文字を無視します\n\
/N 表示される行に1から番号を付けます\n\
/V 文字列を含まない行を出力します"
IDS_NO_SUCH_FILE "FINDSTR: %s: そのようなファイルはありません\n"
IDS_CANNOT_OPEN "FINDSTR: %s: ファイルが開けません\n"
END

View File

@@ -18,12 +18,12 @@ BEGIN
IDS_ERROR_NOMEM "Mémoire insuffisante pour terminer l'opération."
IDS_ERROR_NOFONT "Le fichier %1 n'est pas un fichier de polices valide."
IDS_ERROR_NOCLASS "Impossible d'initialiser la classe de fenêtre."
IDS_ERROR_ISINSTALLED "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_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_FILTER_LIST "Toutes polices supportées (*.fon;*.fnt;*.ttf;*.ttc;*.otf;*.otc)\0*.fon;*.fnt;*.ttf;*.ttc;*.otf;*.otc\0\
Fichier de polices (*.fon;*.fnt)\0*.fon;*.fnt\0\
Fichier de polices TrueType (*.ttf)\0*.ttf\0\

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -9,23 +9,23 @@ BEGIN
MENUITEM SEPARATOR
MENUITEM "終了(&E)", IDM_EXIT
END
POPUP "再生(&P)"
POPUP "&Play"
BEGIN
MENUITEM "再生/再開(&P)\tCtrl+P", IDC_PLAY
MENUITEM "停止(&O)\tCtrl+S", IDC_STOP
MENUITEM "Play/&Pause\tCtrl+P", IDC_PLAY
MENUITEM "St&op\tCtrl+S", IDC_STOP
MENUITEM SEPARATOR
MENUITEM "リピート(&T)\tCtrl+T", IDM_REPEAT
MENUITEM "Repea&t\tCtrl+T", IDM_REPEAT
END
POPUP "表示(&V)"
POPUP "&View"
BEGIN
MENUITEM "単一ウィンドウモード(&M)", IDM_SWITCHVIEW
MENUITEM "Single-Window &Mode", IDM_SWITCHVIEW
END
POPUP "デバイス(&D)"
POPUP "&Device"
BEGIN
MENUITEM SEPARATOR
MENUITEM "プロパティ(&P)", IDM_DEVPROPS
MENUITEM "&Properties", IDM_DEVPROPS
MENUITEM SEPARATOR
MENUITEM "音量調節(&V)", IDM_VOLUMECTL
MENUITEM "&Volume Control", IDM_VOLUMECTL
END
POPUP "ヘルプ(&H)"
BEGIN
@@ -44,14 +44,14 @@ END
STRINGTABLE
BEGIN
IDS_MODE_UNKNOWN "不明"
IDS_MODE_OPEN "開きました"
IDS_MODE_STOP "停止中"
IDS_MODE_PLAY "再生中"
IDS_MODE_PAUSE "一時停止中"
IDS_MODE_RECORD "録音中"
IDS_MODE_SEEK "シーク中"
IDS_MODE_NOT_READY "準備ができていません"
IDS_MODE_UNKNOWN "Unknown"
IDS_MODE_OPEN "Opened"
IDS_MODE_STOP "Stopped"
IDS_MODE_PLAY "Playing"
IDS_MODE_PAUSE "Paused"
IDS_MODE_RECORD "Recording"
IDS_MODE_SEEK "Seeking"
IDS_MODE_NOT_READY "Not ready"
IDS_ALL_TYPES_FILTER "すべてのサポートされたファイル"
IDS_TOOLTIP_PLAY "再生"
IDS_TOOLTIP_STOP "停止"
@@ -60,8 +60,8 @@ BEGIN
IDS_TOOLTIP_SEEKBACK "後ろへシーク"
IDS_TOOLTIP_SEEKFORW "前へシーク"
IDS_TOOLTIP_FORWARD "前へスキップ"
IDS_TOOLTIP_PAUSE "一時停止"
IDS_TOOLTIP_PAUSE "Pause"
IDS_APPTITLE "ReactOS マルチメディア プレーヤー"
IDS_PLAY "再生"
IDS_DEFAULTMCIERRMSG "このエラーの説明はありません。"
IDS_DEFAULTMCIERRMSG "No description is available for this error."
END

View File

@@ -1,171 +0,0 @@
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
IDD_MSCONFIG_DIALOG DIALOGEX 0, 0, 378, 220
STYLE DS_SHELLFONT | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
CAPTION "システム構成プログラム"
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "Tab1", IDC_TAB, "SysTabControl32", WS_TABSTOP, 2, 2, 374, 195
DEFPUSHBUTTON "OK", IDOK, 211, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "ヘルプ(&H)", IDC_BTN_HELP, 2, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "キャンセル", IDCANCEL, 267, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
PUSHBUTTON "適用", IDC_BTN_APPLY, 323, 201, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
IDD_STARTUP_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "List3", IDC_STARTUP_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL |
LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
PUSHBUTTON "すべて有効化(&A)", IDC_BTN_STARTUP_ACTIVATE, 223, 155, 66, 14
PUSHBUTTON "すべて無効化(&D)", IDC_BTN_STARTUP_DEACTIVATE, 295, 155, 66, 14
END
IDD_SYSTEM_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "", IDC_SYSTEM_TREE, "SysTreeView32", TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_EDITLABELS | TVS_SHOWSELALWAYS | WS_CHILD |
WS_VISIBLE | WS_BORDER | WS_TABSTOP, 2, 1, 280, 148
PUSHBUTTON "上へ(&U)", IDC_BTN_SYSTEM_UP, 290, 5, 66, 14
PUSHBUTTON "下へ(&D)", IDC_BTN_SYSTEM_DOWN, 290, 25, 66, 14
PUSHBUTTON "有効化(&E)", IDC_BTN_SYSTEM_ENABLE, 290, 50, 66, 14
PUSHBUTTON "無効化(&I)", IDC_BTN_SYSTEM_DISABLE, 290, 70, 66, 14
PUSHBUTTON "検索(&F)", IDC_BTN_SYSTEM_FIND, 290, 95, 66, 14
PUSHBUTTON "新規(&N)", IDC_BTN_SYSTEM_NEW, 290, 115, 66, 14
PUSHBUTTON "編集(&T)", IDC_BTN_SYSTEM_EDIT, 290, 135, 66, 14
PUSHBUTTON "すべて有効化(&B)", IDC_BTN_SYSTEM_ACTIVATE, 123, 155, 66, 14
PUSHBUTTON "すべて無効化(&L)", IDC_BTN_SYSTEM_DEACTIVATE, 195, 155, 66, 14
END
IDD_TOOLS_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "List2", IDC_TOOLS_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL |
LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 2, 1, 360, 134
EDITTEXT IDC_TOOLS_CMDLINE, 1, 139, 360, 12, ES_READONLY
PUSHBUTTON "実行(&R)", IDC_BTN_RUN, 311, 155, 50, 14, WS_CHILD | WS_VISIBLE | WS_TABSTOP
END
IDD_SERVICES_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CONTROL "List1", IDC_SERVICES_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL |
LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 2, 1, 360, 148
PUSHBUTTON "すべて有効化(&A)", IDC_BTN_SERVICES_ACTIVATE, 223, 155, 66, 14
PUSHBUTTON "すべて無効化(&D)", IDC_BTN_SERVICES_DEACTIVATE, 295, 155, 66, 14
END
IDD_GENERAL_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
GROUPBOX "起動の種類の選択", -1, 10, 10, 340, 150, 0, WS_EX_TRANSPARENT
CONTROL "通常起動(&N) - すべてのデバイスドライバとサービスを読み込む", IDC_CBX_NORMAL_START, "Button", 0x50010009, 20, 30, 260, 10
CONTROL "診断的起動(&D) - 基本的なデバイスとサービスのみを読み込む", IDC_CBX_DIAGNOSTIC_START, "Button", 0x50010009, 20, 45, 260, 10
CONTROL "選択的起動(&E)", IDC_CBX_SELECTIVE_STARTUP, "Button", 0x50010009, 20, 60, 260, 10
AUTOCHECKBOX "ファイル SYSTEM.INI を処理(&R)", IDC_CBX_SYSTEM_INI, 30, 80, 260, 10
AUTOCHECKBOX "システムサービスの読み込み(&L)", IDC_CBX_SYSTEM_SERVICE, 30, 95, 260, 10
AUTOCHECKBOX "スタートアップ項目を読み込む(&O)", IDC_CBX_STARTUP_ITEM, 30, 110, 260, 10
END
IDD_FREELDR_PAGE DIALOGEX 0, 0, 362, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
LISTBOX IDC_LIST_BOX, 10, 10, 340, 50, WS_CHILD | WS_VISIBLE | WS_TABSTOP |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL
PUSHBUTTON "すべての起動パスを確認する(&C)", IDC_BTN_CHECK_BOOT_PATH, 10, 65, 70, 12
PUSHBUTTON "デフォルトにする(&S)", IDC_BTN_SET_DEFAULT_BOOT, 100, 65, 70, 12
PUSHBUTTON "上へ(&U)", IDC_BTN_MOVE_UP_BOOT_OPTION, 190, 65, 70, 12
PUSHBUTTON "下へ(&D)", IDC_BTN_MOVE_DOWN_BOOT_OPTION, 280, 65, 70, 12
GROUPBOX "起動オプション", -1, 10, 80, 250, 90, 0, WS_EX_TRANSPARENT
CHECKBOX "/SA&FEBOOT", IDC_CBX_SAFE_BOOT, 15, 90, 55, 10
CHECKBOX "/&NOGUIBOOT", IDC_CBX_NO_GUI_BOOT, 15, 105, 60, 10
CHECKBOX "/&BOOTLOG", IDC_CBX_BOOT_LOG, 15, 120, 50, 10
CHECKBOX "/BAS&EVIDEO", IDC_CBX_BASE_VIDEO, 15, 135, 55, 10
CHECKBOX "/S&OS", IDC_CBX_SOS, 15, 150, 50, 10
PUSHBUTTON "詳細オプション(&V)...", IDC_BTN_ADVANCED_OPTIONS, 100, 150, 70, 12
LTEXT "タイムアウト(&T):", -1, 280, 91, 30, 10
EDITTEXT IDC_TXT_BOOT_TIMEOUT, 310, 90, 25, 12, ES_LEFT
LTEXT "秒", -1, 340, 91, 15, 10
END
IDD_FREELDR_ADVANCED_PAGE DIALOGEX 0, 0, 175, 175
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 9, "MS UI Gothic"
BEGIN
CHECKBOX "/&MAXMEM=", IDC_CBX_MAX_MEM, 10, 10, 50, 10
EDITTEXT IDC_TXT_MAX_MEM, 80, 10, 60, 12
CONTROL "", IDC_SCR_MAX_MEM, "msctls_updown32", 0x50000000, 140, 10, 11, 11
CHECKBOX "/&NUMPROC=", IDC_CBX_NUM_PROC, 10, 25, 50, 10
COMBOBOX IDC_DRP_NUM_PROC, 80, 25, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
CHECKBOX "/&PCILOCK", IDC_CBX_PCI_LOCK, 10, 40, 50, 10
CHECKBOX "/P&ROFILE", IDC_CBX_PROFILE, 10, 55, 50, 10
CHECKBOX "/&IRQ", IDC_CBX_IRQ, 10, 70, 40, 12
EDITTEXT IDC_TXT_IRQ, 80, 70, 60, 12, ES_LEFT
CHECKBOX "/&DEBUG", IDC_CBX_DEBUG, 10, 85, 40, 10
CHECKBOX "/D&EBUGPORT", IDC_CBX_DEBUG_PORT, 20, 100, 60, 10
COMBOBOX IDC_DRP_DEBUG_PORT, 80, 100, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
CHECKBOX "/&BAUDRATE", IDC_CBX_BAUD_RATE, 20, 115, 50, 10
COMBOBOX IDC_DRP_DRP_BAUD_RATE, 80, 115, 60, 10, CBS_DROPDOWNLIST | CBS_SORT | WS_CHILD | WS_VISIBLE | WS_TABSTOP
CHECKBOX "/&CHANNEL", IDC_CBX_CHANNEL, 20, 130, 50, 10
EDITTEXT IDC_TXT_CHANNEL, 80, 130, 60, 12, ES_LEFT
CONTROL "", IDC_SCR_CHANNEL, "msctls_updown32", 0x50000000, 140, 130, 11, 11
PUSHBUTTON "OK", IDC_OK, 20, 160, 50, 12
PUSHBUTTON "キャンセル", IDC_CANCEL, 100, 160, 50, 12
END
STRINGTABLE
BEGIN
IDS_MSCONFIG "システム構成プログラム"
IDS_TAB_GENERAL "一般"
IDS_TAB_SYSTEM "SYSTEM.INI"
IDS_TAB_FREELDR "FREELDR.INI"
IDS_TAB_SERVICES "サービス"
IDS_TAB_STARTUP "スタートアップ"
IDS_TAB_TOOLS "ツール"
END
STRINGTABLE
BEGIN
IDS_SERVICES_COLUMN_SERVICE "サービス"
IDS_SERVICES_COLUMN_REQ "必要"
IDS_SERVICES_COLUMN_VENDOR "ベンダー"
IDS_SERVICES_COLUMN_STATUS "状態"
END
STRINGTABLE
BEGIN
IDS_TOOLS_COLUMN_NAME "名前"
IDS_TOOLS_COLUMN_DESCR "説明"
IDS_TOOLS_CMD_NAME "コンソール"
IDS_TOOLS_CMD_DESCR ""
IDS_TOOLS_CMD_CMD "cmd.exe"
IDS_TOOLS_INFO_NAME "バージョン"
IDS_TOOLS_INFO_DESCR "バージョン情報を表示します。"
IDS_TOOLS_INFO_CMD "winver.exe"
IDS_TOOLS_REGEDIT_NAME "レジストリ エディタ"
IDS_TOOLS_REGEDIT_DESCR "レジストリ エディタを開きます。"
IDS_TOOLS_REGEDIT_CMD "regedit.exe"
IDS_TOOLS_SYSDM_NAME "システムプロパティ"
IDS_TOOLS_SYSDM_DESCR "このコンピューターに関する情報を表示します。"
IDS_TOOLS_SYSDM_CMD "control.exe"
IDS_TOOLS_SYSDM_PARAM "sysdm.cpl"
IDS_STARTUP_COLUMN_ELEMENT "要素"
IDS_STARTUP_COLUMN_CMD "コマンド"
IDS_STARTUP_COLUMN_PATH "パス"
END
STRINGTABLE
BEGIN
IDS_SERVICES_STATUS_RUNNING "実行中"
IDS_SERVICES_STATUS_STOPPED "停止"
IDS_SERVICES_YES "はい"
IDS_SERVICES_UNKNOWN "不明"
END

View File

@@ -54,9 +54,6 @@ IDI_APPICON ICON "res/msconfig.ico"
#ifdef LANGUAGE_IT_IT
#include "lang/it-IT.rc"
#endif
#ifdef LANGUAGE_JA_JP
#include "lang/ja-JP.rc"
#endif
#ifdef LANGUAGE_KO_KR
#include "lang/ko-KR.rc"
#endif

View File

@@ -28,11 +28,11 @@ BEGIN
CONTROL "Exécuter le fichier &WIN.INI", IDC_CBX_WIN_INI, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 98, 316, 10
CONTROL "C&harger les services système", IDC_CBX_LOAD_SYSTEM_SERVICES, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 110, 316, 10
CONTROL "&Charger les éléments de démarrage", IDC_CBX_LOAD_STARTUP_ITEMS, "Button", BS_AUTO3STATE | WS_TABSTOP, 35, 122, 316, 10
CONTROL "&Utiliser la configuration de démarrage d'origine", IDC_CBX_USE_ORIGINAL_BOOTCFG, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 35, 134, 316, 10
CONTROL "&Utiliser la configuration de démarrage dorigine", 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érique et tous les services", IDC_STATIC, 25, 30, 322, 10
LTEXT "Charger tous les pilotes de périphériques et tous les services", IDC_STATIC, 25, 30, 322, 10
LTEXT "Charger seulement les pilotes de périphérique et les services de base", IDC_STATIC, 25, 58, 322, 10
END

View File

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

View File

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

View File

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

View File

@@ -4,10 +4,11 @@
* PURPOSE: Event Details Control.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#pragma once
#ifndef _EVTDETCTL_H_
#define _EVTDETCTL_H_
/* Optional structure passed by pointer
* as LPARAM to CreateEventDetailsCtrl() */
@@ -24,3 +25,5 @@ HWND
CreateEventDetailsCtrl(HINSTANCE hInstance,
HWND hParentWnd,
LPARAM lParam);
#endif /* _EVTDETCTL_H_ */

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Описание:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Байтове", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDSRADIO, 85, 140, 34, 8
LTEXT "&Данни:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Байтове", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDRADIO, 85, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "Не е намерено описанието на събитие ( %lu ) в източник ( %s ). Възможно е местият компютър да няма нужните сведения в регистъра или DLL файловет, нужни за показване на съобщения от отдалечен компютър.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -81,17 +81,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Datum:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Datum:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Zdroj:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Zdroj:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Č&as:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Čas:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Kategorie:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Kategorie:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "T&yp:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Typ:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&ID události:", IDC_STATIC, 103, 25, 36, 8
LTEXT "ID události:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Uživatel:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Popis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Slova", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Byty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Chcete tento protokol před odstraněním uložit?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "Popis ID události ( %lu ) zdroj ( %s ) nebyl nalezen. Místní počítač neobsahuje potřebné informace v registru nebo chybí DLL soubory pro zobrazení zpráv ze vzdáleného počítače.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -203,7 +201,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "bajtů" // "%s bytes"
IDS_BYTES_FORMAT "byty" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Typ:"
IDS_COPY_EVTSRC "Zdroj:"
IDS_COPY_EVTCAT "Kategorie:"
IDS_COPY_EVTID "ID události:"
IDS_COPY_EVTDATE "Datum:"
IDS_COPY_EVTTIME "Čas:"
IDS_COPY_EVTUSER "Uživatel:"
IDS_COPY_EVTCOMP "Počítač:"
IDS_COPY_EVTTEXT "Popis:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Typ: %s\r\n\
Zdroj: %s\r\n\
Kategorie: %s\r\n\
ID: %s\r\n\
Datum: %s\r\n\
Čas: %s\r\n\
Uživatel: %s\r\n\
Počítač: %s\r\n\
Popis:\r\n%s"
END
STRINGTABLE

View File

@@ -82,21 +82,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Datum:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Datum:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Quelle:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Quelle:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Zeit:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Zeit:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Kategorie:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Kategorie:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Typ:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Typ:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "E&reignis-ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Ereignis-ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "B&enutzer:", IDC_STATIC, 8, 35, 36, 8
LTEXT "&Benutzer:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "C&omputer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Bezeichnung:", IDC_STATIC, 8, 65, 45, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Wörter", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&aten:", IDC_DETAILS_STATIC, 8, 140, 24, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -168,8 +168,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Möchten Sie dieses Protokoll vor dem Löschen speichern?"
IDS_RESTOREDEFAULTS "Möchten Sie alle Einstellungen für dieses Protokoll wieder auf die Standardwerte zurücksetzen?"
IDS_EVENTSTRINGIDNOTFOUND "Die Bezeichnung für die Ereignis-ID ( %lu ) in der Quelle ( %s ) kann nicht gefunden werden. Es könnte sein, dass der lokale Computer die notwendigen Registry Einträge oder Nachrichten DLLs, um Nachrichten entfernter Computer anzuzeigen, nicht besitzt.\n\nDas Ereignis enthält folgende Informationen:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -222,16 +220,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Typ:"
IDS_COPY_EVTSRC "Quelle:"
IDS_COPY_EVTCAT "Kategorie:"
IDS_COPY_EVTID "Ereignis-ID:"
IDS_COPY_EVTDATE "Datum:"
IDS_COPY_EVTTIME "Zeit:"
IDS_COPY_EVTUSER "Benutzer:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Beschreibung:"
IDS_COPY_EVTDATA "Daten:"
IDS_COPY "\
Typ: %s\r\n\
Quelle: %s\r\n\
Kategorie: %s\r\n\
Ereignis-ID: %s\r\n\
Datum: %s\r\n\
Zeit: %s\r\n\
Benutzer: %s\r\n\
Computer: %s\r\n\
Beschreibung:\r\n%s"
END
STRINGTABLE

View File

@@ -81,17 +81,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Πη&γή:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Πηγή:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Ώρα:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Ώρα:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Τύπος:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Τύπος:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Χρήστης:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Περιγραφή:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 87, 140, 34, 8
LTEXT "Δ&εδομένα:", IDC_DETAILS_STATIC, 8, 140, 40, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 87, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -83,21 +83,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "D&ate:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Date:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Source:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Source:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ti&me:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Time:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Category:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Category:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Typ&e:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Type:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&User:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "C&omputer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -107,9 +107,9 @@ BEGIN
LTEXT "&Description:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -169,8 +169,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -223,16 +221,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -84,17 +84,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "&Fecha:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Fecha:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Origen:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Origen:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Hora:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Hora:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Categoría:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Categoría:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&ID de evento:", IDC_STATIC, 103, 25, 36, 8
LTEXT "ID de evento:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Usuario:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -108,9 +108,9 @@ BEGIN
LTEXT "&Descripción:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&atos:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -170,8 +170,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "¿Desea guardar este registro de eventos antes de borrarlo?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "No se pudo recuperar la descripción para el evento con ID ( %lu ) y origen ( %s ). El equipo local puede no tener la información necesaria en el registro o las DLLs necesarias para mostrar los mensajes de un equipo remoto.\n\nLa siguiente información es parte del evento:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -224,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Tipo de evento:"
IDS_COPY_EVTSRC "Fuente del evento:"
IDS_COPY_EVTCAT "Categ. del evento:"
IDS_COPY_EVTID "ID de evento:"
IDS_COPY_EVTDATE "Fecha:"
IDS_COPY_EVTTIME "Hora:"
IDS_COPY_EVTUSER "Usuario:"
IDS_COPY_EVTCOMP "Equipo:"
IDS_COPY_EVTTEXT "Descripción:"
IDS_COPY_EVTDATA "Datos:"
IDS_COPY "\
Tipo de evento: %s\r\n\
Fuente del evento: %s\r\n\
Categ. del evento: %s\r\n\
ID del evento: %s\r\n\
Fecha: %s\r\n\
Hora: %s\r\n\
Usuario: %s\r\n\
Equipo: %s\r\n\
Descripción:\r\n%s"
END
STRINGTABLE

View File

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

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "תיאור:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "בתים", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "נתונים:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "בתים", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "The description for Event ID ( %lu ) in Source ( %s ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -82,21 +82,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Sorgente:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Sorgente:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Ore:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Ore:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "T&ipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "ID &Evento:", IDC_STATIC, 103, 25, 36, 8
LTEXT "IDEvento:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Utente:", IDC_STATIC, 8, 35, 36, 8
LTEXT "&UTente:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Co&mputer:", IDC_STATIC, 8, 45, 36, 8
LTEXT "&Computer:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Descrizione:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ati:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ti:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -168,8 +168,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "La descrizione per l'ID evento ( %lu ) proveniente da ( %s ) non può essere trovata. Il computer locale potrebbe non avere le informazioni sul registry necessarie o i file DLL con i messaggi necessari per la visualizzazione da un computer remoto.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -222,16 +220,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "説明(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "バイト(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "データ(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "バイト(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -168,8 +168,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "このイベントをクリアする前に保存したいですか?"
IDS_RESTOREDEFAULTS "すべての設定をデフォルトに戻しますか?"
IDS_EVENTSTRINGIDNOTFOUND "イベント ID (%lu) (ソース %s 内) に関する説明が見つかりませんでした。 リモート コンピュータからメッセージを表示するために必要なレジストリ情報またはメッセージ DLL ファイルがローカル コンピュータにない可能性があります。\n\n次の情報はイベントの一部です:\n\n"
IDS_CONTFROMBEGINNING "イベント ログの最後に到達しました。最初から続けますか?"
IDS_CONTFROMEND "イベント ログの先頭に到達しました。最後から続けますか?"
END
STRINGTABLE
@@ -222,16 +220,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "イベントの種類:"
IDS_COPY_EVTSRC "イベントのソース:"
IDS_COPY_EVTCAT "イベントのカテゴリ:"
IDS_COPY_EVTID "イベント ID:"
IDS_COPY_EVTDATE "日付:"
IDS_COPY_EVTTIME "時刻:"
IDS_COPY_EVTUSER "ユーザー:"
IDS_COPY_EVTCOMP "コンピューター:"
IDS_COPY_EVTTEXT "説明:"
IDS_COPY_EVTDATA "データ:"
IDS_COPY "\
イベントの種類: %s\r\n\
イベントのソース: %s\r\n\
イベントのカテゴリ: %s\r\n\
イベント ID: %s\r\n\
日付: %s\r\n\
時刻: %s\r\n\
ユーザー: %s\r\n\
コンピューター: %s\r\n\
説明:\r\n%s"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "설명(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "바이트(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "데이터(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "바이트(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "( %s ) 의 이벤트ID ( %lu ) 에 대한 설명을 찾을 수 없습니다. 로컬 컴퓨터가 원격 컴퓨터의 메세지를 표시하는데 필요한 레지스트리나 DLL 파일을 가지지 않고 있을수 있습니다.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "D&ato:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Dato:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Kilde:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Kilde:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ti&d:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Tid:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Katego&ri:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Kategori:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Typ&e:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Type:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Hendelse ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Hendelse ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Br&uker:", IDC_STATIC, 8, 35, 36, 8
LTEXT "&Bruker:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Data&maskin:", IDC_STATIC, 8, 45, 36, 8
LTEXT "&Datamaskin:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Beskrivelse:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "Teg&n", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Da&ta:", IDC_DETAILS_STATIC, 8, 140, 20, 8
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Tegn", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "Beskrivelsen for Hendelse ID ( %lu ) i kilden ( %s ) kan ikke bli finnet. Lokale datamaskinen har ikke nødvendige register informasjon eller melding DLL filer for å vise melding fra en fjern datamaskin.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Event Type:"
IDS_COPY_EVTSRC "Event Source:"
IDS_COPY_EVTCAT "Event Category:"
IDS_COPY_EVTID "Event ID:"
IDS_COPY_EVTDATE "Date:"
IDS_COPY_EVTTIME "Time:"
IDS_COPY_EVTUSER "User:"
IDS_COPY_EVTCOMP "Computer:"
IDS_COPY_EVTTEXT "Description:"
IDS_COPY_EVTDATA "Data:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

View File

@@ -108,9 +108,9 @@ BEGIN
LTEXT "&Opis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&ane:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -170,8 +170,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Czy chcesz zapisać dziennik zdarzeń przed czyszczeniem?"
IDS_RESTOREDEFAULTS "Czy chcesz przywrócić wszystkie ustawienia tego dziennika do wartości domyślnych?"
IDS_EVENTSTRINGIDNOTFOUND "Opis zdarzenia dla danego numeru ID ( %lu ) nie został odnaleziony w źródle ( %s ). Ten komputer może nie miec wystarczających informacji w rejestrze, albo bibliotek DLL, aby wyświetlić wiadomości z komputera zdalnego.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -224,16 +222,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Typ zdarzenia:"
IDS_COPY_EVTSRC "Źródło zdarzenia:"
IDS_COPY_EVTCAT "Kategoria zdarzenia:"
IDS_COPY_EVTID "Identyfikator zdarzenia:"
IDS_COPY_EVTDATE "Data:"
IDS_COPY_EVTTIME "Czas:"
IDS_COPY_EVTUSER "Użytkownik:"
IDS_COPY_EVTCOMP "Komputer:"
IDS_COPY_EVTTEXT "Opis:"
IDS_COPY_EVTDATA "Dane:"
IDS_COPY "\
Typ zdarzenia: %s\r\n\
Źródło zdarzenia: %s\r\n\
Kategoria zdarzenia: %s\r\n\
Idnetyfikator Zdarzenia: %s\r\n\
Data: %s\r\n\
Czas: %s\r\n\
Użytkownik: %s\r\n\
Komputer: %s\r\n\
Opis:\r\n%s"
END
STRINGTABLE

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Fonte:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Fonte:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "T&empo:", IDC_STATIC, 8, 15, 31, 8
LTEXT "Tempo:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Usuário:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Co&mputador:", IDC_STATIC, 8, 45, 36, 8
LTEXT "&Computador:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Descrição:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -167,8 +167,6 @@ BEGIN
IDS_CLEAREVENTS_MSG "Do you want to save this event log before clearing it?"
IDS_RESTOREDEFAULTS "Do you want to restore all settings for this log to their default values?"
IDS_EVENTSTRINGIDNOTFOUND "A descrição para Event ID ( %lu ) em Fonte ( %s ) não foi encontrado. O computador local talvez não possua a informação de registro necessária ou mensagem de arquivos DLL para exibir mensagens de um computador remoto.\n\nThe following information is part of the event:\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
END
STRINGTABLE
@@ -211,7 +209,7 @@ STRINGTABLE
BEGIN
IDS_COLUMNTYPE "Tipo"
IDS_COLUMNDATE "Data"
IDS_COLUMNTIME "Tempo"
IDS_COLUMNTIME "Hora"
IDS_COLUMNSOURCE "Fonte"
IDS_COLUMNCATEGORY "Categoria"
IDS_COLUMNEVENT "Evento"
@@ -221,16 +219,16 @@ END
STRINGTABLE
BEGIN
IDS_COPY_EVTTYPE "Tipo de evento:"
IDS_COPY_EVTSRC "Fonte do evento:"
IDS_COPY_EVTCAT "Categoria:"
IDS_COPY_EVTID "ID do evento:"
IDS_COPY_EVTDATE "Data:"
IDS_COPY_EVTTIME "Tempo:"
IDS_COPY_EVTUSER "Usuário:"
IDS_COPY_EVTCOMP "Computador:"
IDS_COPY_EVTTEXT "Descrição:"
IDS_COPY_EVTDATA "Dados:"
IDS_COPY "\
Event Type: %s\r\n\
Event Source: %s\r\n\
Event Category: %s\r\n\
Event ID: %s\r\n\
Date: %s\r\n\
Time: %s\r\n\
User: %s\r\n\
Computer: %s\r\n\
Description:\r\n%s"
END
STRINGTABLE

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