Compare commits

...

75 Commits

Author SHA1 Message Date
Hermès Bélusca-Maïto
7cd78a81fb [OBJ2BIN] Code style only since here we can safely copy memory as the buffers do not overlap. 2025-04-28 21:26:58 +02:00
Hermès Bélusca-Maïto
32cacdd7c4 [OBJ2BIN] Add support for converting relocatable PE images to flat binaries.
- Use PE image relocation code adapted from rtl/image.c .

- Accepts an optional section name to be only converted, instead of
  the default '.text' section (for OBJ files), or all the sections
  (except '.reloc', for PE images).

- Add more validity checks for PE images.

- Possibility of supporting x64 PE images ??
2025-04-28 21:26:10 +02:00
Hermès Bélusca-Maïto
7dbc0e683b [RTL] Whitespace / minor code style fixes only. 2025-04-28 21:26:10 +02:00
Eric Kohl
dbc0c37750 [UMPNPMGR] Typo: Handle device interface removal events properly 2025-04-28 21:16:05 +02:00
Eric Kohl
bfa63932ce [MOUCLASS] Activate and deactivate the device interface for mouse devices 2025-04-28 21:14:20 +02:00
Hermès Bélusca-Maïto
5456e195db [EVENTVWR] Improve _some_ translations
- Add accelerators to the IDD_EVENTDETAILS_CTRL controls, in _some_
  translations but NOT all. Anyone is welcome to add the missing ones
  in the translations to their own language!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

CORE-11371
2025-04-17 13:55:31 +02:00
Curtis Wilson
be56c5c328 [TRACERT] Improve command line parsing (#7779)
- Added bounds check for -w and -h options to prevent the program from crashing.
- Added argument checks for -w and -h to make sure values were of the correct type and within range.
- Added check to see if a host was specified.
- Added new resource strings for reporting errors related to the checks above.
- Added the slash character as an additional option to specify command options.
2025-04-17 13:53:43 +02:00
253 changed files with 4143 additions and 1929 deletions

View File

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

View File

@@ -1978,7 +1978,6 @@ EnumEventsThread(IN LPVOID lpParameter)
BOOL bResult = TRUE; /* Read succeeded */
HANDLE hProcessHeap = GetProcessHeap();
PSID pLastSid = NULL;
INT nItems;
UINT uStep = 0, uStepAt = 0, uPos = 0;
@@ -1998,7 +1997,8 @@ EnumEventsThread(IN LPVOID lpParameter)
SYSTEMTIME time;
LVITEMW lviEventItem;
EnableEventDetailsButtons(hwndEventDetails, FALSE);
/* Disable the Previous/Next buttons */
SendMessageW(hwndEventDetails, EVT_DISPLAY, FALSE, (LPARAM)-1);
/* Save the current event log filter globally */
EventLogFilter_AddRef(EventLogFilter);
@@ -2265,9 +2265,6 @@ Quit:
/* All events loaded */
Cleanup:
nItems = ListView_GetItemCount(hwndListView);
EnableEventDetailsButtons(hwndEventDetails, (nItems > 0));
ShowWindow(hwndStatusProgress, SW_HIDE);
SendMessageW(hwndListView, LVM_PROGRESS, 0, FALSE);
@@ -2298,6 +2295,11 @@ Cleanup:
/* Resume list view redraw */
SendMessageW(hwndListView, WM_SETREDRAW, TRUE, 0);
/* Re-enable the Previous/Next buttons, keeping the current event details
* displayed, if any. Don't auto-select the first list item but wait for
* the user to do it. */
SendMessageW(hwndEventDetails, EVT_DISPLAY, FALSE, 0);
EventLogFilter_Release(EventLogFilter);
CloseHandle(hStopEnumEvent);
@@ -3342,7 +3344,7 @@ WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
MB_OK | MB_ICONERROR);
break;
}
SendMessageW(hwndEventDetails, EVT_DISPLAY, 0, (LPARAM)pnmv->iItem);
SendMessageW(hwndEventDetails, EVT_DISPLAY, TRUE, (LPARAM)pnmv->iItem);
}
break;
}
@@ -4347,9 +4349,9 @@ EventDetails(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
cxOld = rcWnd.right - rcWnd.left;
cyOld = rcWnd.bottom - rcWnd.top;
/* Show event info in dialog control */
iEventItem = (lParam != 0 ? ((PEVENTDETAIL_INFO)lParam)->iEventItem : 0);
SendMessageW(hWndDetailsCtrl, EVT_DISPLAY, 0, (LPARAM)iEventItem);
/* Display the event info in the dialog */
iEventItem = (lParam != 0 ? ((PEVENTDETAIL_INFO)lParam)->iEventItem : -1);
SendMessageW(hWndDetailsCtrl, EVT_DISPLAY, TRUE, (LPARAM)iEventItem);
// SetWindowPos(hWndDetailsCtrl, NULL,
// 0, 0,

View File

@@ -4,7 +4,7 @@
* PURPOSE: Event Details Control.
* COPYRIGHT: Copyright 2007 Marc Piulachs <marc.piulachs@codexchange.net>
* Copyright 2008-2016 Eric Kohl <eric.kohl@reactos.org>
* Copyright 2016-2022 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
* Copyright 2016-2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
#include "eventvwr.h"
@@ -16,6 +16,7 @@
#define EVENT_MESSAGE_EVENTTEXT_BUFFER (1024*10)
extern WCHAR szTitle[];
extern HWND hwndListView;
extern BOOL
GetEventMessage(IN LPCWSTR KeyName,
IN LPCWSTR SourceName,
@@ -25,6 +26,9 @@ GetEventMessage(IN LPCWSTR KeyName,
typedef struct _DETAILDATA
{
/* The event record being displayed */
PEVENTLOGRECORD pevlr;
/* Data initialized from EVENTDETAIL_INFO */
PEVENTLOGFILTER EventLogFilter;
INT iEventItem;
@@ -38,16 +42,21 @@ typedef struct _DETAILDATA
} DETAILDATA, *PDETAILDATA;
static
VOID
DisplayEventData(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData);
static
VOID
DisplayEvent(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData)
{
PEVENTLOGRECORD pevlr;
PEVENTLOGFILTER EventLogFilter = pDetailData->EventLogFilter;
INT iItem = pDetailData->iEventItem;
LVITEMW li;
PEVENTLOGRECORD pevlr;
BOOL bEventData;
WCHAR szEventType[MAX_PATH];
@@ -60,12 +69,13 @@ DisplayEvent(
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 = (PEVENTLOGRECORD)li.lParam;
pevlr = pDetailData->pevlr = (PEVENTLOGRECORD)li.lParam;
ListView_GetItemText(hwndListView, iItem, 0, szEventType, ARRAYSIZE(szEventType));
ListView_GetItemText(hwndListView, iItem, 1, szDate, ARRAYSIZE(szDate));
@@ -87,11 +97,13 @@ DisplayEvent(
bEventData = (pevlr->DataLength > 0);
EnableDlgItem(hDlg, IDC_BYTESRADIO, bEventData);
EnableDlgItem(hDlg, IDC_WORDRADIO, bEventData);
EnableDlgItem(hDlg, IDC_WORDSRADIO, bEventData);
// FIXME: At the moment we support only one event log in the filter
GetEventMessage(EventLogFilter->EventLogs[0]->LogName, szSource, pevlr, szEventText);
SetDlgItemTextW(hDlg, IDC_EVENTTEXTEDIT, szEventText);
DisplayEventData(hDlg, pDetailData);
}
static
@@ -179,22 +191,17 @@ DisplayEventData(
_In_ HWND hDlg,
_In_ PDETAILDATA pDetailData)
{
PEVENTLOGRECORD pevlr = pDetailData->pevlr;
BOOL bDisplayWords = pDetailData->bDisplayWords;
INT iItem = pDetailData->iEventItem;
LVITEMW li;
PEVENTLOGRECORD pevlr;
LPBYTE pData;
UINT i, uOffset;
UINT uBufferSize, uLineLength;
PWCHAR pTextBuffer, pLine;
li.mask = LVIF_PARAM;
li.iItem = iItem;
li.iSubItem = 0;
ListView_GetItem(hwndListView, &li);
if (!pevlr)
return;
pevlr = (PEVENTLOGRECORD)li.lParam;
if (pevlr->DataLength == 0)
{
SetDlgItemTextW(hDlg, IDC_EVENTDATAEDIT, L"");
@@ -651,7 +658,7 @@ OnSize(HWND hDlg, PDETAILDATA pData, INT cx, INT cy)
0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
hItemWnd = GetDlgItem(hDlg, IDC_WORDRADIO);
hItemWnd = GetDlgItem(hDlg, IDC_WORDSRADIO);
GetWindowRect(hItemWnd, &rect);
MapWindowPoints(HWND_DESKTOP /*NULL*/, hDlg, (LPPOINT)&rect, sizeof(RECT)/sizeof(POINT));
// OffsetRect(&rect, 0, y);
@@ -728,6 +735,46 @@ 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
VOID
InitDetailsDlgCtrl(HWND hDlg, PDETAILDATA pData)
@@ -759,8 +806,22 @@ InitDetailsDlgCtrl(HWND hDlg, PDETAILDATA pData)
/* Note that the RichEdit control never gets themed under WinXP+; one would have to write code to simulate Edit-control theming */
SendDlgItemMessageW(hDlg, pData->bDisplayWords ? IDC_WORDRADIO : IDC_BYTESRADIO, BM_SETCHECK, BST_CHECKED, 0);
SendDlgItemMessageW(hDlg, pData->bDisplayWords ? IDC_WORDSRADIO : IDC_BYTESRADIO, BM_SETCHECK, BST_CHECKED, 0);
SendDlgItemMessageW(hDlg, IDC_EVENTDATAEDIT, WM_SETFONT, (WPARAM)pData->hMonospaceFont, (LPARAM)TRUE);
//ClearContents(hDlg);
if (pData->iEventItem != -1)
{
EnableNavigationArrows(hDlg, TRUE);
EnableDlgItem(hDlg, IDC_COPY, TRUE);
}
else
{
EnableNavigationArrows(hDlg, FALSE);
EnableDlgItem(hDlg, IDC_COPY, FALSE);
}
EnableDlgItem(hDlg, IDC_BYTESRADIO, FALSE);
EnableDlgItem(hDlg, IDC_WORDSRADIO, FALSE);
}
/* Message handler for Event Details control */
@@ -806,6 +867,8 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
pData->scPos.x = pData->scPos.y = 0;
InitDetailsDlgCtrl(hDlg, pData);
/* NOTE: Showing the event (if any) is currently delayed to later */
// SendMessageW(hDlg, EVT_DISPLAY, TRUE, (LPARAM)pData->iEventItem);
// OnSize(hDlg, pData, pData->cxOld, pData->cyOld);
return (INT_PTR)TRUE;
@@ -821,17 +884,58 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return (INT_PTR)TRUE;
case EVT_SETFILTER:
{
/* Disable the display first, before changing the current filter */
pData->pevlr = NULL;
pData->iEventItem = -1;
ClearContents(hDlg);
pData->EventLogFilter = (PEVENTLOGFILTER)lParam;
return (INT_PTR)TRUE;
}
case EVT_DISPLAY:
{
pData->iEventItem = (INT)lParam;
if (pData->EventLogFilter)
if (wParam)
{
/* Show event info in control */
DisplayEvent(hDlg, pData);
DisplayEventData(hDlg, pData);
INT iEventItem = (INT)lParam;
/* If no filter is set, don't change anything */
if (!pData->EventLogFilter)
return (INT_PTR)TRUE;
/* If we re-enable display from previously disabled state, re-enable the buttons */
if ((pData->iEventItem == -1) && (iEventItem != -1))
{
EnableNavigationArrows(hDlg, TRUE);
EnableDlgItem(hDlg, IDC_COPY, TRUE);
}
else
/* If we disable display from previously enabled state, clear and disable it */
if ((pData->iEventItem != -1) && (iEventItem == -1))
{
ClearContents(hDlg);
}
/* Set the new item */
pData->pevlr = NULL;
pData->iEventItem = iEventItem;
/* Display the event info, if there is one */
if (pData->iEventItem != -1)
DisplayEvent(hDlg, pData);
}
else
{
/* Enable or disable the Previous/Next buttons,
* but keep the existing contents, if any */
EnableNavigationArrows(hDlg, (lParam != -1));
// HACK: Disable the Bytes/Words mode buttons
// because we won't have access anymore to the
// event data. (This will be fixed in the future.)
pData->pevlr = NULL; // Invalidate also the cache.
EnableDlgItem(hDlg, IDC_BYTESRADIO, FALSE);
EnableDlgItem(hDlg, IDC_WORDSRADIO, FALSE);
}
return (INT_PTR)TRUE;
}
@@ -843,25 +947,33 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case IDC_NEXT:
{
BOOL bPrev = (LOWORD(wParam) == IDC_PREVIOUS);
INT iItem, iSel, nItems = ListView_GetItemCount(hwndListView);
WCHAR szText[200];
INT nItems = ListView_GetItemCount(hwndListView);
INT iItem, iSel;
if (nItems <= 0) /* No items? */
break;
/* Get the index of the first selected item */
iSel = ListView_GetNextItem(hwndListView, -1, LVNI_SELECTED);
/* Select the previous/next item from our current one */
iItem = ListView_GetNextItem(hwndListView, -1, LVNI_ALL | LVNI_SELECTED);
iItem = ListView_GetNextItem(hwndListView, iItem,
iItem = ListView_GetNextItem(hwndListView, iSel,
(bPrev ? LVNI_ABOVE : LVNI_BELOW));
if (iItem < 0 || iItem >= nItems)
{
LoadStringW(hInst,
(bPrev ? IDS_CONTFROMEND : IDS_CONTFROMBEGINNING),
szText, _countof(szText));
if (MessageBoxW(hDlg, szText, szTitle, MB_YESNO | MB_ICONQUESTION) == IDNO)
break;
/* Confirm selection restart only if an item was previously
* selected. If not, just proceed with default selection. */
if (iSel != -1)
{
WCHAR szText[200];
LoadStringW(hInst,
(bPrev ? IDS_CONTFROMEND : IDS_CONTFROMBEGINNING),
szText, _countof(szText));
if (MessageBoxW(hDlg, szText, szTitle, MB_YESNO | MB_ICONQUESTION) != IDYES)
break;
}
/* Determine from where to restart */
/* Determine where to restart from */
iItem = (bPrev ? (nItems - 1) : 0);
}
@@ -883,14 +995,12 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
LVIS_FOCUSED | LVIS_SELECTED);
ListView_EnsureVisible(hwndListView, iItem, FALSE);
pData->pevlr = NULL;
pData->iEventItem = iItem;
/* Show event info in control */
/* Display the event info */
if (pData->EventLogFilter)
{
DisplayEvent(hDlg, pData);
DisplayEventData(hDlg, pData);
}
return (INT_PTR)TRUE;
}
@@ -900,15 +1010,11 @@ EventDetailsCtrl(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
return (INT_PTR)TRUE;
case IDC_BYTESRADIO:
case IDC_WORDRADIO:
{
case IDC_WORDSRADIO:
pData->bDisplayWords = (LOWORD(wParam) == IDC_WORDSRADIO);
if (pData->EventLogFilter)
{
pData->bDisplayWords = (LOWORD(wParam) == IDC_WORDRADIO);
DisplayEventData(hDlg, pData);
}
return (INT_PTR)TRUE;
}
default:
break;
@@ -959,11 +1065,3 @@ CreateEventDetailsCtrl(HINSTANCE hInstance,
MAKEINTRESOURCEW(IDD_EVENTDETAILS_CTRL),
hParentWnd, EventDetailsCtrl, lParam);
}
VOID
EnableEventDetailsButtons(HWND hWnd, BOOL bEnable)
{
EnableDlgItem(hWnd, IDC_PREVIOUS, bEnable);
EnableDlgItem(hWnd, IDC_NEXT, bEnable);
EnableDlgItem(hWnd, IDC_COPY, bEnable);
}

View File

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

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Описание:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "&Данни:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Байтове", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDRADIO, 85, 140, 34, 8
AUTORADIOBUTTON "&Думи", IDC_WORDSRADIO, 85, 140, 34, 8
LTEXT "&Данни:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

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

View File

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

View File

@@ -81,17 +81,17 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
LTEXT "&Ημερομηνία:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Πηγή:", IDC_STATIC, 103, 5, 36, 8
LTEXT "Πη&γή:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ώρα:", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Ώρα:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Κατηγορία:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Τύπος:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Τύπος:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Χρήστης:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Περιγραφή:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Δ&εδομένα:", IDC_DETAILS_STATIC, 8, 140, 40, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 87, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 87, 140, 34, 8
LTEXT "Δ&εδομένα:", IDC_DETAILS_STATIC, 8, 140, 40, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

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

View File

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

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 "Date :", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ate :", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Source :", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Source :", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Heure :", IDC_STATIC, 8, 15, 31, 8
LTEXT "&Heure :", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Catégorie :", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Catégorie :", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Type :", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Type :", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Événement :", IDC_STATIC, 103, 25, 36, 8
LTEXT "É&vénement :", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Utilisateur :", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Ordinateur :", IDC_STATIC, 8, 45, 36, 8
LTEXT "O&rdinateur :", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -106,9 +106,9 @@ BEGIN
LTEXT "&Description :", IDC_STATIC, 8, 65, 45, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Données :", IDC_DETAILS_STATIC, 8, 140, 35, 8//FIXME: add accel
AUTORADIOBUTTON "&Octets", IDC_BYTESRADIO, 50, 140, 34, 8
AUTORADIOBUTTON "&Mots", IDC_WORDRADIO, 88, 140, 34, 8
AUTORADIOBUTTON "&Mots", IDC_WORDSRADIO, 88, 140, 34, 8
LTEXT "Do&nnées :", IDC_DETAILS_STATIC, 8, 140, 35, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -168,8 +168,8 @@ BEGIN
IDS_CLEAREVENTS_MSG "Voulez-vous enregistrer ce journal d'événements avant de l'effacer ?"
IDS_RESTOREDEFAULTS "Voulez-vous vraiment réinitialiser tous les paramètres pour ce journal aux valeurs par défaut ?"
IDS_EVENTSTRINGIDNOTFOUND "La description pour l'événement d'ID ( %lu ) dans la source ( %s ) ne peut être trouvée. L'ordinateur local pourrait ne pas avoir les informations registres nécessaires ou les fichiers DLL de message pour afficher les messages depuis un ordinateur distant.\n\nLes informations suivantes font partie de l'événement :\n\n"
IDS_CONTFROMBEGINNING "You have reached the end of the event log. Do you want to continue from the beginning?"
IDS_CONTFROMEND "You have reached the beginning of the event log. Do you want to continue from the end?"
IDS_CONTFROMBEGINNING "Vous avez atteint la fin du journal d'événements. Voulez-vous continuer depuis le début ?"
IDS_CONTFROMEND "Vous avez atteint le début du journal d'événements. Voulez-vous continuer depuis la fin ?"
END
STRINGTABLE

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "תיאור:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "נתונים:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "בתים", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "מילים", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "נתונים:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

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

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "説明(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "データ(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "バイト(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "ワード(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "データ(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "설명(&D):", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "데이터(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "바이트(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "글자(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "데이터(&A):", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

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

View File

@@ -108,9 +108,9 @@ BEGIN
LTEXT "&Opis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ane:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Słowa", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&ane:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -81,21 +81,21 @@ IDD_EVENTDETAILS_CTRL DIALOGEX 0, 0, 266, 215
STYLE DS_SHELLFONT | DS_CONTROL | WS_CHILD | WS_CLIPCHILDREN
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT "Data:", IDC_STATIC, 8, 5, 31, 8
LTEXT "D&ata:", IDC_STATIC, 8, 5, 31, 8
EDITTEXT IDC_EVENTDATESTATIC, 46, 5, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Fonte:", IDC_STATIC, 103, 5, 36, 8
LTEXT "&Fonte:", IDC_STATIC, 103, 5, 36, 8
EDITTEXT IDC_EVENTSOURCESTATIC, 140, 5, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tempo:", IDC_STATIC, 8, 15, 31, 8
LTEXT "T&empo:", IDC_STATIC, 8, 15, 31, 8
EDITTEXT IDC_EVENTTIMESTATIC, 46, 15, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Categoria:", IDC_STATIC, 103, 15, 36, 8
LTEXT "&Categoria:", IDC_STATIC, 103, 15, 36, 8
EDITTEXT IDC_EVENTCATEGORYSTATIC, 140, 15, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "Tipo:", IDC_STATIC, 8, 25, 31, 8
LTEXT "&Tipo:", IDC_STATIC, 8, 25, 31, 8
EDITTEXT IDC_EVENTTYPESTATIC, 46, 25, 47, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "EventID:", IDC_STATIC, 103, 25, 36, 8
LTEXT "Event &ID:", IDC_STATIC, 103, 25, 36, 8
EDITTEXT IDC_EVENTIDSTATIC, 140, 25, 82, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Usuário:", IDC_STATIC, 8, 35, 36, 8
EDITTEXT IDC_EVENTUSERSTATIC, 46, 35, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
LTEXT "&Computador:", IDC_STATIC, 8, 45, 36, 8
LTEXT "Co&mputador:", IDC_STATIC, 8, 45, 36, 8
EDITTEXT IDC_EVENTCOMPUTERSTATIC, 46, 45, 152, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL
PUSHBUTTON "", IDC_PREVIOUS, 230, 5, 28, 14, BS_ICON
@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Descrição:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "&Bytes", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Word", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Words", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Dad&os:", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

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

View File

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

View File

@@ -109,9 +109,9 @@ BEGIN
LTEXT "&Описание:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "&Данные:", IDC_DETAILS_STATIC, 8, 140, 30, 8
AUTORADIOBUTTON "&Байты", IDC_BYTESRADIO, 49, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDRADIO, 87, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDSRADIO, 87, 140, 34, 8
LTEXT "&Данные:", IDC_DETAILS_STATIC, 8, 140, 30, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Popis:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Ú&daje:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Bajty", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Slová", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Slová", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Ú&daje:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END
@@ -203,7 +203,7 @@ END
STRINGTABLE
BEGIN
IDS_BYTES_FORMAT "bytes" // "%s bytes"
IDS_BYTES_FORMAT "bajtov" // "%s bytes"
// "%1!ls! (%2!ls! bytes)"
END

View File

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

View File

@@ -105,9 +105,9 @@ BEGIN
LTEXT "&Beskrivning:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Byte", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "&Ord", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "D&ata:", IDC_DETAILS_STATIC, 8, 140, 20, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "Açıklama:", IDC_STATIC, 8, 65, 39, 8//FIXME: add accel
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "Veri:", IDC_DETAILS_STATIC, 8, 140, 20, 8//FIXME: add accel
AUTORADIOBUTTON "&Baytlar", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "Sö&zcük", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "Sö&zcükler", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Veri:", IDC_DETAILS_STATIC, 8, 140, 20, 8//FIXME: add accel
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -107,9 +107,9 @@ BEGIN
LTEXT "&Опис:", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
AUTORADIOBUTTON "&Байти", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Слова", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "Д&aта:", IDC_DETAILS_STATIC, 8, 140, 20, 8
AUTORADIOBUTTON "&Байт", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "&Слово", IDC_WORDRADIO, 77, 140, 34, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -107,9 +107,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "数据(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "字节(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "字(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "字(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "数据(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "位元組(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "位元(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -106,9 +106,9 @@ BEGIN
LTEXT "描述(&D)", IDC_STATIC, 8, 65, 39, 8
CONTROL "", IDC_EVENTTEXTEDIT, RICHEDIT_CLASS, ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER, 8, 76, 250, 60
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
AUTORADIOBUTTON "位元組(&B)", IDC_BYTESRADIO, 39, 140, 34, 8
AUTORADIOBUTTON "位元(&W)", IDC_WORDRADIO, 77, 140, 34, 8
AUTORADIOBUTTON "(&W)", IDC_WORDSRADIO, 77, 140, 34, 8
LTEXT "資料(&A)", IDC_DETAILS_STATIC, 8, 140, 25, 8
EDITTEXT IDC_EVENTDATAEDIT, 8, 150, 250, 60, ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL | WS_BORDER
END

View File

@@ -50,7 +50,7 @@
#define IDC_EVENTTEXTEDIT 1011
#define IDC_DETAILS_STATIC -2
#define IDC_BYTESRADIO 1012
#define IDC_WORDRADIO 1013
#define IDC_WORDSRADIO 1013
#define IDC_EVENTDATAEDIT 1014
#define IDC_DISPLAYNAME 1015
#define IDC_LOGNAME 1016

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -159,7 +159,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Algunos servicios dependen de otros servicios, controladores del sistema y grupos de orden de carga. Si se detiene un componente del sistema o no funciona correctamente, es posible que otros servicios que dependan de éstos resulten afectados.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Éste servicio depende de los siguientes componentes", IDC_STATIC, 8, 57, 236, 9
LTEXT "Éste servicio depende de los siguientes componentes:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Certains services dépendent d'autres services, pilotes système et groupes d'ordre de chargement. Si un composant système est arrêté ou ne fonctionne pas correctement, les services dépendants peuvent être affectés.", IDC_STATIC, 8, 7, 238, 36
LTEXT "Ce service dépend des composants système suivants", IDC_STATIC, 8, 57, 236, 9
LTEXT "&Ce service dépend des composants système suivants:", IDC_STATIC, 8, 57, 236, 9
LTEXT "Les c&omposants système suivants dépendent de ce service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "שירותים מסוימים תלויים בשירותים אחרים, במנהלים של התקנים של המערכת ובקבוצות סדר טעינה. אם רכיב מערכת הופסק או שאינו פועל כראוי, ייתכן ששירותים התלויים בו יושפעו.", IDC_STATIC, 8, 7, 238, 26
LTEXT "שירות זה תלוי ברכיבי המערכת הבאים", IDC_STATIC, 8, 57, 236, 9
LTEXT "שירות זה תלוי ברכיבי המערכת הבאים:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Beberapa layanan bergantung pada layanan lainnya, driver sistem dan grup urutan pengambilan. Jika komponen sistem dihentikan atau tidak berjalan dengan benar, layanan yang bergantung akan dipengaruhi.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Layanan ini tergantung pada komponen berikut", IDC_STATIC, 8, 57, 236, 9
LTEXT "Layanan ini tergantung pada komponen berikut:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Alcuni servizi dipendono da altri servizi, driver di sistema e gruppi di ordine di caricamento. Se un componente di sistema viene fermato o non sta funzionando regolarmente, i servizi dipendenti possono venire influenzati.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Questo servizio dipende dai seguenti componenti", IDC_STATIC, 8, 57, 236, 9
LTEXT "Questo servizio dipende dai seguenti componenti:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "他のサービス、システム ドライバ、読み込み順グループなどに依存しているサービスがあります。システム コンポーネントが停止するか、または正常に実行されない場合、依存するサービスが影響されている場合があります。", IDC_STATIC, 8, 7, 238, 26
LTEXT "このサービスが依存するコンポーネント", IDC_STATIC, 8, 57, 236, 9
LTEXT "このサービスが依存するコンポーネント:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -159,6 +159,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "일부 서비스는 다른 서비스나 시스템 드라이버, 그룹 등에 종속되어 있습니다. 만약 시스템 컴포넌트가 정지되었거나 제대로 동작하지 않는다면, 종속된 서비스에 영향을 끼칠 수 있습니다.", IDC_STATIC, 8, 7, 238, 26
LTEXT "이 서비스는 다음 컴포넌트에 종속되어 있습니다.", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -156,7 +156,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Noen tjenester depend på andre tjenester, system drivere og laster system grupper. Hvis system komponenten er stoppet eller ikke kjøre riktig, dependant services can be affected.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Denne tjenesten depends på følgende komponenter", IDC_STATIC, 8, 57, 236, 9
LTEXT "Denne tjenesten depends på følgende komponenter:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -166,7 +166,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Niektóre usługi są zależne od innych usług, sterowników systemowych i grup kolejności ładowania. Jeżeli składnik systemu jest zatrzymany lub nie działa prawidłowo, zależne od niego usługi nie uruchomią się.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Ta usługa jest zależna od następujących składników systemu", IDC_STATIC, 8, 57, 236, 9
LTEXT "Ta usługa jest zależna od następujących składników systemu:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -157,6 +157,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Alguns serviços dependem de outros serviços, controladores de sistema e grupos de ordenamento de carregamento. Se um componente do sistema for parado ou não estiver a ser executado correctamente, os serviços dependentes podem ser afectados.", IDC_STATIC, 8, 7, 238, 34
LTEXT "Este serviço depende dos seguintes componentes do sistema:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "Os seguintes componentes do sistema dependem deste serviço:", IDC_DEPEND_SERVICE, 8, 138, 236, 13
END

View File

@@ -165,7 +165,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Unele servicii depind de alte servicii sau de module de sistem și de ordinea încărcării în grup. Dacă o componentă de sistem este oprită sau nu rulează corespunzător, serviciile dependente pot fi și ele afectate.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Acest serviciu depinde de următoarele componente", IDC_STATIC, 8, 57, 236, 9
LTEXT "Acest serviciu depinde de următoarele componente:", IDC_STATIC, 8, 57, 236, 9
LTEXT "Următoarele componente depind de acest serviciu:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -157,6 +157,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Некоторые службы зависят от других. Если служба остановлена или неправильно работает, это отражается на зависимых от нее службах.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Эта служба зависит от следующих компонентов:", IDC_STATIC, 8, 59, 236, 9
LTEXT "Следующие компоненты зависят от этой службы:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

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

View File

@@ -161,7 +161,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Disa shërbime varen nga shërbimet e tjera, driverat e sistemit dhe ngarkimet grupet te renditura. Nëse një komponent sistem është i ndalur ose ajo nuk është në drejtimin e duhur, shërbimet e varur mund të preken.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Ky shërbim varet nga komponentet në vijim", IDC_STATIC, 8, 57, 236, 9
LTEXT "Ky shërbim varet nga komponentet në vijim:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -163,7 +163,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Några tjänster är beroende av andra tjänster, systemdrivrutiner och laddsystemsgrupper. Om systemkomponenten är stoppad eller inte kör korrekt, kan tjänster som är beroende av den bli påverkade.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Denna tjänsten är beroende av följande komponenter", IDC_STATIC, 8, 57, 236, 9
LTEXT "Denna tjänsten är beroende av följande komponenter:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -164,7 +164,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "การให้บริการบางอย่างขึ้นกับบริการอื่นๆด้วย, ตัวขับเคลื่อนของระบบ และการดึงข้อมูลตามลำดับกลุ่ม ถ้าส่วนประกอบต่างๆของระบบหยุดทำงานลง หรือไม่ทำงานตามสมควร การให้บริการแบบไม่กำหนดเองจะมีผลทันที", IDC_STATIC, 8, 7, 238, 26
LTEXT "การให้บริการนี้ขึ้นอยู่กับส่วนประกอบอื่นๆที่ตามมาด้วย", IDC_STATIC, 8, 57, 236, 9
LTEXT "การให้บริการนี้ขึ้นอยู่กับส่วนประกอบอื่นๆที่ตามมาด้วย:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -159,6 +159,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Birtakım hizmetler, başka hizmetlere, sistem sürücülerine ve yükleme sırası bileşenlerine bağımlıdır. Eğer bir sistem bileşeni, durdurulmuşsa ya da düzgün çalışmıyorsa bağımlı hizmetler etkilenebilir.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Bu hizmet aşağıdaki bileşenlere bağımlıdır:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -164,7 +164,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "Деякі служби залежать від інших служб, системних драйверів або списку завантаження груп служб. Якщо служба зупинена або неправильно працює, це впливає на залежні від неї служби.", IDC_STATIC, 8, 7, 238, 26
LTEXT "Ця служба залежить від наступних компонентів", IDC_STATIC, 8, 57, 236, 9
LTEXT "Ця служба залежить від наступних компонентів:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -158,7 +158,8 @@ BEGIN
WS_VISIBLE | WS_TABSTOP | TVS_HASBUTTONS | TVS_HASLINES |
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "一些服务依赖于其他服务,系统驱动程序和加载顺序组。如果一个系统组件被停止或者没有正确运行,依赖它的服务也会被影响。", IDC_STATIC, 8, 7, 238, 26
LTEXT "这个服务依赖于以下的组件", IDC_STATIC, 8, 57, 236, 9
LTEXT "这个服务依赖于以下的组件:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -165,6 +165,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "一些服務依賴於其他服務,系統驅動程式和載入順序組。如果一個系統元件被停止或者沒有正確執行,依賴它的服務也會受到影響。", IDC_STATIC, 8, 7, 238, 26
LTEXT "這個服務依賴於以下的元件:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -165,6 +165,7 @@ BEGIN
TVS_LINESATROOT | TVS_DISABLEDRAGDROP, 8, 151, 236, 68
LTEXT "一些服務依賴於其他服務,系統驅動程式和載入順序組。如果一個系統元件被停止或者沒有正確運行,被其依賴的服務也會被影響。", IDC_STATIC, 8, 7, 238, 26
LTEXT "這個服務依賴於以下的元件:", IDC_STATIC, 8, 57, 236, 9
LTEXT "The following components depend on this service:", IDC_STATIC, 8, 140, 236, 9
LTEXT "", IDC_DEPEND_SERVICE, 8, 38, 236, 13
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -38,4 +38,7 @@ Optionen:\n\
IDS_HOP_RESPONSE " Antwort: "
IDS_DEST_HOST_UNREACHABLE "Zielhost nicht erreichbar.\n"
IDS_DEST_NET_UNREACHABLE "Zielnetz nicht erreichbar.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options :\n\
IDS_HOP_RESPONSE " rapporte : "
IDS_DEST_HOST_UNREACHABLE "Hôte de destination inatteignable.\n"
IDS_DEST_NET_UNREACHABLE "Réseau de destination inatteignable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -39,4 +39,7 @@ Opzioni:\n\
IDS_HOP_RESPONSE " rapporti: "
IDS_DEST_HOST_UNREACHABLE "Destinazione ospite irraggiungibile.\n"
IDS_DEST_NET_UNREACHABLE "Destinazione rete irraggiungibile.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Opcje:\n\
IDS_HOP_RESPONSE " raporty: "
IDS_DEST_HOST_UNREACHABLE "Host docelowy nieosiągalny.\n"
IDS_DEST_NET_UNREACHABLE "Sieć docelowa nieosiągalna.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -39,4 +39,7 @@ Opțiuni:\n\
IDS_HOP_RESPONSE " rapoarte: "
IDS_DEST_HOST_UNREACHABLE "Destinație gazdă inaccesibilă.\n"
IDS_DEST_NET_UNREACHABLE "Destinație rețea inaccesibilă.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -34,4 +34,7 @@ BEGIN
IDS_HOP_RESPONSE " сообщает: "
IDS_DEST_HOST_UNREACHABLE "Заданный узел недоступен.\n"
IDS_DEST_NET_UNREACHABLE "Заданная сеть недоступна.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -34,4 +34,7 @@ Seçenekler:\n\
IDS_HOP_RESPONSE " raporlar: "
IDS_DEST_HOST_UNREACHABLE "Hedef cihaza erişilemiyor.\n"
IDS_DEST_NET_UNREACHABLE "Hedef ağa erişilemiyor.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ Options:\n\
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "Destination host unreachable.\n"
IDS_DEST_NET_UNREACHABLE "Destination network unreachable.\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -33,4 +33,7 @@ BEGIN
IDS_HOP_RESPONSE " 报告: "
IDS_DEST_HOST_UNREACHABLE "目标主机不可达。\n"
IDS_DEST_NET_UNREACHABLE "目标网络不可达。\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -39,4 +39,7 @@ BEGIN
IDS_HOP_RESPONSE " reports: "
IDS_DEST_HOST_UNREACHABLE "無法連線至目標主機。\n"
IDS_DEST_NET_UNREACHABLE "無法連線至目標網路。\n"
IDS_BAD_OPTION_VALUE "Bad value for option %1!ls!.\n"
IDS_MISSING_OPTION_VALUE "A value must be supplied for option %1!ls!.\n"
IDS_MISSING_TARGET "A target name or address must be specified.\n"
END

View File

@@ -19,3 +19,6 @@
#define IDS_HOP_RESPONSE 115
#define IDS_DEST_HOST_UNREACHABLE 116
#define IDS_DEST_NET_UNREACHABLE 117
#define IDS_BAD_OPTION_VALUE 118
#define IDS_MISSING_OPTION_VALUE 119
#define IDS_MISSING_TARGET 120

View File

@@ -3,6 +3,7 @@
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: Trace network paths through networks
* COPYRIGHT: Copyright 2018 Ged Murphy <gedmurphy@reactos.org>
Copyright 2025 Curtis Wilson <LiquidFox1776@gmail.com>
*/
#ifdef __REACTOS__
@@ -24,6 +25,7 @@
#include <iphlpapi.h>
#include <icmpapi.h>
#include <strsafe.h>
#include <errno.h>
#include "resource.h"
#define SIZEOF_ICMP_ERROR 8
@@ -31,6 +33,10 @@
#define PACKET_SIZE 32
#define MAX_IPADDRESS 32
#define NUM_OF_PINGS 3
#define MIN_HOP_COUNT 1
#define MAX_HOP_COUNT 255
#define MIN_MILLISECONDS 1
#define MAX_MILLISECONDS ULONG_MAX
struct TraceInfo
{
@@ -153,23 +159,27 @@ Usage()
OutputText(IDS_USAGE);
}
static ULONG
static bool
GetULONG(
_In_z_ LPWSTR String
)
_In_ PCWSTR String,
_Out_ PULONG Value)
{
ULONG Length;
Length = wcslen(String);
PWSTR StopString;
ULONG i = 0;
while ((i < Length) && ((String[i] < L'0') || (String[i] > L'9'))) i++;
if ((i >= Length) || ((String[i] < L'0') || (String[i] > L'9')))
{
return (ULONG)-1;
}
// Check input arguments
if (*String == UNICODE_NULL)
return false;
LPWSTR StopString;
return wcstoul(&String[i], &StopString, 10);
// Clear errno so we can use its value after
// the call to wcstoul to check for errors.
errno = 0;
// Try to convert String to ULONG
*Value = wcstoul(String, &StopString, 10);
if ((errno != ERANGE) && (errno != 0 || *StopString != UNICODE_NULL))
return false;
// The conversion was successful
return true;
}
static bool
@@ -557,6 +567,40 @@ Cleanup:
return Success;
}
static bool
GetUlongOptionInRange(
_In_ int argc,
_In_ wchar_t *argv[],
_Inout_ int *i,
_Out_ ULONG *Value,
_In_ ULONG MinimumValue,
_In_ ULONG MaximumValue)
{
ULONG ParsedValue = 0;
// Check if we have enough values
if ((*i + 1) > (argc - 1))
{
OutputText(IDS_MISSING_OPTION_VALUE, argv[*i]);
return false;
}
(*i)++;
// Try to parse and convert the value as ULONG.
// Check if ParsedValue is within the specified range.
if (!GetULONG(argv[*i], &ParsedValue) ||
((ParsedValue < MinimumValue) || (ParsedValue > MaximumValue)))
{
(*i)--;
OutputText(IDS_BAD_OPTION_VALUE, argv[*i]);
return false;
}
*Value = ParsedValue;
return true;
}
static bool
ParseCmdline(int argc, wchar_t *argv[])
{
@@ -568,7 +612,7 @@ ParseCmdline(int argc, wchar_t *argv[])
for (int i = 1; i < argc; i++)
{
if (argv[i][0] == '-')
if (argv[i][0] == '-' || argv[i][0] == '/')
{
switch (argv[i][1])
{
@@ -577,7 +621,15 @@ ParseCmdline(int argc, wchar_t *argv[])
break;
case 'h':
Info.MaxHops = GetULONG(argv[++i]);
if (!GetUlongOptionInRange(argc,
argv,
&i,
&Info.MaxHops,
MIN_HOP_COUNT,
MAX_HOP_COUNT))
{
return false;
}
break;
case 'j':
@@ -585,7 +637,15 @@ ParseCmdline(int argc, wchar_t *argv[])
return false;
case 'w':
Info.Timeout = GetULONG(argv[++i]);
if (!GetUlongOptionInRange(argc,
argv,
&i,
&Info.Timeout,
MIN_MILLISECONDS,
MAX_MILLISECONDS))
{
return false;
}
break;
case '4':
@@ -606,11 +666,25 @@ ParseCmdline(int argc, wchar_t *argv[])
}
else
{
// The host must be the last argument
if (i != (argc - 1))
{
Usage();
return false;
}
StringCchCopyW(Info.HostName, NI_MAXHOST, argv[i]);
break;
}
}
// Check for missing host
if (Info.HostName[0] == UNICODE_NULL)
{
OutputText(IDS_MISSING_TARGET);
Usage();
return false;
}
return true;
}

View File

@@ -176,6 +176,7 @@ void PerfDataRefresh(void)
PSID ProcessUser;
ULONG Buffer[64]; /* must be 4 bytes aligned! */
ULONG cwcUserName;
BOOL bIsWow64;
/* Get new system time */
status = NtQuerySystemInformation(SystemTimeOfDayInformation, &SysTimeInfo, sizeof(SysTimeInfo), NULL);
@@ -389,6 +390,11 @@ ReadProcOwner:
pPerfData[Idx].GDIObjectCount = GetGuiResources(hProcess, GR_GDIOBJECTS);
}
if (IsWow64Process(hProcess, &bIsWow64) && bIsWow64)
{
wcscat(pPerfData[Idx].ImageName, L" *32");
}
GetProcessIoCounters(hProcess, &pPerfData[Idx].IOCounters);
CloseHandle(hProcess);
} else {

View File

@@ -12,7 +12,7 @@
typedef struct _PERFDATA
{
WCHAR ImageName[MAX_PATH];
WCHAR ImageName[MAX_PATH + _countof(L" *32") - 1];
HANDLE ProcessId;
WCHAR UserName[MAX_PATH];
ULONG SessionId;

View File

@@ -509,7 +509,7 @@ PDHCP_ADAPTER AdapterFindIndex( unsigned int indx ) {
return NULL;
}
PDHCP_ADAPTER AdapterFindName( const WCHAR *name ) {
PDHCP_ADAPTER AdapterFindName( const CHAR *name ) {
PDHCP_ADAPTER Adapter;
PLIST_ENTRY ListEntry;
@@ -517,7 +517,7 @@ PDHCP_ADAPTER AdapterFindName( const WCHAR *name ) {
ListEntry != &AdapterList;
ListEntry = ListEntry->Flink ) {
Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
if( !_wcsicmp( Adapter->IfMib.wszName, name ) ) return Adapter;
if( !stricmp((const CHAR*)Adapter->IfMib.bDescr, name ) ) return Adapter;
}
return NULL;

View File

@@ -33,6 +33,101 @@ VOID ApiFree() {
/* This represents the service portion of the DHCP client API */
DWORD
DSAcquireParams(
_In_ PipeSendFunc Send,
_In_ HANDLE CommPipe,
_Out_ COMM_DHCP_REQ *Req)
{
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
struct protocol* proto;
DPRINT1("DSAcquireParams()\n");
ApiLock();
Adapter = AdapterFindName(Req->Body.AcquireParams.AdapterName);
DPRINT1("Adapter: %p\n", Adapter);
if (Adapter == NULL || Adapter->DhclientState.state == S_STATIC)
{
Reply.Reply = 0;
ApiUnlock();
return Send(CommPipe, &Reply);
}
Reply.Reply = 1;
proto = find_protocol_by_adapter(&Adapter->DhclientInfo);
if (proto)
remove_protocol(proto);
add_protocol(Adapter->DhclientInfo.name,
Adapter->DhclientInfo.rfdesc, got_one,
&Adapter->DhclientInfo);
Adapter->DhclientInfo.client->state = S_INIT;
state_reboot(&Adapter->DhclientInfo);
if (hAdapterStateChangedEvent != NULL)
SetEvent(hAdapterStateChangedEvent);
ApiUnlock();
return Send(CommPipe, &Reply);
}
DWORD
DSReleaseParams(
_In_ PipeSendFunc Send,
_In_ HANDLE CommPipe,
_Out_ COMM_DHCP_REQ *Req)
{
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
struct protocol* proto;
DPRINT1("DSReleaseParams()\n");
ApiLock();
Adapter = AdapterFindName(Req->Body.AcquireParams.AdapterName);
DPRINT1("Adapter: %p\n", Adapter);
Reply.Reply = Adapter ? 1 : 0;
if (Adapter)
{
if (Adapter->NteContext)
{
DeleteIPAddress(Adapter->NteContext);
Adapter->NteContext = 0;
}
if (Adapter->RouterMib.dwForwardNextHop)
{
DeleteIpForwardEntry(&Adapter->RouterMib);
Adapter->RouterMib.dwForwardNextHop = 0;
}
proto = find_protocol_by_adapter(&Adapter->DhclientInfo);
if (proto)
remove_protocol(proto);
Adapter->DhclientInfo.client->active = NULL;
Adapter->DhclientInfo.client->state = S_INIT;
if (hAdapterStateChangedEvent != NULL)
SetEvent(hAdapterStateChangedEvent);
}
ApiUnlock();
return Send(CommPipe, &Reply);
}
DWORD DSLeaseIpAddress( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
@@ -205,40 +300,3 @@ DWORD DSStaticRefreshParams( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *
return Send(CommPipe, &Reply );
}
DWORD DSGetAdapterInfo( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req ) {
COMM_DHCP_REPLY Reply;
PDHCP_ADAPTER Adapter;
ApiLock();
Adapter = AdapterFindIndex( Req->AdapterIndex );
Reply.Reply = Adapter ? 1 : 0;
if( Adapter ) {
Reply.GetAdapterInfo.DhcpEnabled = (S_STATIC != Adapter->DhclientState.state);
if (S_BOUND == Adapter->DhclientState.state) {
if (sizeof(Reply.GetAdapterInfo.DhcpServer) ==
Adapter->DhclientState.active->serveraddress.len) {
memcpy(&Reply.GetAdapterInfo.DhcpServer,
Adapter->DhclientState.active->serveraddress.iabuf,
Adapter->DhclientState.active->serveraddress.len);
} else {
DPRINT1("Unexpected server address len %d\n",
Adapter->DhclientState.active->serveraddress.len);
Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
}
Reply.GetAdapterInfo.LeaseObtained = Adapter->DhclientState.active->obtained;
Reply.GetAdapterInfo.LeaseExpires = Adapter->DhclientState.active->expiry;
} else {
Reply.GetAdapterInfo.DhcpServer = htonl(INADDR_NONE);
Reply.GetAdapterInfo.LeaseObtained = 0;
Reply.GetAdapterInfo.LeaseExpires = 0;
}
}
ApiUnlock();
return Send(CommPipe, &Reply );
}

View File

@@ -532,6 +532,10 @@ void setup_adapter( PDHCP_ADAPTER Adapter, struct client_lease *new_lease ) {
RegSetValueExA(hkey, "DhcpSubnetMask", 0, REG_SZ, (LPBYTE)Buffer, strlen(Buffer)+1);
dwEnableDHCP = 1;
RegSetValueExA(hkey, "EnableDHCP", 0, REG_DWORD, (LPBYTE)&dwEnableDHCP, sizeof(DWORD));
RegSetValueExA(hkey, "LeaseObtainedTime", 0, REG_DWORD, (LPBYTE)&new_lease->obtained, sizeof(DWORD));
RegSetValueExA(hkey, "LeaseTerminatesTime", 0, REG_DWORD, (LPBYTE)&new_lease->expiry, sizeof(DWORD));
RegSetValueExA(hkey, "DhcpServer", 0, REG_SZ, (LPBYTE)piaddr(new_lease->serveraddress), strlen(piaddr(new_lease->serveraddress))+1);
}
if( !NT_SUCCESS(Status) )

View File

@@ -377,11 +377,21 @@ DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
}
}
if( Result ) {
switch( Req.Type ) {
case DhcpReqQueryHWInfo:
DSQueryHWInfo( PipeSend, CommPipe, &Req );
break;
if( Result )
{
switch( Req.Type )
{
case DhcpReqAcquireParams:
DSAcquireParams(PipeSend, CommPipe, &Req);
break;
case DhcpReqReleaseParams:
DSReleaseParams(PipeSend, CommPipe, &Req);
break;
case DhcpReqQueryHWInfo:
DSQueryHWInfo(PipeSend, CommPipe, &Req);
break;
case DhcpReqLeaseIpAddress:
DSLeaseIpAddress( PipeSend, CommPipe, &Req );
@@ -399,10 +409,6 @@ DWORD WINAPI PipeThreadProc( LPVOID Parameter ) {
DSStaticRefreshParams( PipeSend, CommPipe, &Req );
break;
case DhcpReqGetAdapterInfo:
DSGetAdapterInfo( PipeSend, CommPipe, &Req );
break;
default:
DPRINT1("Unrecognized request type %d\n", Req.Type);
ZeroMemory( &Reply, sizeof( COMM_DHCP_REPLY ) );

View File

@@ -74,6 +74,69 @@ DhcpCApiCleanup(VOID)
PipeHandle = INVALID_HANDLE_VALUE;
}
/* FIXME: The adapter name should be a unicode string */
DWORD
APIENTRY
DhcpAcquireParameters(
_In_ PSTR AdapterName)
{
COMM_DHCP_REQ Req;
COMM_DHCP_REPLY Reply;
DWORD BytesRead;
BOOL Result;
DPRINT1("DhcpAcquireParameters(%s)\n", AdapterName);
ASSERT(PipeHandle != INVALID_HANDLE_VALUE);
Req.Type = DhcpReqAcquireParams;
strcpy(Req.Body.AcquireParams.AdapterName, AdapterName);
Result = TransactNamedPipe(PipeHandle,
&Req, sizeof(Req),
&Reply, sizeof(Reply),
&BytesRead, NULL);
if (!Result)
{
/* Pipe transaction failed */
return GetLastError();
}
return Reply.Reply;
}
/* FIXME: The adapter name should be a unicode string */
DWORD
APIENTRY
DhcpReleaseParameters(
_In_ PSTR AdapterName)
{
COMM_DHCP_REQ Req;
COMM_DHCP_REPLY Reply;
DWORD BytesRead;
BOOL Result;
DPRINT1("DhcpReleaseParameters(%s)\n", AdapterName);
ASSERT(PipeHandle != INVALID_HANDLE_VALUE);
Req.Type = DhcpReqReleaseParams;
strcpy(Req.Body.AcquireParams.AdapterName, AdapterName);
Result = TransactNamedPipe(PipeHandle,
&Req, sizeof(Req),
&Reply, sizeof(Reply),
&BytesRead, NULL);
if (!Result)
{
/* Pipe transaction failed */
return GetLastError();
}
return Reply.Reply;
}
DWORD APIENTRY
DhcpQueryHWInfo(DWORD AdapterIndex,
PDWORD MediaType,
@@ -272,74 +335,6 @@ DhcpRequestParams(DWORD Flags,
return 0;
}
/*!
* Get DHCP info for an adapter
*
* \param[in] AdapterIndex
* Index of the adapter (iphlpapi-style) for which info is
* requested
*
* \param[out] DhcpEnabled
* Returns whether DHCP is enabled for the adapter
*
* \param[out] DhcpServer
* Returns DHCP server IP address (255.255.255.255 if no
* server reached yet), in network byte order
*
* \param[out] LeaseObtained
* Returns time at which the lease was obtained
*
* \param[out] LeaseExpires
* Returns time at which the lease will expire
*
* \return non-zero on success
*
* \remarks This is a ReactOS-only routine
*/
DWORD APIENTRY
DhcpRosGetAdapterInfo(DWORD AdapterIndex,
PBOOL DhcpEnabled,
PDWORD DhcpServer,
time_t* LeaseObtained,
time_t* LeaseExpires)
{
COMM_DHCP_REQ Req;
COMM_DHCP_REPLY Reply;
DWORD BytesRead;
BOOL Result;
ASSERT(PipeHandle != INVALID_HANDLE_VALUE);
Req.Type = DhcpReqGetAdapterInfo;
Req.AdapterIndex = AdapterIndex;
Result = TransactNamedPipe(PipeHandle,
&Req, sizeof(Req),
&Reply, sizeof(Reply),
&BytesRead, NULL);
if (Result && Reply.Reply != 0)
*DhcpEnabled = Reply.GetAdapterInfo.DhcpEnabled;
else
*DhcpEnabled = FALSE;
if (*DhcpEnabled)
{
*DhcpServer = Reply.GetAdapterInfo.DhcpServer;
*LeaseObtained = Reply.GetAdapterInfo.LeaseObtained;
*LeaseExpires = Reply.GetAdapterInfo.LeaseExpires;
}
else
{
*DhcpServer = INADDR_NONE;
*LeaseObtained = 0;
*LeaseExpires = 0;
}
return Reply.Reply;
}
static VOID
UpdateServiceStatus(DWORD dwState)
{

View File

@@ -5,7 +5,7 @@
# PURPOSE: dhcpcsvc exports
# COPYRIGHT: Copyright 2006 Ge van Geldorp <gvg@reactos.org>
#
@ stub DhcpAcquireParameters
@ stdcall DhcpAcquireParameters(str)
@ stub DhcpAcquireParametersByBroadcast
@ stdcall DhcpCApiCleanup()
@ stdcall DhcpCApiInitialize(ptr)
@@ -27,7 +27,7 @@
@ stub DhcpRegisterParamChange
@ stdcall DhcpReleaseIpAddressLease(long)
@ stub DhcpReleaseIpAddressLeaseEx
@ stub DhcpReleaseParameters
@ stdcall DhcpReleaseParameters(str)
@ stub DhcpRemoveDNSRegistrations
@ stdcall DhcpRenewIpAddressLease(long)
@ stub DhcpRenewIpAddressLeaseEx
@@ -42,5 +42,4 @@
@ stub McastReleaseAddress
@ stub McastRenewAddress
@ stub McastRequestAddress
@ stdcall DhcpRosGetAdapterInfo(long ptr ptr ptr ptr)
@ stdcall ServiceMain(long ptr)

View File

@@ -13,7 +13,7 @@
#define NTOS_MODE_USER
#include <ndk/rtlfuncs.h>
#include <dhcpcsdk.h>
#include <dhcp/rosdhcp_public.h>
#include <rosdhcp_pipe.h>
#include "debug.h"
@@ -90,6 +90,7 @@ void AdapterStop(VOID);
extern PDHCP_ADAPTER AdapterGetFirst(VOID);
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
extern PDHCP_ADAPTER AdapterFindIndex( unsigned int AdapterIndex );
extern PDHCP_ADAPTER AdapterFindName(const CHAR *name);
extern PDHCP_ADAPTER AdapterFindInfo( struct interface_info *info );
extern PDHCP_ADAPTER AdapterFindByHardwareAddress( u_int8_t haddr[16], u_int8_t hlen );
extern HANDLE PipeInit(HANDLE hStopEvent);
@@ -97,6 +98,8 @@ extern VOID ApiInit(VOID);
extern VOID ApiFree(VOID);
extern VOID ApiLock(VOID);
extern VOID ApiUnlock(VOID);
extern DWORD DSAcquireParams(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req);
extern DWORD DSReleaseParams(PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req);
extern DWORD DSQueryHWInfo( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req );
extern DWORD DSLeaseIpAddress( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req );
extern DWORD DSRenewIpAddressLease( PipeSendFunc Send, HANDLE CommPipe, COMM_DHCP_REQ *Req );

View File

@@ -1,19 +1,25 @@
#ifndef ROSDHCP_PUBLIC_H
#define ROSDHCP_PUBLIC_H
#ifndef ROSDHCP_PIPE_H
#define ROSDHCP_PIPE_H
enum {
DhcpReqAcquireParams,
DhcpReqReleaseParams,
DhcpReqLeaseIpAddress,
DhcpReqQueryHWInfo,
DhcpReqReleaseIpAddress,
DhcpReqRenewIpAddress,
DhcpReqStaticRefreshParams,
DhcpReqGetAdapterInfo,
};
typedef struct _COMM_DHCP_REQ {
UINT Type;
DWORD AdapterIndex;
union {
union
{
struct
{
CHAR AdapterName[64];
} AcquireParams;
struct {
BOOL Inserted;
} PnpEvent;
@@ -40,14 +46,8 @@ typedef union _COMM_DHCP_REPLY {
DWORD Mtu;
DWORD Speed;
} QueryHWInfo;
struct {
BOOL DhcpEnabled;
DWORD DhcpServer;
time_t LeaseObtained;
time_t LeaseExpires;
} GetAdapterInfo;
} COMM_DHCP_REPLY;
#define DHCP_PIPE_NAME L"\\\\.\\pipe\\dhcpclient"
#endif/*ROSDHCP_PUBLIC_H*/
#endif/*ROSDHCP_PIPE_H*/

View File

@@ -118,6 +118,12 @@ VOID
ProcessDeviceClassChangeEvent(
_In_ PPLUGPLAY_EVENT_BLOCK PnpEvent)
{
RPC_STATUS RpcStatus;
PLIST_ENTRY Current;
PNOTIFY_ENTRY pNotifyData;
PDEV_BROADCAST_DEVICEINTERFACE_W pData;
DWORD dwSize;
DPRINT("ProcessDeviceClassChangeEvent(%p)\n", PnpEvent);
DPRINT("SymbolicLink: %S\n", PnpEvent->DeviceClass.SymbolicLinkName);
DPRINT("ClassGuid: {%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}\n",
@@ -125,6 +131,50 @@ ProcessDeviceClassChangeEvent(
PnpEvent->DeviceClass.ClassGuid.Data4[0], PnpEvent->DeviceClass.ClassGuid.Data4[1], PnpEvent->DeviceClass.ClassGuid.Data4[2],
PnpEvent->DeviceClass.ClassGuid.Data4[3], PnpEvent->DeviceClass.ClassGuid.Data4[4], PnpEvent->DeviceClass.ClassGuid.Data4[5],
PnpEvent->DeviceClass.ClassGuid.Data4[6], PnpEvent->DeviceClass.ClassGuid.Data4[7]);
RtlAcquireResourceShared(&NotificationListLock, TRUE);
Current = NotificationListHead.Flink;
while (Current != &NotificationListHead)
{
pNotifyData = CONTAINING_RECORD(Current, NOTIFY_ENTRY, ListEntry);
if ((pNotifyData->dwType == CLASS_NOTIFICATION) &&
((pNotifyData->ulFlags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) ||
(UuidEqual(&PnpEvent->DeviceClass.ClassGuid, &pNotifyData->ClassGuid, &RpcStatus))))
{
if ((pNotifyData->ulFlags & DEVICE_NOTIFY_WINDOW_HANDLE) == DEVICE_NOTIFY_WINDOW_HANDLE)
{
dwSize = sizeof(DEV_BROADCAST_DEVICEINTERFACE_W) + wcslen(PnpEvent->DeviceClass.SymbolicLinkName) * sizeof(WCHAR);
pData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
pData->dbcc_size = dwSize;
pData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
CopyMemory(&pData->dbcc_classguid, &PnpEvent->DeviceClass.ClassGuid, sizeof(GUID));
wcscpy(pData->dbcc_name, PnpEvent->DeviceClass.SymbolicLinkName);
if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_INTERFACE_ARRIVAL, &RpcStatus))
{
DPRINT("Interface arrival: %S\n", PnpEvent->DeviceClass.SymbolicLinkName);
SendMessageW((HANDLE)pNotifyData->hRecipient, WM_DEVICECHANGE, DBT_DEVICEARRIVAL, (LPARAM)pData);
}
else if (UuidEqual(&PnpEvent->EventGuid, (UUID*)&GUID_DEVICE_INTERFACE_REMOVAL, &RpcStatus))
{
DPRINT("Interface removal: %S\n", PnpEvent->DeviceClass.SymbolicLinkName);
SendMessageW((HANDLE)pNotifyData->hRecipient, WM_DEVICECHANGE, DBT_DEVICEREMOVECOMPLETE, (LPARAM)pData);
}
HeapFree(GetProcessHeap(), 0, pData);
}
else
{
DPRINT1("Service notification is not implemented yet!\n");
}
}
Current = Current->Flink;
}
RtlReleaseResource(&NotificationListLock);
}

View File

@@ -26,6 +26,7 @@
#include <rtlfuncs.h>
#include <setypes.h>
#include <umpnpmgr/sysguid.h>
#include <wdmguid.h>
#include <cfgmgr32.h>
#include <regstr.h>
#include <userenv.h>
@@ -41,10 +42,21 @@ typedef struct
WCHAR DeviceIds[ANYSIZE_ARRAY];
} DeviceInstallParams;
typedef enum
{
CLASS_NOTIFICATION = 1,
TARGET_NOTIFICATION
} NOTIFICATION_TYPE;
typedef struct
{
LIST_ENTRY ListEntry;
NOTIFICATION_TYPE dwType;
PWSTR pszName;
DWORD_PTR hRecipient;
DWORD ulFlags;
GUID ClassGuid;
} NOTIFY_ENTRY, *PNOTIFY_ENTRY;
/* event.c */
@@ -78,6 +90,7 @@ DeviceInstallThread(
/* rpcserver.c */
extern LIST_ENTRY NotificationListHead;
extern RTL_RESOURCE NotificationListLock;
DWORD
WINAPI

View File

@@ -37,8 +37,10 @@
/* GLOBALS ******************************************************************/
static WCHAR szRootDeviceInstanceID[] = L"HTREE\\ROOT\\0";
LUID LoadDriverPrivilege = {SE_LOAD_DRIVER_PRIVILEGE, 0};
LIST_ENTRY NotificationListHead;
RTL_RESOURCE NotificationListLock;
/* FUNCTIONS *****************************************************************/
@@ -53,6 +55,7 @@ RpcServerThread(LPVOID lpParameter)
DPRINT("RpcServerThread() called\n");
InitializeListHead(&NotificationListHead);
RtlInitializeResource(&NotificationListLock);
#if 0
/* 2k/XP/2k3-compatible protocol sequence/endpoint */
@@ -5051,6 +5054,8 @@ PNP_RegisterNotification(
pNotifyData = RtlAllocateHeap(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NOTIFY_ENTRY));
if (pNotifyData == NULL)
return CR_OUT_OF_MEMORY;
pNotifyData->dwType = CLASS_NOTIFICATION;
if (pszName != NULL)
{
@@ -5064,8 +5069,20 @@ PNP_RegisterNotification(
}
}
pNotifyData->hRecipient = hRecipient;
pNotifyData->ulFlags = ulFlags;
if ((ulFlags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) == 0)
{
CopyMemory(&pNotifyData->ClassGuid,
&pBroadcastDeviceInterface->dbcc_classguid,
sizeof(GUID));
}
/* Add the entry to the notification list */
RtlAcquireResourceExclusive(&NotificationListLock, TRUE);
InsertTailList(&NotificationListHead, &pNotifyData->ListEntry);
RtlReleaseResource(&NotificationListLock);
DPRINT("pNotifyData: %p\n", pNotifyData);
*pNotifyHandle = (PNP_NOTIFY_HANDLE)pNotifyData;
@@ -5108,7 +5125,10 @@ PNP_UnregisterNotification(
if (pEntry == NULL)
return CR_INVALID_DATA;
RtlAcquireResourceExclusive(&NotificationListLock, TRUE);
RemoveEntryList(&pEntry->ListEntry);
RtlReleaseResource(&NotificationListLock);
if (pEntry->pszName)
RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry->pszName);
RtlFreeHeap(RtlGetProcessHeap(), 0, pEntry);

View File

@@ -35,14 +35,18 @@ list(APPEND SOURCE
setuplib.c
precomp.h)
# Static library used for the dll and for setuplib_unittest.
add_library(setuplib_static ${SOURCE})
add_pch(setuplib_static precomp.h SOURCE)
add_dependencies(setuplib_static xdk) # psdk
add_library(setuplib SHARED
${SOURCE}
main.c
setuplib.rc
${CMAKE_CURRENT_BINARY_DIR}/setuplib.def)
target_link_libraries(setuplib setuplib_static)
add_pch(setuplib precomp.h SOURCE)
add_dependencies(setuplib xdk) # psdk
set_module_type(setuplib nativedll)
target_link_libraries(setuplib ext2lib vfatlib btrfslib ${PSEH_LIB})
add_importlibs(setuplib ntdll)

49
base/setup/lib/main.c Normal file
View File

@@ -0,0 +1,49 @@
/*
* PROJECT: ReactOS Setup Library
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: DLL Main Routine
* COPYRIGHT: Copyright 2025 Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
*/
/* INCLUDES ******************************************************************/
/* PSDK/NDK Headers */
#define WIN32_NO_STATUS
#include <windef.h>
#include <winbase.h>
#define NTOS_MODE_USER
// #include <ndk/umfuncs.h>
#include <ndk/rtlfuncs.h>
/* GLOBALS *******************************************************************/
extern HANDLE ProcessHeap;
/* ENTRY-POINT ***************************************************************/
/* Declared in ndk/umfuncs.h */
NTSTATUS
NTAPI
LdrDisableThreadCalloutsForDll(
_In_ PVOID BaseAddress);
BOOL
NTAPI
DllMain(
_In_ HINSTANCE hDll,
_In_ ULONG dwReason,
_In_opt_ PVOID pReserved)
{
UNREFERENCED_PARAMETER(pReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
LdrDisableThreadCalloutsForDll(hDll);
ProcessHeap = RtlGetProcessHeap();
}
return TRUE;
}
/* EOF */

View File

@@ -1405,31 +1405,4 @@ Cleanup:
return ErrorNumber;
}
/* ENTRY-POINT ***************************************************************/
/* Declared in ndk/umfuncs.h */
NTSTATUS
NTAPI
LdrDisableThreadCalloutsForDll(
_In_ PVOID BaseAddress);
BOOL
NTAPI
DllMain(
_In_ HINSTANCE hDll,
_In_ ULONG dwReason,
_In_opt_ PVOID pReserved)
{
UNREFERENCED_PARAMETER(pReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
LdrDisableThreadCalloutsForDll(hDll);
ProcessHeap = RtlGetProcessHeap();
}
return TRUE;
}
/* EOF */

View File

@@ -1,290 +1,470 @@
/*
* SHAppBarMessage implementation
*
* Copyright 2008 Vincent Povirk for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*
* TODO: freedesktop _NET_WM_STRUT integration
*
* TODO: find when a fullscreen app is in the foreground and send FULLSCREENAPP
* notifications
*
* TODO: detect changes in the screen size and send ABN_POSCHANGED ?
*
* TODO: multiple monitor support
* PROJECT: ReactOS Explorer
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: AppBar implementation
* COPYRIGHT: Copyright 2008 Vincent Povirk for CodeWeavers
* Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
//
// Adapted from Wine appbar.c .
//
#include "precomp.h"
#include "appbar.h"
#include <wine/list.h>
#define GetPrimaryTaskbar() FindWindowW(L"Shell_TrayWnd", NULL)
struct appbar_cmd
CAppBarManager::CAppBarManager()
: m_hAppBarDPA(NULL)
{
DWORD dwMsg;
ULONG return_map;
DWORD return_process;
struct _AppBarData abd;
};
}
struct appbar_response
CAppBarManager::~CAppBarManager()
{
ULONGLONG result;
struct _AppBarData abd;
};
DestroyAppBarDPA();
}
struct appbar_data
PAPPBAR CAppBarManager::FindAppBar(_In_ HWND hwndAppBar) const
{
struct list entry;
HWND hwnd;
UINT callback_msg;
UINT edge;
RECT rc;
BOOL space_reserved;
/* BOOL autohide; */
};
if (!m_hAppBarDPA)
return NULL;
static struct list appbars = LIST_INIT(appbars);
static struct appbar_data* get_appbar(HWND hwnd)
{
struct appbar_data* data;
LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry)
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
if (data->hwnd == hwnd)
return data;
PAPPBAR pAppBar = (PAPPBAR)DPA_GetPtr(m_hAppBarDPA, nItems);
if (pAppBar && hwndAppBar == pAppBar->hWnd)
return pAppBar;
}
return NULL;
}
void appbar_notify_all(HMONITOR hMon, UINT uMsg, HWND hwndExclude, LPARAM lParam)
void CAppBarManager::EliminateAppBar(_In_ INT iItem)
{
struct appbar_data* data;
LocalFree(DPA_GetPtr(m_hAppBarDPA, iItem));
DPA_DeletePtr(m_hAppBarDPA, iItem);
}
LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry)
void CAppBarManager::DestroyAppBarDPA()
{
if (!m_hAppBarDPA)
return;
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
if (data->hwnd == hwndExclude)
continue;
if (hMon && hMon != MonitorFromWindow(data->hwnd, MONITOR_DEFAULTTONULL))
continue;
SendMessageW(data->hwnd, data->callback_msg, uMsg, lParam);
::LocalFree(DPA_GetPtr(m_hAppBarDPA, nItems));
}
DPA_Destroy(m_hAppBarDPA);
m_hAppBarDPA = NULL;
}
/* send_poschanged: send ABN_POSCHANGED to every appbar except one */
static void send_poschanged(HWND hwnd)
// ABM_NEW
BOOL CAppBarManager::OnAppBarNew(_In_ const APPBAR_COMMAND *pData)
{
appbar_notify_all(NULL, ABN_POSCHANGED, hwnd, 0);
}
HWND hWnd = (HWND)UlongToHandle(pData->abd.hWnd32);
/* appbar_cliprect: cut out parts of the rectangle that interfere with existing appbars */
static void appbar_cliprect( HWND hwnd, RECT *rect )
{
struct appbar_data* data;
LIST_FOR_EACH_ENTRY(data, &appbars, struct appbar_data, entry)
if (m_hAppBarDPA)
{
if (data->hwnd == hwnd)
if (FindAppBar(hWnd))
{
/* we only care about appbars that were added before this one */
return;
}
if (data->space_reserved)
{
/* move in the side that corresponds to the other appbar's edge */
switch (data->edge)
{
case ABE_BOTTOM:
rect->bottom = min(rect->bottom, data->rc.top);
break;
case ABE_LEFT:
rect->left = max(rect->left, data->rc.right);
break;
case ABE_RIGHT:
rect->right = min(rect->right, data->rc.left);
break;
case ABE_TOP:
rect->top = max(rect->top, data->rc.bottom);
break;
}
}
}
}
static UINT_PTR handle_appbarmessage(DWORD msg, _AppBarData *abd)
{
struct appbar_data* data;
HWND hwnd = abd->hWnd;
switch (msg)
{
case ABM_NEW:
if (get_appbar(hwnd))
{
/* fail when adding an hwnd the second time */
ERR("Already exists: %p\n", hWnd);
return FALSE;
}
data = (struct appbar_data*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct appbar_data));
if (!data)
{
ERR("out of memory\n");
return FALSE;
}
data->hwnd = hwnd;
data->callback_msg = abd->uCallbackMessage;
list_add_tail(&appbars, &data->entry);
return TRUE;
case ABM_REMOVE:
if ((data = get_appbar(hwnd)))
{
list_remove(&data->entry);
send_poschanged(hwnd);
HeapFree(GetProcessHeap(), 0, data);
}
else
WARN("removing hwnd %p not on the list\n", hwnd);
return TRUE;
case ABM_QUERYPOS:
if (abd->uEdge > ABE_BOTTOM)
WARN("invalid edge %i for %p\n", abd->uEdge, hwnd);
appbar_cliprect( hwnd, &abd->rc );
return TRUE;
case ABM_SETPOS:
if (abd->uEdge > ABE_BOTTOM)
{
WARN("invalid edge %i for %p\n", abd->uEdge, hwnd);
return TRUE;
}
if ((data = get_appbar(hwnd)))
{
/* calculate acceptable space */
appbar_cliprect( hwnd, &abd->rc );
if (!EqualRect(&abd->rc, &data->rc))
send_poschanged(hwnd);
/* reserve that space for this appbar */
data->edge = abd->uEdge;
data->rc = abd->rc;
data->space_reserved = TRUE;
}
else
{
WARN("app sent ABM_SETPOS message for %p without ABM_ADD\n", hwnd);
}
return TRUE;
case ABM_GETSTATE:
TRACE("SHAppBarMessage(ABM_GETSTATE)\n");
return (g_TaskbarSettings.sr.AutoHide ? ABS_AUTOHIDE : 0) |
(g_TaskbarSettings.sr.AlwaysOnTop ? ABS_ALWAYSONTOP : 0);
case ABM_SETSTATE:
TRACE("SHAppBarMessage(ABM_SETSTATE lparam=%s)\n", wine_dbgstr_longlong(abd->lParam));
hwnd = GetPrimaryTaskbar();
if (hwnd)
{
TaskbarSettings settings = g_TaskbarSettings;
settings.sr.AutoHide = (abd->lParam & ABS_AUTOHIDE) != 0;
settings.sr.AlwaysOnTop = (abd->lParam & ABS_ALWAYSONTOP) != 0;
SendMessageW(hwnd, TWM_SETTINGSCHANGED, 0, (LPARAM)&settings);
return TRUE;
}
return FALSE;
case ABM_GETTASKBARPOS:
TRACE("SHAppBarMessage(ABM_GETTASKBARPOS, hwnd=%p)\n", hwnd);
abd->uEdge = g_TaskbarSettings.sr.Position;
abd->hWnd = GetPrimaryTaskbar();
return abd->hWnd && GetWindowRect(abd->hWnd, &abd->rc);
case ABM_ACTIVATE:
return TRUE;
case ABM_GETAUTOHIDEBAR:
FIXME("SHAppBarMessage(ABM_GETAUTOHIDEBAR, hwnd=%p, edge=%x): stub\n", hwnd, abd->uEdge);
if (abd->uEdge == g_TaskbarSettings.sr.Position && g_TaskbarSettings.sr.AutoHide)
return (SIZE_T)GetPrimaryTaskbar();
return NULL;
case ABM_SETAUTOHIDEBAR:
FIXME("SHAppBarMessage(ABM_SETAUTOHIDEBAR, hwnd=%p, edge=%x, lparam=%s): stub\n",
hwnd, abd->uEdge, wine_dbgstr_longlong(abd->lParam));
return TRUE;
case ABM_WINDOWPOSCHANGED:
return TRUE;
default:
FIXME("SHAppBarMessage(%x) unimplemented\n", msg);
return FALSE;
}
}
LRESULT appbar_message ( COPYDATASTRUCT* cds )
{
struct appbar_cmd cmd;
UINT_PTR result;
HANDLE return_hproc;
HANDLE return_map;
LPVOID return_view;
struct appbar_response* response;
if (cds->cbData != sizeof(struct appbar_cmd))
return TRUE;
RtlCopyMemory(&cmd, cds->lpData, cds->cbData);
result = handle_appbarmessage(cmd.dwMsg, &cmd.abd);
return_hproc = OpenProcess(PROCESS_DUP_HANDLE, FALSE, cmd.return_process);
if (return_hproc == NULL)
{
ERR("couldn't open calling process\n");
return TRUE;
}
if (!DuplicateHandle(return_hproc, UlongToHandle(cmd.return_map), GetCurrentProcess(), &return_map, 0, FALSE, DUPLICATE_SAME_ACCESS))
{
ERR("couldn't duplicate handle\n");
CloseHandle(return_hproc);
return TRUE;
}
CloseHandle(return_hproc);
return_view = MapViewOfFile(return_map, FILE_MAP_WRITE, 0, 0, sizeof(struct appbar_response));
if (return_view)
{
response = (struct appbar_response*)return_view;
response->result = result;
response->abd = cmd.abd;
UnmapViewOfFile(return_view);
}
else
{
ERR("couldn't map view of file\n");
const UINT c_nGrow = 4;
m_hAppBarDPA = DPA_Create(c_nGrow);
if (!m_hAppBarDPA)
{
ERR("Out of memory\n");
return FALSE;
}
}
CloseHandle(return_map);
PAPPBAR pAppBar = (PAPPBAR)::LocalAlloc(LPTR, sizeof(*pAppBar));
if (pAppBar)
{
pAppBar->hWnd = hWnd;
pAppBar->uEdge = UINT_MAX;
pAppBar->uCallbackMessage = pData->abd.uCallbackMessage;
if (DPA_InsertPtr(m_hAppBarDPA, INT_MAX, pAppBar) >= 0)
return TRUE; // Success!
::LocalFree(pAppBar);
}
ERR("Out of memory\n");
return FALSE;
}
// ABM_REMOVE
void CAppBarManager::OnAppBarRemove(_In_ const APPBAR_COMMAND *pData)
{
if (!m_hAppBarDPA)
return;
HWND hWnd = (HWND)UlongToHandle(pData->abd.hWnd32);
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
PAPPBAR pAppBar = (PAPPBAR)DPA_GetPtr(m_hAppBarDPA, nItems);
if (!pAppBar)
continue;
if (pAppBar->hWnd == hWnd)
{
RECT rcOld = pAppBar->rc;
EliminateAppBar(nItems);
StuckAppChange(hWnd, &rcOld, NULL, FALSE);
}
}
}
// ABM_QUERYPOS
void CAppBarManager::OnAppBarQueryPos(_Inout_ PAPPBAR_COMMAND pData)
{
HWND hWnd = (HWND)UlongToHandle(pData->abd.hWnd32);
PAPPBAR pAppBar1 = FindAppBar(hWnd);
if (!pAppBar1)
{
ERR("Not found: %p\n", hWnd);
return;
}
PAPPBARDATA3264 pOutput = AppBar_LockOutput(pData);
if (!pOutput)
{
ERR("!pOutput: %d\n", pData->dwProcessId);
return;
}
pOutput->rc = pData->abd.rc;
if (::IsRectEmpty(&pOutput->rc))
ERR("IsRectEmpty\n");
HMONITOR hMon1 = ::MonitorFromRect(&pOutput->rc, MONITOR_DEFAULTTOPRIMARY);
ASSERT(hMon1 != NULL);
// Subtract tray rectangle from pOutput->rc if necessary
if (hMon1 == GetMonitor() && !IsAutoHideState())
{
APPBAR dummyAppBar;
dummyAppBar.uEdge = GetPosition();
GetDockedRect(&dummyAppBar.rc);
AppBarSubtractRect(&dummyAppBar, &pOutput->rc);
}
// Subtract area from pOutput->rc
UINT uEdge = pData->abd.uEdge;
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
PAPPBAR pAppBar2 = (PAPPBAR)DPA_GetPtr(m_hAppBarDPA, nItems);
if (!pAppBar2 || pAppBar1->hWnd == pAppBar2->hWnd)
continue;
if ((Edge_IsVertical(uEdge) || !Edge_IsVertical(pAppBar2->uEdge)) &&
(pAppBar1->uEdge != uEdge || !AppBarOutsideOf(pAppBar1, pAppBar2)))
{
if (pAppBar1->uEdge == uEdge || pAppBar2->uEdge != uEdge)
continue;
}
HMONITOR hMon2 = ::MonitorFromRect(&pAppBar2->rc, MONITOR_DEFAULTTONULL);
if (hMon1 == hMon2)
AppBarSubtractRect(pAppBar2, &pOutput->rc);
}
AppBar_UnLockOutput(pOutput);
}
// ABM_SETPOS
void CAppBarManager::OnAppBarSetPos(_Inout_ PAPPBAR_COMMAND pData)
{
HWND hWnd = (HWND)UlongToHandle(pData->abd.hWnd32);
PAPPBAR pAppBar = FindAppBar(hWnd);
if (!pAppBar)
return;
OnAppBarQueryPos(pData);
PAPPBARDATA3264 pOutput = AppBar_LockOutput(pData);
if (!pOutput)
return;
RECT rcOld = pAppBar->rc, rcNew = pData->abd.rc;
BOOL bChanged = !::EqualRect(&rcOld, &rcNew);
pAppBar->rc = rcNew;
pAppBar->uEdge = pData->abd.uEdge;
AppBar_UnLockOutput(pOutput);
if (bChanged)
StuckAppChange(hWnd, &rcOld, &rcNew, FALSE);
}
void CAppBarManager::OnAppBarNotifyAll(
_In_opt_ HMONITOR hMon,
_In_opt_ HWND hwndIgnore,
_In_ DWORD dwNotify,
_In_opt_ LPARAM lParam)
{
TRACE("%p, %p, 0x%X, %p\n", hMon, hwndIgnore, dwNotify, lParam);
if (!m_hAppBarDPA)
return;
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
PAPPBAR pAppBar = (PAPPBAR)DPA_GetPtr(m_hAppBarDPA, nItems);
if (!pAppBar || pAppBar->hWnd == hwndIgnore)
continue;
HWND hwndAppBar = pAppBar->hWnd;
if (!::IsWindow(hwndAppBar))
{
EliminateAppBar(nItems);
continue;
}
if (!hMon || hMon == ::MonitorFromWindow(hwndAppBar, MONITOR_DEFAULTTONULL))
::PostMessageW(hwndAppBar, pAppBar->uCallbackMessage, dwNotify, lParam);
}
}
/// @param pAppBar The target AppBar to subtract.
/// @param prc The rectangle to be subtracted.
void CAppBarManager::AppBarSubtractRect(_In_ PAPPBAR pAppBar, _Inout_ PRECT prc)
{
switch (pAppBar->uEdge)
{
case ABE_LEFT: prc->left = max(prc->left, pAppBar->rc.right); break;
case ABE_TOP: prc->top = max(prc->top, pAppBar->rc.bottom); break;
case ABE_RIGHT: prc->right = min(prc->right, pAppBar->rc.left); break;
case ABE_BOTTOM: prc->bottom = min(prc->bottom, pAppBar->rc.top); break;
default:
ASSERT(FALSE);
break;
}
}
// Is pAppBar1 outside of pAppBar2?
BOOL CAppBarManager::AppBarOutsideOf(
_In_ const APPBAR *pAppBar1,
_In_ const APPBAR *pAppBar2)
{
if (pAppBar1->uEdge != pAppBar2->uEdge)
return FALSE;
switch (pAppBar2->uEdge)
{
case ABE_LEFT: return pAppBar1->rc.left >= pAppBar2->rc.left;
case ABE_TOP: return pAppBar1->rc.top >= pAppBar2->rc.top;
case ABE_RIGHT: return pAppBar1->rc.right <= pAppBar2->rc.right;
case ABE_BOTTOM: return pAppBar1->rc.bottom <= pAppBar2->rc.bottom;
default:
ASSERT(FALSE);
return FALSE;
}
}
/// Get rectangle of the tray window.
/// @param prcDocked The pointer to the rectangle to be received.
void CAppBarManager::GetDockedRect(_Out_ PRECT prcDocked)
{
*prcDocked = *GetTrayRect();
if (IsAutoHideState() && IsHidingState())
ComputeHiddenRect(prcDocked, GetPosition());
}
/// Compute the position and size of the hidden TaskBar.
/// @param prc The rectangle before hiding TaskBar.
/// @param uSide The side of TaskBar (ABE_...).
void CAppBarManager::ComputeHiddenRect(_Inout_ PRECT prc, _In_ UINT uSide)
{
MONITORINFO mi = { sizeof(mi) };
HMONITOR hMonitor = ::MonitorFromRect(prc, MONITOR_DEFAULTTONULL);
if (!::GetMonitorInfoW(hMonitor, &mi))
return;
RECT rcMon = mi.rcMonitor;
INT cxy = Edge_IsVertical(uSide) ? (prc->bottom - prc->top) : (prc->right - prc->left);
switch (uSide)
{
case ABE_LEFT:
prc->right = rcMon.left + GetSystemMetrics(SM_CXFRAME) / 2;
prc->left = prc->right - cxy;
break;
case ABE_TOP:
prc->bottom = rcMon.top + GetSystemMetrics(SM_CYFRAME) / 2;
prc->top = prc->bottom - cxy;
break;
case ABE_RIGHT:
prc->left = rcMon.right - GetSystemMetrics(SM_CXFRAME) / 2;
prc->right = prc->left + cxy;
break;
case ABE_BOTTOM:
prc->top = rcMon.bottom - GetSystemMetrics(SM_CYFRAME) / 2;
prc->bottom = prc->top + cxy;
break;
default:
ASSERT(FALSE);
break;
}
}
/// This function is called when AppBar and/or TaskBar is being moved, removed, and/or updated.
/// @param hwndTarget The target window. Optional.
/// @param prcOld The old position and size. Optional.
/// @param prcNew The new position and size. Optional.
/// @param bTray TRUE if the tray is being moved.
void
CAppBarManager::StuckAppChange(
_In_opt_ HWND hwndTarget,
_In_opt_ const RECT *prcOld,
_In_opt_ const RECT *prcNew,
_In_ BOOL bTray)
{
RECT rcWorkArea1, rcWorkArea2;
HMONITOR hMon1 = NULL;
UINT flags = 0;
enum { SET_WORKAREA_1 = 1, SET_WORKAREA_2 = 2, NEED_SIZING = 4 }; // for flags
if (prcOld)
{
hMon1 = (bTray ? GetPreviousMonitor() : ::MonitorFromRect(prcOld, MONITOR_DEFAULTTONEAREST));
if (hMon1)
{
WORKAREA_TYPE type1 = RecomputeWorkArea(GetTrayRect(), hMon1, &rcWorkArea1);
if (type1 == WORKAREA_IS_NOT_MONITOR)
flags = SET_WORKAREA_1;
if (type1 == WORKAREA_SAME_AS_MONITOR)
flags = NEED_SIZING;
}
}
if (prcNew)
{
HMONITOR hMon2 = ::MonitorFromRect(prcNew, MONITOR_DEFAULTTONULL);
if (hMon2 && hMon2 != hMon1)
{
WORKAREA_TYPE type2 = RecomputeWorkArea(GetTrayRect(), hMon2, &rcWorkArea2);
if (type2 == WORKAREA_IS_NOT_MONITOR)
flags |= SET_WORKAREA_2;
else if (type2 == WORKAREA_SAME_AS_MONITOR && !flags)
flags = NEED_SIZING;
}
}
if (flags & SET_WORKAREA_1)
{
UINT fWinIni = ((flags == SET_WORKAREA_1 && GetDesktopWnd()) ? SPIF_SENDCHANGE : 0);
::SystemParametersInfoW(SPI_SETWORKAREA, TRUE, &rcWorkArea1, fWinIni);
RedrawDesktop(GetDesktopWnd(), &rcWorkArea1);
}
if (flags & SET_WORKAREA_2)
{
UINT fWinIni = (GetDesktopWnd() ? SPIF_SENDCHANGE : 0);
::SystemParametersInfoW(SPI_SETWORKAREA, TRUE, &rcWorkArea2, fWinIni);
RedrawDesktop(GetDesktopWnd(), &rcWorkArea2);
}
if (bTray || flags == NEED_SIZING)
::SendMessageW(GetDesktopWnd(), WM_SIZE, 0, 0);
// Post ABN_POSCHANGED messages to AppBar windows
OnAppBarNotifyAll(NULL, hwndTarget, ABN_POSCHANGED, TRUE);
}
void CAppBarManager::RedrawDesktop(_In_ HWND hwndDesktop, _Inout_ PRECT prc)
{
if (!hwndDesktop)
return;
::MapWindowPoints(NULL, hwndDesktop, (POINT*)prc, sizeof(*prc) / sizeof(POINT));
::RedrawWindow(hwndDesktop, prc, 0, RDW_ALLCHILDREN | RDW_ERASE | RDW_INVALIDATE);
}
/// Re-compute the work area.
/// @param prcTray The position and size of the tray window
/// @param hMonitor The monitor of the work area to re-compute.
/// @param prcWorkArea The work area to be re-computed.
WORKAREA_TYPE
CAppBarManager::RecomputeWorkArea(
_In_ const RECT *prcTray,
_In_ HMONITOR hMonitor,
_Out_ PRECT prcWorkArea)
{
MONITORINFO mi = { sizeof(mi) };
if (!::GetMonitorInfoW(hMonitor, &mi))
return WORKAREA_NO_TRAY_AREA;
if (IsAutoHideState())
*prcWorkArea = mi.rcMonitor;
else
::SubtractRect(prcWorkArea, &mi.rcMonitor, prcTray);
if (m_hAppBarDPA)
{
INT nItems = DPA_GetPtrCount(m_hAppBarDPA);
while (--nItems >= 0)
{
PAPPBAR pAppBar = (PAPPBAR)DPA_GetPtr(m_hAppBarDPA, nItems);
if (pAppBar && hMonitor == ::MonitorFromRect(&pAppBar->rc, MONITOR_DEFAULTTONULL))
AppBarSubtractRect(pAppBar, prcWorkArea);
}
}
if (!::EqualRect(prcWorkArea, &mi.rcWork))
return WORKAREA_IS_NOT_MONITOR;
if (IsAutoHideState() || ::IsRectEmpty(prcTray))
return WORKAREA_NO_TRAY_AREA;
return WORKAREA_SAME_AS_MONITOR;
}
PAPPBAR_COMMAND
CAppBarManager::GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
{
PAPPBAR_COMMAND pData = (PAPPBAR_COMMAND)pCopyData->lpData;
if (pCopyData->cbData != sizeof(*pData) ||
pData->abd.cbSize != sizeof(pData->abd))
{
ERR("Invalid AppBar message\n");
return NULL;
}
return pData;
}
// WM_COPYDATA TABDMC_APPBAR
LRESULT CAppBarManager::OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData)
{
PAPPBAR_COMMAND pData = GetAppBarMessage(pCopyData);
if (!pData)
return 0;
switch (pData->dwMessage)
{
case ABM_NEW:
return OnAppBarNew(pData);
case ABM_REMOVE:
OnAppBarRemove(pData);
break;
case ABM_QUERYPOS:
OnAppBarQueryPos(pData);
break;
case ABM_SETPOS:
OnAppBarSetPos(pData);
break;
default:
{
FIXME("0x%X\n", pData->dwMessage);
return FALSE;
}
}
return TRUE;
}

View File

@@ -0,0 +1,96 @@
/*
* PROJECT: ReactOS Explorer
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: AppBar implementation
* COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
*/
#pragma once
typedef struct tagAPPBAR
{
HWND hWnd;
UINT uCallbackMessage;
UINT uEdge;
RECT rc;
} APPBAR, *PAPPBAR;
static inline PAPPBARDATA3264
AppBar_LockOutput(_In_ PAPPBAR_COMMAND pData)
{
return (PAPPBARDATA3264)SHLockShared(UlongToHandle(pData->hOutput32), pData->dwProcessId);
}
static inline VOID
AppBar_UnLockOutput(_Out_ PAPPBARDATA3264 pOutput)
{
SHUnlockShared(pOutput);
}
static inline BOOL
Edge_IsVertical(_In_ UINT uEdge)
{
return uEdge == ABE_TOP || uEdge == ABE_BOTTOM;
}
// Return value of CAppBarManager::RecomputeWorkArea
enum WORKAREA_TYPE
{
WORKAREA_NO_TRAY_AREA = 0,
WORKAREA_IS_NOT_MONITOR = 1,
WORKAREA_SAME_AS_MONITOR = 2,
};
class CAppBarManager
{
public:
CAppBarManager();
virtual ~CAppBarManager();
LRESULT OnAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
protected:
HDPA m_hAppBarDPA; // DPA (Dynamic Pointer Array)
PAPPBAR FindAppBar(_In_ HWND hwndAppBar) const;
void EliminateAppBar(_In_ INT iItem);
void DestroyAppBarDPA();
void AppBarSubtractRect(_In_ PAPPBAR pAppBar, _Inout_ PRECT prc);
BOOL AppBarOutsideOf(_In_ const APPBAR *pAppBar1, _In_ const APPBAR *pAppBar2);
void ComputeHiddenRect(_Inout_ PRECT prc, _In_ UINT uSide);
PAPPBAR_COMMAND GetAppBarMessage(_Inout_ PCOPYDATASTRUCT pCopyData);
void GetDockedRect(_Out_ PRECT prcDocked);
BOOL OnAppBarNew(_In_ const APPBAR_COMMAND *pData);
void OnAppBarRemove(_In_ const APPBAR_COMMAND *pData);
void OnAppBarQueryPos(_Inout_ PAPPBAR_COMMAND pData);
void OnAppBarSetPos(_Inout_ PAPPBAR_COMMAND pData);
void OnAppBarNotifyAll(
_In_opt_ HMONITOR hMon,
_In_opt_ HWND hwndIgnore,
_In_ DWORD dwNotify,
_In_opt_ LPARAM lParam);
WORKAREA_TYPE
RecomputeWorkArea(
_In_ const RECT *prcTray,
_In_ HMONITOR hMonitor,
_Out_ PRECT prcWorkArea);
void StuckAppChange(
_In_opt_ HWND hwndTarget,
_In_opt_ const RECT *prcOld,
_In_opt_ const RECT *prcNew,
_In_ BOOL bTray);
void RedrawDesktop(_In_ HWND hwndDesktop, _Inout_ PRECT prc);
virtual BOOL IsAutoHideState() const = 0;
virtual BOOL IsHidingState() const = 0;
virtual HMONITOR GetMonitor() const = 0;
virtual HMONITOR GetPreviousMonitor() const = 0;
virtual INT GetPosition() const = 0;
virtual const RECT* GetTrayRect() = 0;
virtual HWND GetDesktopWnd() const = 0;
};

View File

@@ -353,6 +353,8 @@ UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
*/
VOID
ShowCustomizeClassic(HINSTANCE, HWND);
VOID
ClearRecentAndMru();
/*
* startmnusite.cpp
@@ -367,6 +369,11 @@ CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID & riid, PVOID
/* TrayClockWnd */
HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv);
static inline BOOL GetHideClock()
{
return g_TaskbarSettings.sr.HideClock || SHRestricted(REST_HIDECLOCK);
}
/* TrayNotifyWnd */
#define TNWM_GETMINIMUMSIZE (WM_USER + 0x100)
#define TNWM_CHANGETRAYPOS (WM_USER + 0x104)

View File

@@ -58,10 +58,53 @@ static BOOL RecentHasShortcut(HWND hwnd)
return TRUE;
}
static VOID OnClearRecentItems(HWND hwnd)
static const PCWSTR g_MruKeys[] =
{
L"Software\\Microsoft\\Internet Explorer\\TypedURLs",
L"Explorer\\RunMRU",
L"Explorer\\Comdlg32\\OpenSaveMRU",
L"Explorer\\Comdlg32\\LastVisitedMRU",
};
static BOOL HandleMruData(BOOL Delete)
{
for (UINT i = 0; i < _countof(g_MruKeys); ++i)
{
WCHAR szKey[200];
PCWSTR pszKey = g_MruKeys[i];
if (*pszKey != 'S') // Keys not starting with S[oftware] are assumed to be relative to "SMWCV"
{
wsprintfW(szKey, L"%s\\%s", L"Software\\Microsoft\\Windows\\CurrentVersion", pszKey);
pszKey = szKey;
}
HKEY hKey;
if (Delete)
{
SHDeleteKeyW(HKEY_CURRENT_USER, pszKey);
}
else if (RegOpenKeyExW(HKEY_CURRENT_USER, pszKey, 0, KEY_WRITE, &hKey) == ERROR_SUCCESS)
{
RegCloseKey(hKey);
return TRUE;
}
}
return FALSE;
}
VOID ClearRecentAndMru()
{
SHAddToRecentDocs(SHARD_PIDL, NULL);
EnableWindow(GetDlgItem(hwnd, IDC_CLASSICSTART_CLEAR), RecentHasShortcut(hwnd));
HandleMruData(TRUE);
}
static VOID InitializeClearButton(HWND hwnd)
{
HWND hWndClear = GetDlgItem(hwnd, IDC_CLASSICSTART_CLEAR);
BOOL bHasData = RecentHasShortcut(hwnd) || HandleMruData(FALSE);
if (!bHasData && hWndClear == GetFocus())
SendMessage(hwnd, WM_NEXTDLGCTL, 0, FALSE);
EnableWindow(hWndClear, bHasData);
}
struct CUSTOM_ENTRY;
@@ -175,7 +218,7 @@ static VOID AddCustomItem(HWND hTreeView, const CUSTOM_ENTRY *entry)
static void CustomizeClassic_OnInitDialog(HWND hwnd)
{
EnableWindow(GetDlgItem(hwnd, IDC_CLASSICSTART_CLEAR), RecentHasShortcut(hwnd));
InitializeClearButton(hwnd);
HWND hTreeView = GetDlgItem(hwnd, IDC_CLASSICSTART_SETTINGS);
@@ -240,7 +283,8 @@ INT_PTR CALLBACK CustomizeClassicProc(HWND hwnd, UINT Message, WPARAM wParam, LP
OnAdvancedStartMenuItems();
break;
case IDC_CLASSICSTART_CLEAR:
OnClearRecentItems(hwnd);
ClearRecentAndMru();
InitializeClearButton(hwnd);
break;
case IDOK:
if (CustomizeClassic_OnOK(hwnd))

View File

@@ -20,6 +20,8 @@
#include "precomp.h"
#include <commoncontrols.h>
#include <regstr.h>
#include <shlwapi_undoc.h>
/* Set DUMP_TASKS to 1 to enable a dump of the tasks and task groups every
5 seconds */
@@ -1476,25 +1478,60 @@ public:
::SendMessage(hwndTray, TWM_PULSE, bDelete, (LPARAM)hwndActive);
}
static BOOL InvokeRegistryAppKeyCommand(UINT uAppCmd)
{
BOOL bResult = FALSE;
WCHAR szBuf[MAX_PATH * 2];
wsprintfW(szBuf, L"%s\\AppKey\\%u", REGSTR_PATH_EXPLORER, uAppCmd);
HUSKEY hKey;
if (SHRegOpenUSKeyW(szBuf, KEY_READ, NULL, &hKey, FALSE) != ERROR_SUCCESS)
return bResult;
DWORD cb = sizeof(szBuf);
if (!bResult && SHRegQueryUSValueW(hKey, L"ShellExecute", NULL, szBuf, &cb, FALSE, NULL, 0) == ERROR_SUCCESS)
{
bResult = TRUE;
}
cb = sizeof(szBuf);
if (!bResult && SHRegQueryUSValueW(hKey, L"Association", NULL, szBuf, &cb, FALSE, NULL, 0) == ERROR_SUCCESS)
{
bResult = TRUE;
cb = _countof(szBuf);
if (AssocQueryString(ASSOCF_NOTRUNCATE, ASSOCSTR_EXECUTABLE, szBuf, NULL, szBuf, &cb) != S_OK)
*szBuf = UNICODE_NULL;
}
cb = sizeof(szBuf);
if (!bResult && SHRegQueryUSValueW(hKey, L"RegisteredApp", NULL, szBuf, &cb, FALSE, NULL, 0) == ERROR_SUCCESS)
{
bResult = TRUE;
SHRunIndirectRegClientCommand(NULL, szBuf);
*szBuf = UNICODE_NULL; // Don't execute again
}
SHRegCloseUSKey(hKey);
// Note: Tweak UI uses an empty string for its "Do nothing" option.
if (bResult && *szBuf)
ShellExec_RunDLLW(NULL, NULL, szBuf, SW_SHOW);
return bResult;
}
BOOL HandleAppCommand(IN WPARAM wParam, IN LPARAM lParam)
{
BOOL Ret = FALSE;
switch (GET_APPCOMMAND_LPARAM(lParam))
const UINT uAppCmd = GET_APPCOMMAND_LPARAM(lParam);
if (InvokeRegistryAppKeyCommand(uAppCmd))
return TRUE;
switch (uAppCmd)
{
case APPCOMMAND_BROWSER_SEARCH:
Ret = SHFindFiles(NULL,
NULL);
break;
case APPCOMMAND_BROWSER_HOME:
case APPCOMMAND_LAUNCH_MAIL:
default:
TRACE("Shell app command %d unhandled!\n", (INT) GET_APPCOMMAND_LPARAM(lParam));
break;
case APPCOMMAND_VOLUME_MUTE:
case APPCOMMAND_VOLUME_DOWN:
case APPCOMMAND_VOLUME_UP:
// TODO: Try IMMDeviceEnumerator::GetDefaultAudioEndpoint first and then fall back to mixer.
FIXME("Call the mixer API to change the global volume\n");
return TRUE;
case APPCOMMAND_BROWSER_SEARCH:
return SHFindFiles(NULL, NULL);
}
return Ret;
return FALSE;
}
LRESULT OnShellHook(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
@@ -1513,7 +1550,7 @@ public:
switch ((INT) wParam)
{
case HSHELL_APPCOMMAND:
Ret = HandleAppCommand(wParam, lParam);
Ret = HandleAppCommand(0, lParam);
break;
case HSHELL_WINDOWCREATED:

View File

@@ -666,7 +666,7 @@ LRESULT CTrayClockWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b
m_tooltip.AddTool(&ti);
if (!g_TaskbarSettings.sr.HideClock)
if (!GetHideClock())
{
ResetTime();
}
@@ -694,26 +694,17 @@ LRESULT CTrayClockWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHa
LRESULT CTrayClockWnd::OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
BOOL bRealign = FALSE;
BOOL bHideClock = GetHideClock();
TaskbarSettings* newSettings = (TaskbarSettings*)lParam;
if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds)
{
g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds;
if (!g_TaskbarSettings.sr.HideClock)
{
bRealign = TRUE;
ResetTime();
}
}
if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock)
if (newSettings->sr.HideClock != !IsWindowVisible())
{
g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock;
ShowWindow(g_TaskbarSettings.sr.HideClock ? SW_HIDE : SW_SHOW);
bHideClock = GetHideClock();
ShowWindow(bHideClock ? SW_HIDE : SW_SHOW);
bRealign = TRUE;
if (g_TaskbarSettings.sr.HideClock)
if (bHideClock)
{
/* Disable all timers */
if (IsTimerEnabled)
@@ -733,6 +724,16 @@ LRESULT CTrayClockWnd::OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM
}
}
if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds)
{
g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds;
if (!bHideClock)
{
bRealign = TRUE;
ResetTime();
}
}
if (newSettings->bPreferDate != g_TaskbarSettings.bPreferDate)
{
g_TaskbarSettings.bPreferDate = newSettings->bPreferDate;
@@ -766,7 +767,7 @@ HRESULT CTrayClockWnd::Initialize(IN HWND hWndParent)
/* Create the window. The tray window is going to move it to the correct
position and resize it as needed. */
DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS;
if (!g_TaskbarSettings.sr.HideClock)
if (!GetHideClock())
dwStyle |= WS_VISIBLE;
Create(hWndParent, 0, NULL, dwStyle);

View File

@@ -139,8 +139,9 @@ public:
SIZE clockSize = { 0, 0 };
SIZE traySize = { 0, 0 };
SIZE showDesktopSize = { 0, 0 };
BOOL bHideClock = GetHideClock();
if (!g_TaskbarSettings.sr.HideClock)
if (!bHideClock)
{
if (IsHorizontal)
{
@@ -197,7 +198,7 @@ public:
{
pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X;
if (!g_TaskbarSettings.sr.HideClock)
if (!bHideClock)
pSize->cx += TRAY_NOTIFY_WND_SPACING_X + trayClockMinSize.cx;
if (g_TaskbarSettings.bShowDesktopButton)
@@ -210,7 +211,7 @@ public:
{
pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y;
if (!g_TaskbarSettings.sr.HideClock)
if (!bHideClock)
pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + trayClockMinSize.cy;
if (g_TaskbarSettings.bShowDesktopButton)
@@ -303,7 +304,7 @@ public:
swpFlags);
}
if (!g_TaskbarSettings.sr.HideClock)
if (!GetHideClock())
{
POINT ptClock = { rcClient.left, rcClient.top };
SIZE clockSize = { rcClient.right - rcClient.left, rcClient.bottom - rcClient.top };
@@ -482,6 +483,8 @@ public:
SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
}
g_TaskbarSettings.bHideInactiveIcons = newSettings->bHideInactiveIcons;
return OnClockMessage(uMsg, wParam, lParam, bHandled);
}

View File

@@ -276,11 +276,16 @@ public:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!g_TaskbarSettings.sr.HideClock) ? BST_CHECKED : BST_UNCHECKED);
::EnableWindow(GetDlgItem(IDC_TASKBARPROP_CLOCK), !SHRestricted(REST_HIDECLOCK));
CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!GetHideClock()) ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_TASKBARPROP_SECONDS, g_TaskbarSettings.bShowSeconds ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, g_TaskbarSettings.bHideInactiveIcons ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_TASKBARPROP_DESKTOP, g_TaskbarSettings.bShowDesktopButton ? BST_CHECKED : BST_UNCHECKED);
// TODO: bHideInactiveIcons is not implemented yet, just disable for now
CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, BST_UNCHECKED);
::EnableWindow(GetDlgItem(IDC_TASKBARPROP_HIDEICONS), FALSE);
_UpdateDialog();
return TRUE;
}

View File

@@ -1,30 +1,16 @@
/*
* ReactOS Explorer
*
* Copyright 2006 - 2007 Thomas Weidenmueller <w3seek@reactos.org>
* Copyright 2018-2022 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*
* this library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* this library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* PROJECT: ReactOS Explorer
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: Tray window implementation
* COPYRIGHT: Copyright 2006-2007 Thomas Weidenmueller <w3seek@reactos.org>
* Copyright 2018-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include "precomp.h"
#include <commoncontrols.h>
#include "appbar.h"
HRESULT TrayWindowCtxMenuCreator(ITrayWindow * TrayWnd, IN HWND hWndOwner, IContextMenu ** ppCtxMenu);
LRESULT appbar_message(COPYDATASTRUCT* cds);
void appbar_notify_all(HMONITOR hMon, UINT uMsg, HWND hwndExclude, LPARAM lParam);
#define WM_APP_TRAYDESTROY (WM_APP + 0x100)
@@ -56,8 +42,6 @@ void appbar_notify_all(HMONITOR hMon, UINT uMsg, HWND hwndExclude, LPARAM lParam
#define IDHK_DESKTOP 0x1fe
#define IDHK_PAGER 0x1ff
static const WCHAR szTrayWndClass[] = L"Shell_TrayWnd";
enum { NONE, TILED, CASCADED } g_Arrangement = NONE;
struct WINDOWPOSBACKUPDATA
@@ -323,6 +307,7 @@ class CTrayWindow :
public CComCoClass<CTrayWindow>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public CWindowImpl < CTrayWindow, CWindow, CControlWinTraits >,
public CAppBarManager,
public ITrayWindow,
public IShellDesktopTray,
public IOleWindow,
@@ -470,6 +455,9 @@ public:
return;
SendMessage(m_DesktopWnd, WM_PROGMAN_SAVESTATE, 0, 0);
if (SHRestricted(REST_CLEARRECENTDOCSONEXIT))
ClearRecentAndMru();
}
LRESULT DoExitWindows()
@@ -681,35 +669,35 @@ public:
break;
case ID_SHELL_CMD_TILE_WND_H:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, TRUE);
if (g_Arrangement == NONE)
{
BackupWindowPos();
}
TileWindows(NULL, MDITILE_HORIZONTAL, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, FALSE);
g_Arrangement = TILED;
break;
case ID_SHELL_CMD_TILE_WND_V:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, TRUE);
if (g_Arrangement == NONE)
{
BackupWindowPos();
}
TileWindows(NULL, MDITILE_VERTICAL, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, FALSE);
g_Arrangement = TILED;
break;
case ID_SHELL_CMD_CASCADE_WND:
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, TRUE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, TRUE);
if (g_Arrangement == NONE)
{
BackupWindowPos();
}
CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, 0, NULL);
appbar_notify_all(NULL, ABN_WINDOWARRANGE, NULL, FALSE);
OnAppBarNotifyAll(NULL, NULL, ABN_WINDOWARRANGE, FALSE);
g_Arrangement = CASCADED;
break;
@@ -2391,18 +2379,29 @@ ChangePos:
/* Set the initial lock state in the band site */
m_TrayBandSite->Lock(g_TaskbarSettings.bLock);
RegisterHotKey(m_hWnd, IDHK_RUN, MOD_WIN, 'R');
RegisterHotKey(m_hWnd, IDHK_MINIMIZE_ALL, MOD_WIN, 'M');
RegisterHotKey(m_hWnd, IDHK_RESTORE_ALL, MOD_WIN|MOD_SHIFT, 'M');
RegisterHotKey(m_hWnd, IDHK_HELP, MOD_WIN, VK_F1);
RegisterHotKey(m_hWnd, IDHK_EXPLORE, MOD_WIN, 'E');
RegisterHotKey(m_hWnd, IDHK_FIND, MOD_WIN, 'F');
RegisterHotKey(m_hWnd, IDHK_FIND_COMPUTER, MOD_WIN|MOD_CONTROL, 'F');
RegisterHotKey(m_hWnd, IDHK_NEXT_TASK, MOD_WIN, VK_TAB);
RegisterHotKey(m_hWnd, IDHK_PREV_TASK, MOD_WIN|MOD_SHIFT, VK_TAB);
RegisterHotKey(m_hWnd, IDHK_SYS_PROPERTIES, MOD_WIN, VK_PAUSE);
RegisterHotKey(m_hWnd, IDHK_DESKTOP, MOD_WIN, 'D');
RegisterHotKey(m_hWnd, IDHK_PAGER, MOD_WIN, 'B');
static const UINT winkeys[] =
{
MAKELONG(IDHK_RUN, MAKEWORD('R', MOD_WIN)),
MAKELONG(IDHK_MINIMIZE_ALL, MAKEWORD('M', MOD_WIN)),
MAKELONG(IDHK_RESTORE_ALL, MAKEWORD('M', MOD_WIN|MOD_SHIFT)),
MAKELONG(IDHK_HELP, MAKEWORD(VK_F1, MOD_WIN)),
MAKELONG(IDHK_EXPLORE, MAKEWORD('E', MOD_WIN)),
MAKELONG(IDHK_FIND, MAKEWORD('F', MOD_WIN)),
MAKELONG(IDHK_FIND_COMPUTER, MAKEWORD('F', MOD_WIN|MOD_CONTROL)),
MAKELONG(IDHK_NEXT_TASK, MAKEWORD(VK_TAB, MOD_WIN)),
MAKELONG(IDHK_PREV_TASK, MAKEWORD(VK_TAB, MOD_WIN|MOD_SHIFT)),
MAKELONG(IDHK_SYS_PROPERTIES, MAKEWORD(VK_PAUSE, MOD_WIN)),
MAKELONG(IDHK_DESKTOP, MAKEWORD('D', MOD_WIN)),
MAKELONG(IDHK_PAGER, MAKEWORD('B', MOD_WIN)),
};
if (!SHRestricted(REST_NOWINKEYS))
{
for (UINT i = 0; i < _countof(winkeys); ++i)
{
UINT mod = HIBYTE(HIWORD(winkeys[i])), key = LOBYTE(HIWORD(winkeys[i]));
RegisterHotKey(m_hWnd, LOWORD(winkeys[i]), mod, key);
}
}
return TRUE;
}
@@ -2454,6 +2453,7 @@ ChangePos:
CheckTrayWndPosition();
}
// Note: We rely on CDesktopBrowser to get this message and call SHSettingsChanged
if (m_DesktopWnd)
::SendMessageW(m_DesktopWnd, uMsg, wParam, lParam);
@@ -2503,11 +2503,14 @@ ChangePos:
LRESULT OnCopyData(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam;
PCOPYDATASTRUCT pCopyData = (PCOPYDATASTRUCT)lParam;
if (!pCopyData)
return FALSE;
switch (pCopyData->dwData)
{
case TABDMC_APPBAR:
return appbar_message(pCopyData);
return OnAppBarMessage(pCopyData);
case TABDMC_NOTIFY:
case TABDMC_LOADINPROC:
return ::SendMessageW(m_TrayNotify, uMsg, wParam, lParam);
@@ -2936,7 +2939,7 @@ HandleTrayContextMenu:
LRESULT Ret = FALSE;
/* FIXME: We can't check with IsChild whether the hwnd is somewhere inside
the rebar control! But we shouldn't forward messages that the band
site doesn't handle, such as other controls (start button, tray window */
site doesn't handle, such as other controls (start button, tray window) */
HRESULT hr = E_FAIL;
@@ -3371,7 +3374,7 @@ HandleTrayContextMenu:
return 0;
}
DECLARE_WND_CLASS_EX(szTrayWndClass, CS_DBLCLKS, COLOR_3DFACE)
DECLARE_WND_CLASS_EX(L"Shell_TrayWnd", CS_DBLCLKS, COLOR_3DFACE)
BEGIN_MSG_MAP(CTrayWindow)
if (m_StartMenuBand != NULL)
@@ -3562,6 +3565,24 @@ HandleTrayContextMenu:
COM_INTERFACE_ENTRY_IID(IID_IOleWindow, IOleWindow)
COM_INTERFACE_ENTRY_IID(IID_IContextMenu, IContextMenu)
END_COM_MAP()
protected:
//////////////////////////////////////////////////////////////////////////////////////////////
// AppBar section
//
// See also: appbar.cpp
// TODO: freedesktop _NET_WM_STRUT integration
// TODO: find when a fullscreen app is in the foreground and send FULLSCREENAPP notifications
// TODO: detect changes in the screen size and send ABN_POSCHANGED ?
// TODO: multiple monitor support
BOOL IsAutoHideState() const override { return g_TaskbarSettings.sr.AutoHide; }
BOOL IsHidingState() const override { return m_AutoHideState == AUTOHIDE_HIDING; }
HMONITOR GetMonitor() const override { return m_Monitor; }
HMONITOR GetPreviousMonitor() const override { return m_PreviousMonitor; }
INT GetPosition() const override { return m_Position; }
const RECT* GetTrayRect() override { return &m_TrayRects[m_Position]; }
HWND GetDesktopWnd() const override { return m_DesktopWnd; }
};
class CTrayWindowCtxMenu :

View File

@@ -104,20 +104,20 @@ HKLM,"SOFTWARE\Classes\Applications\mplay32.exe\SupportedTypes",".avi",0x0000000
HKLM,"SOFTWARE\Classes\ftp","",0x00000000,"URL:File Transfer Protocol"
HKLM,"SOFTWARE\Classes\ftp\Source Filter","",0x00000000,"{E436EBB6-524F-11CE-9F53-0020AF0BA770}"
HKLM,"SOFTWARE\Classes\ftp","URL Protocol",0x00000000,""
HKLM,"SOFTWARE\Classes\ftp\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
HKLM,"SOFTWARE\Classes\ftp\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
HKLM,"SOFTWARE\Classes\gopher","",0x00000000,"URL:Gopher Protocol"
HKLM,"SOFTWARE\Classes\gopher\Source Filter","",0x00000000,"{E436EBB6-524F-11CE-9F53-0020AF0BA770}"
HKLM,"SOFTWARE\Classes\gopher","URL Protocol",0x00000000,""
;see http
;HKLM,"SOFTWARE\Classes\gopher\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" -nohome"
HKLM,"SOFTWARE\Classes\gopher\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
;HKLM,"SOFTWARE\Classes\gopher\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" -nohome"
HKLM,"SOFTWARE\Classes\gopher\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
HKLM,"SOFTWARE\Classes\http","",0x00000000,"URL:HyperText Transfer Protocol"
HKLM,"SOFTWARE\Classes\http\DefaultIcon","",0x00000000,"%SystemRoot%\system32\url.dll,0"
HKLM,"SOFTWARE\Classes\http\DefaultIcon","",0x00020000,"%SystemRoot%\system32\url.dll,0"
HKLM,"SOFTWARE\Classes\http\Source Filter","",0x00000000,"{E436EBB6-524F-11CE-9F53-0020AF0BA770}"
HKLM,"SOFTWARE\Classes\http","URL Protocol",0x00000000,""
HKLM,"SOFTWARE\Classes\http\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
HKLM,"SOFTWARE\Classes\http\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
;TODO : iexplore should use DDE
;HKLM,"SOFTWARE\Classes\http\shell\open\ddeexec","",0x00000000,"""%1"",,-1,0,,,,"
;HKLM,"SOFTWARE\Classes\http\shell\open\ddeexec","NoActivateHandler",0x00000000,""
@@ -129,14 +129,14 @@ HKLM,"SOFTWARE\Classes\https\DefaultIcon","",0x00000000,"%SystemRoot%\system32\u
HKLM,"SOFTWARE\Classes\https\Source Filter","",0x00000000,"{E436EBB6-524F-11CE-9F53-0020AF0BA770}"
HKLM,"SOFTWARE\Classes\https","URL Protocol",0x00000000,""
;see http
;HKLM,"SOFTWARE\Classes\https\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" -nohome"
HKLM,"SOFTWARE\Classes\https\shell\open\command","",0x00000000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
;HKLM,"SOFTWARE\Classes\https\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" -nohome"
HKLM,"SOFTWARE\Classes\https\shell\open\command","",0x00020000,"""%programfiles%\Internet Explorer\iexplore.exe"" ""%1"""
; Register system default web browser
HKLM,"SOFTWARE\Clients\StartMenuInternet","",0x00000000,"IEXPLORE.EXE"
HKLM,"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE","",0x00000000,"Internet Explorer"
HKLM,"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon","",0x00000000,"%programfiles%\Internet Explorer\iexplore.exe,-7"
HKLM,"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\shell\open\command","",0x00000000,"%programfiles%\Internet Explorer\iexplore.exe"
HKLM,"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\DefaultIcon","",0x00020000,"%programfiles%\Internet Explorer\iexplore.exe,-7"
HKLM,"SOFTWARE\Clients\StartMenuInternet\IEXPLORE.EXE\shell\open\command","",0x00020000,"%programfiles%\Internet Explorer\iexplore.exe"
; CTF
HKLM,"SOFTWARE\Microsoft\CTF\SystemShared",,0x00000012

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