From a56fcb9ae3b4c6b5934872fe66005ad484e8fc38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 9 Aug 2014 18:48:31 +0000 Subject: [PATCH 01/55] [NTVDM]: Studying ntvdm, we can find the significance of some of the parameters. Others seem unused. svn path=/trunk/; revision=63848 --- reactos/subsystems/ntvdm/hardware/vga.c | 40 ++++++++++++------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/reactos/subsystems/ntvdm/hardware/vga.c b/reactos/subsystems/ntvdm/hardware/vga.c index a175c37faae..caa6332009c 100644 --- a/reactos/subsystems/ntvdm/hardware/vga.c +++ b/reactos/subsystems/ntvdm/hardware/vga.c @@ -23,7 +23,7 @@ static CONST DWORD MemoryLimit[] = { 0xAFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF }; /* * Activate this line if you want to use the real - * RegisterConsoleVDM API of Windows/ReactOS. + * RegisterConsoleVDM API of ReactOS/Windows. */ // #define USE_REAL_REGISTERCONSOLEVDM @@ -314,33 +314,33 @@ static PCHAR_INFO CharBuff = NULL; // This is a hack, which is unneeded BOOL WINAPI -__RegisterConsoleVDM(IN DWORD dwDosVDMFlag, - IN HANDLE hEventHandle1, - IN HANDLE hEventHandle2, - IN HANDLE hEventHandle3, - IN DWORD Unused1, - OUT PULONG returned_val_1, - OUT PVOID* returned_val_2, - IN PVOID lpUnknownBuffer, - IN DWORD dwUnknownBufferLength, +__RegisterConsoleVDM(IN DWORD dwRegisterFlags, + IN HANDLE hStartHardwareEvent, + IN HANDLE hEndHardwareEvent, + IN HANDLE hErrorHardwareEvent, + IN DWORD dwUnusedVar, + OUT LPDWORD lpVideoStateLength, + OUT PVOID* lpVideoState, // PVIDEO_HARDWARE_STATE_HEADER* + IN PVOID lpUnusedBuffer, + IN DWORD dwUnusedBufferLength, IN COORD dwVDMBufferSize, OUT PVOID* lpVDMBuffer) { - UNREFERENCED_PARAMETER(hEventHandle3); - UNREFERENCED_PARAMETER(Unused1); - UNREFERENCED_PARAMETER(returned_val_1); - UNREFERENCED_PARAMETER(returned_val_2); - UNREFERENCED_PARAMETER(lpUnknownBuffer); - UNREFERENCED_PARAMETER(dwUnknownBufferLength); + UNREFERENCED_PARAMETER(hErrorHardwareEvent); + UNREFERENCED_PARAMETER(dwUnusedVar); + UNREFERENCED_PARAMETER(lpVideoStateLength); + UNREFERENCED_PARAMETER(lpVideoState); + UNREFERENCED_PARAMETER(lpUnusedBuffer); + UNREFERENCED_PARAMETER(dwUnusedBufferLength); SetLastError(0); - DPRINT1("__RegisterConsoleVDM(%d)\n", dwDosVDMFlag); + DPRINT1("__RegisterConsoleVDM(%d)\n", dwRegisterFlags); if (lpVDMBuffer == NULL) return FALSE; - if (dwDosVDMFlag != 0) + if (dwRegisterFlags != 0) { - // if (EventHandle_1 == NULL || EventHandle_2 == NULL) return FALSE; + // if (hStartHardwareEvent == NULL || hEndHardwareEvent == NULL) return FALSE; if (VDMBuffer != NULL) return FALSE; VDMBufferSize = dwVDMBufferSize; @@ -451,7 +451,7 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) /* * Windows 2k3 winsrv.dll calls NtVdmControl(VdmQueryVdmProcess == 14, &ConsoleHandle); * in the two following APIs: - * SrvRegisterConsoleVDM (corresponding win32 API: RegisterConsoleVDM) + * SrvRegisterConsoleVDM (corresponding Win32 API: RegisterConsoleVDM) * SrvVDMConsoleOperation (corresponding Win32 API: ) * to check whether the current process is a VDM process, and fails otherwise with the * error 0xC0000022 (). From 39f3c7d584542e899496fa9761422cbdb9f810da Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 10 Aug 2014 16:20:43 +0000 Subject: [PATCH 02/55] [KERNEL32] - Fix some style issues in DefineDosDevice svn path=/trunk/; revision=63851 --- reactos/dll/win32/kernel32/client/dosdev.c | 38 +++++++++------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/reactos/dll/win32/kernel32/client/dosdev.c b/reactos/dll/win32/kernel32/client/dosdev.c index ddd20106f57..5a62d844a26 100644 --- a/reactos/dll/win32/kernel32/client/dosdev.c +++ b/reactos/dll/win32/kernel32/client/dosdev.c @@ -35,22 +35,18 @@ DefineDosDeviceA( BOOL Result; if (lpDeviceName && - ! RtlCreateUnicodeStringFromAsciiz(&DeviceNameU, - (LPSTR)lpDeviceName)) + !RtlCreateUnicodeStringFromAsciiz(&DeviceNameU, lpDeviceName)) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; } if (lpTargetPath && - ! RtlCreateUnicodeStringFromAsciiz(&TargetPathU, - (LPSTR)lpTargetPath)) + !RtlCreateUnicodeStringFromAsciiz(&TargetPathU, lpTargetPath)) { if (DeviceNameU.Buffer) { - RtlFreeHeap(RtlGetProcessHeap (), - 0, - DeviceNameU.Buffer); + RtlFreeUnicodeString(&DeviceNameU); } SetLastError(ERROR_NOT_ENOUGH_MEMORY); return 0; @@ -62,16 +58,12 @@ DefineDosDeviceA( if (TargetPathU.Buffer) { - RtlFreeHeap(RtlGetProcessHeap (), - 0, - TargetPathU.Buffer); + RtlFreeUnicodeString(&TargetPathU); } if (DeviceNameU.Buffer) { - RtlFreeHeap(RtlGetProcessHeap (), - 0, - DeviceNameU.Buffer); + RtlFreeUnicodeString(&DeviceNameU); } return Result; } @@ -114,7 +106,7 @@ DefineDosDeviceW( ArgumentCount = 1; BufferSize = 0; - if (! lpTargetPath) + if (!lpTargetPath) { RtlInitUnicodeString(&NtTargetPathU, NULL); @@ -128,10 +120,10 @@ DefineDosDeviceW( } else { - if (! RtlDosPathNameToNtPathName_U(lpTargetPath, - &NtTargetPathU, - 0, - 0)) + if (!RtlDosPathNameToNtPathName_U(lpTargetPath, + &NtTargetPathU, + NULL, + NULL)) { WARN("RtlDosPathNameToNtPathName_U() failed\n"); BaseSetLastNTError(STATUS_OBJECT_NAME_INVALID); @@ -151,7 +143,7 @@ DefineDosDeviceW( CaptureBuffer = CsrAllocateCaptureBuffer(ArgumentCount, BufferSize); - if (! CaptureBuffer) + if (!CaptureBuffer) { SetLastError(ERROR_NOT_ENOUGH_MEMORY); Result = FALSE; @@ -161,7 +153,7 @@ DefineDosDeviceW( DefineDosDeviceRequest->Flags = dwFlags; CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)DeviceUpcaseNameU.Buffer, + DeviceUpcaseNameU.Buffer, DeviceUpcaseNameU.Length, (PVOID*)&DefineDosDeviceRequest->DeviceName.Buffer); @@ -173,7 +165,7 @@ DefineDosDeviceW( if (NtTargetPathU.Buffer) { CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)NtTargetPathU.Buffer, + NtTargetPathU.Buffer, NtTargetPathU.Length, (PVOID*)&DefineDosDeviceRequest->TargetPath.Buffer); } @@ -212,7 +204,7 @@ DefineDosDeviceW( dbcv.dbcv_size = sizeof(DEV_BROADCAST_VOLUME); dbcv.dbcv_devicetype = DBT_DEVTYP_VOLUME; dbcv.dbcv_reserved = 0; - dbcv.dbcv_unitmask |= + dbcv.dbcv_unitmask |= (1 << (DeviceUpcaseNameU.Buffer[0] - L'A')); dbcv.dbcv_flags = DBTF_NET; (void) BSM_ptr(BSF_SENDNOTIFYMESSAGE | BSF_FLUSHDISK, @@ -293,7 +285,7 @@ QueryDosDeviceA( { CurrentLength = min (ucchMax, MAXUSHORT / 2); TargetPathU.MaximumLength = TargetPathU.Length = (USHORT)CurrentLength * sizeof(WCHAR); - + TargetPathA.Length = 0; TargetPathA.MaximumLength = (USHORT)CurrentLength; From faf7e3ec9491c9f8ae0c10c5049205a9be4f01c7 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 10 Aug 2014 16:23:05 +0000 Subject: [PATCH 03/55] [KERNEL32] - Fix an invalid free in DefineDosDeviceW, found by kernel32_apitest:dosdev svn path=/trunk/; revision=63852 --- reactos/dll/win32/kernel32/client/dosdev.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/dll/win32/kernel32/client/dosdev.c b/reactos/dll/win32/kernel32/client/dosdev.c index 5a62d844a26..38e0e3e0fa6 100644 --- a/reactos/dll/win32/kernel32/client/dosdev.c +++ b/reactos/dll/win32/kernel32/client/dosdev.c @@ -219,7 +219,8 @@ DefineDosDeviceW( } } - if (NtTargetPathU.Buffer) + if (NtTargetPathU.Buffer && + NtTargetPathU.Buffer != lpTargetPath) { RtlFreeHeap(RtlGetProcessHeap(), 0, From 6af1d6e6c876184591d185874e4da6c90dff5382 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 10 Aug 2014 18:39:05 +0000 Subject: [PATCH 04/55] [BROWSEUI] - CComObject cannot be a class member and must be allocated using new. Fixes invalid free. svn path=/trunk/; revision=63853 --- reactos/dll/win32/browseui/internettoolbar.cpp | 5 ++--- reactos/dll/win32/browseui/internettoolbar.h | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/reactos/dll/win32/browseui/internettoolbar.cpp b/reactos/dll/win32/browseui/internettoolbar.cpp index adfd6ef98b4..eeb1f2e1821 100644 --- a/reactos/dll/win32/browseui/internettoolbar.cpp +++ b/reactos/dll/win32/browseui/internettoolbar.cpp @@ -481,14 +481,13 @@ CInternetToolbar::CInternetToolbar() fLocked = false; fMenuBandWindow = NULL; fNavigationWindow = NULL; - fMenuCallback.AddRef(); + fMenuCallback = new CComObject(); fToolbarWindow = NULL; fAdviseCookie = 0; } CInternetToolbar::~CInternetToolbar() { - fMenuCallback.Release(); } void CInternetToolbar::AddDockItem(IUnknown *newItem, int bandID, int flags) @@ -540,7 +539,7 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu **menuBar) IID_IShellMenu, reinterpret_cast(menuBar)); if (FAILED(hResult)) return hResult; - hResult = fMenuCallback.QueryInterface(IID_IShellMenuCallback, reinterpret_cast(&callback)); + hResult = fMenuCallback->QueryInterface(IID_IShellMenuCallback, reinterpret_cast(&callback)); if (FAILED(hResult)) return hResult; hResult = (*menuBar)->Initialize(callback, -1, ANCESTORDEFAULT, SMINIT_HORIZONTAL | SMINIT_TOPLEVEL); diff --git a/reactos/dll/win32/browseui/internettoolbar.h b/reactos/dll/win32/browseui/internettoolbar.h index 71520e30287..ef3e1afc5eb 100644 --- a/reactos/dll/win32/browseui/internettoolbar.h +++ b/reactos/dll/win32/browseui/internettoolbar.h @@ -90,7 +90,7 @@ public: CComPtr fLogoBar; // the reactos logo CComPtr fControlsBar; // navigation controls CComPtr fNavigationBar; // address bar - CComObject fMenuCallback; + CComPtr fMenuCallback; CComPtr fCommandTarget; GUID fCommandCategory; HWND fToolbarWindow; From c38a96f98bd3a57a40cf94710e7a88d596c95ea3 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 10 Aug 2014 19:25:52 +0000 Subject: [PATCH 05/55] [SYSSETUP] - Avoid logging the administrator password CORE-8019 #resolve svn path=/trunk/; revision=63854 --- reactos/dll/win32/syssetup/security.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/syssetup/security.c b/reactos/dll/win32/syssetup/security.c index c181f2c09ae..2f866f4d131 100644 --- a/reactos/dll/win32/syssetup/security.c +++ b/reactos/dll/win32/syssetup/security.c @@ -330,7 +330,7 @@ SetAdministratorPassword(LPCWSTR Password) SAM_HANDLE UserHandle = NULL; NTSTATUS Status; - DPRINT1("SYSSETUP: SetAdministratorPassword(%S)\n", Password); + DPRINT("SYSSETUP: SetAdministratorPassword(%p)\n", Password); memset(&ObjectAttributes, 0, sizeof(LSA_OBJECT_ATTRIBUTES)); ObjectAttributes.Length = sizeof(LSA_OBJECT_ATTRIBUTES); From c4444b2e91d6b1522ad1e9965d71b3a26120185b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 10 Aug 2014 21:06:49 +0000 Subject: [PATCH 06/55] [TRANSLATIONS] To Albanian translators!! Be careful, the "Static" string in CONTROL resource controls, is the name of the control class, and as such must NOT be translated!! (see http://msdn.microsoft.com/en-us/library/windows/desktop/aa380911(v=vs.85).aspx ) svn path=/trunk/; revision=63856 --- .../base/applications/notepad/lang/sq-AL.rc | 2 +- reactos/base/shell/explorer/explorer-sq.rc | 4 +- reactos/dll/cpl/console/lang/sq-AL.rc | 42 +++++++++---------- reactos/dll/cpl/desk/lang/sq-AL.rc | 6 +-- reactos/dll/win32/serialui/lang/sq-AL.rc | 10 ++--- reactos/dll/win32/shell32/lang/sq-AL.rc | 6 +-- 6 files changed, 35 insertions(+), 35 deletions(-) diff --git a/reactos/base/applications/notepad/lang/sq-AL.rc b/reactos/base/applications/notepad/lang/sq-AL.rc index b40ea60b991..b0d97bf7d99 100644 --- a/reactos/base/applications/notepad/lang/sq-AL.rc +++ b/reactos/base/applications/notepad/lang/sq-AL.rc @@ -128,7 +128,7 @@ CAPTION "Rreth ReactOS Notepad" FONT 8, "MS Shell Dlg" BEGIN CONTROL "ReactOS Notepad v1.0\r\nCopyright 1997,98 Marcel Baur \r\nCopyright 2000 Mike McCormack \r\nCopyright 2002 Sylvain Petreolle \r\nCopyright 2002 Andriy Palamarchuk\r\n", -1, "Static", SS_LEFTNOWORDWRAP | WS_GROUP, 46, 7, 232, 39 - CONTROL " ", -1, "Statik", 0x50000000, 8, 48, 272, 11 + CONTROL " ", -1, "Static", 0x50000000, 8, 48, 272, 11 DEFPUSHBUTTON "Mbyll", IDOK, 114, 149, 44, 15, WS_GROUP ICON IDI_NPICON, -1, 12, 9, 20, 30 EDITTEXT IDC_LICENSE, 8, 64, 272, 81, ES_MULTILINE | ES_READONLY | WS_VSCROLL diff --git a/reactos/base/shell/explorer/explorer-sq.rc b/reactos/base/shell/explorer/explorer-sq.rc index c4ac987ca2c..c0b7df1e095 100644 --- a/reactos/base/shell/explorer/explorer-sq.rc +++ b/reactos/base/shell/explorer/explorer-sq.rc @@ -117,8 +117,8 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ekzekuto" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "", 101, "Statik", SS_SIMPLE | SS_NOPREFIX, 3, 6, 150, 10 - CONTROL "&Comanda:", -1, "Statik", SS_LEFTNOWORDWRAP | WS_GROUP, 3, 18, 60, 10 + CONTROL "", 101, "Static", SS_SIMPLE | SS_NOPREFIX, 3, 6, 150, 10 + CONTROL "&Comanda:", -1, "Static", SS_LEFTNOWORDWRAP | WS_GROUP, 3, 18, 60, 10 EDITTEXT 201, 3, 29, 134, 12, ES_AUTOHSCROLL CONTROL "Si &Simbol", 214, "Button", BS_AUTOCHECKBOX | WS_TABSTOP, 3, 45, 71, 12 DEFPUSHBUTTON "&OK", 1, 158, 6, 47, 14 diff --git a/reactos/dll/cpl/console/lang/sq-AL.rc b/reactos/dll/cpl/console/lang/sq-AL.rc index b61d4488c8c..cdf416e99a3 100644 --- a/reactos/dll/cpl/console/lang/sq-AL.rc +++ b/reactos/dll/cpl/console/lang/sq-AL.rc @@ -38,13 +38,13 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Dritare Preview:", -1, 10, 10, 94, 10 LTEXT "Masë:", -1, 180, 10, 36, 10 - CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Statik", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 + CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Font:", -1, 10, 105, 33, 10 CHECKBOX "&Bold fonts", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 6, 156, 241, 50 - CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Statik", SS_OWNERDRAW | SS_SUNKEN, 16, 165, 95, 35 + CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 16, 165, 95, 35 LTEXT "Çdo krarakter është:", -1, 124, 166, 75, 10 LTEXT "pixeli ekranit i gjerë\npixel ekranit i gjatë", -1, 136, 180, 101, 20 LTEXT "", IDC_FONT_SIZE_X, 120, 180, 10, 10 @@ -57,7 +57,7 @@ CAPTION "Pamja" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Dritare Preview:", -1, 8, 6, 95, 10 - CONTROL "", IDC_STATIC_LAYOUT_WINDOW_PREVIEW, "Statik", SS_SUNKEN | SS_OWNERDRAW, 8, 16, 115, 70 + CONTROL "", IDC_STATIC_LAYOUT_WINDOW_PREVIEW, "Static", SS_SUNKEN | SS_OWNERDRAW, 8, 16, 115, 70 GROUPBOX "Masa e Ekranit Buffer", -1, 130, 12, 115, 50 LTEXT "Gjerë:", -1, 140, 28, 40, 10 LTEXT "Gjatë:", -1, 140, 46, 39, 10 @@ -114,26 +114,26 @@ BEGIN EDITTEXT IDC_EDIT_COLOR_BLUE, 175, 48, 35, 14, ES_RIGHT | ES_NUMBER | WS_GROUP CONTROL "", IDC_UPDOWN_COLOR_BLUE, UPDOWN_CLASS, UDS_SETBUDDYINT | UDS_ALIGNRIGHT | UDS_AUTOBUDDY | UDS_ARROWKEYS | WS_GROUP, 210, 48, 10, 14 - CONTROL "", IDC_STATIC_COLOR1, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 23, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR2, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 36, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR3, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 49, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR4, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 62, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR5, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 75, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR6, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 88, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR7, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 101, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR8, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 114, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR9, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 127, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR10, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 140, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR11, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 153, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR12, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 166, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR13, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 179, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR14, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 192, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR15, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 205, 80, 12, 12 - CONTROL "", IDC_STATIC_COLOR16, "Statik", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 218, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR1, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 23, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR2, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 36, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR3, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 49, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR4, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 62, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR5, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 75, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR6, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 88, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR7, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 101, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR8, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 114, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR9, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 127, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR10, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 140, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR11, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 153, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR12, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 166, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR13, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 179, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR14, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 192, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR15, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 205, 80, 12, 12 + CONTROL "", IDC_STATIC_COLOR16, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 218, 80, 12, 12 GROUPBOX "Preview (monitor)", -1, 8, 100, 237, 55 - CONTROL "", IDC_STATIC_SCREEN_COLOR, "Statik", SS_OWNERDRAW | SS_SUNKEN, 13, 110, 227, 40 + CONTROL "", IDC_STATIC_SCREEN_COLOR, "Static", SS_OWNERDRAW | SS_SUNKEN, 13, 110, 227, 40 GROUPBOX "Preview (Popup)", -1, 8, 160, 237, 55 - CONTROL "", IDC_STATIC_POPUP_COLOR, "Statik", SS_OWNERDRAW | SS_SUNKEN, 13, 170, 227, 40 + CONTROL "", IDC_STATIC_POPUP_COLOR, "Static", SS_OWNERDRAW | SS_SUNKEN, 13, 170, 227, 40 END IDD_APPLYOPTIONS DIALOGEX 0, 0, 220, 79 diff --git a/reactos/dll/cpl/desk/lang/sq-AL.rc b/reactos/dll/cpl/desk/lang/sq-AL.rc index 562241f82a8..d4f34ddc9c2 100644 --- a/reactos/dll/cpl/desk/lang/sq-AL.rc +++ b/reactos/dll/cpl/desk/lang/sq-AL.rc @@ -9,7 +9,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Sfond" FONT 8, "MS Shell Dlg" BEGIN - CONTROL "", IDC_BACKGROUND_PREVIEW, "Statik", SS_OWNERDRAW, 70, 10, 105, 80, 0 + CONTROL "", IDC_BACKGROUND_PREVIEW, "Static", SS_OWNERDRAW, 70, 10, 105, 80, 0 CONTROL "", IDC_BACKGROUND_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_NOCOLUMNHEADER | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP, 8, 114, 174, 78 LTEXT "Zgjidhni një imazh për t'u përdorur si sfond tuaj desktop", IDC_STATIC, 8, 103, 230, 9 @@ -24,7 +24,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Screensaver" FONT 8, "MS Shell Dlg", 0, 0 BEGIN - CONTROL "", IDC_SCREENS_PREVIEW, "Statik", SS_OWNERDRAW, 70, 10, 105, 70, WS_EX_STATICEDGE + CONTROL "", IDC_SCREENS_PREVIEW, "Static", SS_OWNERDRAW, 70, 10, 105, 70, WS_EX_STATICEDGE GROUPBOX "&Screensaver", IDC_SCREENS_DUMMY, 8, 92, 230, 52 COMBOBOX IDC_SCREENS_LIST, 14, 103, 100, 100, CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "Cilësime%t", IDC_SCREENS_SETTINGS, 120, 103, 50, 13, WS_GROUP @@ -134,7 +134,7 @@ BEGIN LTEXT "", IDC_SETTINGS_RESOLUTION_TEXT, 10, 157, 100, 10, NOT WS_GROUP | SS_CENTER GROUPBOX "&Ngjyra", 1817, 125, 127, 115, 43 COMBOBOX IDC_SETTINGS_BPP, 131, 137, 103, 80, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP - CONTROL "", IDC_SETTINGS_SPECTRUM, "Statik", SS_OWNERDRAW | SS_SUNKEN, 131, 155, 103, 9 + CONTROL "", IDC_SETTINGS_SPECTRUM, "Static", SS_OWNERDRAW | SS_SUNKEN, 131, 155, 103, 9 PUSHBUTTON "Përparuar...", IDC_SETTINGS_ADVANCED, 170, 174, 70, 14 END diff --git a/reactos/dll/win32/serialui/lang/sq-AL.rc b/reactos/dll/win32/serialui/lang/sq-AL.rc index 193b1863d59..954d4e10cb6 100644 --- a/reactos/dll/win32/serialui/lang/sq-AL.rc +++ b/reactos/dll/win32/serialui/lang/sq-AL.rc @@ -28,11 +28,11 @@ BEGIN CONTROL "", IDC_GRP1, "Buton", 0x50000007, 6, 5, 210, 146, 0x00000000 CONTROL "OK", IDC_OKBTN, "Buton", 0x50010000, 98, 156, 56, 13, 0x00000000 CONTROL "Anulo", IDC_CANCELBTN, "Buton", 0x50010000, 158, 156, 56, 13, 0x00000000 - CONTROL "Baud normë:", IDC_STC1, "Statik", 0x50000000, 24, 31, 42, 9, 0x00000000 - CONTROL "Byte masë:", IDC_STC2, "Statik", 0x50000000, 24, 53, 42, 9, 0x00000000 - CONTROL "Barazi:", IDC_STC3, "Statik", 0x50000000, 24, 73, 42, 9, 0x00000000 - CONTROL "Ndalo bits:", IDC_STC4, "Statik", 0x50000000, 24, 96, 42, 9, 0x00000000 - CONTROL "Kontroll Rrjedhe:", IDC_STC5, "Statik", 0x50000000, 24, 120, 42, 9, 0x00000000 + CONTROL "Baud normë:", IDC_STC1, "Static", 0x50000000, 24, 31, 42, 9, 0x00000000 + CONTROL "Byte masë:", IDC_STC2, "Static", 0x50000000, 24, 53, 42, 9, 0x00000000 + CONTROL "Barazi:", IDC_STC3, "Static", 0x50000000, 24, 73, 42, 9, 0x00000000 + CONTROL "Ndalo bits:", IDC_STC4, "Static", 0x50000000, 24, 96, 42, 9, 0x00000000 + CONTROL "Kontroll Rrjedhe:", IDC_STC5, "Static", 0x50000000, 24, 120, 42, 9, 0x00000000 CONTROL "", IDC_BAUDRATE, "ComboBox", 0x50210003, 98, 29, 100, 50, 0x00000000 CONTROL "", IDC_BYTESIZE, "ComboBox", 0x50210003, 98, 49, 100, 50, 0x00000000 CONTROL "", IDC_PARITY, "ComboBox", 0x50210003, 98, 72, 100, 50, 0x00000000 diff --git a/reactos/dll/win32/shell32/lang/sq-AL.rc b/reactos/dll/win32/shell32/lang/sq-AL.rc index 4568c57b000..34aa9202526 100644 --- a/reactos/dll/win32/shell32/lang/sq-AL.rc +++ b/reactos/dll/win32/shell32/lang/sq-AL.rc @@ -289,11 +289,11 @@ BEGIN LTEXT "Dokumentimi Sistemit:", -1, 8, 51, 95, 10 EDITTEXT 14002, 110, 51, 120, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP LTEXT "", -1, 8, 64, 223, 1, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE - CONTROL "", 14013, "Statik", SS_SUNKEN | SS_OWNERDRAW, 8, 69, 10, 10 + CONTROL "", 14013, "Static", SS_SUNKEN | SS_OWNERDRAW, 8, 69, 10, 10 LTEXT "Hapësira përdorur:", -1, 25, 69, 80, 10 EDITTEXT 14003, 110, 69, 86, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL EDITTEXT 14004, 197, 69, 33, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - CONTROL "", 14014, "Statik", SS_SUNKEN | SS_OWNERDRAW, 8, 82, 10, 10 + CONTROL "", 14014, "Static", SS_SUNKEN | SS_OWNERDRAW, 8, 82, 10, 10 LTEXT "Hapësirë Falas:", -1, 25, 82, 80, 10 EDITTEXT 14005, 110, 82, 86, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL EDITTEXT 14006, 197, 82, 33, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL @@ -301,7 +301,7 @@ BEGIN LTEXT "Kapaciteti:", -1, 25, 103, 80, 10 EDITTEXT 14007, 110, 103, 86, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL EDITTEXT 14008, 197, 103, 33, 10, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - CONTROL "", 14015, "Statik", SS_OWNERDRAW, 70, 116, 100, 30 + CONTROL "", 14015, "Static", SS_OWNERDRAW, 70, 116, 100, 30 LTEXT "Drive %c", 14009, 100, 150, 70, 10 PUSHBUTTON "Pastrim &Disku", 14010, 160, 154, 70, 15, WS_TABSTOP LTEXT "", -1, 8, 171, 223, 1, SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE From 0d0a2740ebe43038d2a8d098931affa8b35ace46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 10 Aug 2014 21:19:34 +0000 Subject: [PATCH 07/55] [TRANSLATIONS] Same remark as for revision 63856, but for "Button"!! svn path=/trunk/; revision=63857 --- reactos/dll/win32/serialui/lang/sq-AL.rc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/dll/win32/serialui/lang/sq-AL.rc b/reactos/dll/win32/serialui/lang/sq-AL.rc index 954d4e10cb6..5626c815ae4 100644 --- a/reactos/dll/win32/serialui/lang/sq-AL.rc +++ b/reactos/dll/win32/serialui/lang/sq-AL.rc @@ -25,9 +25,9 @@ FONT 8, "MS Shell Dlg" STYLE 0x10C80080 EXSTYLE 0x00000001 BEGIN - CONTROL "", IDC_GRP1, "Buton", 0x50000007, 6, 5, 210, 146, 0x00000000 - CONTROL "OK", IDC_OKBTN, "Buton", 0x50010000, 98, 156, 56, 13, 0x00000000 - CONTROL "Anulo", IDC_CANCELBTN, "Buton", 0x50010000, 158, 156, 56, 13, 0x00000000 + CONTROL "", IDC_GRP1, "Button", 0x50000007, 6, 5, 210, 146, 0x00000000 + CONTROL "OK", IDC_OKBTN, "Button", 0x50010000, 98, 156, 56, 13, 0x00000000 + CONTROL "Anulo", IDC_CANCELBTN, "Button", 0x50010000, 158, 156, 56, 13, 0x00000000 CONTROL "Baud normë:", IDC_STC1, "Static", 0x50000000, 24, 31, 42, 9, 0x00000000 CONTROL "Byte masë:", IDC_STC2, "Static", 0x50000000, 24, 53, 42, 9, 0x00000000 CONTROL "Barazi:", IDC_STC3, "Static", 0x50000000, 24, 73, 42, 9, 0x00000000 From a4d36a3511181e6f44a5c9b8060d00cc1078b101 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 10 Aug 2014 21:51:29 +0000 Subject: [PATCH 08/55] [USETUP] - Don't access next block if there is none in CabinetExtractFile. svn path=/trunk/; revision=63859 --- reactos/base/setup/usetup/cabinet.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/setup/usetup/cabinet.c b/reactos/base/setup/usetup/cabinet.c index 9f0242557bc..1d16ac0d956 100644 --- a/reactos/base/setup/usetup/cabinet.c +++ b/reactos/base/setup/usetup/cabinet.c @@ -1098,7 +1098,7 @@ CabinetExtractFile(PCAB_SEARCH Search) Size -= OutputLength; /* reduce remaining block size by bytes consumed */ RemainingBlock -= InputLength; - if (RemainingBlock == 0) + if (Size > 0 && RemainingBlock == 0) { /* used up this block, move on to the next */ DPRINT("Out of block data\n"); From 0d5a8d0594a522d44fd4b3220f6e6b297f32d19e Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 11 Aug 2014 08:05:33 +0000 Subject: [PATCH 09/55] [CABMAN] - Don't crash when a directory is specified instead of a file list (i.e. specified_files.root.normalized_name == NULL) svn path=/trunk/; revision=63860 --- reactos/tools/cdmake/dirhash.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reactos/tools/cdmake/dirhash.c b/reactos/tools/cdmake/dirhash.c index 1b1d27f7a6e..21d0c7c5d3f 100644 --- a/reactos/tools/cdmake/dirhash.c +++ b/reactos/tools/cdmake/dirhash.c @@ -210,7 +210,8 @@ dir_hash_destroy_dir(struct target_dir_hash *dh, struct target_dir_entry *de) free(tf->target_name); free(tf); } - delete_entry_by_normname(dh, de->normalized_name); + if (de->normalized_name) + delete_entry_by_normname(dh, de->normalized_name); free(de->normalized_name); free(de->case_name); } From 29813c1b0b360c3edb2d7f427a3577224c2205b6 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 11 Aug 2014 12:45:32 +0000 Subject: [PATCH 10/55] [SYSSETUP] - Gracefully handle ConvertStringSidToSid failures in InstallBuiltinAccounts and InstallPrivileges. Fixes invalid frees in second stage. svn path=/trunk/; revision=63861 --- reactos/dll/win32/syssetup/security.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/syssetup/security.c b/reactos/dll/win32/syssetup/security.c index 2f866f4d131..09c42f5e04b 100644 --- a/reactos/dll/win32/syssetup/security.c +++ b/reactos/dll/win32/syssetup/security.c @@ -170,7 +170,11 @@ InstallBuiltinAccounts(VOID) for (i = 0; i < 10; i++) { - ConvertStringSidToSid(BuiltinAccounts[i], &AccountSid); + if (!ConvertStringSidToSid(BuiltinAccounts[i], &AccountSid)) + { + DPRINT1("ConvertStringSidToSid(%S) failed: %lu\n", BuiltinAccounts[i], GetLastError()); + continue; + } Status = LsaCreateAccount(PolicyHandle, AccountSid, @@ -277,7 +281,11 @@ InstallPrivileges(VOID) } DPRINT("SID: %S\n", szSidString); - ConvertStringSidToSid(szSidString, &AccountSid); + if (!ConvertStringSidToSid(szSidString, &AccountSid)) + { + DPRINT1("ConvertStringSidToSid(%S) failed: %lu\n", szSidString, GetLastError()); + continue; + } Status = LsaOpenAccount(PolicyHandle, AccountSid, From 42f34d3788c5455425d4c0a7b482de6dd4c8fc8a Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 12 Aug 2014 07:47:08 +0000 Subject: [PATCH 11/55] [KMTESTS:RTL] - Fix a stack buffer overflow in the RtlMemory test svn path=/trunk/; revision=63870 --- rostests/kmtests/rtl/RtlMemory.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rostests/kmtests/rtl/RtlMemory.c b/rostests/kmtests/rtl/RtlMemory.c index 154ce8e925d..1f5bfa10d11 100644 --- a/rostests/kmtests/rtl/RtlMemory.c +++ b/rostests/kmtests/rtl/RtlMemory.c @@ -316,7 +316,7 @@ START_TEST(RtlMemory) KeRaiseIrql(HIGH_LEVEL, &Irql); /* RtlCompareMemoryUlong */ - MakeBuffer(Buffer, 8, 0x55, Size - 4, 0, 0); + MakeBuffer(Buffer, 8, 0x55, Size - 8, 0, 0); RetSize = RtlCompareMemoryUlong(Buffer, sizeof(ULONG), 0x55555555LU); ok_eq_size(RetSize, 4); RetSize = RtlCompareMemoryUlong(Buffer + 1, sizeof(ULONG), 0x55555555LU); From e70cc781b3f27bbd32a340c698912dabd7bd3142 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 12 Aug 2014 07:52:29 +0000 Subject: [PATCH 12/55] [RPCRT4] - Correctly check for in-buffer memory in PointerFree. Fixes invalid free e.g. when calling StartService without service arguments svn path=/trunk/; revision=63871 --- reactos/dll/win32/rpcrt4/ndr_marshall.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/rpcrt4/ndr_marshall.c b/reactos/dll/win32/rpcrt4/ndr_marshall.c index 6f19cb35761..51795467e49 100644 --- a/reactos/dll/win32/rpcrt4/ndr_marshall.c +++ b/reactos/dll/win32/rpcrt4/ndr_marshall.c @@ -1120,7 +1120,7 @@ static void PointerFree(PMIDL_STUB_MESSAGE pStubMsg, * BufferStart and BufferEnd won't be reset when allocating memory for * sending the response. we don't have to check for the new buffer here as * it won't be used a type memory, only for buffer memory */ - if (Pointer >= pStubMsg->BufferStart && Pointer < pStubMsg->BufferEnd) + if (Pointer >= pStubMsg->BufferStart && Pointer <= pStubMsg->BufferEnd) goto notfree; if (attr & RPC_FC_P_ONSTACK) { From 8094b5e493b6f13e564f0637d6c30fb2dd69affa Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Tue, 12 Aug 2014 10:29:40 +0000 Subject: [PATCH 13/55] [shell32] - Marshall interface pointers between apartments correctly - Patch by Huw Campbell svn path=/trunk/; revision=63872 --- reactos/dll/win32/shell32/folders/fs.cpp | 27 +++++++++++++++--------- reactos/dll/win32/shell32/folders/fs.h | 3 +-- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/fs.cpp b/reactos/dll/win32/shell32/folders/fs.cpp index 76e19a00543..3ee29df76d9 100644 --- a/reactos/dll/win32/shell32/folders/fs.cpp +++ b/reactos/dll/win32/shell32/folders/fs.cpp @@ -1431,20 +1431,17 @@ HRESULT WINAPI CFSFolder::Drop(IDataObject *pDataObject, _DoDropData *data = static_cast<_DoDropData*>(HeapAlloc(GetProcessHeap(), 0, sizeof(_DoDropData))); data->This = this; // Need to maintain this class in case the window is closed or the class exists temporarily (when dropping onto a folder). + pDataObject->AddRef(); + pAsyncOperation->StartOperation(NULL); + CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &data->pStream); this->AddRef(); - data->pDataObject = pDataObject; - data->pAsyncOperation = pAsyncOperation; data->dwKeyState = dwKeyState; data->pt = pt; // Need to dereference as pdweffect gets freed. data->pdwEffect = *pdwEffect; - data->pDataObject->AddRef(); - data->pAsyncOperation->StartOperation(NULL); SHCreateThread(CFSFolder::_DoDropThreadProc, data, NULL, NULL); return S_OK; } - else - pAsyncOperation->Release(); } return this->_DoDrop(pDataObject, dwKeyState, pt, pdwEffect); } @@ -1745,12 +1742,22 @@ HRESULT WINAPI CFSFolder::_DoDrop(IDataObject *pDataObject, } DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) { + CoInitialize(NULL); _DoDropData *data = static_cast<_DoDropData*>(lpParameter); - HRESULT hr = data->This->_DoDrop(data->pDataObject, data->dwKeyState, data->pt, &data->pdwEffect); + IDataObject *pDataObject; + HRESULT hr = CoGetInterfaceAndReleaseStream (data->pStream, IID_IDataObject, (void**) &pDataObject); + + if (SUCCEEDED(hr)) + { + CComPtr pAsyncOperation; + hr = data->This->_DoDrop(pDataObject, data->dwKeyState, data->pt, &data->pdwEffect); + if (SUCCEEDED(pDataObject->QueryInterface(IID_PPV_ARG(IAsyncOperation, &pAsyncOperation)))) + { + pAsyncOperation->EndOperation(hr, NULL, data->pdwEffect); + } + pDataObject->Release(); + } //Release the CFSFolder and data object holds in the copying thread. - data->pAsyncOperation->EndOperation(hr, NULL, data->pdwEffect); - data->pAsyncOperation->Release(); - data->pDataObject->Release(); data->This->Release(); //Release the parameter from the heap. HeapFree(GetProcessHeap(), 0, data); diff --git a/reactos/dll/win32/shell32/folders/fs.h b/reactos/dll/win32/shell32/folders/fs.h index 95ca362ccfe..ac7b2cda92c 100644 --- a/reactos/dll/win32/shell32/folders/fs.h +++ b/reactos/dll/win32/shell32/folders/fs.h @@ -123,8 +123,7 @@ class CFSFolder : struct _DoDropData { CFSFolder *This; - IDataObject *pDataObject; - IAsyncOperation *pAsyncOperation; + IStream *pStream; DWORD dwKeyState; POINTL pt; DWORD pdwEffect; From f6304a30dc6159b73ad76d9b4b316545e0fa59f5 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 12 Aug 2014 13:21:38 +0000 Subject: [PATCH 14/55] [SPEC2DEF] - In GCC builds, actually import by ordinal if -ordinal is specified. Found by Robert. svn path=/trunk/; revision=63873 --- reactos/tools/spec2def/spec2def.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/tools/spec2def/spec2def.c b/reactos/tools/spec2def/spec2def.c index 2b796937a57..11a7862de52 100644 --- a/reactos/tools/spec2def/spec2def.c +++ b/reactos/tools/spec2def/spec2def.c @@ -664,6 +664,10 @@ ParseFile(char* pcStart, FILE *fileDest, PFNOUTLINE OutputLine) else if (CompareToken(pc, "-ordinal")) { exp.uFlags |= FL_ORDINAL; + /* GCC doesn't automatically import by ordinal if an ordinal + * is found in the def file. Force it. */ + if (gbImportLib && !gbMSComp) + exp.uFlags |= FL_NONAME; } else if (CompareToken(pc, "-stub")) { From c0d467161aa7a451091dcc0a98fcc9147807e327 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Tue, 12 Aug 2014 15:50:27 +0000 Subject: [PATCH 15/55] [WIN32K:NTUSER] - Clear appropriate message bits when removing a sent message in FindRemoveAsyncMsg. Thanks to Giannis. - Fix list walk in FindRemoveAsyncMsg CORE-7013 #resolve svn path=/trunk/; revision=63875 --- reactos/win32ss/user/ntuser/focus.c | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/reactos/win32ss/user/ntuser/focus.c b/reactos/win32ss/user/ntuser/focus.c index c2d39a2340d..a5e87245331 100644 --- a/reactos/win32ss/user/ntuser/focus.c +++ b/reactos/win32ss/user/ntuser/focus.c @@ -315,28 +315,22 @@ FindRemoveAsyncMsg(PWND Wnd, WPARAM wParam) pti = Wnd->head.pti; - if (!IsListEmpty(&pti->SentMessagesListHead)) + Entry = pti->SentMessagesListHead.Flink; + while (Entry != &pti->SentMessagesListHead) { // Scan sent queue messages to see if we received async messages. - Entry = pti->SentMessagesListHead.Flink; Message = CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry); - do - { - if (IsListEmpty(Entry)) return; - if (!Message) return; - Entry = Message->ListEntry.Flink; + Entry = Entry->Flink; - if (Message->Msg.message == WM_ASYNC_SETACTIVEWINDOW && - Message->Msg.hwnd == UserHMGetHandle(Wnd) && - Message->Msg.wParam == wParam ) - { - ERR("ASYNC SAW: Found one in the Sent Msg Queue! %p Activate/Deactivate %d\n", Message->Msg.hwnd,!!wParam); - RemoveEntryList(&Message->ListEntry); // Purge the entry. - ExFreePoolWithTag(Message, TAG_USRMSG); - } - Message = CONTAINING_RECORD(Entry, USER_SENT_MESSAGE, ListEntry); + if (Message->Msg.message == WM_ASYNC_SETACTIVEWINDOW && + Message->Msg.hwnd == UserHMGetHandle(Wnd) && + Message->Msg.wParam == wParam) + { + ERR("ASYNC SAW: Found one in the Sent Msg Queue! %p Activate/Deactivate %d\n", Message->Msg.hwnd, !!wParam); + RemoveEntryList(&Message->ListEntry); // Purge the entry. + ClearMsgBitsMask(pti, Message->QS_Flags); + ExFreePoolWithTag(Message, TAG_USRMSG); } - while (Entry != &pti->SentMessagesListHead); } } From e8874e08eb51cb386bf2f673af5904fa9330ee26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Tue, 12 Aug 2014 19:43:32 +0000 Subject: [PATCH 16/55] Third partial merge of the condrv_restructure branch, including reverse video (rev.63865), underline (rev.63864), fonts changing (rev.63863) plus some resource fixes, RegisterConsoleVDM (rev.63849) and some code refactoring, plus WriteConsoleOutput fix (rev.63841) for Far Manager et al. CORE-5006 CORE-6397 CORE-8424 #comment Fixes from the condrv_restructure branch (rev.63841) merged back to trunk in revision 63877. svn path=/trunk/; revision=63877 --- reactos/dll/cpl/console/console.c | 1 - reactos/dll/cpl/console/font.c | 248 ++++++++++++++++-- reactos/dll/cpl/console/lang/bg-BG.rc | 2 +- reactos/dll/cpl/console/lang/cs-CZ.rc | 2 +- reactos/dll/cpl/console/lang/de-DE.rc | 2 +- reactos/dll/cpl/console/lang/en-US.rc | 2 +- reactos/dll/cpl/console/lang/es-ES.rc | 2 +- reactos/dll/cpl/console/lang/fr-FR.rc | 6 +- reactos/dll/cpl/console/lang/he-IL.rc | 2 +- reactos/dll/cpl/console/lang/id-ID.rc | 2 +- reactos/dll/cpl/console/lang/it-IT.rc | 2 +- reactos/dll/cpl/console/lang/no-NO.rc | 2 +- reactos/dll/cpl/console/lang/pl-PL.rc | 2 +- reactos/dll/cpl/console/lang/ro-RO.rc | 2 +- reactos/dll/cpl/console/lang/ru-RU.rc | 2 +- reactos/dll/cpl/console/lang/sk-SK.rc | 2 +- reactos/dll/cpl/console/lang/sq-AL.rc | 2 +- reactos/dll/cpl/console/lang/tr-TR.rc | 2 +- reactos/dll/cpl/console/lang/uk-UA.rc | 2 +- reactos/dll/cpl/console/lang/zh-CN.rc | 2 +- reactos/dll/cpl/console/layout.c | 4 +- .../win32/kernel32/client/console/readwrite.c | 47 +++- reactos/dll/win32/kernel32/client/vdm.c | 116 ++++++-- reactos/include/psdk/wincon.h | 6 + reactos/include/reactos/subsys/win/conmsg.h | 32 ++- .../user/winsrv/consrv/condrv/conoutput.c | 22 +- .../win32ss/user/winsrv/consrv/condrv/text.c | 62 +++++ .../win32ss/user/winsrv/consrv/conoutput.c | 105 +++++--- .../user/winsrv/consrv/frontends/gui/conwnd.c | 4 +- .../winsrv/consrv/frontends/gui/guisettings.c | 115 +++++++- .../winsrv/consrv/frontends/gui/guisettings.h | 1 - .../winsrv/consrv/frontends/gui/guiterm.c | 4 +- .../user/winsrv/consrv/frontends/gui/text.c | 86 +++++- reactos/win32ss/user/winsrv/consrv/handle.c | 128 ++++----- reactos/win32ss/user/winsrv/consrv/handle.h | 45 ++-- .../user/winsrv/consrv/include/conio.h | 33 ++- .../user/winsrv/consrv/include/conio_winsrv.h | 1 + .../user/winsrv/consrv/include/settings.h | 10 +- reactos/win32ss/user/winsrv/consrv/procinit.h | 2 +- .../win32ss/user/winsrv/consrv/subsysreg.c | 128 ++++++++- 40 files changed, 1030 insertions(+), 210 deletions(-) diff --git a/reactos/dll/cpl/console/console.c b/reactos/dll/cpl/console/console.c index d26c23b21e2..436626b6087 100644 --- a/reactos/dll/cpl/console/console.c +++ b/reactos/dll/cpl/console/console.c @@ -118,7 +118,6 @@ InitConsoleDefaults(PCONSOLE_PROPS pConInfo) GuiInfo->FontSize.X = 0; GuiInfo->FontSize.Y = 0; GuiInfo->FontWeight = FW_DONTCARE; - GuiInfo->UseRasterFonts = TRUE; GuiInfo->FullScreen = FALSE; GuiInfo->ShowWindow = SW_SHOWNORMAL; diff --git a/reactos/dll/cpl/console/font.c b/reactos/dll/cpl/console/font.c index 58d7948975f..d714e63fa13 100644 --- a/reactos/dll/cpl/console/font.c +++ b/reactos/dll/cpl/console/font.c @@ -76,11 +76,25 @@ if (GetTextExtentPoint32W(drawItem->hDC, L"R", 1, &CharSize)) GuiData->CharWidth = CharSize.cx; } + +/* + * See also: Display_SetTypeFace in applications/fontview/display.c + */ #endif -BOOL CALLBACK -EnumFontFamExProc(PLOGFONTW lplf, +/* + * Font pixel heights for TrueType fonts + */ +static SHORT TrueTypePoints[] = +{ + // 8, 9, 10, 11, 12, 14, 16, 18, 20, + // 22, 24, 26, 28, 36, 48, 72 + 5, 6, 7, 8, 10, 12, 14, 16, 18, 20, 24, 28, 36, 72 +}; + +static BOOL CALLBACK +EnumFontNamesProc(PLOGFONTW lplf, PNEWTEXTMETRICW lpntm, DWORD FontType, LPARAM lParam) @@ -197,6 +211,161 @@ EnumFontFamExProc(PLOGFONTW lplf, return TRUE; } +static BOOL CALLBACK +EnumFontSizesProc(PLOGFONTW lplf, + PNEWTEXTMETRICW lpntm, + DWORD FontType, + LPARAM lParam) +{ + HWND hwndCombo = (HWND)lParam; + WCHAR FontSize[100]; + + if (FontType != TRUETYPE_FONTTYPE) + { + // int logsize = lpntm->tmHeight - lpntm->tmInternalLeading; + // LONG pointsize = MulDiv(logsize, 72, GetDeviceCaps(hdc, LOGPIXELSY)); + + // swprintf(FontSize, L"%2d (%d x %d)", pointsize, lplf->lfWidth, lplf->lfHeight); + swprintf(FontSize, L"%d x %d", lplf->lfWidth, lplf->lfHeight); + + /* Make sure the size doesn't already exist in the list */ + if (SendMessageW(hwndCombo, LB_FINDSTRINGEXACT, 0, (LPARAM)FontSize) == LB_ERR) + { + /* Add the size */ + INT idx = (INT)SendMessageW(hwndCombo, LB_ADDSTRING, 0, (LPARAM)FontSize); + + /* + * Store this information in the list-item's userdata area. + * Format: + * Width = FontSize.X = LOWORD(FontSize); + * Height = FontSize.Y = HIWORD(FontSize); + */ + SendMessageW(hwndCombo, LB_SETITEMDATA, idx, MAKEWPARAM(lplf->lfWidth, lplf->lfHeight)); + } + + return TRUE; + } + else + { + int i; + for (i = 0; i < sizeof(TrueTypePoints) / sizeof(TrueTypePoints[0]); ++i) + { + swprintf(FontSize, L"%2d", TrueTypePoints[i]); + + /* Make sure the size doesn't already exist in the list */ + if (SendMessageW(hwndCombo, LB_FINDSTRINGEXACT, 0, (LPARAM)FontSize) == LB_ERR) + { + /* Add the size */ + INT idx = (INT)SendMessageW(hwndCombo, LB_ADDSTRING, 0, (LPARAM)FontSize); + + /* + * Store this information in the list-item's userdata area. + * Format: + * Width = FontSize.X = LOWORD(FontSize); + * Height = FontSize.Y = HIWORD(FontSize); + */ + SendMessageW(hwndCombo, LB_SETITEMDATA, idx, MAKEWPARAM(0, TrueTypePoints[i])); + } + } + + return FALSE; + } +} + + + +static VOID +FontSizeChange(HWND hwndDlg, + PGUI_CONSOLE_INFO GuiInfo); + +static VOID +FontTypeChange(HWND hwndDlg, + PGUI_CONSOLE_INFO GuiInfo) +{ + INT Length, nSel; + LPWSTR FaceName; + + HDC hDC; + LOGFONTW lf; + + nSel = (INT)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTTYPE, + LB_GETCURSEL, 0, 0); + if (nSel == LB_ERR) return; + + Length = (INT)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTTYPE, + LB_GETTEXTLEN, nSel, 0); + if (Length == LB_ERR) return; + + FaceName = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + (Length + 1) * sizeof(WCHAR)); + if (FaceName == NULL) return; + + Length = (INT)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTTYPE, + LB_GETTEXT, nSel, (LPARAM)FaceName); + FaceName[Length] = '\0'; + + Length = min(Length/*wcslen(FaceName) + 1*/, LF_FACESIZE); // wcsnlen + wcsncpy(GuiInfo->FaceName, FaceName, LF_FACESIZE); + GuiInfo->FaceName[Length] = L'\0'; + DPRINT1("GuiInfo->FaceName = '%S'\n", GuiInfo->FaceName); + + /* Enumerate the available sizes for the selected font */ + ZeroMemory(&lf, sizeof(lf)); + lf.lfCharSet = DEFAULT_CHARSET; // OEM_CHARSET; + // lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; + wcsncpy(lf.lfFaceName, FaceName, LF_FACESIZE); + lf.lfFaceName[Length] = L'\0'; + + hDC = GetDC(NULL); + EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFontSizesProc, + (LPARAM)GetDlgItem(hwndDlg, IDC_LBOX_FONTSIZE), 0); + ReleaseDC(NULL, hDC); + + HeapFree(GetProcessHeap(), 0, FaceName); + + // TODO: Select a default font size???? + FontSizeChange(hwndDlg, GuiInfo); + + // InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_FONT_WINDOW_PREVIEW), NULL, TRUE); + // InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SELECT_FONT_PREVIEW), NULL, TRUE); +} + +static VOID +FontSizeChange(HWND hwndDlg, + PGUI_CONSOLE_INFO GuiInfo) +{ + INT nSel; + ULONG FontSize; + WCHAR FontSizeStr[20]; + + nSel = (INT)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTSIZE, + LB_GETCURSEL, 0, 0); + if (nSel == LB_ERR) return; + + /* + * Format: + * Width = FontSize.X = LOWORD(FontSize); + * Height = FontSize.Y = HIWORD(FontSize); + */ + FontSize = (ULONG)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTSIZE, + LB_GETITEMDATA, nSel, 0); + if (FontSize == LB_ERR) return; + + GuiInfo->FontSize.X = LOWORD(FontSize); + GuiInfo->FontSize.Y = HIWORD(FontSize); + DPRINT1("GuiInfo->FontSize = (%d x %d)\n", GuiInfo->FontSize.X, GuiInfo->FontSize.Y); + + InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_FONT_WINDOW_PREVIEW), NULL, TRUE); + InvalidateRect(GetDlgItem(hwndDlg, IDC_STATIC_SELECT_FONT_PREVIEW), NULL, TRUE); + + swprintf(FontSizeStr, L"%2d", GuiInfo->FontSize.X); + SetWindowText(GetDlgItem(hwndDlg, IDC_FONT_SIZE_X), FontSizeStr); + swprintf(FontSizeStr, L"%2d", GuiInfo->FontSize.Y); + SetWindowText(GetDlgItem(hwndDlg, IDC_FONT_SIZE_Y), FontSizeStr); +} + + INT_PTR CALLBACK FontProc(HWND hwndDlg, @@ -214,7 +383,6 @@ FontProc(HWND hwndDlg, case WM_INITDIALOG: { HDC hDC; - HWND hwndCombo; LOGFONTW lf; INT idx; @@ -225,19 +393,19 @@ FontProc(HWND hwndDlg, ZeroMemory(&lf, sizeof(lf)); lf.lfCharSet = DEFAULT_CHARSET; // OEM_CHARSET; // lf.lfPitchAndFamily = FIXED_PITCH | FF_DONTCARE; - // lf.lfFaceName = L""; hDC = GetDC(NULL); - hwndCombo = GetDlgItem(hwndDlg, IDC_LBOX_FONTTYPE); - EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFontFamExProc, (LPARAM)hwndCombo, 0); + EnumFontFamiliesExW(hDC, &lf, (FONTENUMPROCW)EnumFontNamesProc, + (LPARAM)GetDlgItem(hwndDlg, IDC_LBOX_FONTTYPE), 0); ReleaseDC(NULL, hDC); DPRINT1("GuiInfo->FaceName = '%S'\n", GuiInfo->FaceName); - idx = (INT)SendMessageW(hwndCombo, LB_FINDSTRINGEXACT, 0, (LPARAM)GuiInfo->FaceName); - if (idx != LB_ERR) - { - SendMessageW(hwndCombo, LB_SETCURSEL, (WPARAM)idx, 0); - } + idx = (INT)SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTTYPE, + LB_FINDSTRINGEXACT, 0, (LPARAM)GuiInfo->FaceName); + if (idx != LB_ERR) SendDlgItemMessageW(hwndDlg, IDC_LBOX_FONTTYPE, + LB_SETCURSEL, (WPARAM)idx, 0); + + FontTypeChange(hwndDlg, GuiInfo); return TRUE; } @@ -247,16 +415,66 @@ FontProc(HWND hwndDlg, LPDRAWITEMSTRUCT drawItem = (LPDRAWITEMSTRUCT)lParam; if (drawItem->CtlID == IDC_STATIC_FONT_WINDOW_PREVIEW) - { PaintConsole(drawItem, pConInfo); - } else if (drawItem->CtlID == IDC_STATIC_SELECT_FONT_PREVIEW) - { PaintText(drawItem, pConInfo, Screen); - } + return TRUE; } + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) + { + case PSN_APPLY: + { + if (!pConInfo->AppliedConfig) + { + return ApplyConsoleInfo(hwndDlg, pConInfo); + } + else + { + /* Options have already been applied */ + SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_NOERROR); + return TRUE; + } + break; + } + } + + break; + } + + case WM_COMMAND: + { + switch (HIWORD(wParam)) + { + case LBN_SELCHANGE: + { + switch (LOWORD(wParam)) + { + case IDC_LBOX_FONTTYPE: + { + FontTypeChange(hwndDlg, GuiInfo); + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + break; + } + + case IDC_LBOX_FONTSIZE: + { + FontSizeChange(hwndDlg, GuiInfo); + PropSheet_Changed(GetParent(hwndDlg), hwndDlg); + break; + } + } + + break; + } + } + + break; + } + default: break; } diff --git a/reactos/dll/cpl/console/lang/bg-BG.rc b/reactos/dll/cpl/console/lang/bg-BG.rc index b7f0b9da413..e6f62b7530b 100644 --- a/reactos/dll/cpl/console/lang/bg-BG.rc +++ b/reactos/dll/cpl/console/lang/bg-BG.rc @@ -35,7 +35,7 @@ BEGIN LTEXT "Прозоречен преглед:", -1, 10, 10, 94, 10 LTEXT "Размер:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Шрифт:", -1, 10, 105, 33, 10 CHECKBOX "&Получери шрифтове", IDC_CHECK_BOLD_FONTS, 38, 105, 85, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/cs-CZ.rc b/reactos/dll/cpl/console/lang/cs-CZ.rc index 0cfef2c42f4..afda11d7d58 100644 --- a/reactos/dll/cpl/console/lang/cs-CZ.rc +++ b/reactos/dll/cpl/console/lang/cs-CZ.rc @@ -41,7 +41,7 @@ BEGIN LTEXT "Náhled okna:", -1, 10, 10, 94, 10 LTEXT "Velikost:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Písmo:", -1, 10, 105, 33, 10 CHECKBOX "&Tučná písma", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/de-DE.rc b/reactos/dll/cpl/console/lang/de-DE.rc index 8a241377d0b..5ea5d53f846 100644 --- a/reactos/dll/cpl/console/lang/de-DE.rc +++ b/reactos/dll/cpl/console/lang/de-DE.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Fenstervorschau", -1, 10, 7, 65, 10 LTEXT "Größe", -1, 130, 10, 30, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 115, 70 - LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Schrift", -1, 10, 105, 35, 10 CHECKBOX "&Fette Schriften", IDC_CHECK_BOLD_FONTS, 45, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 50, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/en-US.rc b/reactos/dll/cpl/console/lang/en-US.rc index a389a6af357..d4d9e576f2b 100644 --- a/reactos/dll/cpl/console/lang/en-US.rc +++ b/reactos/dll/cpl/console/lang/en-US.rc @@ -35,7 +35,7 @@ BEGIN LTEXT "Window Preview:", -1, 10, 10, 94, 10 LTEXT "Size:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Font:", -1, 10, 105, 33, 10 CHECKBOX "&Bold fonts", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/es-ES.rc b/reactos/dll/cpl/console/lang/es-ES.rc index 86611a92863..4cb83e117ee 100644 --- a/reactos/dll/cpl/console/lang/es-ES.rc +++ b/reactos/dll/cpl/console/lang/es-ES.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Ventana de Previsualización", -1, 10, 7, 65, 10 LTEXT "Tamaño", -1, 130, 10, 30, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 115, 70 - LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Fuente", -1, 10, 105, 35, 10 CHECKBOX "&Negrita", IDC_CHECK_BOLD_FONTS, 45, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 50, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/fr-FR.rc b/reactos/dll/cpl/console/lang/fr-FR.rc index fcfc76e36ee..4e57984b2fb 100644 --- a/reactos/dll/cpl/console/lang/fr-FR.rc +++ b/reactos/dll/cpl/console/lang/fr-FR.rc @@ -37,14 +37,14 @@ BEGIN LTEXT "Fenêtre de Prévisualisation :", -1, 10, 10, 94, 10 LTEXT "Taille :", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Police :", -1, 10, 105, 33, 10 CHECKBOX "&Gras", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL GROUPBOX "", IDC_GROUPBOX_FONT_NAME, 6, 156, 241, 50 CONTROL "", IDC_STATIC_SELECT_FONT_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 16, 165, 95, 35 - LTEXT "Chaque caractère est :", -1, 124, 166, 75, 10 - LTEXT "largeur du pixel\nhauteur du pixel", -1, 136, 180, 101, 20 + LTEXT "Chaque caractère utilise :", -1, 124, 166, 85, 10 + LTEXT "pixels en largeur\npixels en hauteur", -1, 136, 180, 101, 20 LTEXT "", IDC_FONT_SIZE_X, 120, 180, 10, 10 LTEXT "", IDC_FONT_SIZE_Y, 120, 188, 10, 10 END diff --git a/reactos/dll/cpl/console/lang/he-IL.rc b/reactos/dll/cpl/console/lang/he-IL.rc index 2ee72d74b64..a68475013f4 100644 --- a/reactos/dll/cpl/console/lang/he-IL.rc +++ b/reactos/dll/cpl/console/lang/he-IL.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "תצוגה מקדימה:", -1, 10, 10, 94, 10 LTEXT "גודל:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "גופן:", -1, 10, 105, 33, 10 CHECKBOX "גופנים מודגשים", IDC_CHECK_BOLD_FONTS, 41, 105, 33, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/id-ID.rc b/reactos/dll/cpl/console/lang/id-ID.rc index 4232a3b112d..e84bcbfe107 100644 --- a/reactos/dll/cpl/console/lang/id-ID.rc +++ b/reactos/dll/cpl/console/lang/id-ID.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Tinjauan Jendela", -1, 10, 7, 65, 10 LTEXT "Ukuran", -1, 130, 10, 30, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 115, 70 - LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Font", -1, 10, 105, 35, 10 CHECKBOX "Font &tebal", IDC_CHECK_BOLD_FONTS, 45, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 50, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/it-IT.rc b/reactos/dll/cpl/console/lang/it-IT.rc index 395c6c45ed2..cfc0bd31e9b 100644 --- a/reactos/dll/cpl/console/lang/it-IT.rc +++ b/reactos/dll/cpl/console/lang/it-IT.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Anteprima", -1, 10, 7, 65, 10 LTEXT "Dimansione", -1, 130, 10, 30, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 115, 70 - LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Font", -1, 10, 105, 35, 10 CHECKBOX "&Grassetto fonts", IDC_CHECK_BOLD_FONTS, 45, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 50, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/no-NO.rc b/reactos/dll/cpl/console/lang/no-NO.rc index 8a3eb71fe11..634812113d8 100644 --- a/reactos/dll/cpl/console/lang/no-NO.rc +++ b/reactos/dll/cpl/console/lang/no-NO.rc @@ -35,7 +35,7 @@ BEGIN LTEXT "Vindu forhåndsvisning:", -1, 10, 10, 94, 10 LTEXT "Størrelse:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Skrift:", -1, 10, 105, 33, 10 CHECKBOX "&Fet skrift", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/pl-PL.rc b/reactos/dll/cpl/console/lang/pl-PL.rc index f7e8d7c3588..bcee44f7b5c 100644 --- a/reactos/dll/cpl/console/lang/pl-PL.rc +++ b/reactos/dll/cpl/console/lang/pl-PL.rc @@ -42,7 +42,7 @@ BEGIN LTEXT "Okno podglądu", -1, 10, 7, 65, 10 LTEXT "Rozmiar", -1, 130, 10, 30, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 115, 70 - LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 130, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Czcionka", -1, 10, 105, 35, 10 CHECKBOX "&Pogrubiona czcionka", IDC_CHECK_BOLD_FONTS, 45, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 50, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/ro-RO.rc b/reactos/dll/cpl/console/lang/ro-RO.rc index 6f17ed30790..7c33e3a6fbe 100644 --- a/reactos/dll/cpl/console/lang/ro-RO.rc +++ b/reactos/dll/cpl/console/lang/ro-RO.rc @@ -44,7 +44,7 @@ BEGIN LTEXT "Previzionare:", -1, 10, 10, 94, 10 LTEXT "&Mărime:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "F&ont:", -1, 10, 105, 33, 10 CHECKBOX "&Aldin", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/ru-RU.rc b/reactos/dll/cpl/console/lang/ru-RU.rc index 13e60dd0861..7a71960c3c0 100644 --- a/reactos/dll/cpl/console/lang/ru-RU.rc +++ b/reactos/dll/cpl/console/lang/ru-RU.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Окно предпросмотра:", -1, 10, 10, 94, 10 LTEXT "Размер:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Шрифт:", -1, 10, 105, 33, 10 CHECKBOX "&Жирный", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/sk-SK.rc b/reactos/dll/cpl/console/lang/sk-SK.rc index 09df76713af..6392d83271b 100644 --- a/reactos/dll/cpl/console/lang/sk-SK.rc +++ b/reactos/dll/cpl/console/lang/sk-SK.rc @@ -39,7 +39,7 @@ BEGIN LTEXT "Ukážka okna:", -1, 10, 10, 94, 10 LTEXT "Veľkosť:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Písmo:", -1, 10, 105, 33, 10 CHECKBOX "&Tučné písma", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/sq-AL.rc b/reactos/dll/cpl/console/lang/sq-AL.rc index cdf416e99a3..8a2364e66d7 100644 --- a/reactos/dll/cpl/console/lang/sq-AL.rc +++ b/reactos/dll/cpl/console/lang/sq-AL.rc @@ -39,7 +39,7 @@ BEGIN LTEXT "Dritare Preview:", -1, 10, 10, 94, 10 LTEXT "Masë:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Font:", -1, 10, 105, 33, 10 CHECKBOX "&Bold fonts", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/tr-TR.rc b/reactos/dll/cpl/console/lang/tr-TR.rc index 23445d94baf..7521b5bcce9 100644 --- a/reactos/dll/cpl/console/lang/tr-TR.rc +++ b/reactos/dll/cpl/console/lang/tr-TR.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Pencere Ön İzlemesi:", -1, 10, 10, 94, 10 LTEXT "&Boyutlar:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Yazı Tipi:", -1, 10, 105, 33, 10 CHECKBOX "&Kalın Yazı Tipleri", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/uk-UA.rc b/reactos/dll/cpl/console/lang/uk-UA.rc index c98f33c127d..dbe92ecf144 100644 --- a/reactos/dll/cpl/console/lang/uk-UA.rc +++ b/reactos/dll/cpl/console/lang/uk-UA.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "Зразок вікна", -1, 10, 10, 94, 10 LTEXT "Size:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&Шрифт:", -1, 10, 105, 33, 10 CHECKBOX "&Жирні", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/lang/zh-CN.rc b/reactos/dll/cpl/console/lang/zh-CN.rc index 409f531e67f..fa8d9bd0390 100644 --- a/reactos/dll/cpl/console/lang/zh-CN.rc +++ b/reactos/dll/cpl/console/lang/zh-CN.rc @@ -37,7 +37,7 @@ BEGIN LTEXT "窗口预览:", -1, 10, 10, 94, 10 LTEXT "大小:", -1, 180, 10, 36, 10 CONTROL "", IDC_STATIC_FONT_WINDOW_PREVIEW, "Static", SS_OWNERDRAW | SS_SUNKEN, 10, 20, 163, 74 - LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_DISABLENOSCROLL | WS_VSCROLL + LISTBOX IDC_LBOX_FONTSIZE, 181, 20, 55, 80, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL LTEXT "&字体(&F):", -1, 10, 105, 33, 10 CHECKBOX "粗体(&B)", IDC_CHECK_BOLD_FONTS, 56, 105, 60, 10 LISTBOX IDC_LBOX_FONTTYPE, 10, 120, 110, 40, LBS_SORT | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_VSCROLL diff --git a/reactos/dll/cpl/console/layout.c b/reactos/dll/cpl/console/layout.c index 41ebc3146e5..fac40bba815 100644 --- a/reactos/dll/cpl/console/layout.c +++ b/reactos/dll/cpl/console/layout.c @@ -120,8 +120,8 @@ PaintText(LPDRAWITEMSTRUCT drawItem, hBrush = CreateSolidBrush(nbkColor); if (!hBrush) return FALSE; - Font = CreateFontW(GuiInfo->FontSize.X, - 0, // GuiInfo->FontSize.Y, + Font = CreateFontW(GuiInfo->FontSize.Y, + 0, // GuiInfo->FontSize.X, 0, TA_BASELINE, GuiInfo->FontWeight, diff --git a/reactos/dll/win32/kernel32/client/console/readwrite.c b/reactos/dll/win32/kernel32/client/console/readwrite.c index 9db3ab5cab1..f1818a0c8c8 100644 --- a/reactos/dll/win32/kernel32/client/console/readwrite.c +++ b/reactos/dll/win32/kernel32/client/console/readwrite.c @@ -881,6 +881,7 @@ IntWriteConsoleOutput(IN HANDLE hConsoleOutput, { WriteOutputRequest->CharInfo = &WriteOutputRequest->StaticBuffer; // CaptureBuffer = NULL; + WriteOutputRequest->UseVirtualMemory = FALSE; } else { @@ -888,17 +889,36 @@ IntWriteConsoleOutput(IN HANDLE hConsoleOutput, /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); - if (CaptureBuffer == NULL) + if (CaptureBuffer) { - DPRINT1("CsrAllocateCaptureBuffer failed with size %ld!\n", Size); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; + /* Allocate space in the Buffer */ + CsrAllocateMessagePointer(CaptureBuffer, + Size, + (PVOID*)&WriteOutputRequest->CharInfo); + WriteOutputRequest->UseVirtualMemory = FALSE; } + else + { + /* + * CsrAllocateCaptureBuffer failed because we tried to allocate + * a too large (>= 64 kB, size of the CSR heap) data buffer. + * To circumvent this, Windows uses a trick (that we reproduce for + * compatibility reasons): we allocate a heap buffer in the process' + * memory, and CSR will read it via NtReadVirtualMemory. + */ + DPRINT1("CsrAllocateCaptureBuffer failed with size %ld, let's use local heap buffer...\n", Size); - /* Allocate space in the Buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - Size, - (PVOID*)&WriteOutputRequest->CharInfo); + WriteOutputRequest->CharInfo = RtlAllocateHeap(RtlGetProcessHeap(), 0, Size); + WriteOutputRequest->UseVirtualMemory = TRUE; + + /* Bail out if we still cannot allocate memory */ + if (WriteOutputRequest->CharInfo == NULL) + { + DPRINT1("Failed to allocate heap buffer with size %ld!\n", Size); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + } } /* Capture the user buffer contents */ @@ -945,7 +965,16 @@ IntWriteConsoleOutput(IN HANDLE hConsoleOutput, Success = NT_SUCCESS(ApiMessage.Status); /* Release the capture buffer if needed */ - if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + if (CaptureBuffer) + { + CsrFreeCaptureBuffer(CaptureBuffer); + } + else + { + /* If we used a heap buffer, free it */ + if (WriteOutputRequest->UseVirtualMemory) + RtlFreeHeap(RtlGetProcessHeap(), 0, WriteOutputRequest->CharInfo); + } /* Retrieve the results */ _SEH2_TRY diff --git a/reactos/dll/win32/kernel32/client/vdm.c b/reactos/dll/win32/kernel32/client/vdm.c index 8b50319491f..3456dab587c 100644 --- a/reactos/dll/win32/kernel32/client/vdm.c +++ b/reactos/dll/win32/kernel32/client/vdm.c @@ -1640,26 +1640,101 @@ GetVDMCurrentDirectories(DWORD cchCurDirs, PCHAR lpszzCurDirs) /* - * @unimplemented + * @implemented (undocumented) */ BOOL WINAPI -RegisterConsoleVDM ( - DWORD Unknown0, - DWORD Unknown1, - DWORD Unknown2, - DWORD Unknown3, - DWORD Unknown4, - DWORD Unknown5, - DWORD Unknown6, - DWORD Unknown7, - DWORD Unknown8, - DWORD Unknown9, - DWORD Unknown10 - ) +RegisterConsoleVDM(IN DWORD dwRegisterFlags, + IN HANDLE hStartHardwareEvent, + IN HANDLE hEndHardwareEvent, + IN HANDLE hErrorHardwareEvent, + IN DWORD dwUnusedVar, + OUT LPDWORD lpVideoStateLength, + OUT PVOID* lpVideoState, // PVIDEO_HARDWARE_STATE_HEADER* + IN PVOID lpUnusedBuffer, + IN DWORD dwUnusedBufferLength, + IN COORD dwVDMBufferSize, + OUT PVOID* lpVDMBuffer) { - STUB; - return FALSE; + BOOL Success; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_REGISTERVDM RegisterVDMRequest = &ApiMessage.Data.RegisterVDMRequest; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; + + /* Set up the data to send to the Console Server */ + RegisterVDMRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + RegisterVDMRequest->RegisterFlags = dwRegisterFlags; + + if (dwRegisterFlags != 0) + { + RegisterVDMRequest->StartHardwareEvent = hStartHardwareEvent; + RegisterVDMRequest->EndHardwareEvent = hEndHardwareEvent; + RegisterVDMRequest->ErrorHardwareEvent = hErrorHardwareEvent; + + RegisterVDMRequest->VDMBufferSize = dwVDMBufferSize; + +#if 0 + RegisterVDMRequest->UnusedBufferLength = dwUnusedBufferLength; + + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, dwUnusedBufferLength); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + /* Capture the buffer to write */ + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpUnusedBuffer, + dwUnusedBufferLength, + (PVOID*)&RegisterVDMRequest->UnusedBuffer); +#endif + } + else + { + // CaptureBuffer = NULL; + } + + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepRegisterVDM), + sizeof(*RegisterVDMRequest)); + + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Retrieve the results */ + if (Success) + { + if (dwRegisterFlags != 0) + { + _SEH2_TRY + { + *lpVideoStateLength = RegisterVDMRequest->VideoStateLength; + *lpVideoState = RegisterVDMRequest->VideoState; + *lpVDMBuffer = RegisterVDMRequest->VDMBuffer; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + } + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } + + /* Return success status */ + return Success; } @@ -1756,9 +1831,8 @@ VDMOperationStarted(IN ULONG Unknown0) { DPRINT1("VDMOperationStarted(%d)\n", Unknown0); - return - BaseUpdateVDMEntry(VdmEntryUpdateControlCHandler, - NULL, - 0, - Unknown0); + return BaseUpdateVDMEntry(VdmEntryUpdateControlCHandler, + NULL, + 0, + Unknown0); } diff --git a/reactos/include/psdk/wincon.h b/reactos/include/psdk/wincon.h index c44e478dab0..2df5ef345a0 100644 --- a/reactos/include/psdk/wincon.h +++ b/reactos/include/psdk/wincon.h @@ -618,6 +618,12 @@ BOOL WINAPI CloseConsoleHandle(_In_ HANDLE); // BOOL WINAPI SetStdHandle(_In_ DWORD, _In_ HANDLE); /* Undocumented */ BOOL WINAPI VerifyConsoleIoHandle(_In_ HANDLE); +/* Undocumented */ +BOOL +WINAPI +RegisterConsoleVDM(_In_ DWORD, _In_ HANDLE, _In_ HANDLE, _In_ HANDLE, _In_ DWORD, + _Out_ LPDWORD, _Out_ PVOID*, _In_ PVOID, _In_ DWORD, _In_ COORD, + _Out_ PVOID*); BOOL WINAPI diff --git a/reactos/include/reactos/subsys/win/conmsg.h b/reactos/include/reactos/subsys/win/conmsg.h index a11d0bf64b8..1f047226d3d 100644 --- a/reactos/include/reactos/subsys/win/conmsg.h +++ b/reactos/include/reactos/subsys/win/conmsg.h @@ -544,7 +544,12 @@ typedef struct SMALL_RECT WriteRegion; BOOLEAN Unicode; - ULONG Unknown; + /* + * If we are going to write too large (>= 64 kB, size of the CSR heap) + * data buffers, we allocate a heap buffer in the process' memory, and + * CSR will read it via NtReadVirtualMemory. + */ + BOOLEAN UseVirtualMemory; } CONSOLE_WRITEOUTPUT, *PCONSOLE_WRITEOUTPUT; typedef struct @@ -801,6 +806,28 @@ typedef struct BOOL Ansi; } CONSOLE_GETKBDLAYOUTNAME, *PCONSOLE_GETKBDLAYOUTNAME; +typedef struct +{ + HANDLE ConsoleHandle; + ULONG RegisterFlags; + HANDLE StartHardwareEvent; + HANDLE EndHardwareEvent; + HANDLE ErrorHardwareEvent; + + /* Unused member */ + ULONG UnusedVar; + + ULONG VideoStateLength; + PVOID VideoState; // PVIDEO_HARDWARE_STATE_HEADER + + /* Unused members */ + PVOID UnusedBuffer; + ULONG UnusedBufferLength; + + COORD VDMBufferSize; + PVOID VDMBuffer; +} CONSOLE_REGISTERVDM, *PCONSOLE_REGISTERVDM; + typedef struct _CONSOLE_API_MESSAGE { PORT_MESSAGE Header; @@ -898,6 +925,9 @@ typedef struct _CONSOLE_API_MESSAGE CONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest; CONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest; CONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest; + + /* Virtual DOS Machine */ + CONSOLE_REGISTERVDM RegisterVDMRequest; } Data; } CONSOLE_API_MESSAGE, *PCONSOLE_API_MESSAGE; diff --git a/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c b/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c index 42d5cbfdb36..4fe657454f4 100644 --- a/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c +++ b/reactos/win32ss/user/winsrv/consrv/condrv/conoutput.c @@ -188,7 +188,7 @@ ConDrvSetConsoleActiveScreenBuffer(IN PCONSOLE Console, if (Buffer == Console->ActiveBuffer) return STATUS_SUCCESS; /* If old buffer has no handles, it's now unreferenced */ - if (Console->ActiveBuffer->Header.HandleCount == 0) + if (Console->ActiveBuffer->Header.ReferenceCount == 0) { ConioDeleteScreenBuffer(Console->ActiveBuffer); } @@ -207,6 +207,13 @@ ConDrvGetActiveScreenBuffer(IN PCONSOLE Console) /* PUBLIC DRIVER APIS *********************************************************/ +NTSTATUS NTAPI +ConDrvWriteConsoleOutputVDM(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCHAR_CELL CharInfo/*Buffer*/, + IN COORD CharInfoSize, + IN OUT PSMALL_RECT WriteRegion, + IN BOOLEAN DrawRegion); NTSTATUS NTAPI ConDrvInvalidateBitMapRect(IN PCONSOLE Console, IN PCONSOLE_SCREEN_BUFFER Buffer, @@ -218,6 +225,19 @@ ConDrvInvalidateBitMapRect(IN PCONSOLE Console, /* Validity check */ ASSERT(Console == Buffer->Header.Console); + /* In text-mode only, draw the VDM buffer if present */ + if (GetType(Buffer) == TEXTMODE_BUFFER) + { + PTEXTMODE_SCREEN_BUFFER TextBuffer = (PTEXTMODE_SCREEN_BUFFER)Buffer; + + /*Status =*/ ConDrvWriteConsoleOutputVDM(Buffer->Header.Console, + TextBuffer, + Console->VDMBuffer, + Console->VDMBufferSize, + Region, + FALSE); + } + /* If the output buffer is the current one, redraw the correct portion of the screen */ if (Buffer == Console->ActiveBuffer) TermDrawRegion(Console, Region); diff --git a/reactos/win32ss/user/winsrv/consrv/condrv/text.c b/reactos/win32ss/user/winsrv/consrv/condrv/text.c index 96e30035931..6b8dbdcbc8a 100644 --- a/reactos/win32ss/user/winsrv/consrv/condrv/text.c +++ b/reactos/win32ss/user/winsrv/consrv/condrv/text.c @@ -722,6 +722,68 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, return STATUS_SUCCESS; } +/* + * NOTE: This function is strongly inspired by ConDrvWriteConsoleOutput... + */ +NTSTATUS NTAPI +ConDrvWriteConsoleOutputVDM(IN PCONSOLE Console, + IN PTEXTMODE_SCREEN_BUFFER Buffer, + IN PCHAR_CELL CharInfo/*Buffer*/, + IN COORD CharInfoSize, + IN OUT PSMALL_RECT WriteRegion, + IN BOOLEAN DrawRegion) +{ + SHORT X, Y; + SMALL_RECT ScreenBuffer; + PCHAR_CELL CurCharInfo; + SMALL_RECT CapturedWriteRegion; + PCHAR_INFO Ptr; + + if (Console == NULL || Buffer == NULL || CharInfo == NULL || WriteRegion == NULL) + { + return STATUS_INVALID_PARAMETER; + } + + /* Validity check */ + ASSERT(Console == Buffer->Header.Console); + + CapturedWriteRegion = *WriteRegion; + + /* Make sure WriteRegion is inside the screen buffer */ + ConioInitRect(&ScreenBuffer, 0, 0, + Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); + if (!ConioGetIntersection(&CapturedWriteRegion, &ScreenBuffer, &CapturedWriteRegion)) + { + /* + * It is okay to have a WriteRegion completely outside + * the screen buffer. No data is written then. + */ + return STATUS_SUCCESS; + } + + // CurCharInfo = CharInfo; + + for (Y = CapturedWriteRegion.Top; Y <= CapturedWriteRegion.Bottom; ++Y) + { + /**/CurCharInfo = CharInfo + Y * CharInfoSize.X + CapturedWriteRegion.Left;/**/ + + Ptr = ConioCoordToPointer(Buffer, CapturedWriteRegion.Left, Y); + for (X = CapturedWriteRegion.Left; X <= CapturedWriteRegion.Right; ++X) + { + ConsoleAnsiCharToUnicodeChar(Console, &Ptr->Char.UnicodeChar, &CurCharInfo->Char); + Ptr->Attributes = CurCharInfo->Attributes; + ++Ptr; + ++CurCharInfo; + } + } + + if (DrawRegion) TermDrawRegion(Console, &CapturedWriteRegion); + + *WriteRegion = CapturedWriteRegion; + + return STATUS_SUCCESS; +} + NTSTATUS NTAPI ConDrvWriteConsole(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER ScreenBuffer, diff --git a/reactos/win32ss/user/winsrv/consrv/conoutput.c b/reactos/win32ss/user/winsrv/consrv/conoutput.c index 833b3cdbb79..12a4d4d8e00 100644 --- a/reactos/win32ss/user/winsrv/consrv/conoutput.c +++ b/reactos/win32ss/user/winsrv/consrv/conoutput.c @@ -463,15 +463,15 @@ CSR_API(SrvReadConsoleOutput) DPRINT("SrvReadConsoleOutput\n"); + NumCells = (ReadOutputRequest->ReadRegion.Right - ReadOutputRequest->ReadRegion.Left + 1) * + (ReadOutputRequest->ReadRegion.Bottom - ReadOutputRequest->ReadRegion.Top + 1); + /* * For optimization purposes, Windows (and hence ReactOS, too, for * compatibility reasons) uses a static buffer if no more than one * cell is read. Otherwise a new buffer is used. * The client-side expects that we know this behaviour. */ - NumCells = (ReadOutputRequest->ReadRegion.Right - ReadOutputRequest->ReadRegion.Left + 1) * - (ReadOutputRequest->ReadRegion.Bottom - ReadOutputRequest->ReadRegion.Top + 1); - if (NumCells <= 1) { /* @@ -520,54 +520,95 @@ CSR_API(SrvWriteConsoleOutput) NTSTATUS Status; PCONSOLE_WRITEOUTPUT WriteOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteOutputRequest; PTEXTMODE_SCREEN_BUFFER Buffer; + PCSR_PROCESS Process = CsrGetClientThread()->Process; ULONG NumCells; PCHAR_INFO CharInfo; DPRINT("SrvWriteConsoleOutput\n"); - /* - * For optimization purposes, Windows (and hence ReactOS, too, for - * compatibility reasons) uses a static buffer if no more than one - * cell is written. Otherwise a new buffer is used. - * The client-side expects that we know this behaviour. - */ NumCells = (WriteOutputRequest->WriteRegion.Right - WriteOutputRequest->WriteRegion.Left + 1) * (WriteOutputRequest->WriteRegion.Bottom - WriteOutputRequest->WriteRegion.Top + 1); - if (NumCells <= 1) - { - /* - * Adjust the internal pointer, because its old value points to - * the static buffer in the original ApiMessage structure. - */ - // WriteOutputRequest->CharInfo = &WriteOutputRequest->StaticBuffer; - CharInfo = &WriteOutputRequest->StaticBuffer; - } - else - { - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&WriteOutputRequest->CharInfo, - NumCells, - sizeof(CHAR_INFO))) - { - return STATUS_INVALID_PARAMETER; - } - - CharInfo = WriteOutputRequest->CharInfo; - } - - Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(Process), WriteOutputRequest->OutputHandle, &Buffer, GENERIC_WRITE, TRUE); if (!NT_SUCCESS(Status)) return Status; + /* + * Validate the message buffer if we do not use a process' heap buffer + * (CsrAllocateCaptureBuffer succeeded because we haven't allocated + * a too large (>= 64 kB, size of the CSR heap) data buffer). + */ + if (!WriteOutputRequest->UseVirtualMemory) + { + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than one + * cell is written. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (NumCells <= 1) + { + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // WriteOutputRequest->CharInfo = &WriteOutputRequest->StaticBuffer; + CharInfo = &WriteOutputRequest->StaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&WriteOutputRequest->CharInfo, + NumCells, + sizeof(CHAR_INFO))) + { + Status = STATUS_INVALID_PARAMETER; + goto Quit; + } + + CharInfo = WriteOutputRequest->CharInfo; + } + } + else + { + /* + * This was not the case: we use a heap buffer. Retrieve its contents. + */ + ULONG Size = NumCells * sizeof(CHAR_INFO); + + CharInfo = ConsoleAllocHeap(HEAP_ZERO_MEMORY, Size); + if (CharInfo == NULL) + { + Status = STATUS_NO_MEMORY; + goto Quit; + } + + Status = NtReadVirtualMemory(Process->ProcessHandle, + WriteOutputRequest->CharInfo, + CharInfo, + Size, + NULL); + if (!NT_SUCCESS(Status)) + { + ConsoleFreeHeap(CharInfo); + // Status = STATUS_NO_MEMORY; + goto Quit; + } + } + Status = ConDrvWriteConsoleOutput(Buffer->Header.Console, Buffer, WriteOutputRequest->Unicode, CharInfo, &WriteOutputRequest->WriteRegion); + /* Free the temporary buffer if we used the process' heap buffer */ + if (WriteOutputRequest->UseVirtualMemory && CharInfo) + ConsoleFreeHeap(CharInfo); + +Quit: ConSrvReleaseScreenBuffer(Buffer, TRUE); return Status; } diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c index fc229215fe4..2a7ff36cc40 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c @@ -506,8 +506,8 @@ OnNcCreate(HWND hWnd, LPCREATESTRUCTW Create) GuiData->hWindow = hWnd; - GuiData->Font = CreateFontW(GuiData->GuiInfo.FontSize.X, - 0, // GuiData->GuiInfo.FontSize.Y, + GuiData->Font = CreateFontW(GuiData->GuiInfo.FontSize.Y, + 0, // GuiData->GuiInfo.FontSize.X, 0, TA_BASELINE, GuiData->GuiInfo.FontWeight, diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c index 3220152419a..a3969fe3a23 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c @@ -98,8 +98,8 @@ GuiConsoleReadUserSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, } else if (!wcscmp(szValueName, L"FontSize")) { - TermInfo->FontSize.X = LOWORD(Value); - TermInfo->FontSize.Y = HIWORD(Value); + TermInfo->FontSize.X = LOWORD(Value); // Width + TermInfo->FontSize.Y = HIWORD(Value); // Height RetVal = TRUE; } else if (!wcscmp(szValueName, L"FontWeight")) @@ -161,7 +161,7 @@ do { SetConsoleSetting(L"FaceName", REG_SZ, (wcslen(TermInfo->FaceName) + 1) * sizeof(WCHAR), TermInfo->FaceName, L'\0'); // wcsnlen SetConsoleSetting(L"FontFamily", REG_DWORD, sizeof(DWORD), &TermInfo->FontFamily, FF_DONTCARE); - Storage = MAKELONG(TermInfo->FontSize.X, TermInfo->FontSize.Y); + Storage = MAKELONG(TermInfo->FontSize.X, TermInfo->FontSize.Y); // Width, Height SetConsoleSetting(L"FontSize", REG_DWORD, sizeof(DWORD), &Storage, 0); SetConsoleSetting(L"FontWeight", REG_DWORD, sizeof(DWORD), &TermInfo->FontWeight, FW_DONTCARE); @@ -197,7 +197,7 @@ GuiConsoleGetDefaultSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, * 1. Load the default values */ // wcsncpy(TermInfo->FaceName, L"DejaVu Sans Mono", LF_FACESIZE); - // TermInfo->FontSize = MAKELONG(12, 8); // 0x0008000C; // font is 8x12 + // TermInfo->FontSize = MAKELONG(8, 12); // 0x000C0008; // font is 8x12 // TermInfo->FontSize = MAKELONG(16, 16); // font is 16x16 // TermInfo->FontWeight = FW_NORMAL; @@ -207,7 +207,6 @@ GuiConsoleGetDefaultSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, TermInfo->FontSize.X = 0; TermInfo->FontSize.Y = 0; TermInfo->FontWeight = FW_DONTCARE; - TermInfo->UseRasterFonts = TRUE; TermInfo->FullScreen = FALSE; TermInfo->ShowWindow = SW_SHOWNORMAL; @@ -333,7 +332,6 @@ GuiConsoleShowConsoleProperties(PGUI_CONSOLE_DATA GuiData, GuiInfo->FontFamily = GuiData->GuiInfo.FontFamily; GuiInfo->FontSize = GuiData->GuiInfo.FontSize; GuiInfo->FontWeight = GuiData->GuiInfo.FontWeight; - GuiInfo->UseRasterFonts = GuiData->GuiInfo.UseRasterFonts; GuiInfo->FullScreen = GuiData->GuiInfo.FullScreen; GuiInfo->AutoPosition = GuiData->GuiInfo.AutoPosition; GuiInfo->WindowOrigin = GuiData->GuiInfo.WindowOrigin; @@ -420,6 +418,92 @@ Quit: return; } + + + +BOOL +ChangeFont(PGUI_CONSOLE_DATA GuiData, + LPWSTR FaceName, // Points to a WCHAR array of LF_FACESIZE elements. + ULONG FontFamily, + COORD FontSize, + ULONG FontWeight) +{ + HDC hDC; + HFONT OldFont, NewFont; + TEXTMETRICW Metrics; + SIZE CharSize; + SIZE_T Length; + + NewFont = CreateFontW(FontSize.Y, + 0, // FontSize.X, + 0, + TA_BASELINE, + FontWeight, + FALSE, + FALSE, + FALSE, + OEM_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + NONANTIALIASED_QUALITY, + FIXED_PITCH | FontFamily /* FF_DONTCARE */, + FaceName); + if (NewFont == NULL) + { + DPRINT1("ChangeFont: CreateFont failed\n"); + return FALSE; + } + + hDC = GetDC(GuiData->hWindow); + if (hDC == NULL) + { + DPRINT1("ChangeFont: GetDC failed\n"); + DeleteObject(NewFont); + return FALSE; + } + + OldFont = SelectObject(hDC, NewFont); + if (OldFont == NULL) + { + DPRINT1("ChangeFont: SelectObject failed\n"); + ReleaseDC(GuiData->hWindow, hDC); + DeleteObject(NewFont); + return FALSE; + } + + if (!GetTextMetricsW(hDC, &Metrics)) + { + DPRINT1("ChangeFont: GetTextMetrics failed\n"); + SelectObject(hDC, OldFont); + ReleaseDC(GuiData->hWindow, hDC); + DeleteObject(NewFont); + return FALSE; + } + GuiData->CharWidth = Metrics.tmMaxCharWidth; + GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; + + /* Measure real char width more precisely if possible. */ + if (GetTextExtentPoint32W(hDC, L"R", 1, &CharSize)) + GuiData->CharWidth = CharSize.cx; + + SelectObject(hDC, OldFont); + ReleaseDC(GuiData->hWindow, hDC); + + if (GuiData->Font != NULL) DeleteObject(GuiData->Font); + GuiData->Font = NewFont; + + Length = min(wcslen(FaceName) + 1, LF_FACESIZE); // wcsnlen + wcsncpy(GuiData->GuiInfo.FaceName, FaceName, LF_FACESIZE); + GuiData->GuiInfo.FaceName[Length] = L'\0'; // NULL-terminate + GuiData->GuiInfo.FontFamily = FontFamily; + GuiData->GuiInfo.FontSize = FontSize; + GuiData->GuiInfo.FontWeight = FontWeight; + + return TRUE; +} + + + VOID GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, HANDLE hClientSection, @@ -501,6 +585,15 @@ GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, // memcpy(&GuiData->GuiInfo, GuiInfo, sizeof(GUI_CONSOLE_INFO)); + /* Change the font */ + ChangeFont(GuiData, + GuiInfo->FaceName, + GuiInfo->FontFamily, + GuiInfo->FontSize, + GuiInfo->FontWeight); + // HACK, needed because changing font may change the size of the window + /**/TermResizeTerminal(Console);/**/ + /* Move the window to the user's values */ GuiData->GuiInfo.AutoPosition = GuiInfo->AutoPosition; GuiData->GuiInfo.WindowOrigin = GuiInfo->WindowOrigin; @@ -655,7 +748,6 @@ GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, GuiInfo.FullScreen = !!pConInfo->FullScreen; GuiInfo.AutoPosition = !!pConInfo->AutoPosition; GuiInfo.WindowOrigin = pConInfo->WindowPosition; - // BOOL GuiInfo.UseRasterFonts = pConInfo-> // WORD GuiInfo.ShowWindow = pConInfo-> @@ -675,6 +767,15 @@ GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, // memcpy(&GuiData->GuiInfo, &GuiInfo, sizeof(GUI_CONSOLE_INFO)); + /* Change the font */ + ChangeFont(GuiData, + GuiInfo.FaceName, + GuiInfo.FontFamily, + GuiInfo.FontSize, + GuiInfo.FontWeight); + // HACK, needed because changing font may change the size of the window + /**/TermResizeTerminal(Console);/**/ + /* Move the window to the user's values */ GuiData->GuiInfo.AutoPosition = GuiInfo.AutoPosition; GuiData->GuiInfo.WindowOrigin = GuiInfo.WindowOrigin; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h index ff8a91265d8..df95bdc28c2 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h @@ -34,7 +34,6 @@ typedef struct _GUI_CONSOLE_INFO ULONG FontFamily; COORD FontSize; ULONG FontWeight; - BOOL UseRasterFonts; BOOL FullScreen; /* Whether the console is displayed in full-screen or windowed mode */ // ULONG HardwareState; /* _GDI_MANAGED, _DIRECT */ diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c index 6fb343a324d..8b6bc26bd67 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c @@ -486,13 +486,15 @@ GuiInitFrontEnd(IN OUT PFRONTEND This, * Set up GUI data */ + // Font data Length = min(wcslen(TermInfo.FaceName) + 1, LF_FACESIZE); // wcsnlen wcsncpy(GuiData->GuiInfo.FaceName, TermInfo.FaceName, LF_FACESIZE); GuiData->GuiInfo.FaceName[Length] = L'\0'; GuiData->GuiInfo.FontFamily = TermInfo.FontFamily; GuiData->GuiInfo.FontSize = TermInfo.FontSize; GuiData->GuiInfo.FontWeight = TermInfo.FontWeight; - GuiData->GuiInfo.UseRasterFonts = TermInfo.UseRasterFonts; + + // Display GuiData->GuiInfo.FullScreen = TermInfo.FullScreen; GuiData->GuiInfo.ShowWindow = TermInfo.ShowWindow; GuiData->GuiInfo.AutoPosition = TermInfo.AutoPosition; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c index 078cb40fe03..50ebbb6d899 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c @@ -24,7 +24,8 @@ /* FUNCTIONS ******************************************************************/ -COLORREF PaletteRGBFromAttrib(PCONSOLE Console, WORD Attribute) +static COLORREF +PaletteRGBFromAttrib(PCONSOLE Console, WORD Attribute) { HPALETTE hPalette = Console->ActiveBuffer->PaletteHandle; PALETTEENTRY pe; @@ -35,6 +36,44 @@ COLORREF PaletteRGBFromAttrib(PCONSOLE Console, WORD Attribute) return PALETTERGB(pe.peRed, pe.peGreen, pe.peBlue); } +static HFONT +ChangeFontAttributes(PGUI_CONSOLE_DATA GuiData, + // COORD FontSize, + ULONG FontWeight, + BOOLEAN bItalic, + BOOLEAN bUnderline, + BOOLEAN bStrikeOut) +{ + HFONT NewFont; + LOGFONT lf; + + /* Initialize the LOGFONT structure */ + RtlZeroMemory(&lf, sizeof(lf)); + + /* Retrieve the details of the current font */ + if (GetObject(GuiData->Font, sizeof(lf), &lf) == 0) + return NULL; // GuiData->Font; + + /* Change the font attributes */ + // lf.lfHeight = FontSize.Y; + // lf.lfWidth = FontSize.X; + lf.lfWeight = FontWeight; + lf.lfItalic = bItalic; + lf.lfUnderline = bUnderline; + lf.lfStrikeOut = bStrikeOut; + + /* Build a new font */ + NewFont = CreateFontIndirect(&lf); + if (NewFont == NULL) + return NULL; // GuiData->Font; + + // FIXME: Do we need to update GuiData->CharWidth and GuiData->CharHeight ?? + + /* Select it (return the old font) */ + // return SelectObject(GuiData->hMemDC, NewFont); + return NewFont; +} + static VOID CopyBlock(PTEXTMODE_SCREEN_BUFFER Buffer, PSMALL_RECT Selection) @@ -348,7 +387,8 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, WORD LastAttribute, Attribute; ULONG CursorX, CursorY, CursorHeight; HBRUSH CursorBrush, OldBrush; - HFONT OldFont; + HFONT OldFont, NewFont; + BOOLEAN IsUnderscore; if (Buffer->Buffer == NULL) return; @@ -372,7 +412,18 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, SetTextColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, TextAttribFromAttrib(LastAttribute))); SetBkColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, BkgdAttribFromAttrib(LastAttribute))); - OldFont = SelectObject(GuiData->hMemDC, GuiData->Font); + // OldFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, FALSE, FALSE, FALSE); + IsUnderscore = !!(LastAttribute & COMMON_LVB_UNDERSCORE); + NewFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, + FALSE, + IsUnderscore, + FALSE); + if (NewFont == NULL) + { + DPRINT1("ChangeFontAttributes failed, use the original font\n"); + NewFont = GuiData->Font; + } + OldFont = SelectObject(GuiData->hMemDC, NewFont); for (Line = TopLine; Line <= BottomLine; Line++) { @@ -399,9 +450,31 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, Attribute = From->Attributes; if (Attribute != LastAttribute) { - SetTextColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, TextAttribFromAttrib(Attribute))); - SetBkColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, BkgdAttribFromAttrib(Attribute))); LastAttribute = Attribute; + SetTextColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, TextAttribFromAttrib(LastAttribute))); + SetBkColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, BkgdAttribFromAttrib(LastAttribute))); + + /* Change underscore state if needed */ + if (!!(LastAttribute & COMMON_LVB_UNDERSCORE) != IsUnderscore) + { + IsUnderscore = !!(LastAttribute & COMMON_LVB_UNDERSCORE); + + /* Delete the font we used up to now */ + // SelectObject(GuiData->hMemDC, OldFont); + if (NewFont != GuiData->Font) DeleteObject(NewFont); + /* Recreate it */ + NewFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, + FALSE, + IsUnderscore, + FALSE); + if (NewFont == NULL) + { + DPRINT1("ChangeFontAttributes failed, use the original font\n"); + NewFont = GuiData->Font; + } + /* Select it */ + /* OldFont = */ SelectObject(GuiData->hMemDC, NewFont); + } } } @@ -441,12 +514,15 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, GuiData->CharWidth, CursorHeight, PATCOPY); + SelectObject(GuiData->hMemDC, OldBrush); DeleteObject(CursorBrush); } } + /* Restore the old font and delete the font we used up to now */ SelectObject(GuiData->hMemDC, OldFont); + if (NewFont != GuiData->Font) DeleteObject(NewFont); LeaveCriticalSection(&Console->Lock); } diff --git a/reactos/win32ss/user/winsrv/consrv/handle.c b/reactos/win32ss/user/winsrv/consrv/handle.c index 721f3375558..a114411fc80 100644 --- a/reactos/win32ss/user/winsrv/consrv/handle.c +++ b/reactos/win32ss/user/winsrv/consrv/handle.c @@ -19,53 +19,45 @@ /* GLOBALS ********************************************************************/ +/* Console handle */ typedef struct _CONSOLE_IO_HANDLE { PCONSOLE_IO_OBJECT Object; /* The object on which the handle points to */ - DWORD Access; - BOOL Inheritable; - DWORD ShareMode; + ULONG Access; + ULONG ShareMode; + BOOLEAN Inheritable; } CONSOLE_IO_HANDLE, *PCONSOLE_IO_HANDLE; /* PRIVATE FUNCTIONS **********************************************************/ -static INT -AdjustHandleCounts(PCONSOLE_IO_HANDLE Entry, INT Change) +static LONG +AdjustHandleCounts(IN PCONSOLE_IO_HANDLE Handle, + IN LONG Change) { - PCONSOLE_IO_OBJECT Object = Entry->Object; + PCONSOLE_IO_OBJECT Object = Handle->Object; - DPRINT("AdjustHandleCounts(0x%p, %d), Object = 0x%p\n", Entry, Change, Object); - DPRINT("\tAdjustHandleCounts(0x%p, %d), Object = 0x%p, Object->HandleCount = %d, Object->Type = %lu\n", Entry, Change, Object, Object->HandleCount, Object->Type); + DPRINT("AdjustHandleCounts(0x%p, %d), Object = 0x%p\n", + Handle, Change, Object); + DPRINT("\tAdjustHandleCounts(0x%p, %d), Object = 0x%p, Object->ReferenceCount = %d, Object->Type = %lu\n", + Handle, Change, Object, Object->ReferenceCount, Object->Type); - if (Entry->Access & GENERIC_READ) Object->AccessRead += Change; - if (Entry->Access & GENERIC_WRITE) Object->AccessWrite += Change; - if (!(Entry->ShareMode & FILE_SHARE_READ)) Object->ExclusiveRead += Change; - if (!(Entry->ShareMode & FILE_SHARE_WRITE)) Object->ExclusiveWrite += Change; + if (Handle->Access & GENERIC_READ) Object->AccessRead += Change; + if (Handle->Access & GENERIC_WRITE) Object->AccessWrite += Change; + if (!(Handle->ShareMode & FILE_SHARE_READ)) Object->ExclusiveRead += Change; + if (!(Handle->ShareMode & FILE_SHARE_WRITE)) Object->ExclusiveWrite += Change; - Object->HandleCount += Change; + Object->ReferenceCount += Change; - return Object->HandleCount; + return Object->ReferenceCount; } static VOID -ConSrvCreateHandleEntry(PCONSOLE_IO_HANDLE Entry) +ConSrvCloseHandle(IN PCONSOLE_IO_HANDLE Handle) { - /// LOCK /// PCONSOLE_IO_OBJECT Object = Entry->Object; - /// LOCK /// EnterCriticalSection(&Object->Console->Lock); - AdjustHandleCounts(Entry, +1); - /// LOCK /// LeaveCriticalSection(&Object->Console->Lock); -} - -static VOID -ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) -{ - PCONSOLE_IO_OBJECT Object = Entry->Object; + PCONSOLE_IO_OBJECT Object = Handle->Object; if (Object != NULL) { - /// LOCK /// PCONSOLE Console = Object->Console; - /// LOCK /// EnterCriticalSection(&Console->Lock); - /* * If this is a input handle, notify and dereference * all the waits related to this handle. @@ -87,7 +79,7 @@ ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) CsrNotifyWait(&Console->ReadWaitQueue, TRUE, NULL, - (PVOID)Entry); + (PVOID)Handle); if (!IsListEmpty(&Console->ReadWaitQueue)) { CsrDereferenceWait(&Console->ReadWaitQueue); @@ -95,7 +87,7 @@ ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) } /* If the last handle to a screen buffer is closed, delete it... */ - if (AdjustHandleCounts(Entry, -1) == 0) + if (AdjustHandleCounts(Handle, -1) == 0) { if (Object->Type == TEXTMODE_BUFFER || Object->Type == GRAPHICS_BUFFER) { @@ -116,16 +108,18 @@ ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) } } - /// LOCK /// LeaveCriticalSection(&Console->Lock); - /* Invalidate (zero-out) this handle entry */ - // Entry->Object = NULL; - // RtlZeroMemory(Entry, sizeof(*Entry)); + // Handle->Object = NULL; + // RtlZeroMemory(Handle, sizeof(*Handle)); } - RtlZeroMemory(Entry, sizeof(*Entry)); // Be sure the whole entry is invalidated. + RtlZeroMemory(Handle, sizeof(*Handle)); // Be sure the whole entry is invalidated. } + + + + /* Forward declaration, used in ConSrvInitHandlesTable */ static VOID ConSrvFreeHandlesTable(PCONSOLE_PROCESS_DATA ProcessData); @@ -244,10 +238,10 @@ ConSrvInheritHandlesTable(IN PCONSOLE_PROCESS_DATA SourceProcessData, { /* * Copy the handle data and increment the reference count of the - * pointed object (via the call to ConSrvCreateHandleEntry). + * pointed object (via the call to ConSrvCreateHandleEntry == AdjustHandleCounts). */ TargetProcessData->HandleTable[j] = SourceProcessData->HandleTable[i]; - ConSrvCreateHandleEntry(&TargetProcessData->HandleTable[j]); + AdjustHandleCounts(&TargetProcessData->HandleTable[j], +1); ++j; } } @@ -258,7 +252,7 @@ Quit: } static VOID -ConSrvFreeHandlesTable(PCONSOLE_PROCESS_DATA ProcessData) +ConSrvFreeHandlesTable(IN PCONSOLE_PROCESS_DATA ProcessData) { RtlEnterCriticalSection(&ProcessData->HandleTableLock); @@ -277,7 +271,7 @@ ConSrvFreeHandlesTable(PCONSOLE_PROCESS_DATA ProcessData) /* Close all the console handles */ for (i = 0; i < ProcessData->HandleTableSize; i++) { - ConSrvCloseHandleEntry(&ProcessData->HandleTable[i]); + ConSrvCloseHandle(&ProcessData->HandleTable[i]); } } /* Free the handles table memory */ @@ -290,6 +284,12 @@ ConSrvFreeHandlesTable(PCONSOLE_PROCESS_DATA ProcessData) RtlLeaveCriticalSection(&ProcessData->HandleTableLock); } + + + + + +// ConSrvCreateObject VOID ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, IN CONSOLE_IO_OBJECT_TYPE Type, @@ -300,18 +300,19 @@ ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, Object->Type = Type; Object->Console = Console; + Object->ReferenceCount = 0; + Object->AccessRead = Object->AccessWrite = 0; Object->ExclusiveRead = Object->ExclusiveWrite = 0; - Object->HandleCount = 0; } NTSTATUS -ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, - PHANDLE Handle, - PCONSOLE_IO_OBJECT Object, - DWORD Access, - BOOL Inheritable, - DWORD ShareMode) +ConSrvInsertObject(IN PCONSOLE_PROCESS_DATA ProcessData, + OUT PHANDLE Handle, + IN PCONSOLE_IO_OBJECT Object, + IN ULONG Access, + IN BOOLEAN Inheritable, + IN ULONG ShareMode) { #define IO_HANDLES_INCREMENT 2 * 3 @@ -362,7 +363,7 @@ ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, ProcessData->HandleTable[i].Access = Access; ProcessData->HandleTable[i].Inheritable = Inheritable; ProcessData->HandleTable[i].ShareMode = ShareMode; - ConSrvCreateHandleEntry(&ProcessData->HandleTable[i]); + AdjustHandleCounts(&ProcessData->HandleTable[i], +1); *Handle = ULongToHandle((i << 2) | 0x3); // RtlLeaveCriticalSection(&ProcessData->HandleTableLock); @@ -371,8 +372,8 @@ ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, } NTSTATUS -ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, - HANDLE Handle) +ConSrvRemoveObject(IN PCONSOLE_PROCESS_DATA ProcessData, + IN HANDLE Handle) { ULONG Index = HandleToULong(Handle) >> 2; @@ -390,20 +391,20 @@ ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, } ASSERT(ProcessData->ConsoleHandle); - ConSrvCloseHandleEntry(&ProcessData->HandleTable[Index]); + ConSrvCloseHandle(&ProcessData->HandleTable[Index]); RtlLeaveCriticalSection(&ProcessData->HandleTableLock); return STATUS_SUCCESS; } NTSTATUS -ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, - HANDLE Handle, - PCONSOLE_IO_OBJECT* Object, - PVOID* Entry OPTIONAL, - DWORD Access, - BOOL LockConsole, - CONSOLE_IO_OBJECT_TYPE Type) +ConSrvGetObject(IN PCONSOLE_PROCESS_DATA ProcessData, + IN HANDLE Handle, + OUT PCONSOLE_IO_OBJECT* Object, + OUT PVOID* Entry OPTIONAL, + IN ULONG Access, + IN BOOLEAN LockConsole, + IN CONSOLE_IO_OBJECT_TYPE Type) { // NTSTATUS Status; ULONG Index = HandleToULong(Handle) >> 2; @@ -461,12 +462,17 @@ ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, } VOID -ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, - BOOL IsConsoleLocked) +ConSrvReleaseObject(IN PCONSOLE_IO_OBJECT Object, + IN BOOLEAN IsConsoleLocked) { ConSrvReleaseConsole(Object->Console, IsConsoleLocked); } + + + + + NTSTATUS ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, PHANDLE pInputHandle, @@ -548,7 +554,7 @@ ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, NTSTATUS ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, HANDLE ConsoleHandle, - BOOL CreateNewHandlesTable, + BOOLEAN CreateNewHandlesTable, PHANDLE pInputHandle, PHANDLE pOutputHandle, PHANDLE pErrorHandle) @@ -826,7 +832,7 @@ CSR_API(SrvDuplicateHandle) (DuplicateHandleRequest->Options & DUPLICATE_CLOSE_SOURCE)) { /* Close the original handle if needed */ - ConSrvCloseHandleEntry(Entry); + ConSrvCloseHandle(Entry); } Quit: diff --git a/reactos/win32ss/user/winsrv/consrv/handle.h b/reactos/win32ss/user/winsrv/consrv/handle.h index 2e75f884a4b..d154c5cc17c 100644 --- a/reactos/win32ss/user/winsrv/consrv/handle.h +++ b/reactos/win32ss/user/winsrv/consrv/handle.h @@ -10,23 +10,28 @@ #pragma once -VOID ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, - IN CONSOLE_IO_OBJECT_TYPE Type, - IN PCONSOLE Console); -NTSTATUS ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, - PHANDLE Handle, - PCONSOLE_IO_OBJECT Object, - DWORD Access, - BOOL Inheritable, - DWORD ShareMode); -NTSTATUS ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, - HANDLE Handle); -NTSTATUS ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, - HANDLE Handle, - PCONSOLE_IO_OBJECT* Object, - PVOID* Entry OPTIONAL, - DWORD Access, - BOOL LockConsole, - CONSOLE_IO_OBJECT_TYPE Type); -VOID ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, - BOOL IsConsoleLocked); +VOID +ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, + IN CONSOLE_IO_OBJECT_TYPE Type, + IN PCONSOLE Console); +NTSTATUS +ConSrvInsertObject(IN PCONSOLE_PROCESS_DATA ProcessData, + OUT PHANDLE Handle, + IN PCONSOLE_IO_OBJECT Object, + IN ULONG Access, + IN BOOLEAN Inheritable, + IN ULONG ShareMode); +NTSTATUS +ConSrvRemoveObject(IN PCONSOLE_PROCESS_DATA ProcessData, + IN HANDLE Handle); +NTSTATUS +ConSrvGetObject(IN PCONSOLE_PROCESS_DATA ProcessData, + IN HANDLE Handle, + OUT PCONSOLE_IO_OBJECT* Object, + OUT PVOID* Entry OPTIONAL, + IN ULONG Access, + IN BOOLEAN LockConsole, + IN CONSOLE_IO_OBJECT_TYPE Type); +VOID +ConSrvReleaseObject(IN PCONSOLE_IO_OBJECT Object, + IN BOOLEAN IsConsoleLocked); diff --git a/reactos/win32ss/user/winsrv/consrv/include/conio.h b/reactos/win32ss/user/winsrv/consrv/include/conio.h index 90defe0ea42..8d3dc9f6a4d 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/conio.h +++ b/reactos/win32ss/user/winsrv/consrv/include/conio.h @@ -19,23 +19,35 @@ #define DEFAULT_POPUP_ATTRIB (FOREGROUND_BLUE | FOREGROUND_RED | \ BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY) +/* VGA character cell */ +typedef struct _CHAR_CELL +{ + CHAR Char; + BYTE Attributes; +} CHAR_CELL, *PCHAR_CELL; +C_ASSERT(sizeof(CHAR_CELL) == 2); + + /* Object type magic numbers */ typedef enum _CONSOLE_IO_OBJECT_TYPE { -// ANY_TYPE_BUFFER = 0x00, // --> Match any types of IO handles - TEXTMODE_BUFFER = 0x01, // --> Output-type handles for text SBs - GRAPHICS_BUFFER = 0x02, // --> Output-type handles for graphics SBs + UNKNOWN = 0x00, // --> Unknown object + TEXTMODE_BUFFER = 0x01, // --> Output-type object for text SBs + GRAPHICS_BUFFER = 0x02, // --> Output-type object for graphics SBs SCREEN_BUFFER = 0x03, // --> Any SB type - INPUT_BUFFER = 0x04 // --> Input-type handles + INPUT_BUFFER = 0x04, // --> Input-type object + ANY_TYPE_BUFFER = 0x07, // --> Any IO object } CONSOLE_IO_OBJECT_TYPE; typedef struct _CONSOLE_IO_OBJECT { CONSOLE_IO_OBJECT_TYPE Type; + struct _CONSOLE* /* PCONSOLE */ Console; + LONG ReferenceCount; /* Is incremented each time a console object gets referenced */ + LONG AccessRead, AccessWrite; LONG ExclusiveRead, ExclusiveWrite; - LONG HandleCount; } CONSOLE_IO_OBJECT, *PCONSOLE_IO_OBJECT; @@ -300,6 +312,17 @@ typedef struct _CONSOLE PCONSOLE_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ UINT OutputCodePage; + /**** Per-console Virtual DOS Machine Text-mode Buffer ****/ + COORD VDMBufferSize; /* Real size of the VDM buffer, in units of ??? */ + HANDLE VDMBufferSection; /* Handle to the memory shared section for the VDM buffer */ + PVOID VDMBuffer; /* Our VDM buffer */ + PVOID ClientVDMBuffer; /* A copy of the client view of our VDM buffer */ + HANDLE VDMClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ + + HANDLE StartHardwareEvent; + HANDLE EndHardwareEvent; + HANDLE ErrorHardwareEvent; + /****************************** Other properties ******************************/ UNICODE_STRING OriginalTitle; /* Original title of console, the one defined when the console leader is launched; it never changes. Always NULL-terminated */ UNICODE_STRING Title; /* Title of console. Always NULL-terminated */ diff --git a/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h b/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h index aba4715a2b8..4669dae0255 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h +++ b/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h @@ -83,6 +83,7 @@ struct _FRONTEND PFRONTEND_VTBL Vtbl; /* Virtual table */ NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); + // struct _WINSRV_CONSOLE* struct _CONSOLE* Console; /* Console to which the frontend is attached to */ PVOID Data; /* Private data */ PVOID OldData; /* Reserved */ diff --git a/reactos/win32ss/user/winsrv/consrv/include/settings.h b/reactos/win32ss/user/winsrv/consrv/include/settings.h index be00e502073..fcef0f18b58 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/settings.h +++ b/reactos/win32ss/user/winsrv/consrv/include/settings.h @@ -51,10 +51,14 @@ typedef struct _CONSOLE_INFO WCHAR ConsoleTitle[MAX_PATH + 1]; } CONSOLE_INFO, *PCONSOLE_INFO; +/* + * BYTE Foreground = LOBYTE(Attributes) & 0x0F; + * BYTE Background = (LOBYTE(Attributes) & 0xF0) >> 4; + */ #define RGBFromAttrib(Console, Attribute) ((Console)->Colors[(Attribute) & 0xF]) -#define TextAttribFromAttrib(Attribute) ((Attribute) & 0xF) -#define BkgdAttribFromAttrib(Attribute) (((Attribute) >> 4) & 0xF) -#define MakeAttrib(TextAttrib, BkgdAttrib) (DWORD)((((BkgdAttrib) & 0xF) << 4) | ((TextAttrib) & 0xF)) +#define TextAttribFromAttrib(Attribute) ( !((Attribute) & COMMON_LVB_REVERSE_VIDEO) ? (Attribute) & 0xF : ((Attribute) >> 4) & 0xF ) +#define BkgdAttribFromAttrib(Attribute) ( !((Attribute) & COMMON_LVB_REVERSE_VIDEO) ? ((Attribute) >> 4) & 0xF : (Attribute) & 0xF ) +#define MakeAttrib(TextAttrib, BkgdAttrib) (USHORT)((((BkgdAttrib) & 0xF) << 4) | ((TextAttrib) & 0xF)) /* * Structure used to communicate with console.dll diff --git a/reactos/win32ss/user/winsrv/consrv/procinit.h b/reactos/win32ss/user/winsrv/consrv/procinit.h index 9c7186667dd..493415156eb 100644 --- a/reactos/win32ss/user/winsrv/consrv/procinit.h +++ b/reactos/win32ss/user/winsrv/consrv/procinit.h @@ -15,7 +15,7 @@ NTSTATUS ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, PCONSOLE_START_INFO ConsoleStartInfo); NTSTATUS ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, HANDLE ConsoleHandle, - BOOL CreateNewHandlesTable, + BOOLEAN CreateNewHandlesTable, PHANDLE pInputHandle, PHANDLE pOutputHandle, PHANDLE pErrorHandle); diff --git a/reactos/win32ss/user/winsrv/consrv/subsysreg.c b/reactos/win32ss/user/winsrv/consrv/subsysreg.c index 0ba10afce3a..40f974040c1 100644 --- a/reactos/win32ss/user/winsrv/consrv/subsysreg.c +++ b/reactos/win32ss/user/winsrv/consrv/subsysreg.c @@ -21,8 +21,132 @@ CSR_API(SrvRegisterConsoleVDM) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PCONSOLE_REGISTERVDM RegisterVDMRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RegisterVDMRequest; + PCONSOLE Console; + + DPRINT1("SrvRegisterConsoleVDM(%d)\n", RegisterVDMRequest->RegisterFlags); + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), + &Console, TRUE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Can't get console\n"); + return Status; + } + + if (RegisterVDMRequest->RegisterFlags != 0) + { + LARGE_INTEGER SectionSize; + ULONG Size, ViewSize = 0; + HANDLE ProcessHandle; + + /* + * Remember the handle to the process so that we can close or unmap + * correctly the allocated resources when the client releases the + * screen buffer. + */ + ProcessHandle = CsrGetClientThread()->Process->ProcessHandle; + Console->VDMClientProcess = ProcessHandle; + + Console->VDMBufferSize = RegisterVDMRequest->VDMBufferSize; + + Size = Console->VDMBufferSize.X * Console->VDMBufferSize.Y + * sizeof(CHAR_CELL); + + /* + * Create a memory section for the VDM buffer, to share with the client. + */ + SectionSize.QuadPart = Size; + Status = NtCreateSection(&Console->VDMBufferSection, + SECTION_ALL_ACCESS, + NULL, + &SectionSize, + PAGE_READWRITE, + SEC_COMMIT, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Error: Impossible to create a shared section ; Status = %lu\n", Status); + goto Quit; + } + + /* + * Create a view for our needs. + */ + ViewSize = 0; + Console->VDMBuffer = NULL; + Status = NtMapViewOfSection(Console->VDMBufferSection, + NtCurrentProcess(), + (PVOID*)&Console->VDMBuffer, + 0, + 0, + NULL, + &ViewSize, + ViewUnmap, + 0, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Error: Impossible to map the shared section ; Status = %lu\n", Status); + NtClose(Console->VDMBufferSection); + goto Quit; + } + + /* + * Create a view for the client. We must keep a trace of it so that + * we can unmap it when the client releases the VDM buffer. + */ + ViewSize = 0; + Console->ClientVDMBuffer = NULL; + Status = NtMapViewOfSection(Console->VDMBufferSection, + ProcessHandle, + (PVOID*)&Console->ClientVDMBuffer, + 0, + 0, + NULL, + &ViewSize, + ViewUnmap, + 0, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Error: Impossible to map the shared section ; Status = %lu\n", Status); + NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer); + NtClose(Console->VDMBufferSection); + goto Quit; + } + + // TODO: Duplicate the event handles. + + RegisterVDMRequest->VDMBuffer = Console->ClientVDMBuffer; + + Status = STATUS_SUCCESS; + } + else + { + /* RegisterFlags == 0 means we are unregistering the VDM */ + + // TODO: Close the duplicated handles. + + if (Console->VDMBuffer) + { + /* + * Uninitialize the graphics screen buffer + * in the reverse way we initialized it. + */ + NtUnmapViewOfSection(Console->VDMClientProcess, Console->ClientVDMBuffer); + NtUnmapViewOfSection(NtCurrentProcess(), Console->VDMBuffer); + NtClose(Console->VDMBufferSection); + } + Console->VDMBuffer = Console->ClientVDMBuffer = NULL; + + Console->VDMBufferSize.X = Console->VDMBufferSize.Y = 0; + } + +Quit: + ConSrvReleaseConsole(Console, TRUE); + return Status; } CSR_API(SrvVDMConsoleOperation) From 3f1a4576dd2469dd4e372ad1ee781d2984ad1f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Wed, 13 Aug 2014 16:30:52 +0000 Subject: [PATCH 17/55] [CMAKE] - Properly serve reactos.cab dependencies - try 2 CORE-8435 #comment this should do it, please retest. Regarding the bot problem, touching boot/bootdata/packages/reactos.dff forces regenerating reactos.inf and reactos.cab svn path=/trunk/; revision=63878 --- reactos/boot/bootdata/packages/CMakeLists.txt | 16 ++++------- reactos/cmake/CMakeMacros.cmake | 28 +++++++++++++------ 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/reactos/boot/bootdata/packages/CMakeLists.txt b/reactos/boot/bootdata/packages/CMakeLists.txt index 3344a23d95f..d65a1049cb6 100644 --- a/reactos/boot/bootdata/packages/CMakeLists.txt +++ b/reactos/boot/bootdata/packages/CMakeLists.txt @@ -31,24 +31,18 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.dyn ) -# And now we build reactos.cab - -# First we create reactos.inf +# And now we build reactos.inf add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf COMMAND native-cabman -C ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff -L ${CMAKE_CURRENT_BINARY_DIR} -I -P ${REACTOS_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff native-cabman) -# Then we create the actual cab file using a custom target -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab - COMMAND native-cabman -C ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff -RC ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf -L ${CMAKE_CURRENT_BINARY_DIR} -N -P ${REACTOS_SOURCE_DIR} - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf native-cabman) - -add_custom_target(reactos_cab DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab) +# reactos.cab generation will be made later (cf. CMakeMacros.cmake - create iso lists) +add_custom_target(reactos_cab_inf DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf) add_cd_file( TARGET reactos_cab - FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf + FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf DESTINATION reactos NO_CAB FOR bootcd regtest) + diff --git a/reactos/cmake/CMakeMacros.cmake b/reactos/cmake/CMakeMacros.cmake index 716ac07c75d..1a722fa0ded 100644 --- a/reactos/cmake/CMakeMacros.cmake +++ b/reactos/cmake/CMakeMacros.cmake @@ -316,15 +316,11 @@ function(add_cd_file) file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${__relative_file}\" ${_num}\n") unset(__relative_file) if(_CD_TARGET) - #manage dependency - add_dependencies(reactos_cab ${_CD_TARGET}) - # add this so that the combination make target/fast reactos_cab/fast bootcd/fast properly detects that reactos.cab must be rebuilt - if (CMAKE_BUILD_TOOL STREQUAL "make") - add_custom_command(TARGET ${_CD_TARGET} - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E touch ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff) - endif() + #manage dependency - target level + add_dependencies(reactos_cab_inf ${_CD_TARGET}) endif() + # manage dependency - file level + set_property(GLOBAL APPEND PROPERTY REACTOS_CAB_DEPENDS ${_CD_FILE}) endif() endif() #end bootcd @@ -378,6 +374,22 @@ function(add_cd_file) endfunction() function(create_iso_lists) + # generate reactos.cab before anything else + get_property(_filelist GLOBAL PROPERTY REACTOS_CAB_DEPENDS) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab + COMMAND native-cabman -C ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff -RC ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf -N -P ${REACTOS_SOURCE_DIR} + DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf native-cabman ${_filelist}) + + add_custom_target(reactos_cab DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab) + add_dependencies(reactos_cab reactos_cab_inf) + + add_cd_file( + TARGET reactos_cab + FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab + DESTINATION reactos + NO_CAB FOR bootcd regtest) + get_property(_filelist GLOBAL PROPERTY BOOTCD_FILE_LIST) string(REPLACE ";" "\n" _filelist "${_filelist}") file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.lst "${_filelist}") From 9ad857369a07eb8d84350c4680fa3ea373a818e3 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 07:46:59 +0000 Subject: [PATCH 18/55] [WIN32K:NTUSER] - Assert that the thread's sent message queue matches change bits in UserDbgAssertThreadInfo. Suggested by Giannis. CORE-7013 svn path=/trunk/; revision=63880 --- reactos/win32ss/user/ntuser/misc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reactos/win32ss/user/ntuser/misc.c b/reactos/win32ss/user/ntuser/misc.c index 4b64a13a89c..40ec94d227b 100644 --- a/reactos/win32ss/user/ntuser/misc.c +++ b/reactos/win32ss/user/ntuser/misc.c @@ -656,6 +656,8 @@ void UserDbgAssertThreadInfo(BOOL showCaller) ASSERT(pci->ulClientDelta == DesktopHeapGetUserDelta()); if (pti->pcti && pci->pDeskInfo) ASSERT(pci->pClientThreadInfo == (PVOID)((ULONG_PTR)pti->pcti - pci->ulClientDelta)); + if (pti->pcti && IsListEmpty(&pti->SentMessagesListHead)) + ASSERT((pti->pcti->fsChangeBits & QS_SENDMESSAGE) == 0); if (pti->KeyboardLayout) ASSERT(pci->hKL == pti->KeyboardLayout->hkl); if(pti->rpdesk != NULL) From b8b0cb9b6f07772422154a2fbff5df6bab87349d Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 13:21:32 +0000 Subject: [PATCH 19/55] [PSDK] - Fix some ITEMIDLIST types in IShellFolder CORE-8441 svn path=/trunk/; revision=63881 --- reactos/include/psdk/shobjidl.idl | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reactos/include/psdk/shobjidl.idl b/reactos/include/psdk/shobjidl.idl index 44a549ff470..55fa6e37019 100644 --- a/reactos/include/psdk/shobjidl.idl +++ b/reactos/include/psdk/shobjidl.idl @@ -224,21 +224,21 @@ interface IShellFolder : IUnknown [out] IEnumIDList **ppenumIDList); HRESULT BindToObject( - [in] LPCITEMIDLIST pidl, + [in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut); HRESULT BindToStorage( - [in] LPCITEMIDLIST pidl, + [in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj); HRESULT CompareIDs( [in] LPARAM lParam, - [in] LPCITEMIDLIST pidl1, - [in] LPCITEMIDLIST pidl2); + [in] PCUIDLIST_RELATIVE pidl1, + [in] PCUIDLIST_RELATIVE pidl2); HRESULT CreateViewObject( [in] HWND hwndOwner, @@ -247,28 +247,28 @@ interface IShellFolder : IUnknown HRESULT GetAttributesOf( [in] UINT cidl, - [in, size_is(cidl)] LPCITEMIDLIST *apidl, + [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut); HRESULT GetUIObjectOf( [in] HWND hwndOwner, [in] UINT cidl, - [in, size_is(cidl)] LPCITEMIDLIST *apidl, + [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut); HRESULT GetDisplayNameOf( - [in] LPCITEMIDLIST pidl, + [in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName); HRESULT SetNameOf( [in] HWND hwnd, - [in] LPCITEMIDLIST pidl, + [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, - [out] LPITEMIDLIST *ppidlOut); + [out] PITEMID_CHILD *ppidlOut); } From 124d892d487ed5fcc9a82a10708e55be82fedb1c Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 13:26:02 +0000 Subject: [PATCH 20/55] [SHELL32] - Use correct prototype for IFolderView::SelectAndPositionItems in CDefView svn path=/trunk/; revision=63882 --- reactos/dll/win32/shell32/shlview.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/reactos/dll/win32/shell32/shlview.cpp b/reactos/dll/win32/shell32/shlview.cpp index d36822506b4..00db9830450 100644 --- a/reactos/dll/win32/shell32/shlview.cpp +++ b/reactos/dll/win32/shell32/shlview.cpp @@ -164,7 +164,7 @@ class CDefView : virtual HRESULT STDMETHODCALLTYPE GetDefaultSpacing(POINT *ppt); virtual HRESULT STDMETHODCALLTYPE GetAutoArrange(); virtual HRESULT STDMETHODCALLTYPE SelectItem(int iItem, DWORD dwFlags); - virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags); + virtual HRESULT STDMETHODCALLTYPE SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags); // *** IOleCommandTarget methods *** virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[ ], OLECMDTEXT *pCmdText); @@ -2309,7 +2309,7 @@ HRESULT STDMETHODCALLTYPE CDefView::SelectItem(int iItem, DWORD dwFlags) return S_OK; } -HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, LPCITEMIDLIST *apidl, POINT *apt, DWORD dwFlags) +HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, POINT *apt, DWORD dwFlags) { return E_NOTIMPL; } From ccacbf8050f5a3289538d9ef985c69ea4885b706 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 19:35:00 +0000 Subject: [PATCH 21/55] [NPFS] - Fix list walk in NpCancelWaiter -- we cannot access the list entry after using RemoveEntryList on it - Make the logic in NpCancelWaiter more readable CORE-8442 #resolve svn path=/trunk/; revision=63883 --- reactos/drivers/filesystems/npfs/waitsup.c | 99 +++++++++++----------- 1 file changed, 48 insertions(+), 51 deletions(-) diff --git a/reactos/drivers/filesystems/npfs/waitsup.c b/reactos/drivers/filesystems/npfs/waitsup.c index bc80ebb955f..42e15e861fc 100644 --- a/reactos/drivers/filesystems/npfs/waitsup.c +++ b/reactos/drivers/filesystems/npfs/waitsup.c @@ -26,11 +26,11 @@ NpCancelWaitQueueIrp(IN PDEVICE_OBJECT DeviceObject, IoReleaseCancelSpinLock(Irp->CancelIrql); - WaitQueue = (PNP_WAIT_QUEUE)Irp->Tail.Overlay.DriverContext[0]; + WaitQueue = Irp->Tail.Overlay.DriverContext[0]; KeAcquireSpinLock(&WaitQueue->WaitLock, &OldIrql); - WaitEntry = (PNP_WAIT_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[1]; + WaitEntry = Irp->Tail.Overlay.DriverContext[1]; if (WaitEntry) { RemoveEntryList(&Irp->Tail.Overlay.ListEntry); @@ -102,94 +102,91 @@ NpInitializeWaitQueue(IN PNP_WAIT_QUEUE WaitQueue) NTSTATUS NTAPI NpCancelWaiter(IN PNP_WAIT_QUEUE WaitQueue, - IN PUNICODE_STRING PipeName, + IN PUNICODE_STRING PipePath, IN NTSTATUS Status, IN PLIST_ENTRY List) { - UNICODE_STRING DestinationString; + UNICODE_STRING PipePathUpper; KIRQL OldIrql; PWCHAR Buffer; PLIST_ENTRY NextEntry; PNP_WAIT_QUEUE_ENTRY WaitEntry, Linkage; PIRP WaitIrp; PFILE_PIPE_WAIT_FOR_BUFFER WaitBuffer; - ULONG i, NameLength; + UNICODE_STRING WaitName, PipeName; Linkage = NULL; Buffer = ExAllocatePoolWithTag(NonPagedPool, - PipeName->Length, + PipePath->Length, NPFS_WAIT_BLOCK_TAG); if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES; - RtlInitEmptyUnicodeString(&DestinationString, Buffer, PipeName->Length); - RtlUpcaseUnicodeString(&DestinationString, PipeName, FALSE); + RtlInitEmptyUnicodeString(&PipePathUpper, Buffer, PipePath->Length); + RtlUpcaseUnicodeString(&PipePathUpper, PipePath, FALSE); KeAcquireSpinLock(&WaitQueue->WaitLock, &OldIrql); - for (NextEntry = WaitQueue->WaitList.Flink; - NextEntry != &WaitQueue->WaitList; - NextEntry = NextEntry->Flink) + NextEntry = WaitQueue->WaitList.Flink; + while (NextEntry != &WaitQueue->WaitList) { WaitIrp = CONTAINING_RECORD(NextEntry, IRP, Tail.Overlay.ListEntry); + NextEntry = NextEntry->Flink; WaitEntry = WaitIrp->Tail.Overlay.DriverContext[1]; if (WaitEntry->AliasName.Length) { ASSERT(FALSE); - if (DestinationString.Length == WaitEntry->AliasName.Length) - { - if (RtlCompareMemory(WaitEntry->AliasName.Buffer, - DestinationString.Buffer, - DestinationString.Length) == - DestinationString.Length) - { -CancelWait: - RemoveEntryList(&WaitIrp->Tail.Overlay.ListEntry); - if (KeCancelTimer(&WaitEntry->Timer)) - { - WaitEntry->WaitQueue = (PNP_WAIT_QUEUE)Linkage; - Linkage = WaitEntry; - } - else - { - WaitEntry->Irp = NULL; - WaitIrp->Tail.Overlay.DriverContext[1] = NULL; - } - - if (IoSetCancelRoutine(WaitIrp, NULL)) - { - WaitIrp->IoStatus.Information = 0; - WaitIrp->IoStatus.Status = Status; - InsertTailList(List, &WaitIrp->Tail.Overlay.ListEntry); - } - else - { - WaitIrp->Tail.Overlay.DriverContext[1] = NULL; - } - } - } + /* We have an alias. Use that for comparison */ + WaitName = WaitEntry->AliasName; + PipeName = PipePathUpper; } else { + /* Use the name from the wait buffer to compare */ WaitBuffer = WaitIrp->AssociatedIrp.SystemBuffer; + WaitName.Buffer = WaitBuffer->Name; + WaitName.Length = WaitBuffer->NameLength; + WaitName.MaximumLength = WaitName.Length; - if (WaitBuffer->NameLength + sizeof(WCHAR) == DestinationString.Length) + /* WaitName doesn't have a leading backslash, + * so skip the one in PipePathUpper for the comparison */ + PipeName.Buffer = PipePathUpper.Buffer + 1; + PipeName.Length = PipePathUpper.Length - sizeof(WCHAR); + PipeName.MaximumLength = PipeName.Length; + } + + if (RtlEqualUnicodeString(&WaitName, &PipeName, FALSE)) + { + /* Found a matching wait. Cancel it */ + RemoveEntryList(&WaitIrp->Tail.Overlay.ListEntry); + if (KeCancelTimer(&WaitEntry->Timer)) { - NameLength = WaitBuffer->NameLength / sizeof(WCHAR); - for (i = 0; i < NameLength; i++) - { - if (WaitBuffer->Name[i] != DestinationString.Buffer[i + 1]) break; - } + WaitEntry->WaitQueue = (PNP_WAIT_QUEUE)Linkage; + Linkage = WaitEntry; + } + else + { + WaitEntry->Irp = NULL; + WaitIrp->Tail.Overlay.DriverContext[1] = NULL; + } - if (i >= NameLength) goto CancelWait; + if (IoSetCancelRoutine(WaitIrp, NULL)) + { + WaitIrp->IoStatus.Information = 0; + WaitIrp->IoStatus.Status = Status; + InsertTailList(List, &WaitIrp->Tail.Overlay.ListEntry); + } + else + { + WaitIrp->Tail.Overlay.DriverContext[1] = NULL; } } } KeReleaseSpinLock(&WaitQueue->WaitLock, OldIrql); - ExFreePool(DestinationString.Buffer); + ExFreePoolWithTag(Buffer, NPFS_WAIT_BLOCK_TAG); while (Linkage) { From 6acec73b44222739d96a96b38d80246e93548d2e Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 19:47:45 +0000 Subject: [PATCH 22/55] [SHELL32] - Correctly manage object lifetime in CDefaultContextMenu. Members of DEFCONTEXTMENU need to be referenced or cloned in order to keep them. CORE-8430 #resolve svn path=/trunk/; revision=63884 --- reactos/dll/win32/shell32/defcontextmenu.cpp | 142 ++++++++++--------- 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/reactos/dll/win32/shell32/defcontextmenu.cpp b/reactos/dll/win32/shell32/defcontextmenu.cpp index 2de0965d002..7d4f02e3210 100644 --- a/reactos/dll/win32/shell32/defcontextmenu.cpp +++ b/reactos/dll/win32/shell32/defcontextmenu.cpp @@ -37,9 +37,11 @@ class CDefaultContextMenu : public IContextMenu2 { private: - DEFCONTEXTMENU m_Dcm; + IShellFolder *m_psf; + UINT m_cidl; + PCUITEMID_CHILD_ARRAY m_apidl; IDataObject *m_pDataObj; - LPCITEMIDLIST m_pidlFolder; + PIDLIST_ABSOLUTE m_pidlFolder; DWORD m_bGroupPolicyActive; PDynamicShellEntry m_pDynamicEntries; /* first dynamic shell extension entry */ UINT m_iIdSHEFirst; /* first used id */ @@ -92,18 +94,20 @@ class CDefaultContextMenu : END_COM_MAP() }; -CDefaultContextMenu::CDefaultContextMenu() +CDefaultContextMenu::CDefaultContextMenu() : + m_psf(NULL), + m_cidl(0), + m_apidl(NULL), + m_pDataObj(NULL), + m_pidlFolder(NULL), + m_bGroupPolicyActive(0), + m_pDynamicEntries(NULL), + m_iIdSHEFirst(0), + m_iIdSHELast(0), + m_pStaticEntries(NULL), + m_iIdSCMFirst(0), + m_iIdSCMLast(0) { - memset(&m_Dcm, 0, sizeof(m_Dcm)); - m_pDataObj = NULL; - m_pidlFolder = NULL; - m_bGroupPolicyActive = 0; - m_pDynamicEntries = NULL; - m_iIdSHEFirst = 0; - m_iIdSHELast = 0; - m_pStaticEntries = NULL; - m_iIdSCMFirst = 0; - m_iIdSCMLast = 0; } CDefaultContextMenu::~CDefaultContextMenu() @@ -130,9 +134,12 @@ CDefaultContextMenu::~CDefaultContextMenu() } if (m_pidlFolder) - ILFree((_ITEMIDLIST*)m_pidlFolder); + CoTaskMemFree(m_pidlFolder); if (m_pDataObj) m_pDataObj->Release(); + _ILFreeaPidl(const_cast(m_apidl), m_cidl); + if (m_psf) + m_psf->Release(); } HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm) @@ -140,28 +147,33 @@ HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm) IDataObject *pDataObj; TRACE("cidl %u\n", pdcm->cidl); + + m_cidl = pdcm->cidl; + m_apidl = const_cast(_ILCopyaPidl(pdcm->apidl, m_cidl)); + if (!m_apidl) + return E_OUTOFMEMORY; + m_psf = pdcm->psf; + m_psf->AddRef(); + if (SUCCEEDED(SHCreateDataObject(pdcm->pidlFolder, pdcm->cidl, pdcm->apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) m_pDataObj = pDataObj; - if (!pdcm->cidl) + if (pdcm->pidlFolder) { - /* Init pidlFolder only if it is background context menu. See IShellExtInit::Initialize */ - if (pdcm->pidlFolder) - m_pidlFolder = ILClone(pdcm->pidlFolder); - else + m_pidlFolder = ILClone(pdcm->pidlFolder); + } + else + { + IPersistFolder2 *pf = NULL; + if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf)))) { - IPersistFolder2 *pf = NULL; - if (SUCCEEDED(pdcm->psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf)))) - { - if (FAILED(pf->GetCurFolder((_ITEMIDLIST**)&m_pidlFolder))) - ERR("GetCurFolder failed\n"); - pf->Release(); - } + if (FAILED(pf->GetCurFolder(reinterpret_cast(&m_pidlFolder)))) + ERR("GetCurFolder failed\n"); + pf->Release(); } TRACE("pidlFolder %p\n", m_pidlFolder); } - CopyMemory(&m_Dcm, pdcm, sizeof(DEFCONTEXTMENU)); return S_OK; } @@ -603,7 +615,7 @@ CDefaultContextMenu::AddStaticContextMenusToMenu( /* set first entry as default */ if (pEntry == m_pStaticEntries) fState |= MFS_DEFAULT; - + if (!wcsicmp(pEntry->szVerb, L"open")) { /* override default when open verb is found */ @@ -714,14 +726,14 @@ CDefaultContextMenu::BuildShellItemContextMenu( HRESULT hr; TRACE("BuildShellItemContextMenu entered\n"); - ASSERT(m_Dcm.cidl >= 1); + ASSERT(m_cidl >= 1); STRRET strFile; - hr = m_Dcm.psf->GetDisplayNameOf(m_Dcm.apidl[0], SHGDN_FORPARSING, &strFile); + hr = m_psf->GetDisplayNameOf(m_apidl[0], SHGDN_FORPARSING, &strFile); if (hr == S_OK) { WCHAR wszPath[MAX_PATH]; - hr = StrRetToBufW(&strFile, m_Dcm.apidl[0], wszPath, _countof(wszPath)); + hr = StrRetToBufW(&strFile, m_apidl[0], wszPath, _countof(wszPath)); if (hr == S_OK) { LPCWSTR pwszExt = PathFindExtensionW(wszPath); @@ -765,7 +777,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( else ERR("GetDisplayNameOf failed: %x\n", hr); - GUID *pGuid = _ILGetGUIDPointer(m_Dcm.apidl[0]); + GUID *pGuid = _ILGetGUIDPointer(m_apidl[0]); if (pGuid) { LPOLESTR pwszCLSID; @@ -787,7 +799,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( } } - if (_ILIsDrive(m_Dcm.apidl[0])) + if (_ILIsDrive(m_apidl[0])) { AddStaticEntryForFileClass(L"Drive"); if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Drive", 0, KEY_READ, &hKey) == ERROR_SUCCESS) @@ -800,7 +812,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( /* add static actions */ SFGAOF rfg = SFGAO_BROWSABLE | SFGAO_CANCOPY | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_HASPROPSHEET | SFGAO_FILESYSTEM | SFGAO_FOLDER; - hr = m_Dcm.psf->GetAttributesOf(m_Dcm.cidl, m_Dcm.apidl, &rfg); + hr = m_psf->GetAttributesOf(m_cidl, m_apidl, &rfg); if (FAILED(hr)) { ERR("GetAttributesOf failed: %x\n", hr); @@ -818,7 +830,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( } /* Directory is only loaded for real filesystem directories */ - if (_ILIsFolder(m_Dcm.apidl[0])) + if (_ILIsFolder(m_apidl[0])) { AddStaticEntryForFileClass(L"Directory"); if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory", 0, KEY_READ, &hKey) == ERROR_SUCCESS) @@ -830,7 +842,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( } /* AllFilesystemObjects class is loaded only for files and directories */ - if (_ILIsFolder(m_Dcm.apidl[0]) || _ILIsValue(m_Dcm.apidl[0])) + if (_ILIsFolder(m_apidl[0]) || _ILIsValue(m_apidl[0])) { if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"AllFilesystemObjects", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { @@ -848,7 +860,7 @@ CDefaultContextMenu::BuildShellItemContextMenu( IndexMenu = InsertMenuItemsOfDynamicContextMenuExtension(hMenu, IndexMenu, iIdCmdFirst, iIdCmdLast); TRACE("IndexMenu %d\n", IndexMenu); - if (_ILIsDrive(m_Dcm.apidl[0])) + if (_ILIsDrive(m_apidl[0])) { /* The 'Format' option must be always available, * thus it is not registered as a static shell extension */ @@ -916,7 +928,7 @@ CDefaultContextMenu::QueryContextMenu( UINT idCmdLast, UINT uFlags) { - if (m_Dcm.cidl) + if (m_cidl) idCmdFirst = BuildShellItemContextMenu(hMenu, idCmdFirst, idCmdLast, uFlags); else idCmdFirst = BuildBackgroundContextMenu(hMenu, idCmdFirst, idCmdLast, uFlags); @@ -951,7 +963,7 @@ CDefaultContextMenu::DoRefresh( { CComPtr ppf2 = NULL; LPITEMIDLIST pidl; - HRESULT hr = m_Dcm.psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); + HRESULT hr = m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); if (SUCCEEDED(hr)) { hr = ppf2->GetCurFolder(&pidl); @@ -984,9 +996,9 @@ CDefaultContextMenu::DoPaste( return hr; /* Find target folder */ - if (m_Dcm.cidl) + if (m_cidl) { - hr = m_Dcm.psf->BindToObject(m_Dcm.apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfTarget)); + hr = m_psf->BindToObject(m_apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfTarget)); } else { @@ -994,7 +1006,7 @@ CDefaultContextMenu::DoPaste( LPITEMIDLIST pidl; /* cidl is zero due to explorer view */ - hr = m_Dcm.psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); + hr = m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); if (SUCCEEDED(hr)) { hr = ppf2->GetCurFolder(&pidl); @@ -1087,9 +1099,9 @@ CDefaultContextMenu::DoCreateLink( if (FAILED(hr)) return hr; - if (SUCCEEDED(hr = SHCreateDataObject(m_Dcm.pidlFolder, m_Dcm.cidl, m_Dcm.apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) + if (SUCCEEDED(hr = SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) { - hr = m_Dcm.psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); + hr = m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2)); if (SUCCEEDED(hr)) { hr = ppf2->GetCurFolder(&pidl); @@ -1134,13 +1146,13 @@ HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi) { LPDATAOBJECT pDataObj; - if (SUCCEEDED(SHCreateDataObject(m_Dcm.pidlFolder, m_Dcm.cidl, m_Dcm.apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) + if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) { pDataObj->AddRef(); SHCreateThread(DoDeleteThreadProc, pDataObj, NULL, NULL); pDataObj->Release(); - } - else + } + else return E_FAIL; return S_OK; @@ -1154,7 +1166,7 @@ CDefaultContextMenu::DoCopyOrCut( LPDATAOBJECT pDataObj; HRESULT hr; - if (SUCCEEDED(SHCreateDataObject(m_Dcm.pidlFolder, m_Dcm.cidl, m_Dcm.apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) + if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) { if (!bCopy) { @@ -1233,7 +1245,7 @@ CDefaultContextMenu::DoRename( return hr; } - lpSV->SelectItem(m_Dcm.apidl[0], + lpSV->SelectItem(m_apidl[0], SVSI_DESELECTOTHERS | SVSI_EDIT | SVSI_ENSUREVISIBLE | SVSI_FOCUSED | SVSI_SELECT); lpSV->Release(); return S_OK; @@ -1244,26 +1256,26 @@ CDefaultContextMenu::DoProperties( LPCMINVOKECOMMANDINFO lpcmi) { HRESULT hr = S_OK; - const ITEMIDLIST *pidlParent = m_Dcm.pidlFolder, *pidlChild; + const ITEMIDLIST *pidlParent = m_pidlFolder, *pidlChild; if (!pidlParent) { IPersistFolder2 *pf; /* pidlFolder is optional */ - if (SUCCEEDED(m_Dcm.psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf)))) + if (SUCCEEDED(m_psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &pf)))) { pf->GetCurFolder((_ITEMIDLIST**)&pidlParent); pf->Release(); } } - if (m_Dcm.cidl > 0) - pidlChild = m_Dcm.apidl[0]; + if (m_cidl > 0) + pidlChild = m_apidl[0]; else { /* Set pidlChild to last pidl of current folder */ - if (pidlParent == m_Dcm.pidlFolder) + if (pidlParent == m_pidlFolder) pidlParent = (ITEMIDLIST*)ILClone(pidlParent); pidlChild = (ITEMIDLIST*)ILClone(ILFindLastID(pidlParent)); @@ -1303,11 +1315,11 @@ CDefaultContextMenu::DoProperties( } else { - if (m_Dcm.cidl > 1) + if (m_cidl > 1) WARN("SHMultiFileProperties is not yet implemented\n"); STRRET strFile; - hr = m_Dcm.psf->GetDisplayNameOf(pidlChild, SHGDN_FORPARSING, &strFile); + hr = m_psf->GetDisplayNameOf(pidlChild, SHGDN_FORPARSING, &strFile); if (SUCCEEDED(hr)) { WCHAR wszBuf[MAX_PATH]; @@ -1322,9 +1334,9 @@ CDefaultContextMenu::DoProperties( } /* Free allocated PIDLs */ - if (pidlParent != m_Dcm.pidlFolder) + if (pidlParent != m_pidlFolder) ILFree((ITEMIDLIST*)pidlParent); - if (m_Dcm.cidl < 1 || pidlChild != m_Dcm.apidl[0]) + if (m_cidl < 1 || pidlChild != m_apidl[0]) ILFree((ITEMIDLIST*)pidlChild); return hr; @@ -1336,7 +1348,7 @@ CDefaultContextMenu::DoFormat( { char szDrive[8] = {0}; - if (!_ILGetDrive(m_Dcm.apidl[0], szDrive, sizeof(szDrive))) + if (!_ILGetDrive(m_apidl[0], szDrive, sizeof(szDrive))) { ERR("pidl is not a drive\n"); return E_FAIL; @@ -1417,7 +1429,7 @@ CDefaultContextMenu::TryToBrowse( if (lpSB == NULL) return E_FAIL; - hr = lpSB->BrowseObject(ILCombine(m_Dcm.pidlFolder, pidl), wFlags); + hr = lpSB->BrowseObject(ILCombine(m_pidlFolder, pidl), wFlags); return hr; } @@ -1425,7 +1437,7 @@ CDefaultContextMenu::TryToBrowse( HRESULT CDefaultContextMenu::InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, PStaticShellEntry pEntry) { - LPITEMIDLIST pidlFull = ILCombine(m_Dcm.pidlFolder, pidl); + LPITEMIDLIST pidlFull = ILCombine(m_pidlFolder, pidl); if (pidlFull == NULL) { return E_FAIL; @@ -1442,7 +1454,7 @@ CDefaultContextMenu::InvokePidl(LPCMINVOKECOMMANDINFO lpcmi, LPCITEMIDLIST pidl, } else { - SHGetPathFromIDListW(m_Dcm.pidlFolder, wszDir); + SHGetPathFromIDListW(m_pidlFolder, wszDir); } HKEY hkeyClass; @@ -1491,7 +1503,7 @@ CDefaultContextMenu::DoStaticShellExtensions( DWORD wFlags = BrowserFlagsFromVerb(lpcmi, pEntry); BOOL bBrowsed = FALSE; - for (i=0; i < m_Dcm.cidl; i++) + for (i=0; i < m_cidl; i++) { /* Check if we need to browse */ if (wFlags > 0) @@ -1502,7 +1514,7 @@ CDefaultContextMenu::DoStaticShellExtensions( if (bBrowsed) continue; - hr = TryToBrowse(lpcmi, m_Dcm.apidl[i], wFlags); + hr = TryToBrowse(lpcmi, m_apidl[i], wFlags); if (SUCCEEDED(hr)) { bBrowsed = TRUE; @@ -1510,7 +1522,7 @@ CDefaultContextMenu::DoStaticShellExtensions( } } - InvokePidl(lpcmi, m_Dcm.apidl[i], pEntry); + InvokePidl(lpcmi, m_apidl[i], pEntry); } return S_OK; From 6a85d82141edaf3f5e41c3cf6e7f26399b9ab21b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 14 Aug 2014 20:23:03 +0000 Subject: [PATCH 23/55] Fourth partial merge of the condrv_restructure branch, with fonts improvements. CORE-8439 #resolve #comment r63885 merged to trunk in r63886. svn path=/trunk/; revision=63886 --- reactos/dll/cpl/console/console.c | 3 +- reactos/dll/cpl/console/layout.c | 6 +- .../win32/kernel32/client/console/console.c | 2 +- reactos/win32ss/user/winsrv/consrv/alias.c | 22 +- reactos/win32ss/user/winsrv/consrv/alias.h | 2 +- .../user/winsrv/consrv/condrv/console.c | 1 - reactos/win32ss/user/winsrv/consrv/coninput.c | 4 +- .../win32ss/user/winsrv/consrv/conoutput.c | 2 +- reactos/win32ss/user/winsrv/consrv/console.c | 61 +++-- reactos/win32ss/user/winsrv/consrv/consrv.h | 1 + .../win32ss/user/winsrv/consrv/frontendctl.c | 26 +- .../user/winsrv/consrv/frontends/gui/conwnd.c | 250 ++++++++++++------ .../user/winsrv/consrv/frontends/gui/conwnd.h | 19 +- .../winsrv/consrv/frontends/gui/fullscreen.c | 4 +- .../winsrv/consrv/frontends/gui/graphics.c | 4 +- .../winsrv/consrv/frontends/gui/guisettings.c | 119 ++------- .../winsrv/consrv/frontends/gui/guisettings.h | 1 - .../winsrv/consrv/frontends/gui/guiterm.c | 6 +- .../winsrv/consrv/frontends/gui/guiterm.h | 25 +- .../user/winsrv/consrv/frontends/gui/text.c | 91 ++----- .../user/winsrv/consrv/frontends/input.c | 4 +- .../winsrv/consrv/frontends/tui/tuiterm.c | 14 +- .../winsrv/consrv/frontends/tui/tuiterm.h | 6 +- reactos/win32ss/user/winsrv/consrv/handle.c | 2 +- .../user/winsrv/consrv/include/conio.h | 40 +-- .../user/winsrv/consrv/include/conio_winsrv.h | 62 ++++- .../win32ss/user/winsrv/consrv/lineinput.c | 32 +-- .../win32ss/user/winsrv/consrv/lineinput.h | 4 +- .../win32ss/user/winsrv/consrv/subsysreg.c | 2 +- 29 files changed, 399 insertions(+), 416 deletions(-) diff --git a/reactos/dll/cpl/console/console.c b/reactos/dll/cpl/console/console.c index 436626b6087..8fdda90d1b3 100644 --- a/reactos/dll/cpl/console/console.c +++ b/reactos/dll/cpl/console/console.c @@ -117,7 +117,8 @@ InitConsoleDefaults(PCONSOLE_PROPS pConInfo) GuiInfo->FontFamily = FF_DONTCARE; GuiInfo->FontSize.X = 0; GuiInfo->FontSize.Y = 0; - GuiInfo->FontWeight = FW_DONTCARE; + GuiInfo->FontWeight = FW_NORMAL; // HACK: !! + // GuiInfo->FontWeight = FW_DONTCARE; GuiInfo->FullScreen = FALSE; GuiInfo->ShowWindow = SW_SHOWNORMAL; diff --git a/reactos/dll/cpl/console/layout.c b/reactos/dll/cpl/console/layout.c index fac40bba815..90926c821c2 100644 --- a/reactos/dll/cpl/console/layout.c +++ b/reactos/dll/cpl/console/layout.c @@ -121,7 +121,7 @@ PaintText(LPDRAWITEMSTRUCT drawItem, if (!hBrush) return FALSE; Font = CreateFontW(GuiInfo->FontSize.Y, - 0, // GuiInfo->FontSize.X, + GuiInfo->FontSize.X, 0, TA_BASELINE, GuiInfo->FontWeight, @@ -131,8 +131,8 @@ PaintText(LPDRAWITEMSTRUCT drawItem, OEM_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, - FIXED_PITCH | GuiInfo->FontFamily /* FF_DONTCARE */, + DEFAULT_QUALITY, // NONANTIALIASED_QUALITY ; ANTIALIASED_QUALITY + FIXED_PITCH | GuiInfo->FontFamily, GuiInfo->FaceName); if (Font == NULL) { diff --git a/reactos/dll/win32/kernel32/client/console/console.c b/reactos/dll/win32/kernel32/client/console/console.c index fe4a08461a8..0a4059ac84a 100644 --- a/reactos/dll/win32/kernel32/client/console/console.c +++ b/reactos/dll/win32/kernel32/client/console/console.c @@ -561,7 +561,7 @@ InvalidateConsoleDIBits(IN HANDLE hConsoleOutput, /* - * @unimplemented (Undocumented) + * @implemented (Undocumented) */ HANDLE WINAPI diff --git a/reactos/win32ss/user/winsrv/consrv/alias.c b/reactos/win32ss/user/winsrv/consrv/alias.c index 3d7a533d5a0..a288f976b91 100644 --- a/reactos/win32ss/user/winsrv/consrv/alias.c +++ b/reactos/win32ss/user/winsrv/consrv/alias.c @@ -102,7 +102,7 @@ ConvertInputUnicodeToAnsi(PCONSOLE Console, /* PRIVATE FUNCTIONS **********************************************************/ static PALIAS_HEADER -IntFindAliasHeader(PCONSOLE Console, +IntFindAliasHeader(PCONSRV_CONSOLE Console, PVOID ExeName, USHORT ExeLength, BOOLEAN UnicodeExe) @@ -149,7 +149,7 @@ IntFindAliasHeader(PCONSOLE Console, } static PALIAS_HEADER -IntCreateAliasHeader(PCONSOLE Console, +IntCreateAliasHeader(PCONSRV_CONSOLE Console, PVOID ExeName, USHORT ExeLength, BOOLEAN UnicodeExe) @@ -217,7 +217,7 @@ IntInsertAliasHeader(PALIAS_HEADER* RootHeader, } static PALIAS_ENTRY -IntGetAliasEntry(PCONSOLE Console, +IntGetAliasEntry(PCONSRV_CONSOLE Console, PALIAS_HEADER Header, PVOID Source, USHORT SourceLength, @@ -266,7 +266,7 @@ IntGetAliasEntry(PCONSOLE Console, } static PALIAS_ENTRY -IntCreateAliasEntry(PCONSOLE Console, +IntCreateAliasEntry(PCONSRV_CONSOLE Console, PVOID Source, USHORT SourceLength, PVOID Target, @@ -425,7 +425,7 @@ IntGetAllConsoleAliasesLength(PALIAS_HEADER Header, } VOID -IntDeleteAllAliases(PCONSOLE Console) +IntDeleteAllAliases(PCONSRV_CONSOLE Console) { PALIAS_HEADER Header, NextHeader; PALIAS_ENTRY Entry, NextEntry; @@ -449,7 +449,7 @@ CSR_API(SrvAddConsoleAlias) { NTSTATUS Status; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PALIAS_HEADER Header; PALIAS_ENTRY Entry; PVOID lpTarget; @@ -538,7 +538,7 @@ CSR_API(SrvGetConsoleAlias) { NTSTATUS Status; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PALIAS_HEADER Header; PALIAS_ENTRY Entry; UINT Length; @@ -629,7 +629,7 @@ CSR_API(SrvGetConsoleAliases) { NTSTATUS Status; PCONSOLE_GETALLALIASES GetAllAliasesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; ULONG BytesWritten = 0; PALIAS_HEADER Header; @@ -734,7 +734,7 @@ CSR_API(SrvGetConsoleAliasesLength) { NTSTATUS Status; PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesLengthRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PALIAS_HEADER Header; DPRINT1("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage); @@ -774,7 +774,7 @@ CSR_API(SrvGetConsoleAliasExes) { NTSTATUS Status; PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; UINT BytesWritten = 0; DPRINT1("SrvGetConsoleAliasExes entered\n"); @@ -860,7 +860,7 @@ CSR_API(SrvGetConsoleAliasExesLength) { NTSTATUS Status; PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesLengthRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; DPRINT1("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage); diff --git a/reactos/win32ss/user/winsrv/consrv/alias.h b/reactos/win32ss/user/winsrv/consrv/alias.h index d3653e540b3..38505d1697e 100644 --- a/reactos/win32ss/user/winsrv/consrv/alias.h +++ b/reactos/win32ss/user/winsrv/consrv/alias.h @@ -9,4 +9,4 @@ #pragma once -VOID IntDeleteAllAliases(PCONSOLE Console); +VOID IntDeleteAllAliases(PCONSRV_CONSOLE Console); diff --git a/reactos/win32ss/user/winsrv/consrv/condrv/console.c b/reactos/win32ss/user/winsrv/consrv/condrv/console.c index b0f7099cc6a..4f60730212b 100644 --- a/reactos/win32ss/user/winsrv/consrv/condrv/console.c +++ b/reactos/win32ss/user/winsrv/consrv/condrv/console.c @@ -233,7 +233,6 @@ ConDrvInitConsole(OUT PCONSOLE* NewConsole, /* Initialize the terminal interface */ ResetTerminal(Console); - memcpy(Console->Colors, ConsoleInfo->Colors, sizeof(ConsoleInfo->Colors)); Console->ConsoleSize = ConsoleInfo->ConsoleSize; Console->FixedSize = FALSE; // Value by default; is reseted by the terminals if needed. diff --git a/reactos/win32ss/user/winsrv/consrv/coninput.c b/reactos/win32ss/user/winsrv/consrv/coninput.c index 738e819c93f..953451e9f09 100644 --- a/reactos/win32ss/user/winsrv/consrv/coninput.c +++ b/reactos/win32ss/user/winsrv/consrv/coninput.c @@ -40,7 +40,7 @@ typedef struct _GET_INPUT_INFO * This pre-processing code MUST be IN consrv ONLY */ /* static */ ULONG -PreprocessInput(PCONSOLE Console, +PreprocessInput(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent, ULONG NumEventsToWrite) { @@ -102,7 +102,7 @@ PreprocessInput(PCONSOLE Console, * This post-processing code MUST be IN consrv ONLY */ /* static */ VOID -PostprocessInput(PCONSOLE Console) +PostprocessInput(PCONSRV_CONSOLE Console) { CsrNotifyWait(&Console->ReadWaitQueue, FALSE, diff --git a/reactos/win32ss/user/winsrv/consrv/conoutput.c b/reactos/win32ss/user/winsrv/consrv/conoutput.c index 12a4d4d8e00..ab911f78a02 100644 --- a/reactos/win32ss/user/winsrv/consrv/conoutput.c +++ b/reactos/win32ss/user/winsrv/consrv/conoutput.c @@ -170,7 +170,7 @@ CSR_API(SrvCreateConsoleScreenBuffer) NTSTATUS Status = STATUS_INVALID_PARAMETER; PCONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CreateScreenBufferRequest; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); - PCONSOLE Console; + PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; PVOID ScreenBufferInfo = NULL; diff --git a/reactos/win32ss/user/winsrv/consrv/console.c b/reactos/win32ss/user/winsrv/consrv/console.c index fb0ddf7bd14..a5d7c658330 100644 --- a/reactos/win32ss/user/winsrv/consrv/console.c +++ b/reactos/win32ss/user/winsrv/consrv/console.c @@ -26,7 +26,7 @@ NTSTATUS NTAPI RtlGetLastNtStatus(VOID); /* GLOBALS ********************************************************************/ static ULONG ConsoleListSize; -static PCONSOLE* ConsoleList; /* The list of the ConSrv consoles */ +static PCONSRV_CONSOLE* ConsoleList; /* The list of the ConSrv consoles */ static RTL_RESOURCE ListLock; #define ConSrvLockConsoleListExclusive() \ @@ -41,13 +41,13 @@ static RTL_RESOURCE ListLock; static NTSTATUS InsertConsole(OUT PHANDLE Handle, - IN PCONSOLE Console) + IN PCONSRV_CONSOLE Console) { #define CONSOLE_HANDLES_INCREMENT 2 * 3 NTSTATUS Status = STATUS_SUCCESS; ULONG i = 0; - PCONSOLE* Block; + PCONSRV_CONSOLE* Block; ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || (ConsoleList != NULL && ConsoleListSize != 0) ); @@ -70,7 +70,7 @@ InsertConsole(OUT PHANDLE Handle, /* Allocate a new handles table */ Block = ConsoleAllocHeap(HEAP_ZERO_MEMORY, (ConsoleListSize + - CONSOLE_HANDLES_INCREMENT) * sizeof(PCONSOLE)); + CONSOLE_HANDLES_INCREMENT) * sizeof(PCONSRV_CONSOLE)); if (Block == NULL) { Status = STATUS_UNSUCCESSFUL; @@ -83,7 +83,7 @@ InsertConsole(OUT PHANDLE Handle, /* Copy the handles from the old table to the new one */ RtlCopyMemory(Block, ConsoleList, - ConsoleListSize * sizeof(PCONSOLE)); + ConsoleListSize * sizeof(PCONSRV_CONSOLE)); ConsoleFreeHeap(ConsoleList); } ConsoleList = Block; @@ -105,7 +105,7 @@ static NTSTATUS RemoveConsoleByHandle(IN HANDLE Handle) { NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE Console; + PCONSRV_CONSOLE Console; BOOLEAN ValidHandle = ((HandleToULong(Handle) & 0x3) == 0x3); ULONG Index = HandleToULong(Handle) >> 2; @@ -135,7 +135,7 @@ Quit: #endif static NTSTATUS -RemoveConsoleByPointer(IN PCONSOLE Console) +RemoveConsoleByPointer(IN PCONSRV_CONSOLE Console) { ULONG i = 0; @@ -162,13 +162,13 @@ RemoveConsoleByPointer(IN PCONSOLE Console) } BOOLEAN NTAPI -ConSrvValidateConsole(OUT PCONSOLE* Console, +ConSrvValidateConsole(OUT PCONSRV_CONSOLE* Console, IN HANDLE ConsoleHandle, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole) { BOOLEAN RetVal = FALSE; - PCONSOLE ValidatedConsole; + PCONSRV_CONSOLE ValidatedConsole; BOOLEAN ValidHandle = ((HandleToULong(ConsoleHandle) & 0x3) == 0x3); ULONG Index = HandleToULong(ConsoleHandle) >> 2; @@ -210,14 +210,14 @@ ConSrvValidateConsole(OUT PCONSOLE* Console, /* PRIVATE FUNCTIONS **********************************************************/ VOID -ConioPause(PCONSOLE Console, UINT Flags) +ConioPause(PCONSRV_CONSOLE Console, UINT Flags) { Console->PauseFlags |= Flags; ConDrvPause(Console); } VOID -ConioUnpause(PCONSOLE Console, UINT Flags) +ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags) { Console->PauseFlags &= ~Flags; @@ -239,11 +239,11 @@ ConioUnpause(PCONSOLE Console, UINT Flags) NTSTATUS ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData, - OUT PCONSOLE* Console, + OUT PCONSRV_CONSOLE* Console, IN BOOLEAN LockConsole) { NTSTATUS Status = STATUS_INVALID_HANDLE; - PCONSOLE GrabConsole; + PCONSRV_CONSOLE GrabConsole; // if (Console == NULL) return STATUS_INVALID_PARAMETER; ASSERT(Console); @@ -266,7 +266,7 @@ ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData, } VOID -ConSrvReleaseConsole(IN PCONSOLE Console, +ConSrvReleaseConsole(IN PCONSRV_CONSOLE Console, IN BOOLEAN WasConsoleLocked) { LONG RefCount = 0; @@ -319,13 +319,13 @@ ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal); NTSTATUS NTAPI ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, - OUT PCONSOLE* NewConsole, + OUT PCONSRV_CONSOLE* NewConsole, IN OUT PCONSOLE_START_INFO ConsoleStartInfo, IN ULONG ConsoleLeaderProcessId) { NTSTATUS Status; HANDLE ConsoleHandle; - PCONSOLE Console; + PCONSRV_CONSOLE Console; CONSOLE_INFO ConsoleInfo; SIZE_T Length = 0; @@ -429,6 +429,9 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, Console->QuickEdit = ConsoleInfo.QuickEdit; + /* Colour table */ + memcpy(Console->Colors, ConsoleInfo.Colors, sizeof(ConsoleInfo.Colors)); + /* Attach the ConSrv terminal to the console */ Status = ConDrvRegisterTerminal(Console, &Terminal); if (!NT_SUCCESS(Status)) @@ -450,7 +453,7 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, } VOID NTAPI -ConSrvDeleteConsole(PCONSOLE Console) +ConSrvDeleteConsole(PCONSRV_CONSOLE Console) { DPRINT("ConSrvDeleteConsole\n"); @@ -528,7 +531,7 @@ ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, } PCONSOLE_PROCESS_DATA NTAPI -ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console) +ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console) { if (Console == NULL) return NULL; @@ -538,7 +541,7 @@ ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console) } NTSTATUS NTAPI -ConSrvGetConsoleProcessList(IN PCONSOLE Console, +ConSrvGetConsoleProcessList(IN PCONSRV_CONSOLE Console, IN OUT PULONG ProcessIdsList, IN ULONG MaxIdListItems, OUT PULONG ProcessIdsTotal) @@ -567,7 +570,7 @@ ConSrvGetConsoleProcessList(IN PCONSOLE Console, // ConSrvGenerateConsoleCtrlEvent NTSTATUS NTAPI -ConSrvConsoleProcessCtrlEvent(IN PCONSOLE Console, +ConSrvConsoleProcessCtrlEvent(IN PCONSRV_CONSOLE Console, IN ULONG ProcessGroupId, IN ULONG CtrlEvent) { @@ -795,7 +798,7 @@ CSR_API(SrvGetConsoleTitle) { NTSTATUS Status; PCONSOLE_GETSETCONSOLETITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&TitleRequest->Title, @@ -830,7 +833,7 @@ CSR_API(SrvSetConsoleTitle) { NTSTATUS Status; PCONSOLE_GETSETCONSOLETITLE TitleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.TitleRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&TitleRequest->Title, @@ -865,7 +868,7 @@ CSR_API(SrvGetConsoleCP) { NTSTATUS Status; PCONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleCPRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; DPRINT("SrvGetConsoleCP, getting %s Code Page\n", GetConsoleCPRequest->OutputCP ? "Output" : "Input"); @@ -889,7 +892,7 @@ CSR_API(SrvSetConsoleCP) { NTSTATUS Status = STATUS_INVALID_PARAMETER; PCONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetConsoleCPRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; DPRINT("SrvSetConsoleCP, setting %s Code Page\n", SetConsoleCPRequest->OutputCP ? "Output" : "Input"); @@ -909,7 +912,7 @@ CSR_API(SrvGetConsoleProcessList) { NTSTATUS Status; PCONSOLE_GETPROCESSLIST GetProcessListRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetProcessListRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&GetProcessListRequest->ProcessIdsList, @@ -935,7 +938,7 @@ CSR_API(SrvGenerateConsoleCtrlEvent) { NTSTATUS Status; PCONSOLE_GENERATECTRLEVENT GenerateCtrlEventRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GenerateCtrlEventRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -952,7 +955,7 @@ CSR_API(SrvConsoleNotifyLastClose) { NTSTATUS Status; PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ProcessData, &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -979,7 +982,7 @@ CSR_API(SrvGetConsoleMouseInfo) { NTSTATUS Status; PCONSOLE_GETMOUSEINFO GetMouseInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetMouseInfoRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -1001,7 +1004,7 @@ CSR_API(SrvGetConsoleKeyboardLayoutName) { NTSTATUS Status; PCONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetKbdLayoutNameRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; diff --git a/reactos/win32ss/user/winsrv/consrv/consrv.h b/reactos/win32ss/user/winsrv/consrv/consrv.h index 57a0acfb792..2c9c1e795f5 100644 --- a/reactos/win32ss/user/winsrv/consrv/consrv.h +++ b/reactos/win32ss/user/winsrv/consrv/consrv.h @@ -67,6 +67,7 @@ typedef struct _CONSOLE_PROCESS_DATA } CONSOLE_PROCESS_DATA, *PCONSOLE_PROCESS_DATA; #include "include/conio.h" +// #include "include/conio_winsrv.h" #include "include/console.h" #include "include/settings.h" #include "include/term.h" diff --git a/reactos/win32ss/user/winsrv/consrv/frontendctl.c b/reactos/win32ss/user/winsrv/consrv/frontendctl.c index e8545ecc3ab..24bef400a2e 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontendctl.c +++ b/reactos/win32ss/user/winsrv/consrv/frontendctl.c @@ -31,7 +31,7 @@ */ #if 0 static NTSTATUS -SetConsoleHardwareState(PCONSOLE Console, ULONG ConsoleHwState) +SetConsoleHardwareState(PCONSRV_CONSOLE Console, ULONG ConsoleHwState) { DPRINT1("Console Hardware State: %d\n", ConsoleHwState); @@ -58,7 +58,7 @@ CSR_API(SrvGetConsoleHardwareState) NTSTATUS Status; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest; PCONSOLE_SCREEN_BUFFER Buff; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, @@ -88,7 +88,7 @@ CSR_API(SrvSetConsoleHardwareState) NTSTATUS Status; PCONSOLE_GETSETHWSTATE HardwareStateRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HardwareStateRequest; PCONSOLE_SCREEN_BUFFER Buff; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), HardwareStateRequest->OutputHandle, @@ -117,7 +117,7 @@ CSR_API(SrvGetConsoleDisplayMode) { NTSTATUS Status; PCONSOLE_GETDISPLAYMODE GetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetDisplayModeRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); @@ -133,7 +133,7 @@ CSR_API(SrvSetConsoleDisplayMode) { NTSTATUS Status; PCONSOLE_SETDISPLAYMODE SetDisplayModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetDisplayModeRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), @@ -164,7 +164,7 @@ CSR_API(SrvGetLargestConsoleWindowSize) NTSTATUS Status; PCONSOLE_GETLARGESTWINDOWSIZE GetLargestWindowSizeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetLargestWindowSizeRequest; PCONSOLE_SCREEN_BUFFER Buff; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), GetLargestWindowSizeRequest->OutputHandle, @@ -184,7 +184,7 @@ CSR_API(SrvShowConsoleCursor) { NTSTATUS Status; PCONSOLE_SHOWCURSOR ShowCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ShowCursorRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), @@ -207,7 +207,7 @@ CSR_API(SrvSetConsoleCursor) NTSTATUS Status; BOOL Success; PCONSOLE_SETCURSOR SetCursorRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetCursorRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; // FIXME: Tests show that this function is used only for graphics screen buffers @@ -232,7 +232,7 @@ CSR_API(SrvConsoleMenuControl) { NTSTATUS Status; PCONSOLE_MENUCONTROL MenuControlRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.MenuControlRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PCONSOLE_SCREEN_BUFFER Buff; Status = ConSrvGetScreenBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), @@ -257,7 +257,7 @@ CSR_API(SrvSetConsoleMenuClose) NTSTATUS Status; BOOL Success; PCONSOLE_SETMENUCLOSE SetMenuCloseRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetMenuCloseRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); @@ -273,7 +273,7 @@ CSR_API(SrvGetConsoleWindow) { NTSTATUS Status; PCONSOLE_GETWINDOW GetWindowRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetWindowRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -288,7 +288,7 @@ CSR_API(SrvSetConsoleIcon) { NTSTATUS Status; PCONSOLE_SETICON SetIconRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetIconRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; @@ -305,7 +305,7 @@ CSR_API(SrvGetConsoleSelectionInfo) { NTSTATUS Status; PCONSOLE_GETSELECTIONINFO GetSelectionInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetSelectionInfoRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c index 2a7ff36cc40..84de1871b20 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c @@ -282,7 +282,7 @@ CreateSysMenu(HWND hWnd) } static VOID -SendMenuEvent(PCONSOLE Console, UINT CmdId) +SendMenuEvent(PCONSRV_CONSOLE Console, UINT CmdId) { INPUT_RECORD er; @@ -366,7 +366,7 @@ static LRESULT OnCommand(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam) { LRESULT Ret = TRUE; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; /* * In case the selected menu item belongs to the user-reserved menu id range, @@ -486,15 +486,166 @@ ResizeConWnd(PGUI_CONSOLE_DATA GuiData, DWORD WidthUnit, DWORD HeightUnit) // to: InvalidateRect(GuiData->hWindow, NULL, TRUE); } + +VOID +DeleteFonts(PGUI_CONSOLE_DATA GuiData) +{ + ULONG i; + for (i = 0; i < sizeof(GuiData->Font) / sizeof(GuiData->Font[0]); ++i) + { + if (GuiData->Font[i] != NULL) DeleteObject(GuiData->Font[i]); + GuiData->Font[i] = NULL; + } +} + +static HFONT +CreateDerivedFont(HFONT OrgFont, + // COORD FontSize, + ULONG FontWeight, + // BOOLEAN bItalic, + BOOLEAN bUnderline, + BOOLEAN bStrikeOut) +{ + LOGFONT lf; + + /* Initialize the LOGFONT structure */ + RtlZeroMemory(&lf, sizeof(lf)); + + /* Retrieve the details of the current font */ + if (GetObject(OrgFont, sizeof(lf), &lf) == 0) + return NULL; + + /* Change the font attributes */ + // lf.lfHeight = FontSize.Y; + // lf.lfWidth = FontSize.X; + lf.lfWeight = FontWeight; + // lf.lfItalic = bItalic; + lf.lfUnderline = bUnderline; + lf.lfStrikeOut = bStrikeOut; + + /* Build a new font */ + return CreateFontIndirect(&lf); +} + +BOOL +InitFonts(PGUI_CONSOLE_DATA GuiData, + LPWSTR FaceName, // Points to a WCHAR array of LF_FACESIZE elements. + ULONG FontFamily, + COORD FontSize, + ULONG FontWeight) +{ + HDC hDC; + HFONT OldFont, NewFont; + TEXTMETRICW Metrics; + SIZE CharSize; + + /* + * Initialize a new NORMAL font and get its metrics. + */ + + NewFont = CreateFontW(FontSize.Y, + FontSize.X, + 0, + TA_BASELINE, + FontWeight, + FALSE, + FALSE, + FALSE, + OEM_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + DEFAULT_QUALITY, // NONANTIALIASED_QUALITY ; ANTIALIASED_QUALITY + FIXED_PITCH | FontFamily, + FaceName); + if (NewFont == NULL) + { + DPRINT1("InitFonts: CreateFontW failed\n"); + return FALSE; + } + + hDC = GetDC(GuiData->hWindow); + if (hDC == NULL) + { + DPRINT1("InitFonts: GetDC failed\n"); + DeleteObject(NewFont); + return FALSE; + } + + OldFont = SelectObject(hDC, NewFont); + if (OldFont == NULL) + { + DPRINT1("InitFonts: SelectObject failed\n"); + ReleaseDC(GuiData->hWindow, hDC); + DeleteObject(NewFont); + return FALSE; + } + + if (!GetTextMetricsW(hDC, &Metrics)) + { + DPRINT1("InitFonts: GetTextMetrics failed\n"); + SelectObject(hDC, OldFont); + ReleaseDC(GuiData->hWindow, hDC); + DeleteObject(NewFont); + return FALSE; + } + GuiData->CharWidth = Metrics.tmMaxCharWidth; + GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; + + /* Measure real char width more precisely if possible. */ + if (GetTextExtentPoint32W(hDC, L"R", 1, &CharSize)) + GuiData->CharWidth = CharSize.cx; + + SelectObject(hDC, OldFont); + ReleaseDC(GuiData->hWindow, hDC); + + /* + * Initialization succeeded. + */ + // Delete all the old fonts first. + DeleteFonts(GuiData); + GuiData->Font[FONT_NORMAL] = NewFont; + + /* + * Now build the other fonts (bold, underlined, mixed). + */ + GuiData->Font[FONT_BOLD] = + CreateDerivedFont(GuiData->Font[FONT_NORMAL], + FontWeight < FW_BOLD ? FW_BOLD : FontWeight, + FALSE, + FALSE); + GuiData->Font[FONT_UNDERLINE] = + CreateDerivedFont(GuiData->Font[FONT_NORMAL], + FontWeight, + TRUE, + FALSE); + GuiData->Font[FONT_BOLD | FONT_UNDERLINE] = + CreateDerivedFont(GuiData->Font[FONT_NORMAL], + FontWeight < FW_BOLD ? FW_BOLD : FontWeight, + TRUE, + FALSE); + + /* + * Save the settings. + */ + if (FaceName != GuiData->GuiInfo.FaceName) + { + SIZE_T Length = min(wcslen(FaceName) + 1, LF_FACESIZE); // wcsnlen + wcsncpy(GuiData->GuiInfo.FaceName, FaceName, LF_FACESIZE); + GuiData->GuiInfo.FaceName[Length] = L'\0'; // NULL-terminate + } + GuiData->GuiInfo.FontFamily = FontFamily; + GuiData->GuiInfo.FontSize = FontSize; + GuiData->GuiInfo.FontWeight = FontWeight; + + return TRUE; +} + + static BOOL OnNcCreate(HWND hWnd, LPCREATESTRUCTW Create) { PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Create->lpCreateParams; - PCONSOLE Console; - HDC hDC; - HFONT OldFont; - TEXTMETRICW Metrics; - SIZE CharSize; + PCONSRV_CONSOLE Console; if (NULL == GuiData) { @@ -506,67 +657,18 @@ OnNcCreate(HWND hWnd, LPCREATESTRUCTW Create) GuiData->hWindow = hWnd; - GuiData->Font = CreateFontW(GuiData->GuiInfo.FontSize.Y, - 0, // GuiData->GuiInfo.FontSize.X, - 0, - TA_BASELINE, - GuiData->GuiInfo.FontWeight, - FALSE, - FALSE, - FALSE, - OEM_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, - FIXED_PITCH | GuiData->GuiInfo.FontFamily /* FF_DONTCARE */, - GuiData->GuiInfo.FaceName); - - if (NULL == GuiData->Font) + /* Initialize the fonts */ + if (!InitFonts(GuiData, + GuiData->GuiInfo.FaceName, + GuiData->GuiInfo.FontFamily, + GuiData->GuiInfo.FontSize, + GuiData->GuiInfo.FontWeight)) { - DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); + DPRINT1("GuiConsoleNcCreate: InitFonts failed\n"); GuiData->hWindow = NULL; SetEvent(GuiData->hGuiInitEvent); return FALSE; } - hDC = GetDC(GuiData->hWindow); - if (NULL == hDC) - { - DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); - DeleteObject(GuiData->Font); - GuiData->hWindow = NULL; - SetEvent(GuiData->hGuiInitEvent); - return FALSE; - } - OldFont = SelectObject(hDC, GuiData->Font); - if (NULL == OldFont) - { - DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); - ReleaseDC(GuiData->hWindow, hDC); - DeleteObject(GuiData->Font); - GuiData->hWindow = NULL; - SetEvent(GuiData->hGuiInitEvent); - return FALSE; - } - if (!GetTextMetricsW(hDC, &Metrics)) - { - DPRINT1("GuiConsoleNcCreate: GetTextMetrics failed\n"); - SelectObject(hDC, OldFont); - ReleaseDC(GuiData->hWindow, hDC); - DeleteObject(GuiData->Font); - GuiData->hWindow = NULL; - SetEvent(GuiData->hGuiInitEvent); - return FALSE; - } - GuiData->CharWidth = Metrics.tmMaxCharWidth; - GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; - - /* Measure real char width more precisely if possible. */ - if (GetTextExtentPoint32W(hDC, L"R", 1, &CharSize)) - GuiData->CharWidth = CharSize.cx; - - SelectObject(hDC, OldFont); - - ReleaseDC(GuiData->hWindow, hDC); /* Initialize the terminal framebuffer */ GuiData->hMemDC = CreateCompatibleDC(NULL); @@ -647,7 +749,7 @@ OnActivate(PGUI_CONSOLE_DATA GuiData, WPARAM wParam) static VOID OnFocus(PGUI_CONSOLE_DATA GuiData, BOOL SetFocus) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; INPUT_RECORD er; if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; @@ -814,7 +916,7 @@ UpdateSelection(PGUI_CONSOLE_DATA GuiData, PCOORD SelectionAnchor OPTIONAL, PCOORD coord) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; HRGN oldRgn = CreateSelectionRgn(GuiData, GuiData->LineSelection, &GuiData->Selection.dwSelectionAnchor, &GuiData->Selection.srSelection); @@ -1039,7 +1141,7 @@ IsSystemKey(WORD VirtualKeyCode) static VOID OnKey(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_SCREEN_BUFFER ActiveBuffer; if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; @@ -1204,7 +1306,7 @@ InvalidateCell(PGUI_CONSOLE_DATA GuiData, static VOID OnTimer(PGUI_CONSOLE_DATA GuiData) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_SCREEN_BUFFER Buff; SetTimer(GuiData->hWindow, CONGUI_UPDATE_TIMER, CURSOR_BLINK_TIME, NULL); @@ -1309,7 +1411,7 @@ OnTimer(PGUI_CONSOLE_DATA GuiData) static BOOL OnClose(PGUI_CONSOLE_DATA GuiData) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return TRUE; @@ -1341,7 +1443,7 @@ OnNcDestroy(HWND hWnd) if (GuiData->hMemDC ) DeleteDC(GuiData->hMemDC); if (GuiData->hBitmap) DeleteObject(GuiData->hBitmap); // if (GuiData->hSysPalette) DeleteObject(GuiData->hSysPalette); - if (GuiData->Font) DeleteObject(GuiData->Font); + DeleteFonts(GuiData); } /* Free the GuiData registration */ @@ -1380,7 +1482,7 @@ static LRESULT OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) { BOOL Err = FALSE; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; // FIXME: It's here that we need to check whether we has focus or not // and whether we are in edit mode or not, to know if we need to deal @@ -1735,7 +1837,7 @@ Paste(PGUI_CONSOLE_DATA GuiData) static VOID OnGetMinMaxInfo(PGUI_CONSOLE_DATA GuiData, PMINMAXINFO minMaxInfo) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_SCREEN_BUFFER ActiveBuffer; DWORD windx, windy; UINT WidthUnit, HeightUnit; @@ -1767,7 +1869,7 @@ OnGetMinMaxInfo(PGUI_CONSOLE_DATA GuiData, PMINMAXINFO minMaxInfo) static VOID OnSize(PGUI_CONSOLE_DATA GuiData, WPARAM wParam, LPARAM lParam) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; @@ -1872,7 +1974,7 @@ GuiConsoleHandleScrollbarMenu(VOID) static LRESULT OnScroll(PGUI_CONSOLE_DATA GuiData, UINT uMsg, WPARAM wParam) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_SCREEN_BUFFER Buff; SCROLLINFO sInfo; int fnBar; @@ -1983,7 +2085,7 @@ ConWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT Result = 0; PGUI_CONSOLE_DATA GuiData = NULL; - PCONSOLE Console = NULL; + PCONSRV_CONSOLE Console = NULL; /* * - If it's the first time we create a window for the terminal, diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.h b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.h index f6caa6d57f5..dee5c3254c2 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.h +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/conwnd.h @@ -21,6 +21,17 @@ #define PM_CONSOLE_BEEP (WM_APP + 4) #define PM_CONSOLE_SET_TITLE (WM_APP + 5) +/* +typedef struct _CONSOLE_FONT +{ + HFONT Font; + ULONG Flag; +} CONSOLE_FONT, *PCONSOLE_FONT; +*/ +#define FONT_NORMAL 0x00 +#define FONT_BOLD 0x01 +#define FONT_UNDERLINE 0x02 +#define FONT_MAXNO 0x04 typedef struct _GUI_CONSOLE_DATA { @@ -56,12 +67,12 @@ typedef struct _GUI_CONSOLE_DATA // PVOID ScreenBuffer; /* Hardware screen buffer */ - HFONT Font; - UINT CharWidth; - UINT CharHeight; + HFONT Font[FONT_MAXNO]; + UINT CharWidth; /* The character width and height should be the same for */ + UINT CharHeight; /* both normal and bold/underlined fonts... */ /*****************************************************/ - PCONSOLE Console; /* Pointer to the owned console */ + PCONSRV_CONSOLE Console; /* Pointer to the owned console */ PCONSOLE_SCREEN_BUFFER ActiveBuffer; /* Pointer to the active screen buffer (then maybe the previous Console member is redundant?? Or not...) */ CONSOLE_SELECTION_INFO Selection; /* Contains information about the selection */ COORD dwSelectionCursor; /* Selection cursor position, most of the time different from Selection.dwSelectionAnchor */ diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/fullscreen.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/fullscreen.c index caf9330d882..1bb4283f6fa 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/fullscreen.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/fullscreen.c @@ -48,7 +48,7 @@ LeaveFullScreen(PGUI_CONSOLE_DATA GuiData) VOID SwitchFullScreen(PGUI_CONSOLE_DATA GuiData, BOOL FullScreen) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; /* * See: @@ -174,7 +174,7 @@ SwitchFullScreen(PGUI_CONSOLE_DATA GuiData, BOOL FullScreen) VOID GuiConsoleSwitchFullScreen(PGUI_CONSOLE_DATA GuiData) { - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; BOOL FullScreen; if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/graphics.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/graphics.c index 37111b3f415..ba1d6ff1c7b 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/graphics.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/graphics.c @@ -115,7 +115,7 @@ GuiPasteToGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, * This function supposes that the system clipboard was opened. */ - // PCONSOLE Console = Buffer->Header.Console; + // PCONSRV_CONSOLE Console = Buffer->Header.Console; UNIMPLEMENTED; } @@ -126,7 +126,7 @@ GuiPaintGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, PRECT rcView, PRECT rcFramebuffer) { - PCONSOLE Console = Buffer->Header.Console; + PCONSRV_CONSOLE Console = Buffer->Header.Console; // ASSERT(Console == GuiData->Console); if (Buffer->BitMap == NULL) return; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c index a3969fe3a23..12dce743a21 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c @@ -17,9 +17,6 @@ #include "guiterm.h" #include "guisettings.h" -VOID GuiConsoleMoveWindow(PGUI_CONSOLE_DATA GuiData); -VOID SwitchFullScreen(PGUI_CONSOLE_DATA GuiData, BOOL FullScreen); - /* FUNCTIONS ******************************************************************/ BOOL @@ -199,14 +196,14 @@ GuiConsoleGetDefaultSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, // wcsncpy(TermInfo->FaceName, L"DejaVu Sans Mono", LF_FACESIZE); // TermInfo->FontSize = MAKELONG(8, 12); // 0x000C0008; // font is 8x12 // TermInfo->FontSize = MAKELONG(16, 16); // font is 16x16 - // TermInfo->FontWeight = FW_NORMAL; wcsncpy(TermInfo->FaceName, L"VGA", LF_FACESIZE); // HACK: !! // TermInfo->FaceName[0] = L'\0'; TermInfo->FontFamily = FF_DONTCARE; TermInfo->FontSize.X = 0; TermInfo->FontSize.Y = 0; - TermInfo->FontWeight = FW_DONTCARE; + TermInfo->FontWeight = FW_NORMAL; // HACK: !! + // TermInfo->FontWeight = FW_DONTCARE; TermInfo->FullScreen = FALSE; TermInfo->ShowWindow = SW_SHOWNORMAL; @@ -230,7 +227,7 @@ GuiConsoleShowConsoleProperties(PGUI_CONSOLE_DATA GuiData, BOOL Defaults) { NTSTATUS Status; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer; PCONSOLE_PROCESS_DATA ProcessData; HANDLE hSection = NULL, hClientSection = NULL; @@ -418,99 +415,13 @@ Quit: return; } - - - -BOOL -ChangeFont(PGUI_CONSOLE_DATA GuiData, - LPWSTR FaceName, // Points to a WCHAR array of LF_FACESIZE elements. - ULONG FontFamily, - COORD FontSize, - ULONG FontWeight) -{ - HDC hDC; - HFONT OldFont, NewFont; - TEXTMETRICW Metrics; - SIZE CharSize; - SIZE_T Length; - - NewFont = CreateFontW(FontSize.Y, - 0, // FontSize.X, - 0, - TA_BASELINE, - FontWeight, - FALSE, - FALSE, - FALSE, - OEM_CHARSET, - OUT_DEFAULT_PRECIS, - CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, - FIXED_PITCH | FontFamily /* FF_DONTCARE */, - FaceName); - if (NewFont == NULL) - { - DPRINT1("ChangeFont: CreateFont failed\n"); - return FALSE; - } - - hDC = GetDC(GuiData->hWindow); - if (hDC == NULL) - { - DPRINT1("ChangeFont: GetDC failed\n"); - DeleteObject(NewFont); - return FALSE; - } - - OldFont = SelectObject(hDC, NewFont); - if (OldFont == NULL) - { - DPRINT1("ChangeFont: SelectObject failed\n"); - ReleaseDC(GuiData->hWindow, hDC); - DeleteObject(NewFont); - return FALSE; - } - - if (!GetTextMetricsW(hDC, &Metrics)) - { - DPRINT1("ChangeFont: GetTextMetrics failed\n"); - SelectObject(hDC, OldFont); - ReleaseDC(GuiData->hWindow, hDC); - DeleteObject(NewFont); - return FALSE; - } - GuiData->CharWidth = Metrics.tmMaxCharWidth; - GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; - - /* Measure real char width more precisely if possible. */ - if (GetTextExtentPoint32W(hDC, L"R", 1, &CharSize)) - GuiData->CharWidth = CharSize.cx; - - SelectObject(hDC, OldFont); - ReleaseDC(GuiData->hWindow, hDC); - - if (GuiData->Font != NULL) DeleteObject(GuiData->Font); - GuiData->Font = NewFont; - - Length = min(wcslen(FaceName) + 1, LF_FACESIZE); // wcsnlen - wcsncpy(GuiData->GuiInfo.FaceName, FaceName, LF_FACESIZE); - GuiData->GuiInfo.FaceName[Length] = L'\0'; // NULL-terminate - GuiData->GuiInfo.FontFamily = FontFamily; - GuiData->GuiInfo.FontSize = FontSize; - GuiData->GuiInfo.FontWeight = FontWeight; - - return TRUE; -} - - - VOID GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, HANDLE hClientSection, BOOL SaveSettings) { NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_PROCESS_DATA ProcessData; HANDLE hSection = NULL; ULONG ViewSize = 0; @@ -586,11 +497,11 @@ GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, // memcpy(&GuiData->GuiInfo, GuiInfo, sizeof(GUI_CONSOLE_INFO)); /* Change the font */ - ChangeFont(GuiData, - GuiInfo->FaceName, - GuiInfo->FontFamily, - GuiInfo->FontSize, - GuiInfo->FontWeight); + InitFonts(GuiData, + GuiInfo->FaceName, + GuiInfo->FontFamily, + GuiInfo->FontSize, + GuiInfo->FontWeight); // HACK, needed because changing font may change the size of the window /**/TermResizeTerminal(Console);/**/ @@ -654,7 +565,7 @@ GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, HANDLE hClientSection) { NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; PCONSOLE_PROCESS_DATA ProcessData; HANDLE hSection = NULL; ULONG ViewSize = 0; @@ -768,11 +679,11 @@ GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, // memcpy(&GuiData->GuiInfo, &GuiInfo, sizeof(GUI_CONSOLE_INFO)); /* Change the font */ - ChangeFont(GuiData, - GuiInfo.FaceName, - GuiInfo.FontFamily, - GuiInfo.FontSize, - GuiInfo.FontWeight); + InitFonts(GuiData, + GuiInfo.FaceName, + GuiInfo.FontFamily, + GuiInfo.FontSize, + GuiInfo.FontWeight); // HACK, needed because changing font may change the size of the window /**/TermResizeTerminal(Console);/**/ diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h index df95bdc28c2..593c14e5e2d 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h @@ -29,7 +29,6 @@ typedef struct _GUI_CONSOLE_INFO { - // FONTSIGNATURE FontSignature; WCHAR FaceName[LF_FACESIZE]; ULONG FontFamily; COORD FontSize; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c index 8b6bc26bd67..730d9a30c87 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c @@ -160,7 +160,7 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case PM_CREATE_CONSOLE: { PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)lParam; - PCONSOLE Console = GuiData->Console; + PCONSRV_CONSOLE Console = GuiData->Console; RECT rcWnd; DPRINT("PM_CREATE_CONSOLE -- creating window\n"); @@ -394,9 +394,9 @@ GuiInit(VOID) static VOID NTAPI GuiDeinitFrontEnd(IN OUT PFRONTEND This); -NTSTATUS NTAPI +static NTSTATUS NTAPI GuiInitFrontEnd(IN OUT PFRONTEND This, - IN PCONSOLE Console) + IN PCONSRV_CONSOLE Console) { PGUI_INIT_INFO GuiInitInfo; PCONSOLE_INFO ConsoleInfo; diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h index b70efa96a6f..8755cdd9f24 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h @@ -15,8 +15,23 @@ #include "conwnd.h" NTSTATUS GuiInitConsole(PCONSOLE Console, - /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, - PCONSOLE_INFO ConsoleInfo, - DWORD ProcessId, - LPCWSTR IconPath, - INT IconIndex); + /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, + PCONSOLE_INFO ConsoleInfo, + DWORD ProcessId, + LPCWSTR IconPath, + INT IconIndex); + +VOID +GuiConsoleMoveWindow(PGUI_CONSOLE_DATA GuiData); + +VOID +SwitchFullScreen(PGUI_CONSOLE_DATA GuiData, BOOL FullScreen); + +BOOL +InitFonts(PGUI_CONSOLE_DATA GuiData, + LPWSTR FaceName, // Points to a WCHAR array of LF_FACESIZE elements. + ULONG FontFamily, + COORD FontSize, + ULONG FontWeight); +VOID +DeleteFonts(PGUI_CONSOLE_DATA GuiData); diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c b/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c index 50ebbb6d899..ba38aaa10bb 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/gui/text.c @@ -25,7 +25,7 @@ /* FUNCTIONS ******************************************************************/ static COLORREF -PaletteRGBFromAttrib(PCONSOLE Console, WORD Attribute) +PaletteRGBFromAttrib(PCONSRV_CONSOLE Console, WORD Attribute) { HPALETTE hPalette = Console->ActiveBuffer->PaletteHandle; PALETTEENTRY pe; @@ -36,44 +36,6 @@ PaletteRGBFromAttrib(PCONSOLE Console, WORD Attribute) return PALETTERGB(pe.peRed, pe.peGreen, pe.peBlue); } -static HFONT -ChangeFontAttributes(PGUI_CONSOLE_DATA GuiData, - // COORD FontSize, - ULONG FontWeight, - BOOLEAN bItalic, - BOOLEAN bUnderline, - BOOLEAN bStrikeOut) -{ - HFONT NewFont; - LOGFONT lf; - - /* Initialize the LOGFONT structure */ - RtlZeroMemory(&lf, sizeof(lf)); - - /* Retrieve the details of the current font */ - if (GetObject(GuiData->Font, sizeof(lf), &lf) == 0) - return NULL; // GuiData->Font; - - /* Change the font attributes */ - // lf.lfHeight = FontSize.Y; - // lf.lfWidth = FontSize.X; - lf.lfWeight = FontWeight; - lf.lfItalic = bItalic; - lf.lfUnderline = bUnderline; - lf.lfStrikeOut = bStrikeOut; - - /* Build a new font */ - NewFont = CreateFontIndirect(&lf); - if (NewFont == NULL) - return NULL; // GuiData->Font; - - // FIXME: Do we need to update GuiData->CharWidth and GuiData->CharHeight ?? - - /* Select it (return the old font) */ - // return SelectObject(GuiData->hMemDC, NewFont); - return NewFont; -} - static VOID CopyBlock(PTEXTMODE_SCREEN_BUFFER Buffer, PSMALL_RECT Selection) @@ -309,7 +271,7 @@ GuiPasteToTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, * This function supposes that the system clipboard was opened. */ - PCONSOLE Console = Buffer->Header.Console; + PCONSRV_CONSOLE Console = Buffer->Header.Console; HANDLE hData; LPWSTR str; @@ -377,7 +339,7 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, PRECT rcView, PRECT rcFramebuffer) { - PCONSOLE Console = Buffer->Header.Console; + PCONSRV_CONSOLE Console = Buffer->Header.Console; // ASSERT(Console == GuiData->Console); ULONG TopLine, BottomLine, LeftChar, RightChar; @@ -388,7 +350,7 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, ULONG CursorX, CursorY, CursorHeight; HBRUSH CursorBrush, OldBrush; HFONT OldFont, NewFont; - BOOLEAN IsUnderscore; + BOOLEAN IsUnderline; if (Buffer->Buffer == NULL) return; @@ -412,17 +374,10 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, SetTextColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, TextAttribFromAttrib(LastAttribute))); SetBkColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, BkgdAttribFromAttrib(LastAttribute))); - // OldFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, FALSE, FALSE, FALSE); - IsUnderscore = !!(LastAttribute & COMMON_LVB_UNDERSCORE); - NewFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, - FALSE, - IsUnderscore, - FALSE); - if (NewFont == NULL) - { - DPRINT1("ChangeFontAttributes failed, use the original font\n"); - NewFont = GuiData->Font; - } + /* We use the underscore flag as a underline flag */ + IsUnderline = !!(LastAttribute & COMMON_LVB_UNDERSCORE); + /* Select the new font */ + NewFont = GuiData->Font[IsUnderline ? FONT_BOLD : FONT_NORMAL]; OldFont = SelectObject(GuiData->hMemDC, NewFont); for (Line = TopLine; Line <= BottomLine; Line++) @@ -454,25 +409,12 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, SetTextColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, TextAttribFromAttrib(LastAttribute))); SetBkColor(GuiData->hMemDC, PaletteRGBFromAttrib(Console, BkgdAttribFromAttrib(LastAttribute))); - /* Change underscore state if needed */ - if (!!(LastAttribute & COMMON_LVB_UNDERSCORE) != IsUnderscore) + /* Change underline state if needed */ + if (!!(LastAttribute & COMMON_LVB_UNDERSCORE) != IsUnderline) { - IsUnderscore = !!(LastAttribute & COMMON_LVB_UNDERSCORE); - - /* Delete the font we used up to now */ - // SelectObject(GuiData->hMemDC, OldFont); - if (NewFont != GuiData->Font) DeleteObject(NewFont); - /* Recreate it */ - NewFont = ChangeFontAttributes(GuiData, /* {0}, */ GuiData->GuiInfo.FontWeight, - FALSE, - IsUnderscore, - FALSE); - if (NewFont == NULL) - { - DPRINT1("ChangeFontAttributes failed, use the original font\n"); - NewFont = GuiData->Font; - } - /* Select it */ + IsUnderline = !!(LastAttribute & COMMON_LVB_UNDERSCORE); + /* Select the new font */ + NewFont = GuiData->Font[IsUnderline ? FONT_BOLD : FONT_NORMAL]; /* OldFont = */ SelectObject(GuiData->hMemDC, NewFont); } } @@ -488,6 +430,9 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, RightChar - Start + 1); } + /* Restore the old font */ + SelectObject(GuiData->hMemDC, OldFont); + /* * Draw the caret */ @@ -520,10 +465,6 @@ GuiPaintTextModeBuffer(PTEXTMODE_SCREEN_BUFFER Buffer, } } - /* Restore the old font and delete the font we used up to now */ - SelectObject(GuiData->hMemDC, OldFont); - if (NewFont != GuiData->Font) DeleteObject(NewFont); - LeaveCriticalSection(&Console->Lock); } diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/input.c b/reactos/win32ss/user/winsrv/consrv/frontends/input.c index 2fb6f3b8071..b2c17042eb1 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/input.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/input.c @@ -126,7 +126,7 @@ ConioGetShiftState(PBYTE KeyState, LPARAM lParam) } VOID NTAPI -ConioProcessKey(PCONSOLE Console, MSG* msg) +ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg) { static BYTE KeyState[256] = { 0 }; /* MSDN mentions that you should use the last virtual key code received @@ -205,7 +205,7 @@ ConioProcessKey(PCONSOLE Console, MSG* msg) } DWORD -ConioEffectiveCursorSize(PCONSOLE Console, DWORD Scale) +ConioEffectiveCursorSize(PCONSRV_CONSOLE Console, DWORD Scale) { DWORD Size = (Console->ActiveBuffer->CursorInfo.dwSize * Scale + 99) / 100; /* If line input in progress, perhaps adjust for insert toggle */ diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c b/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c index 1231148afb5..3e2bed71c3d 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c +++ b/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c @@ -35,7 +35,7 @@ typedef struct _TUI_CONSOLE_DATA HWND hWindow; /* Handle to the console's window (used for the window's procedure */ - PCONSOLE Console; /* Pointer to the owned console */ + PCONSRV_CONSOLE Console; /* Pointer to the owned console */ // TUI_CONSOLE_INFO TuiInfo; /* TUI terminal settings */ } TUI_CONSOLE_DATA, *PTUI_CONSOLE_DATA; @@ -261,7 +261,7 @@ TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { /* PTUI_CONSOLE_DATA TuiData = NULL; - PCONSOLE Console = NULL; + PCONSRV_CONSOLE Console = NULL; TuiData = TuiGetGuiData(hWnd); if (TuiData == NULL) return 0; @@ -330,7 +330,7 @@ static DWORD NTAPI TuiConsoleThread(PVOID Data) { PTUI_CONSOLE_DATA TuiData = (PTUI_CONSOLE_DATA)Data; - PCONSOLE Console = TuiData->Console; + PCONSRV_CONSOLE Console = TuiData->Console; HWND NewWindow; MSG msg; @@ -458,11 +458,11 @@ Quit: static VOID NTAPI TuiDeinitFrontEnd(IN OUT PFRONTEND This /*, - IN PCONSOLE Console */); + IN PCONSRV_CONSOLE Console */); -NTSTATUS NTAPI +static NTSTATUS NTAPI TuiInitFrontEnd(IN OUT PFRONTEND This, - IN PCONSOLE Console) + IN PCONSRV_CONSOLE Console) { PTUI_CONSOLE_DATA TuiData; HANDLE ThreadHandle; @@ -539,7 +539,7 @@ TuiInitFrontEnd(IN OUT PFRONTEND This, static VOID NTAPI TuiDeinitFrontEnd(IN OUT PFRONTEND This) { - // PCONSOLE Console = This->Console; + // PCONSRV_CONSOLE Console = This->Console; PTUI_CONSOLE_DATA TuiData = This->Data; // Console->FrontEndIFace.Data; /* Close the notification window */ diff --git a/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h b/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h index 2a176dc6cfe..84be2f7cc5a 100644 --- a/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h +++ b/reactos/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h @@ -12,8 +12,8 @@ #pragma once NTSTATUS TuiInitConsole(PCONSOLE Console, - /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, - PCONSOLE_INFO ConsoleInfo, - DWORD ProcessId); + /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, + PCONSOLE_INFO ConsoleInfo, + DWORD ProcessId); /* EOF */ diff --git a/reactos/win32ss/user/winsrv/consrv/handle.c b/reactos/win32ss/user/winsrv/consrv/handle.c index a114411fc80..4c74ab15a3e 100644 --- a/reactos/win32ss/user/winsrv/consrv/handle.c +++ b/reactos/win32ss/user/winsrv/consrv/handle.c @@ -482,7 +482,7 @@ ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, { NTSTATUS Status = STATUS_SUCCESS; HANDLE ConsoleHandle; - PCONSOLE Console; + PCONSRV_CONSOLE Console; /* * We are about to create a new console. However when ConSrvNewProcess diff --git a/reactos/win32ss/user/winsrv/consrv/include/conio.h b/reactos/win32ss/user/winsrv/consrv/include/conio.h index 8d3dc9f6a4d..fc9d4ebd9a2 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/conio.h +++ b/reactos/win32ss/user/winsrv/consrv/include/conio.h @@ -12,21 +12,11 @@ #include "rect.h" -#define CSR_DEFAULT_CURSOR_SIZE 25 - /* Default attributes */ #define DEFAULT_SCREEN_ATTRIB (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED) #define DEFAULT_POPUP_ATTRIB (FOREGROUND_BLUE | FOREGROUND_RED | \ BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY) -/* VGA character cell */ -typedef struct _CHAR_CELL -{ - CHAR Char; - BYTE Attributes; -} CHAR_CELL, *PCHAR_CELL; -C_ASSERT(sizeof(CHAR_CELL) == 2); - /* Object type magic numbers */ typedef enum _CONSOLE_IO_OBJECT_TYPE @@ -272,7 +262,6 @@ typedef enum _CONSOLE_STATE // HACK!! struct _CONSOLE; -struct _WINSRV_CONSOLE; /* HACK: */ typedef struct _CONSOLE *PCONSOLE; #include "conio_winsrv.h" @@ -294,7 +283,7 @@ typedef struct _CONSOLE CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ UINT InputCodePage; - /** Put those things in CONSOLE_INPUT_BUFFER ?? **/ + /** Put those things in CONSOLE_INPUT_BUFFER in PWINSRV_CONSOLE ?? **/ PWCHAR LineBuffer; /* Current line being input, in line buffered mode */ ULONG LineMaxSize; /* Maximum size of line in characters (including CR+LF) */ ULONG LineSize; /* Current size of line */ @@ -303,26 +292,16 @@ typedef struct _CONSOLE BOOLEAN LineUpPressed; BOOLEAN LineInsertToggle; /* Replace character over cursor instead of inserting */ ULONG LineWakeupMask; /* Bitmap of which control characters will end line input */ - /*************************************************/ + /** In PWINSRV_CONSOLE ?? **/ BOOLEAN InsertMode; + /*************************************************/ /******************************* Screen buffers *******************************/ LIST_ENTRY BufferList; /* List of all screen buffers for this console */ PCONSOLE_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ UINT OutputCodePage; - /**** Per-console Virtual DOS Machine Text-mode Buffer ****/ - COORD VDMBufferSize; /* Real size of the VDM buffer, in units of ??? */ - HANDLE VDMBufferSection; /* Handle to the memory shared section for the VDM buffer */ - PVOID VDMBuffer; /* Our VDM buffer */ - PVOID ClientVDMBuffer; /* A copy of the client view of our VDM buffer */ - HANDLE VDMClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ - - HANDLE StartHardwareEvent; - HANDLE EndHardwareEvent; - HANDLE ErrorHardwareEvent; - /****************************** Other properties ******************************/ UNICODE_STRING OriginalTitle; /* Original title of console, the one defined when the console leader is launched; it never changes. Always NULL-terminated */ UNICODE_STRING Title; /* Title of console. Always NULL-terminated */ @@ -332,30 +311,19 @@ typedef struct _CONSOLE COORD ConsoleSize; /* The current size of the console, for text-mode only */ BOOLEAN FixedSize; /* TRUE if the console is of fixed size */ - COLORREF Colors[16]; /* Colour palette */ - } CONSOLE; // , *PCONSOLE; -// #include "conio_winsrv.h" - /* console.c */ VOID NTAPI ConDrvPause(PCONSOLE Console); VOID NTAPI ConDrvUnpause(PCONSOLE Console); -PCONSOLE_PROCESS_DATA NTAPI -ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console); NTSTATUS ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData); -NTSTATUS NTAPI -ConSrvConsoleProcessCtrlEvent(IN PCONSOLE Console, - IN ULONG ProcessGroupId, - IN ULONG CtrlEvent); /* coninput.c */ -VOID NTAPI ConioProcessKey(PCONSOLE Console, MSG* msg); NTSTATUS ConioAddInputEvents(PCONSOLE Console, PINPUT_RECORD InputRecords, @@ -392,7 +360,5 @@ NTSTATUS ConioWriteConsole(PCONSOLE Console, PWCHAR Buffer, DWORD Length, BOOL Attrib); -DWORD ConioEffectiveCursorSize(PCONSOLE Console, - DWORD Scale); /* EOF */ diff --git a/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h b/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h index 4669dae0255..d7be50e4e75 100644 --- a/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h +++ b/reactos/win32ss/user/winsrv/consrv/include/conio_winsrv.h @@ -12,8 +12,28 @@ #include "rect.h" +// This is ALMOST a HACK!!!!!!! +// Helpers for code refactoring +#define _CONSRV_CONSOLE _CONSOLE +#define CONSRV_CONSOLE CONSOLE +#define PCONSRV_CONSOLE PCONSOLE + +// #define _CONSRV_CONSOLE _WINSRV_CONSOLE +// #define CONSRV_CONSOLE WINSRV_CONSOLE +// #define PCONSRV_CONSOLE PWINSRV_CONSOLE + + #define CSR_DEFAULT_CURSOR_SIZE 25 +/* VGA character cell */ +typedef struct _CHAR_CELL +{ + CHAR Char; + BYTE Attributes; +} CHAR_CELL, *PCHAR_CELL; +C_ASSERT(sizeof(CHAR_CELL) == 2); + + typedef struct _FRONTEND FRONTEND, *PFRONTEND; /* HACK: */ typedef struct _CONSOLE_INFO *PCONSOLE_INFO; typedef struct _FRONTEND_VTBL @@ -24,7 +44,7 @@ typedef struct _FRONTEND_VTBL * Internal interface (functions called by the console server only) */ NTSTATUS (NTAPI *InitFrontEnd)(IN OUT PFRONTEND This, - IN struct _CONSOLE* Console); + IN struct _CONSRV_CONSOLE* Console); VOID (NTAPI *DeinitFrontEnd)(IN OUT PFRONTEND This); /* Interface used for both text-mode and graphics screen buffers */ @@ -83,8 +103,7 @@ struct _FRONTEND PFRONTEND_VTBL Vtbl; /* Virtual table */ NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); - // struct _WINSRV_CONSOLE* - struct _CONSOLE* Console; /* Console to which the frontend is attached to */ + struct _CONSRV_CONSOLE* Console; /* Console to which the frontend is attached to */ PVOID Data; /* Private data */ PVOID OldData; /* Reserved */ }; @@ -99,6 +118,7 @@ typedef struct _WINSRV_CONSOLE /******************************* Console Set-up *******************************/ /* This **MUST** be FIRST!! */ // CONSOLE; + // PCONSOLE Console; // LONG ReferenceCount; /* Is incremented each time a handle to something in the console (a screen-buffer or the input buffer of this console) gets referenced */ // CRITICAL_SECTION Lock; @@ -125,35 +145,49 @@ typedef struct _WINSRV_CONSOLE ULONG NumberOfHistoryBuffers; /* Maximum number of history buffers allowed */ BOOLEAN HistoryNoDup; /* Remove old duplicate history entries */ +/************************ Virtual DOS Machine support *************************/ + COORD VDMBufferSize; /* Real size of the VDM buffer, in units of ??? */ + HANDLE VDMBufferSection; /* Handle to the memory shared section for the VDM buffer */ + PVOID VDMBuffer; /* Our VDM buffer */ + PVOID ClientVDMBuffer; /* A copy of the client view of our VDM buffer */ + HANDLE VDMClientProcess; /* Handle to the client process who opened the buffer, to unmap the view */ + + HANDLE StartHardwareEvent; + HANDLE EndHardwareEvent; + HANDLE ErrorHardwareEvent; + +/****************************** Other properties ******************************/ + COLORREF Colors[16]; /* Colour palette */ + } WINSRV_CONSOLE, *PWINSRV_CONSOLE; /* console.c */ -VOID ConioPause(PCONSOLE Console, UINT Flags); -VOID ConioUnpause(PCONSOLE Console, UINT Flags); +VOID ConioPause(PCONSRV_CONSOLE Console, UINT Flags); +VOID ConioUnpause(PCONSRV_CONSOLE Console, UINT Flags); PCONSOLE_PROCESS_DATA NTAPI -ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console); +ConSrvGetConsoleLeaderProcess(IN PCONSRV_CONSOLE Console); NTSTATUS ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData); NTSTATUS NTAPI -ConSrvConsoleProcessCtrlEvent(IN PCONSOLE Console, +ConSrvConsoleProcessCtrlEvent(IN PCONSRV_CONSOLE Console, IN ULONG ProcessGroupId, IN ULONG CtrlEvent); /* coninput.c */ -VOID NTAPI ConioProcessKey(PCONSOLE Console, MSG* msg); -DWORD ConioEffectiveCursorSize(PCONSOLE Console, +VOID NTAPI ConioProcessKey(PCONSRV_CONSOLE Console, MSG* msg); +DWORD ConioEffectiveCursorSize(PCONSRV_CONSOLE Console, DWORD Scale); NTSTATUS -ConioAddInputEvents(PCONSOLE Console, +ConioAddInputEvents(PCONSRV_CONSOLE Console, PINPUT_RECORD InputRecords, ULONG NumEventsToWrite, PULONG NumEventsWritten, BOOLEAN AppendToEnd); NTSTATUS -ConioProcessInputEvent(PCONSOLE Console, +ConioProcessInputEvent(PCONSRV_CONSOLE Console, PINPUT_RECORD InputEvent); /* conoutput.c */ @@ -173,11 +207,11 @@ ConioProcessInputEvent(PCONSOLE Console, MultiByteToWideChar((Console)->OutputCodePage, 0, (sChar), 1, (dWChar), 1) PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); -VOID ConioDrawConsole(PCONSOLE Console); -NTSTATUS ConioResizeBuffer(PCONSOLE Console, +VOID ConioDrawConsole(PCONSRV_CONSOLE Console); +NTSTATUS ConioResizeBuffer(PCONSRV_CONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size); -NTSTATUS ConioWriteConsole(PCONSOLE Console, +NTSTATUS ConioWriteConsole(PCONSRV_CONSOLE Console, PTEXTMODE_SCREEN_BUFFER Buff, PWCHAR Buffer, DWORD Length, diff --git a/reactos/win32ss/user/winsrv/consrv/lineinput.c b/reactos/win32ss/user/winsrv/consrv/lineinput.c index c3ae65e6edb..e60ff4c1135 100644 --- a/reactos/win32ss/user/winsrv/consrv/lineinput.c +++ b/reactos/win32ss/user/winsrv/consrv/lineinput.c @@ -43,7 +43,7 @@ ConvertInputUnicodeToAnsi(PCONSOLE Console, /* PRIVATE FUNCTIONS **********************************************************/ static PHISTORY_BUFFER -HistoryCurrentBuffer(PCONSOLE Console, +HistoryCurrentBuffer(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName) { PLIST_ENTRY Entry = Console->HistoryBuffers.Flink; @@ -75,7 +75,7 @@ HistoryCurrentBuffer(PCONSOLE Console, } static VOID -HistoryAddEntry(PCONSOLE Console, +HistoryAddEntry(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName) { UNICODE_STRING NewEntry; @@ -127,7 +127,7 @@ HistoryAddEntry(PCONSOLE Console, } static VOID -HistoryGetCurrentEntry(PCONSOLE Console, +HistoryGetCurrentEntry(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, PUNICODE_STRING Entry) { @@ -140,7 +140,7 @@ HistoryGetCurrentEntry(PCONSOLE Console, } static PHISTORY_BUFFER -HistoryFindBuffer(PCONSOLE Console, +HistoryFindBuffer(PCONSRV_CONSOLE Console, PVOID ExeName, USHORT ExeLength, BOOLEAN UnicodeExe) @@ -202,7 +202,7 @@ HistoryDeleteBuffer(PHISTORY_BUFFER Hist) } VOID -HistoryDeleteBuffers(PCONSOLE Console) +HistoryDeleteBuffers(PCONSRV_CONSOLE Console) { PLIST_ENTRY CurrentEntry; PHISTORY_BUFFER HistoryBuffer; @@ -216,7 +216,7 @@ HistoryDeleteBuffers(PCONSOLE Console) } static VOID -LineInputSetPos(PCONSOLE Console, UINT Pos) +LineInputSetPos(PCONSRV_CONSOLE Console, UINT Pos) { if (Pos != Console->LinePos && Console->InputBuffer.Mode & ENABLE_ECHO_INPUT) { @@ -240,7 +240,7 @@ LineInputSetPos(PCONSOLE Console, UINT Pos) } static VOID -LineInputEdit(PCONSOLE Console, UINT NumToDelete, UINT NumToInsert, PWCHAR Insertion) +LineInputEdit(PCONSRV_CONSOLE Console, UINT NumToDelete, UINT NumToInsert, PWCHAR Insertion) { PTEXTMODE_SCREEN_BUFFER ActiveBuffer; UINT Pos = Console->LinePos; @@ -277,7 +277,7 @@ LineInputEdit(PCONSOLE Console, UINT NumToDelete, UINT NumToInsert, PWCHAR Inser } static VOID -LineInputRecallHistory(PCONSOLE Console, +LineInputRecallHistory(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, INT Offset) { @@ -297,7 +297,7 @@ LineInputRecallHistory(PCONSOLE Console, } VOID -LineInputKeyDown(PCONSOLE Console, +LineInputKeyDown(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, KEY_EVENT_RECORD *KeyEvent) { @@ -511,7 +511,7 @@ CSR_API(SrvGetConsoleCommandHistory) { NTSTATUS Status; PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; ULONG BytesWritten = 0; PHISTORY_BUFFER Hist; @@ -599,7 +599,7 @@ CSR_API(SrvGetConsoleCommandHistoryLength) { NTSTATUS Status; PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLengthRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PHISTORY_BUFFER Hist; ULONG Length = 0; UINT i; @@ -641,7 +641,7 @@ CSR_API(SrvExpungeConsoleCommandHistory) { NTSTATUS Status; PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistoryRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PHISTORY_BUFFER Hist; if (!CsrValidateMessageBuffer(ApiMessage, @@ -669,7 +669,7 @@ CSR_API(SrvSetConsoleNumberOfCommands) { NTSTATUS Status; PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommandsRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; PHISTORY_BUFFER Hist; if (!CsrValidateMessageBuffer(ApiMessage, @@ -720,7 +720,7 @@ CSR_API(SrvGetConsoleHistory) { #if 0 // Vista+ PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; NTSTATUS Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (NT_SUCCESS(Status)) { @@ -740,7 +740,7 @@ CSR_API(SrvSetConsoleHistory) { #if 0 // Vista+ PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; NTSTATUS Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (NT_SUCCESS(Status)) { @@ -760,7 +760,7 @@ CSR_API(SrvSetConsoleCommandHistoryMode) { NTSTATUS Status; PCONSOLE_SETHISTORYMODE SetHistoryModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryModeRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; DPRINT1("SrvSetConsoleCommandHistoryMode(Mode = %d) is not yet implemented\n", SetHistoryModeRequest->Mode); diff --git a/reactos/win32ss/user/winsrv/consrv/lineinput.h b/reactos/win32ss/user/winsrv/consrv/lineinput.h index afb6d25f216..55511a0f758 100644 --- a/reactos/win32ss/user/winsrv/consrv/lineinput.h +++ b/reactos/win32ss/user/winsrv/consrv/lineinput.h @@ -8,9 +8,9 @@ #pragma once -VOID HistoryDeleteBuffers(PCONSOLE Console); +VOID HistoryDeleteBuffers(PCONSRV_CONSOLE Console); VOID -LineInputKeyDown(PCONSOLE Console, +LineInputKeyDown(PCONSRV_CONSOLE Console, PUNICODE_STRING ExeName, KEY_EVENT_RECORD *KeyEvent); diff --git a/reactos/win32ss/user/winsrv/consrv/subsysreg.c b/reactos/win32ss/user/winsrv/consrv/subsysreg.c index 40f974040c1..e49f06ecf35 100644 --- a/reactos/win32ss/user/winsrv/consrv/subsysreg.c +++ b/reactos/win32ss/user/winsrv/consrv/subsysreg.c @@ -23,7 +23,7 @@ CSR_API(SrvRegisterConsoleVDM) { NTSTATUS Status; PCONSOLE_REGISTERVDM RegisterVDMRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.RegisterVDMRequest; - PCONSOLE Console; + PCONSRV_CONSOLE Console; DPRINT1("SrvRegisterConsoleVDM(%d)\n", RegisterVDMRequest->RegisterFlags); From f46c30d54816512e2f32355ffde2631336a30e60 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Thu, 14 Aug 2014 22:43:10 +0000 Subject: [PATCH 24/55] [SHELL32] - Don't fail on NULL array pointer if count is zero CORE-8443 #resolve svn path=/trunk/; revision=63887 --- reactos/dll/win32/shell32/defcontextmenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/win32/shell32/defcontextmenu.cpp b/reactos/dll/win32/shell32/defcontextmenu.cpp index 7d4f02e3210..94863d7f35a 100644 --- a/reactos/dll/win32/shell32/defcontextmenu.cpp +++ b/reactos/dll/win32/shell32/defcontextmenu.cpp @@ -150,7 +150,7 @@ HRESULT WINAPI CDefaultContextMenu::Initialize(const DEFCONTEXTMENU *pdcm) m_cidl = pdcm->cidl; m_apidl = const_cast(_ILCopyaPidl(pdcm->apidl, m_cidl)); - if (!m_apidl) + if (m_cidl && !m_apidl) return E_OUTOFMEMORY; m_psf = pdcm->psf; m_psf->AddRef(); From a42c7bc31b7e28fb17c3e7d4af2e726927a1d215 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 15 Aug 2014 10:33:54 +0000 Subject: [PATCH 25/55] [SHELL32] - Fix ITEMIDLIST typing in IShellFolder/IShellFolder2 implementations CORE-8441 svn path=/trunk/; revision=63889 --- reactos/include/psdk/shobjidl.idl | 6 +++--- reactos/include/psdk/shtypes.idl | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/reactos/include/psdk/shobjidl.idl b/reactos/include/psdk/shobjidl.idl index 55fa6e37019..b8689c7a19a 100644 --- a/reactos/include/psdk/shobjidl.idl +++ b/reactos/include/psdk/shobjidl.idl @@ -215,7 +215,7 @@ interface IShellFolder : IUnknown [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, - [out] LPITEMIDLIST *ppidl, + [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes); HRESULT EnumObjects( @@ -332,8 +332,8 @@ interface IShellFolder2 : IShellFolder HRESULT EnumSearches( [out] IEnumExtraSearch **ppenum ); HRESULT GetDefaultColumn( [in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay ); HRESULT GetDefaultColumnState( [in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags ); - HRESULT GetDetailsEx( [in] LPCITEMIDLIST pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv); - HRESULT GetDetailsOf( [in] LPCITEMIDLIST pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd); + HRESULT GetDetailsEx( [in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv); + HRESULT GetDetailsOf( [in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd); HRESULT MapColumnToSCID( [in] UINT iColumn, [in] SHCOLUMNID *pscid ); } diff --git a/reactos/include/psdk/shtypes.idl b/reactos/include/psdk/shtypes.idl index a8ee1311289..1161bad138b 100644 --- a/reactos/include/psdk/shtypes.idl +++ b/reactos/include/psdk/shtypes.idl @@ -38,6 +38,7 @@ typedef LPITEMIDLIST PITEMID_CHILD; typedef const PITEMID_CHILD PCITEMID_CHILD; typedef LPCITEMIDLIST PCUITEMID_CHILD; typedef LPCITEMIDLIST *PCUITEMID_CHILD_ARRAY; +typedef LPITEMIDLIST PIDLIST_RELATIVE; typedef LPCITEMIDLIST PCUIDLIST_RELATIVE; typedef LPITEMIDLIST PIDLIST_ABSOLUTE; typedef LPCITEMIDLIST PCIDLIST_ABSOLUTE; From cb5f28caf10710695577fec0bc641f37267d28ae Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 15 Aug 2014 10:38:11 +0000 Subject: [PATCH 26/55] [SHELL32] - ACTUALLY fix ITEMIDLIST typing in IShellFolder/IShellFolder2 implementations CORE-8441 svn path=/trunk/; revision=63890 --- .../dll/win32/shell32/folders/admintools.cpp | 22 ++++++++-------- .../dll/win32/shell32/folders/admintools.h | 20 +++++++------- reactos/dll/win32/shell32/folders/cpanel.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/cpanel.h | 20 +++++++------- reactos/dll/win32/shell32/folders/desktop.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/desktop.h | 20 +++++++------- reactos/dll/win32/shell32/folders/fonts.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/fonts.h | 20 +++++++------- reactos/dll/win32/shell32/folders/fs.cpp | 26 ++++++++++--------- reactos/dll/win32/shell32/folders/fs.h | 20 +++++++------- reactos/dll/win32/shell32/folders/mycomp.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/mycomp.h | 20 +++++++------- .../dll/win32/shell32/folders/mydocuments.cpp | 24 ++++++++--------- .../dll/win32/shell32/folders/mydocuments.h | 20 +++++++------- .../dll/win32/shell32/folders/netplaces.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/netplaces.h | 20 +++++++------- .../dll/win32/shell32/folders/printers.cpp | 22 ++++++++-------- reactos/dll/win32/shell32/folders/printers.h | 20 +++++++------- .../dll/win32/shell32/folders/recyclebin.cpp | 22 ++++++++-------- .../dll/win32/shell32/folders/recyclebin.h | 20 +++++++------- 20 files changed, 214 insertions(+), 212 deletions(-) diff --git a/reactos/dll/win32/shell32/folders/admintools.cpp b/reactos/dll/win32/shell32/folders/admintools.cpp index 0e93a4f2160..bbd5092eda1 100644 --- a/reactos/dll/win32/shell32/folders/admintools.cpp +++ b/reactos/dll/win32/shell32/folders/admintools.cpp @@ -116,7 +116,7 @@ HRESULT WINAPI CAdminToolsFolder::FinalConstruct() * */ HRESULT WINAPI CAdminToolsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) + DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), @@ -167,7 +167,7 @@ HRESULT WINAPI CAdminToolsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPE /************************************************************************** * CAdminToolsFolder::BindToObject */ -HRESULT WINAPI CAdminToolsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CAdminToolsFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -178,7 +178,7 @@ HRESULT WINAPI CAdminToolsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReser /************************************************************************** * CAdminToolsFolder::BindToStorage */ -HRESULT WINAPI CAdminToolsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CAdminToolsFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -190,7 +190,7 @@ HRESULT WINAPI CAdminToolsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcRese /************************************************************************** * CAdminToolsFolder::CompareIDs */ -HRESULT WINAPI CAdminToolsFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CAdminToolsFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -234,7 +234,7 @@ HRESULT WINAPI CAdminToolsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, /************************************************************************** * ISF_AdminTools_fnGetAttributesOf */ -HRESULT WINAPI CAdminToolsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) +HRESULT WINAPI CAdminToolsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { HRESULT hr = S_OK; static const DWORD dwAdminToolsAttributes = @@ -286,7 +286,7 @@ HRESULT WINAPI CAdminToolsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apid * LPVOID* ppvObject) //[out] Resulting Interface * */ -HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, +HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { LPITEMIDLIST pidl; @@ -349,7 +349,7 @@ HRESULT WINAPI CAdminToolsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCIT * CAdminToolsFolder::GetDisplayNameOf * */ -HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { HRESULT hr = S_OK; LPWSTR pszPath, pOffset; @@ -451,8 +451,8 @@ HRESULT WINAPI CAdminToolsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwF * DWORD dwFlags, //[in ] SHGNO formatting flags * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned */ -HRESULT WINAPI CAdminToolsFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CAdminToolsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); @@ -490,14 +490,14 @@ HRESULT WINAPI CAdminToolsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcs } -HRESULT WINAPI CAdminToolsFolder::GetDetailsEx (LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CAdminToolsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME ("(%p): stub\n", this); return E_NOTIMPL; } -HRESULT WINAPI CAdminToolsFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CAdminToolsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; diff --git a/reactos/dll/win32/shell32/folders/admintools.h b/reactos/dll/win32/shell32/folders/admintools.h index 7c3a8361504..ace708a8b34 100644 --- a/reactos/dll/win32/shell32/folders/admintools.h +++ b/reactos/dll/win32/shell32/folders/admintools.h @@ -41,24 +41,24 @@ class CAdminToolsFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/cpanel.cpp b/reactos/dll/win32/shell32/folders/cpanel.cpp index cf0c9cf448d..54c91fbe569 100644 --- a/reactos/dll/win32/shell32/folders/cpanel.cpp +++ b/reactos/dll/win32/shell32/folders/cpanel.cpp @@ -312,7 +312,7 @@ HRESULT WINAPI CControlPanelFolder::ParseDisplayName( LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, - LPITEMIDLIST *ppidl, + PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { WCHAR szElement[MAX_PATH]; @@ -408,7 +408,7 @@ HRESULT WINAPI CControlPanelFolder::EnumObjects( * CControlPanelFolder::BindToObject */ HRESULT WINAPI CControlPanelFolder::BindToObject( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) @@ -422,7 +422,7 @@ HRESULT WINAPI CControlPanelFolder::BindToObject( * CControlPanelFolder::BindToStorage */ HRESULT WINAPI CControlPanelFolder::BindToStorage( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) @@ -437,7 +437,7 @@ HRESULT WINAPI CControlPanelFolder::BindToStorage( * CControlPanelFolder::CompareIDs */ -HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CControlPanelFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -480,7 +480,7 @@ HRESULT WINAPI CControlPanelFolder::CreateViewObject(HWND hwndOwner, REFIID riid /************************************************************************** * CControlPanelFolder::GetAttributesOf */ -HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut) { HRESULT hr = S_OK; @@ -522,7 +522,7 @@ HRESULT WINAPI CControlPanelFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * a * */ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner, - UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) + UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { LPITEMIDLIST pidl; IUnknown *pObj = NULL; @@ -576,7 +576,7 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner, /************************************************************************** * CControlPanelFolder::GetDisplayNameOf */ -HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { CHAR szName[MAX_PATH]; WCHAR wszName[MAX_PATH+1]; /* +1 for potential backslash */ @@ -656,8 +656,8 @@ HRESULT WINAPI CControlPanelFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD d * DWORD dwFlags, //[in ] SHGNO formatting flags * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned */ -HRESULT WINAPI CControlPanelFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CControlPanelFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); return E_FAIL; @@ -693,13 +693,13 @@ HRESULT WINAPI CControlPanelFolder::GetDefaultColumnState(UINT iColumn, DWORD *p return S_OK; } -HRESULT WINAPI CControlPanelFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CControlPanelFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME("(%p)\n", this); return E_NOTIMPL; } -HRESULT WINAPI CControlPanelFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CControlPanelFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { HRESULT hr; diff --git a/reactos/dll/win32/shell32/folders/cpanel.h b/reactos/dll/win32/shell32/folders/cpanel.h index 0d3b6d9559e..b4d8cc7b5f3 100644 --- a/reactos/dll/win32/shell32/folders/cpanel.h +++ b/reactos/dll/win32/shell32/folders/cpanel.h @@ -46,24 +46,24 @@ class CControlPanelFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/desktop.cpp b/reactos/dll/win32/shell32/folders/desktop.cpp index 4f5ca9fe0c7..83093286574 100644 --- a/reactos/dll/win32/shell32/folders/desktop.cpp +++ b/reactos/dll/win32/shell32/folders/desktop.cpp @@ -300,7 +300,7 @@ HRESULT WINAPI CDesktopFolder::ParseDisplayName( LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, - LPITEMIDLIST *ppidl, + PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { WCHAR szElement[MAX_PATH]; @@ -462,7 +462,7 @@ HRESULT WINAPI CDesktopFolder::EnumObjects( * CDesktopFolder::BindToObject */ HRESULT WINAPI CDesktopFolder::BindToObject( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) @@ -477,7 +477,7 @@ HRESULT WINAPI CDesktopFolder::BindToObject( * CDesktopFolder::BindToStorage */ HRESULT WINAPI CDesktopFolder::BindToStorage( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) @@ -492,7 +492,7 @@ HRESULT WINAPI CDesktopFolder::BindToStorage( /************************************************************************** * CDesktopFolder::CompareIDs */ -HRESULT WINAPI CDesktopFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CDesktopFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -545,7 +545,7 @@ HRESULT WINAPI CDesktopFolder::CreateViewObject( */ HRESULT WINAPI CDesktopFolder::GetAttributesOf( UINT cidl, - LPCITEMIDLIST *apidl, + PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { HRESULT hr = S_OK; @@ -609,7 +609,7 @@ HRESULT WINAPI CDesktopFolder::GetAttributesOf( HRESULT WINAPI CDesktopFolder::GetUIObjectOf( HWND hwndOwner, UINT cidl, - LPCITEMIDLIST *apidl, + PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) @@ -679,7 +679,7 @@ HRESULT WINAPI CDesktopFolder::GetUIObjectOf( * NOTES * special case: pidl = null gives desktop-name back */ -HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { HRESULT hr = S_OK; LPWSTR pszPath; @@ -854,10 +854,10 @@ HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlag */ HRESULT WINAPI CDesktopFolder::SetNameOf( HWND hwndOwner, - LPCITEMIDLIST pidl, /* simple pidl */ + PCUITEMID_CHILD pidl, /* simple pidl */ LPCOLESTR lpName, DWORD dwFlags, - LPITEMIDLIST *pPidlOut) + PITEMID_CHILD *pPidlOut) { CComPtr psf; HRESULT hr; @@ -963,7 +963,7 @@ HRESULT WINAPI CDesktopFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFla } HRESULT WINAPI CDesktopFolder::GetDetailsEx( - LPCITEMIDLIST pidl, + PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { @@ -973,7 +973,7 @@ HRESULT WINAPI CDesktopFolder::GetDetailsEx( } HRESULT WINAPI CDesktopFolder::GetDetailsOf( - LPCITEMIDLIST pidl, + PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { diff --git a/reactos/dll/win32/shell32/folders/desktop.h b/reactos/dll/win32/shell32/folders/desktop.h index be62108ff10..2718c375bfa 100644 --- a/reactos/dll/win32/shell32/folders/desktop.h +++ b/reactos/dll/win32/shell32/folders/desktop.h @@ -48,24 +48,24 @@ class CDesktopFolder : HRESULT WINAPI FinalConstruct(); // *** IShellFolder methods *** - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); // *** IShellFolder2 methods *** virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // *** IPersist methods *** diff --git a/reactos/dll/win32/shell32/folders/fonts.cpp b/reactos/dll/win32/shell32/folders/fonts.cpp index 43e5f2d70da..8aee8351fa3 100644 --- a/reactos/dll/win32/shell32/folders/fonts.cpp +++ b/reactos/dll/win32/shell32/folders/fonts.cpp @@ -198,7 +198,7 @@ HRESULT WINAPI CFontsFolder::ParseDisplayName( LPBC pbcReserved, LPOLESTR lpszDisplayName, DWORD *pchEaten, - LPITEMIDLIST *ppidl, + PIDLIST_RELATIVE *ppidl, DWORD * pdwAttributes) { HRESULT hr = E_UNEXPECTED; @@ -252,7 +252,7 @@ HRESULT WINAPI CFontsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMID /************************************************************************** * CFontsFolder::BindToObject */ -HRESULT WINAPI CFontsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CFontsFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -263,7 +263,7 @@ HRESULT WINAPI CFontsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, /************************************************************************** * CFontsFolder::BindToStorage */ -HRESULT WINAPI CFontsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CFontsFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -276,7 +276,7 @@ HRESULT WINAPI CFontsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, * CFontsFolder::CompareIDs */ -HRESULT WINAPI CFontsFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CFontsFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -325,7 +325,7 @@ HRESULT WINAPI CFontsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOI /************************************************************************** * CFontsFolder::GetAttributesOf */ -HRESULT WINAPI CFontsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) +HRESULT WINAPI CFontsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { HRESULT hr = S_OK; @@ -381,7 +381,7 @@ HRESULT WINAPI CFontsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DW */ HRESULT WINAPI CFontsFolder::GetUIObjectOf( HWND hwndOwner, - UINT cidl, LPCITEMIDLIST *apidl, + UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) { LPITEMIDLIST pidl; @@ -439,7 +439,7 @@ HRESULT WINAPI CFontsFolder::GetUIObjectOf( * CFontsFolder::GetDisplayNameOf * */ -HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CFontsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { PIDLFontStruct *pFont; @@ -497,8 +497,8 @@ HRESULT WINAPI CFontsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, * dwFlags [in] SHGNO formatting flags * ppidlOut [out] simple pidl returned */ -HRESULT WINAPI CFontsFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CFontsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); @@ -539,13 +539,13 @@ HRESULT WINAPI CFontsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags return S_OK; } -HRESULT WINAPI CFontsFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CFontsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME ("(%p)\n", this); return E_NOTIMPL; } -HRESULT WINAPI CFontsFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CFontsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; diff --git a/reactos/dll/win32/shell32/folders/fonts.h b/reactos/dll/win32/shell32/folders/fonts.h index 68db4609444..e2cc8589435 100644 --- a/reactos/dll/win32/shell32/folders/fonts.h +++ b/reactos/dll/win32/shell32/folders/fonts.h @@ -39,24 +39,24 @@ class CFontsFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/fs.cpp b/reactos/dll/win32/shell32/folders/fs.cpp index 3ee29df76d9..ef16c7b41af 100644 --- a/reactos/dll/win32/shell32/folders/fs.cpp +++ b/reactos/dll/win32/shell32/folders/fs.cpp @@ -171,7 +171,7 @@ LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path) HRESULT WINAPI CFSFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD *pchEaten, LPITEMIDLIST *ppidl, + DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { HRESULT hr = E_INVALIDARG; @@ -297,7 +297,7 @@ HRESULT WINAPI CFSFolder::EnumObjects( * LPVOID* ppvObject //[out] Interface* */ HRESULT WINAPI CFSFolder::BindToObject( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, LPVOID * ppvOut) @@ -317,7 +317,7 @@ HRESULT WINAPI CFSFolder::BindToObject( * LPVOID* ppvObject //[out] Interface* returned */ HRESULT WINAPI CFSFolder::BindToStorage( - LPCITEMIDLIST pidl, + PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) @@ -334,7 +334,8 @@ HRESULT WINAPI CFSFolder::BindToStorage( */ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam, - LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) + PCUIDLIST_RELATIVE pidl1, + PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -391,7 +392,7 @@ HRESULT WINAPI CFSFolder::CreateViewObject(HWND hwndOwner, * */ HRESULT WINAPI CFSFolder::GetAttributesOf(UINT cidl, - LPCITEMIDLIST * apidl, DWORD * rgfInOut) + PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut) { HRESULT hr = S_OK; @@ -460,8 +461,9 @@ HRESULT WINAPI CFSFolder::GetAttributesOf(UINT cidl, * needs the positions. */ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner, - UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, - UINT * prgfInOut, LPVOID * ppvOut) + UINT cidl, PCUITEMID_CHILD_ARRAY apidl, + REFIID riid, UINT * prgfInOut, + LPVOID * ppvOut) { LPITEMIDLIST pidl; IUnknown *pObj = NULL; @@ -597,7 +599,7 @@ void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags) * if the name is in the pidl the ret value should be a STRRET_OFFSET */ -HRESULT WINAPI CFSFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, +HRESULT WINAPI CFSFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { LPWSTR pszPath; @@ -677,10 +679,10 @@ HRESULT WINAPI CFSFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, */ HRESULT WINAPI CFSFolder::SetNameOf( HWND hwndOwner, - LPCITEMIDLIST pidl, + PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, - LPITEMIDLIST * pPidlOut) + PITEMID_CHILD *pPidlOut) { WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1]; LPWSTR ptr; @@ -778,7 +780,7 @@ HRESULT WINAPI CFSFolder::GetDefaultColumnState(UINT iColumn, return S_OK; } -HRESULT WINAPI CFSFolder::GetDetailsEx(LPCITEMIDLIST pidl, +HRESULT WINAPI CFSFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID * pscid, VARIANT * pv) { FIXME ("(%p)\n", this); @@ -786,7 +788,7 @@ HRESULT WINAPI CFSFolder::GetDetailsEx(LPCITEMIDLIST pidl, return E_NOTIMPL; } -HRESULT WINAPI CFSFolder::GetDetailsOf(LPCITEMIDLIST pidl, +HRESULT WINAPI CFSFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS * psd) { HRESULT hr = E_FAIL; diff --git a/reactos/dll/win32/shell32/folders/fs.h b/reactos/dll/win32/shell32/folders/fs.h index ac7b2cda92c..f29523a04f5 100644 --- a/reactos/dll/win32/shell32/folders/fs.h +++ b/reactos/dll/win32/shell32/folders/fs.h @@ -59,24 +59,24 @@ class CFSFolder : // IShellFolder - virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/mycomp.cpp b/reactos/dll/win32/shell32/folders/mycomp.cpp index bdd5444f870..b18382b675e 100644 --- a/reactos/dll/win32/shell32/folders/mycomp.cpp +++ b/reactos/dll/win32/shell32/folders/mycomp.cpp @@ -193,7 +193,7 @@ HRESULT WINAPI CDrivesFolder::FinalConstruct() * CDrivesFolder::ParseDisplayName */ HRESULT WINAPI CDrivesFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) + DWORD * pchEaten, PIDLIST_RELATIVE * ppidl, DWORD * pdwAttributes) { HRESULT hr = E_INVALIDARG; LPCWSTR szNext = NULL; @@ -287,7 +287,7 @@ HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMI /************************************************************************** * CDrivesFolder::BindToObject */ -HRESULT WINAPI CDrivesFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CDrivesFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid(&riid), ppvOut); @@ -298,7 +298,7 @@ HRESULT WINAPI CDrivesFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, /************************************************************************** * CDrivesFolder::BindToStorage */ -HRESULT WINAPI CDrivesFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CDrivesFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -311,7 +311,7 @@ HRESULT WINAPI CDrivesFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved * CDrivesFolder::CompareIDs */ -HRESULT WINAPI CDrivesFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CDrivesFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -363,7 +363,7 @@ HRESULT WINAPI CDrivesFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVO /************************************************************************** * CDrivesFolder::GetAttributesOf */ -HRESULT WINAPI CDrivesFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +HRESULT WINAPI CDrivesFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD * rgfInOut) { static const DWORD dwComputerAttributes = SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | @@ -422,7 +422,7 @@ HRESULT WINAPI CDrivesFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, * */ HRESULT WINAPI CDrivesFolder::GetUIObjectOf(HWND hwndOwner, - UINT cidl, LPCITEMIDLIST *apidl, + UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) { LPITEMIDLIST pidl; @@ -486,7 +486,7 @@ HRESULT WINAPI CDrivesFolder::GetUIObjectOf(HWND hwndOwner, /************************************************************************** * CDrivesFolder::GetDisplayNameOf */ -HRESULT WINAPI CDrivesFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CDrivesFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { LPWSTR pszPath; HRESULT hr = S_OK; @@ -682,8 +682,8 @@ HRESULT WINAPI CDrivesFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags * dwFlags [in] SHGNO formatting flags * ppidlOut [out] simple pidl returned */ -HRESULT WINAPI CDrivesFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut) +HRESULT WINAPI CDrivesFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { LPWSTR sName; HKEY hKey; @@ -766,14 +766,14 @@ HRESULT WINAPI CDrivesFolder::GetDefaultColumnState(UINT iColumn, DWORD * pcsFla return S_OK; } -HRESULT WINAPI CDrivesFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +HRESULT WINAPI CDrivesFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID * pscid, VARIANT * pv) { FIXME ("(%p)\n", this); return E_NOTIMPL; } /* FIXME: drive size >4GB is rolling over */ -HRESULT WINAPI CDrivesFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CDrivesFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { HRESULT hr; diff --git a/reactos/dll/win32/shell32/folders/mycomp.h b/reactos/dll/win32/shell32/folders/mycomp.h index b8275a7fd5d..53752dde5f7 100644 --- a/reactos/dll/win32/shell32/folders/mycomp.h +++ b/reactos/dll/win32/shell32/folders/mycomp.h @@ -39,24 +39,24 @@ class CDrivesFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/mydocuments.cpp b/reactos/dll/win32/shell32/folders/mydocuments.cpp index f1a0238f936..2d2e47acce7 100644 --- a/reactos/dll/win32/shell32/folders/mydocuments.cpp +++ b/reactos/dll/win32/shell32/folders/mydocuments.cpp @@ -126,8 +126,8 @@ HRESULT WINAPI CMyDocsFolder::FinalConstruct() return S_OK; } -HRESULT WINAPI CMyDocsFolder::ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +HRESULT WINAPI CMyDocsFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, + DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { WCHAR szElement[MAX_PATH]; LPCWSTR szNext = NULL; @@ -245,7 +245,7 @@ HRESULT WINAPI CMyDocsFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMI /************************************************************************** * CMyDocsFolder::BindToObject */ -HRESULT WINAPI CMyDocsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CMyDocsFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -256,7 +256,7 @@ HRESULT WINAPI CMyDocsFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, /************************************************************************** * CMyDocsFolder::BindToStorage */ -HRESULT WINAPI CMyDocsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CMyDocsFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -268,7 +268,7 @@ HRESULT WINAPI CMyDocsFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved /************************************************************************** * CMyDocsFolder::CompareIDs */ -HRESULT WINAPI CMyDocsFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CMyDocsFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -319,7 +319,7 @@ HRESULT WINAPI CMyDocsFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVO /************************************************************************** * CMyDocsFolder::GetAttributesOf */ -HRESULT WINAPI CMyDocsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) +HRESULT WINAPI CMyDocsFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { HRESULT hr = S_OK; static const DWORD dwMyDocumentsAttributes = @@ -371,7 +371,7 @@ HRESULT WINAPI CMyDocsFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, D * LPVOID* ppvObject) //[out] Resulting Interface * */ -HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, +HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { LPITEMIDLIST pidl; @@ -431,7 +431,7 @@ HRESULT WINAPI CMyDocsFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMID return hr; } -HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { HRESULT hr = S_OK; LPWSTR pszPath; @@ -571,8 +571,8 @@ HRESULT WINAPI CMyDocsFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags return hr; } -HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CMyDocsFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); @@ -616,14 +616,14 @@ HRESULT WINAPI CMyDocsFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlag return S_OK; } -HRESULT WINAPI CMyDocsFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CMyDocsFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME ("(%p)\n", this); return E_NOTIMPL; } -HRESULT WINAPI CMyDocsFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CMyDocsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { HRESULT hr = S_OK; diff --git a/reactos/dll/win32/shell32/folders/mydocuments.h b/reactos/dll/win32/shell32/folders/mydocuments.h index 3a70e8c3d26..75e891b5ece 100644 --- a/reactos/dll/win32/shell32/folders/mydocuments.h +++ b/reactos/dll/win32/shell32/folders/mydocuments.h @@ -40,24 +40,24 @@ class CMyDocsFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf (UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/netplaces.cpp b/reactos/dll/win32/shell32/folders/netplaces.cpp index 6075856e009..9f71ef7c6df 100644 --- a/reactos/dll/win32/shell32/folders/netplaces.cpp +++ b/reactos/dll/win32/shell32/folders/netplaces.cpp @@ -66,7 +66,7 @@ HRESULT WINAPI CNetFolder::FinalConstruct() * CNetFolder::ParseDisplayName */ HRESULT WINAPI CNetFolder::ParseDisplayName(HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, - DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes) + DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { HRESULT hr = E_UNEXPECTED; @@ -101,7 +101,7 @@ HRESULT WINAPI CNetFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLI /************************************************************************** * CNetFolder::BindToObject */ -HRESULT WINAPI CNetFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CNetFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -112,7 +112,7 @@ HRESULT WINAPI CNetFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, RE /************************************************************************** * CNetFolder::BindToStorage */ -HRESULT WINAPI CNetFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) +HRESULT WINAPI CNetFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) { FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -125,7 +125,7 @@ HRESULT WINAPI CNetFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, R * CNetFolder::CompareIDs */ -HRESULT WINAPI CNetFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CNetFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -177,7 +177,7 @@ HRESULT WINAPI CNetFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID /************************************************************************** * CNetFolder::GetAttributesOf */ -HRESULT WINAPI CNetFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) +HRESULT WINAPI CNetFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { static const DWORD dwNethoodAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | @@ -227,7 +227,7 @@ HRESULT WINAPI CNetFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWOR * ppvObject [out] Resulting Interface * */ -HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, +HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { LPITEMIDLIST pidl; @@ -283,7 +283,7 @@ HRESULT WINAPI CNetFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIS * CNetFolder::GetDisplayNameOf * */ -HRESULT WINAPI CNetFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CNetFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { FIXME("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); pdump(pidl); @@ -306,8 +306,8 @@ HRESULT WINAPI CNetFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, L * dwFlags [in] SHGNO formatting flags * ppidlOut [out] simple pidl returned */ -HRESULT WINAPI CNetFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CNetFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); @@ -348,13 +348,13 @@ HRESULT WINAPI CNetFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags) return S_OK; } -HRESULT WINAPI CNetFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CNetFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME("(%p)\n", this); return E_NOTIMPL; } -HRESULT WINAPI CNetFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CNetFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; diff --git a/reactos/dll/win32/shell32/folders/netplaces.h b/reactos/dll/win32/shell32/folders/netplaces.h index a6ca94ed510..618f3da976c 100644 --- a/reactos/dll/win32/shell32/folders/netplaces.h +++ b/reactos/dll/win32/shell32/folders/netplaces.h @@ -39,24 +39,24 @@ class CNetFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/printers.cpp b/reactos/dll/win32/shell32/folders/printers.cpp index f459fa0d595..37543e4219c 100644 --- a/reactos/dll/win32/shell32/folders/printers.cpp +++ b/reactos/dll/win32/shell32/folders/printers.cpp @@ -351,7 +351,7 @@ HRESULT WINAPI CPrinterFolder::FinalConstruct() * This is E_NOTIMPL in Windows too. */ HRESULT WINAPI CPrinterFolder::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) + DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) { TRACE("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), @@ -410,7 +410,7 @@ HRESULT WINAPI CPrinterFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUM /************************************************************************** * CPrinterFolder::BindToObject */ -HRESULT WINAPI CPrinterFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +HRESULT WINAPI CPrinterFolder::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) { TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -421,7 +421,7 @@ HRESULT WINAPI CPrinterFolder::BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved /************************************************************************** * ISF_Printers_fnBindToStorage */ -HRESULT WINAPI CPrinterFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +HRESULT WINAPI CPrinterFolder::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) { FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut); @@ -433,7 +433,7 @@ HRESULT WINAPI CPrinterFolder::BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserve /************************************************************************** * CPrinterFolder::CompareIDs */ -HRESULT WINAPI CPrinterFolder::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CPrinterFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { int nReturn; @@ -485,7 +485,7 @@ HRESULT WINAPI CPrinterFolder::CreateViewObject(HWND hwndOwner, REFIID riid, LPV /************************************************************************** * CPrinterFolder::GetAttributesOf */ -HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut) +HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) { static const DWORD dwPrintersAttributes = SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; @@ -514,7 +514,7 @@ HRESULT WINAPI CPrinterFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, * LPVOID* ppvObject) //[out] Resulting Interface * */ -HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, +HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { IUnknown *pObj = NULL; @@ -545,7 +545,7 @@ HRESULT WINAPI CPrinterFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMI * CPrinterFolder::GetDisplayNameOf * */ -HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { LPWSTR pszName; PIDLPrinterStruct * p; @@ -604,8 +604,8 @@ HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlag * DWORD dwFlags, //[in ] SHGNO formatting flags * LPITEMIDLIST* ppidlOut) //[out] simple pidl returned */ -HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +HRESULT WINAPI CPrinterFolder::SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, /* simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) { FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", this, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); @@ -644,14 +644,14 @@ HRESULT WINAPI CPrinterFolder::GetDefaultColumnState(UINT iColumn, DWORD *pcsFla } -HRESULT WINAPI CPrinterFolder::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CPrinterFolder::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME("(%p): stub\n", this); return E_NOTIMPL; } -HRESULT WINAPI CPrinterFolder::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd) +HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; diff --git a/reactos/dll/win32/shell32/folders/printers.h b/reactos/dll/win32/shell32/folders/printers.h index 7e4edced98a..b3f30a4421d 100644 --- a/reactos/dll/win32/shell32/folders/printers.h +++ b/reactos/dll/win32/shell32/folders/printers.h @@ -42,24 +42,24 @@ class CPrinterFolder : HRESULT WINAPI FinalConstruct(); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); /* ShellFolder2 */ virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IPersist diff --git a/reactos/dll/win32/shell32/folders/recyclebin.cpp b/reactos/dll/win32/shell32/folders/recyclebin.cpp index 9b1a3895832..4365297b7d0 100644 --- a/reactos/dll/win32/shell32/folders/recyclebin.cpp +++ b/reactos/dll/win32/shell32/folders/recyclebin.cpp @@ -493,7 +493,7 @@ HRESULT WINAPI CRecycleBin::GetCurFolder(LPITEMIDLIST *ppidl) */ HRESULT WINAPI CRecycleBin::ParseDisplayName(HWND hwnd, LPBC pbc, - LPOLESTR pszDisplayName, ULONG *pchEaten, LPITEMIDLIST *ppidl, + LPOLESTR pszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) { FIXME("stub\n"); @@ -537,19 +537,19 @@ HRESULT WINAPI CRecycleBin::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDL return S_OK; } -HRESULT WINAPI CRecycleBin::BindToObject(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) +HRESULT WINAPI CRecycleBin::BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv) { FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv); return E_NOTIMPL; } -HRESULT WINAPI CRecycleBin::BindToStorage(LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, void **ppv) +HRESULT WINAPI CRecycleBin::BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbc, REFIID riid, void **ppv) { FIXME("(%p, %p, %p, %s, %p) - stub\n", this, pidl, pbc, debugstr_guid(&riid), ppv); return E_NOTIMPL; } -HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { /* TODO */ TRACE("(%p, %p, %p, %p)\n", this, (void *)lParam, pidl1, pidl2); @@ -594,7 +594,7 @@ HRESULT WINAPI CRecycleBin::CreateViewObject(HWND hwndOwner, REFIID riid, void * } -HRESULT WINAPI CRecycleBin::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, +HRESULT WINAPI CRecycleBin::GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) { TRACE("(%p, %d, {%p, ...}, {%x})\n", this, cidl, apidl ? apidl[0] : NULL, (unsigned int)*rgfInOut); @@ -602,7 +602,7 @@ HRESULT WINAPI CRecycleBin::GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, return S_OK; } -HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, +HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, void **ppv) { IUnknown *pObj = NULL; @@ -635,7 +635,7 @@ HRESULT WINAPI CRecycleBin::GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLI return hr; } -HRESULT WINAPI CRecycleBin::GetDisplayNameOf(LPCITEMIDLIST pidl, SHGDNF uFlags, STRRET *pName) +HRESULT WINAPI CRecycleBin::GetDisplayNameOf(PCUITEMID_CHILD pidl, SHGDNF uFlags, STRRET *pName) { PIDLRecycleStruct *pFileDetails; LPWSTR pFileName; @@ -679,8 +679,8 @@ HRESULT WINAPI CRecycleBin::GetDisplayNameOf(LPCITEMIDLIST pidl, SHGDNF uFlags, return S_OK; } -HRESULT WINAPI CRecycleBin::SetNameOf(HWND hwnd, LPCITEMIDLIST pidl, LPCOLESTR pszName, - SHGDNF uFlags, LPITEMIDLIST *ppidlOut) +HRESULT WINAPI CRecycleBin::SetNameOf(HWND hwnd, PCUITEMID_CHILD pidl, LPCOLESTR pszName, + SHGDNF uFlags, PITEMID_CHILD *ppidlOut) { TRACE("\n"); return E_FAIL; /* not supported */ @@ -716,7 +716,7 @@ HRESULT WINAPI CRecycleBin::GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcs return S_OK; } -HRESULT WINAPI CRecycleBin::GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv) +HRESULT WINAPI CRecycleBin::GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) { FIXME("stub\n"); return E_NOTIMPL; @@ -742,7 +742,7 @@ static HRESULT FormatDateTime(LPWSTR buffer, int size, FILETIME * ft) return (ret != 0 ? E_FAIL : S_OK); } -HRESULT WINAPI CRecycleBin::GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, LPSHELLDETAILS pDetails) +HRESULT WINAPI CRecycleBin::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, LPSHELLDETAILS pDetails) { PIDLRecycleStruct * pFileDetails; WCHAR buffer[MAX_PATH]; diff --git a/reactos/dll/win32/shell32/folders/recyclebin.h b/reactos/dll/win32/shell32/folders/recyclebin.h index 8355697e845..e813a7a5116 100644 --- a/reactos/dll/win32/shell32/folders/recyclebin.h +++ b/reactos/dll/win32/shell32/folders/recyclebin.h @@ -55,24 +55,24 @@ class CRecycleBin : virtual HRESULT WINAPI GetCurFolder(LPITEMIDLIST * pidl); // IShellFolder - virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, LPITEMIDLIST *ppidl, DWORD *pdwAttributes); + virtual HRESULT WINAPI ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes); virtual HRESULT WINAPI EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList); - virtual HRESULT WINAPI BindToObject(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI BindToStorage(LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI CompareIDs(LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2); + virtual HRESULT WINAPI BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut); + virtual HRESULT WINAPI CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2); virtual HRESULT WINAPI CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut); - virtual HRESULT WINAPI GetAttributesOf(UINT cidl, LPCITEMIDLIST *apidl, DWORD *rgfInOut); - virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, LPCITEMIDLIST *apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut); - virtual HRESULT WINAPI GetDisplayNameOf(LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet); - virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, LPCITEMIDLIST pidl, LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST *pPidlOut); + virtual HRESULT WINAPI GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut); + virtual HRESULT WINAPI GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut); + virtual HRESULT WINAPI GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet); + virtual HRESULT WINAPI SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut); // IShellFolder2 virtual HRESULT WINAPI GetDefaultSearchGUID(GUID *pguid); virtual HRESULT WINAPI EnumSearches(IEnumExtraSearch **ppenum); virtual HRESULT WINAPI GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay); virtual HRESULT WINAPI GetDefaultColumnState(UINT iColumn, DWORD *pcsFlags); - virtual HRESULT WINAPI GetDetailsEx(LPCITEMIDLIST pidl, const SHCOLUMNID *pscid, VARIANT *pv); - virtual HRESULT WINAPI GetDetailsOf(LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS *psd); + virtual HRESULT WINAPI GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv); + virtual HRESULT WINAPI GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd); virtual HRESULT WINAPI MapColumnToSCID(UINT column, SHCOLUMNID *pscid); // IContextMenu From f8abce1e284f0d7168e82b5e979c9fdf0d3c7b58 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Fri, 15 Aug 2014 11:12:09 +0000 Subject: [PATCH 27/55] [CMAKE] Thin & Slim link-time optimization (requires up-to-date binutils). svn path=/trunk/; revision=63893 --- reactos/cmake/gcc.cmake | 2 +- reactos/toolchain-gcc.cmake | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/reactos/cmake/gcc.cmake b/reactos/cmake/gcc.cmake index d3b6a062ed8..2dc7d484dc1 100644 --- a/reactos/cmake/gcc.cmake +++ b/reactos/cmake/gcc.cmake @@ -115,7 +115,7 @@ endif() # Link-time code generation if(LTCG) - add_compile_flags("-flto -ffat-lto-objects") + add_compile_flags("-flto -fno-fat-lto-objects") endif() if(ARCH STREQUAL "i386") diff --git a/reactos/toolchain-gcc.cmake b/reactos/toolchain-gcc.cmake index fe746637ead..8cd6a4c82c5 100644 --- a/reactos/toolchain-gcc.cmake +++ b/reactos/toolchain-gcc.cmake @@ -46,12 +46,9 @@ set(CMAKE_ASM_COMPILER_ID "GNU") set(CMAKE_MC_COMPILER ${MINGW_TOOLCHAIN_PREFIX}windmc) set(CMAKE_RC_COMPILER ${MINGW_TOOLCHAIN_PREFIX}windres) set(CMAKE_DLLTOOL ${MINGW_TOOLCHAIN_PREFIX}dlltool) +set(CMAKE_AR ${MINGW_TOOLCHAIN_PREFIX}gcc-ar${MINGW_TOOLCHAIN_SUFFIX}) -if(NOT LTCG) - set(CMAKE_C_CREATE_STATIC_LIBRARY " crT ") -else() - set(CMAKE_C_CREATE_STATIC_LIBRARY " cr ") -endif() +set(CMAKE_C_CREATE_STATIC_LIBRARY " crT ") set(CMAKE_CXX_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY}) set(CMAKE_ASM_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY}) From c0b944dbb5281d6153a8b002703d1461e9feec21 Mon Sep 17 00:00:00 2001 From: Dmitry Gorbachev Date: Fri, 15 Aug 2014 11:17:16 +0000 Subject: [PATCH 28/55] Fix build. svn path=/trunk/; revision=63894 --- reactos/toolchain-gcc.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/toolchain-gcc.cmake b/reactos/toolchain-gcc.cmake index 8cd6a4c82c5..ba61c834a21 100644 --- a/reactos/toolchain-gcc.cmake +++ b/reactos/toolchain-gcc.cmake @@ -46,7 +46,7 @@ set(CMAKE_ASM_COMPILER_ID "GNU") set(CMAKE_MC_COMPILER ${MINGW_TOOLCHAIN_PREFIX}windmc) set(CMAKE_RC_COMPILER ${MINGW_TOOLCHAIN_PREFIX}windres) set(CMAKE_DLLTOOL ${MINGW_TOOLCHAIN_PREFIX}dlltool) -set(CMAKE_AR ${MINGW_TOOLCHAIN_PREFIX}gcc-ar${MINGW_TOOLCHAIN_SUFFIX}) +#set(CMAKE_AR ${MINGW_TOOLCHAIN_PREFIX}gcc-ar${MINGW_TOOLCHAIN_SUFFIX}) set(CMAKE_C_CREATE_STATIC_LIBRARY " crT ") set(CMAKE_CXX_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY}) From cd26effabdbab6e8f808118b6acf7fa3fa2d6e7c Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 15 Aug 2014 12:34:12 +0000 Subject: [PATCH 29/55] [APPWIZ] - Download Gecko from a URL that does not force HTTPS. CORE-8396 svn path=/trunk/; revision=63895 --- reactos/dll/cpl/appwiz/addons.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/dll/cpl/appwiz/addons.c b/reactos/dll/cpl/appwiz/addons.c index fa728cd72c9..d05053555fa 100644 --- a/reactos/dll/cpl/appwiz/addons.c +++ b/reactos/dll/cpl/appwiz/addons.c @@ -60,7 +60,7 @@ static const addon_info_t *addon; static HWND install_dialog = NULL; -static WCHAR GeckoUrl[] = L"http://dl.dropboxusercontent.com/u/743491/ReactOS/wine_gecko-2.24-x86.msi"; +static WCHAR GeckoUrl[] = L"http://svn.reactos.org/amine/wine_gecko-2.24-x86.msi"; /* SHA definitions are copied from advapi32. They aren't available in headers. */ From 50aa823cdbc3933436e0f984d38c5bb6c52dada8 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 16 Aug 2014 08:56:48 +0000 Subject: [PATCH 30/55] [NTOSKRNL:CONFIG] CmShutdownSystem: Close all hive files after flushing the hives. svn path=/trunk/; revision=63897 --- reactos/ntoskrnl/config/cmsysini.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/reactos/ntoskrnl/config/cmsysini.c b/reactos/ntoskrnl/config/cmsysini.c index f41d27b042c..a191797e330 100644 --- a/reactos/ntoskrnl/config/cmsysini.c +++ b/reactos/ntoskrnl/config/cmsysini.c @@ -2043,12 +2043,35 @@ VOID NTAPI CmShutdownSystem(VOID) { + PLIST_ENTRY ListEntry; + PCMHIVE Hive; + ULONG i; + /* Kill the workers */ if (!CmFirstTime) CmpShutdownWorkers(); /* Flush all hives */ CmpLockRegistryExclusive(); CmpDoFlushAll(TRUE); + + /* Close all hive files */ + ListEntry = CmpHiveListHead.Flink; + while (ListEntry != &CmpHiveListHead) + { + Hive = CONTAINING_RECORD(ListEntry, CMHIVE, HiveList); + + for (i = 0; i < HFILE_TYPE_MAX; i++) + { + if (Hive->FileHandles[i] != NULL) + { + ZwClose(Hive->FileHandles[i]); + Hive->FileHandles[i] = NULL; + } + } + + ListEntry = ListEntry->Flink; + } + CmpUnlockRegistry(); } From ef4815c35f93fb5206e20164de29ac11d0d6fdd2 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 17 Aug 2014 01:42:02 +0000 Subject: [PATCH 31/55] [HAL] Fix a catastrophic bug in S/G DMA. There is a subtle difference between the S/G DMA APIs and the old AllocateAdapterChannel API when it comes to having multiple requests in flight. Callers of (Io)AllocateAdapterChannel CANNOT queue another request until the AdapterControlRoutine is called. S/G DMA allows multiple concurrent DMA requests, but ROS was using IoAllocateAdapterChannel in the S/G API. As a result, the wait block stored in the device object was unexpectedly reinitalized and queued again. This results in a leak of the originally queued request context, potentially performing the new DMA operation twice while dropping the old request, and use after free of the context passed to HalpScatterGatherAdapterControl. svn path=/trunk/; revision=63898 --- reactos/hal/halx86/generic/dma.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/reactos/hal/halx86/generic/dma.c b/reactos/hal/halx86/generic/dma.c index 1709973179b..98b3718b6e4 100644 --- a/reactos/hal/halx86/generic/dma.c +++ b/reactos/hal/halx86/generic/dma.c @@ -919,6 +919,7 @@ typedef struct _SCATTER_GATHER_CONTEXT { PVOID AdapterListControlContext, MapRegisterBase; ULONG MapRegisterCount; BOOLEAN WriteToDevice; + WAIT_CONTEXT_BLOCK Wcb; } SCATTER_GATHER_CONTEXT, *PSCATTER_GATHER_CONTEXT; @@ -1041,11 +1042,14 @@ HalpScatterGatherAdapterControl(IN PDEVICE_OBJECT DeviceObject, AdapterControlContext->AdapterListControlContext = Context; AdapterControlContext->WriteToDevice = WriteToDevice; - return IoAllocateAdapterChannel(AdapterObject, - DeviceObject, - AdapterControlContext->MapRegisterCount, - HalpScatterGatherAdapterControl, - AdapterControlContext); + AdapterControlContext->Wcb.DeviceObject = DeviceObject; + AdapterControlContext->Wcb.DeviceContext = AdapterControlContext; + AdapterControlContext->Wcb.CurrentIrp = DeviceObject->CurrentIrp; + + return HalAllocateAdapterChannel(AdapterObject, + &AdapterControlContext->Wcb, + AdapterControlContext->MapRegisterCount, + HalpScatterGatherAdapterControl); } /** From 87f8f559cc0a076856b33d9477d319cf1fdebe4e Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 17 Aug 2014 04:03:29 +0000 Subject: [PATCH 32/55] [TCPIP] - Reference the address file while delivering data to avoid a use after free when an address file is closed during datagram delivery svn path=/trunk/; revision=63899 --- reactos/drivers/network/tcpip/tcpip/fileobjs.c | 13 ++++++++++--- reactos/lib/drivers/ip/transport/rawip/rawip.c | 1 + reactos/lib/drivers/ip/transport/udp/udp.c | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/reactos/drivers/network/tcpip/tcpip/fileobjs.c b/reactos/drivers/network/tcpip/tcpip/fileobjs.c index bd696b7cf2b..313e9d1ee66 100644 --- a/reactos/drivers/network/tcpip/tcpip/fileobjs.c +++ b/reactos/drivers/network/tcpip/tcpip/fileobjs.c @@ -222,7 +222,7 @@ PADDRESS_FILE AddrFindShared( * ARGUMENTS: * SearchContext = Pointer to search context * RETURNS: - * Pointer to address file, NULL if none was found + * Pointer to referenced address file, NULL if none was found */ PADDRESS_FILE AddrSearchNext( PAF_SEARCH SearchContext) @@ -232,6 +232,7 @@ PADDRESS_FILE AddrSearchNext( KIRQL OldIrql; PADDRESS_FILE Current = NULL; BOOLEAN Found = FALSE; + PADDRESS_FILE StartingAddrFile; TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql); @@ -241,8 +242,8 @@ PADDRESS_FILE AddrSearchNext( return NULL; } - /* Remove the extra reference we added to keep this address file in memory */ - DereferenceObject(CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry)); + /* Save this pointer so we can dereference it later */ + StartingAddrFile = CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry); CurrentEntry = SearchContext->Next; @@ -279,10 +280,16 @@ PADDRESS_FILE AddrSearchNext( /* Reference the next address file to prevent the link from disappearing behind our back */ ReferenceObject(CONTAINING_RECORD(SearchContext->Next, ADDRESS_FILE, ListEntry)); } + + /* Reference the returned address file before dereferencing the starting + * address file because it may be that Current == StartingAddrFile */ + ReferenceObject(Current); } else Current = NULL; + DereferenceObject(StartingAddrFile); + TcpipReleaseSpinLock(&AddressFileListLock, OldIrql); return Current; diff --git a/reactos/lib/drivers/ip/transport/rawip/rawip.c b/reactos/lib/drivers/ip/transport/rawip/rawip.c index 467fe398102..180f545db39 100644 --- a/reactos/lib/drivers/ip/transport/rawip/rawip.c +++ b/reactos/lib/drivers/ip/transport/rawip/rawip.c @@ -321,6 +321,7 @@ VOID RawIpReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket) 0, IPPacket, DataSize); + DereferenceObject(AddrFile); } while ((AddrFile = AddrSearchNext(&SearchContext)) != NULL); } else { /* There are no open address files that will take this datagram */ diff --git a/reactos/lib/drivers/ip/transport/udp/udp.c b/reactos/lib/drivers/ip/transport/udp/udp.c index 1629aad7f96..2f7dae94594 100644 --- a/reactos/lib/drivers/ip/transport/udp/udp.c +++ b/reactos/lib/drivers/ip/transport/udp/udp.c @@ -320,6 +320,7 @@ VOID UDPReceive(PIP_INTERFACE Interface, PIP_PACKET IPPacket) UDPHeader->DestPort, IPPacket, DataSize); + DereferenceObject(AddrFile); } while ((AddrFile = AddrSearchNext(&SearchContext)) != NULL); } else { /* There are no open address files that will take this datagram */ From d34c276260d595e8b75aa5a31f882e5fe67d7457 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 17 Aug 2014 21:47:43 +0000 Subject: [PATCH 33/55] [NTOS:CC] - Use the passed-in file sizes in CcInitializeCacheMap svn path=/trunk/; revision=63901 --- reactos/ntoskrnl/cc/fs.c | 1 + reactos/ntoskrnl/cc/view.c | 10 +++------- reactos/ntoskrnl/include/internal/cc.h | 1 + 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/reactos/ntoskrnl/cc/fs.c b/reactos/ntoskrnl/cc/fs.c index 27f6455904c..b4c3b1d0d0d 100644 --- a/reactos/ntoskrnl/cc/fs.c +++ b/reactos/ntoskrnl/cc/fs.c @@ -87,6 +87,7 @@ CcInitializeCacheMap ( /* Call old ROS cache init function */ CcRosInitializeFileCache(FileObject, + FileSizes, CallBacks, LazyWriterContext); } diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 10bf34cb248..05544f9f69f 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -1187,6 +1187,7 @@ NTSTATUS NTAPI CcRosInitializeFileCache ( PFILE_OBJECT FileObject, + PCC_FILE_SIZES FileSizes, PCACHE_MANAGER_CALLBACKS CallBacks, PVOID LazyWriterContext) /* @@ -1216,13 +1217,8 @@ CcRosInitializeFileCache ( SharedCacheMap->FileObject = FileObject; SharedCacheMap->Callbacks = CallBacks; SharedCacheMap->LazyWriteContext = LazyWriterContext; - if (FileObject->FsContext) - { - SharedCacheMap->SectionSize = - ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->AllocationSize; - SharedCacheMap->FileSize = - ((PFSRTL_COMMON_FCB_HEADER)FileObject->FsContext)->FileSize; - } + SharedCacheMap->SectionSize = FileSizes->AllocationSize; + SharedCacheMap->FileSize = FileSizes->FileSize; KeInitializeSpinLock(&SharedCacheMap->CacheMapLock); InitializeListHead(&SharedCacheMap->CacheMapVacbListHead); FileObject->SectionObjectPointer->SharedCacheMap = SharedCacheMap; diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 3e559f8888b..30c657d6dbc 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -287,6 +287,7 @@ NTSTATUS NTAPI CcRosInitializeFileCache( PFILE_OBJECT FileObject, + PCC_FILE_SIZES FileSizes, PCACHE_MANAGER_CALLBACKS CallBacks, PVOID LazyWriterContext ); From 39d29c44d0370a875da1cc10fae076ddad94e0c7 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 17 Aug 2014 21:52:54 +0000 Subject: [PATCH 34/55] [NTOS:CC] - Set the uninitialize event in CcUninitializeCacheMap to avoid deadlocking callers svn path=/trunk/; revision=63902 --- reactos/ntoskrnl/cc/fs.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reactos/ntoskrnl/cc/fs.c b/reactos/ntoskrnl/cc/fs.c index b4c3b1d0d0d..489e51355ce 100644 --- a/reactos/ntoskrnl/cc/fs.c +++ b/reactos/ntoskrnl/cc/fs.c @@ -235,12 +235,12 @@ CcUninitializeCacheMap ( IN PLARGE_INTEGER TruncateSize OPTIONAL, IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL) { -#if 0 - UNIMPLEMENTED; - return FALSE; -#else - return NT_SUCCESS(CcRosReleaseFileCache(FileObject)); -#endif + NTSTATUS Status; + + Status = CcRosReleaseFileCache(FileObject); + if (UninitializeCompleteEvent) + KeSetEvent(&UninitializeCompleteEvent->Event, IO_NO_INCREMENT, FALSE); + return NT_SUCCESS(Status); } BOOLEAN From 1cc1113dc7ec9c66eea14b7b9a8458f33db92b31 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Mon, 18 Aug 2014 03:55:59 +0000 Subject: [PATCH 35/55] [NTOS:CC] - Remove "VACB chain" optimization for CcCopyRead that was never applied anyway since MAX_RW_LENGTH == VACB_MAPPING_GRANULARITY, so a single read could never exceed one VACB - Consolidate CcCopyRead, CcCopyWrite and the cached case of CcZeroData into a common worker function CORE-8410 svn path=/trunk/; revision=63903 --- reactos/ntoskrnl/cc/copy.c | 628 ++++++++----------------- reactos/ntoskrnl/cc/view.c | 67 --- reactos/ntoskrnl/include/internal/cc.h | 10 - 3 files changed, 193 insertions(+), 512 deletions(-) diff --git a/reactos/ntoskrnl/cc/copy.c b/reactos/ntoskrnl/cc/copy.c index d63c36e06ea..ccddd414a17 100644 --- a/reactos/ntoskrnl/cc/copy.c +++ b/reactos/ntoskrnl/cc/copy.c @@ -18,8 +18,13 @@ static PFN_NUMBER CcZeroPage = 0; #define MAX_ZERO_LENGTH (256 * 1024) -#define MAX_RW_LENGTH (256 * 1024) -C_ASSERT(MAX_RW_LENGTH <= VACB_MAPPING_GRANULARITY); + +typedef enum _CC_COPY_OPERATION +{ + CcOperationRead, + CcOperationWrite, + CcOperationZero +} CC_COPY_OPERATION; ULONG CcFastMdlReadWait; ULONG CcFastMdlReadNotPossible; @@ -54,136 +59,6 @@ CcInitCacheZeroPage ( MiZeroPhysicalPage(CcZeroPage); } -NTSTATUS -NTAPI -ReadVacbChain ( - PROS_SHARED_CACHE_MAP SharedCacheMap, - ULONG ReadOffset, - ULONG Length, - PVOID Buffer) -{ - PROS_VACB head; - PROS_VACB current; - PROS_VACB previous; - IO_STATUS_BLOCK Iosb; - NTSTATUS Status; - ULONG TempLength; - KEVENT Event; - PMDL Mdl; - - Mdl = _alloca(MmSizeOfMdl(NULL, MAX_RW_LENGTH)); - - Status = CcRosGetVacbChain(SharedCacheMap, ReadOffset, Length, &head); - if (!NT_SUCCESS(Status)) - { - return Status; - } - current = head; - while (current != NULL) - { - /* - * If the current VACB is valid then copy it into the user buffer. - */ - if (current->Valid) - { - TempLength = min(VACB_MAPPING_GRANULARITY, Length); - RtlCopyMemory(Buffer, current->BaseAddress, TempLength); - - Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); - - Length = Length - TempLength; - previous = current; - current = current->NextInChain; - CcRosReleaseVacb(SharedCacheMap, previous, TRUE, FALSE, FALSE); - } - /* - * Otherwise read in as much as we can. - */ - else - { - PROS_VACB current2; - ULONG current_size; - ULONG i; - PPFN_NUMBER MdlPages; - - /* - * Count the maximum number of bytes we could read starting - * from the current VACB. - */ - current2 = current; - current_size = 0; - while ((current2 != NULL) && !current2->Valid && (current_size < MAX_RW_LENGTH)) - { - current2 = current2->NextInChain; - current_size += VACB_MAPPING_GRANULARITY; - } - - /* - * Create an MDL which contains all their pages. - */ - MmInitializeMdl(Mdl, NULL, current_size); - Mdl->MdlFlags |= (MDL_PAGES_LOCKED | MDL_IO_PAGE_READ); - current2 = current; - current_size = 0; - MdlPages = (PPFN_NUMBER)(Mdl + 1); - while ((current2 != NULL) && !current2->Valid && (current_size < MAX_RW_LENGTH)) - { - PVOID address = current2->BaseAddress; - for (i = 0; i < VACB_MAPPING_GRANULARITY / PAGE_SIZE; i++, address = RVA(address, PAGE_SIZE)) - { - *MdlPages++ = MmGetPfnForProcess(NULL, address); - } - current2 = current2->NextInChain; - current_size += VACB_MAPPING_GRANULARITY; - } - - /* - * Read in the information. - */ - KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoPageRead(SharedCacheMap->FileObject, - Mdl, - ¤t->FileOffset, - &Event, - &Iosb); - if (Status == STATUS_PENDING) - { - KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); - Status = Iosb.Status; - } - if (Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - if (!NT_SUCCESS(Status) && Status != STATUS_END_OF_FILE) - { - while (current != NULL) - { - previous = current; - current = current->NextInChain; - CcRosReleaseVacb(SharedCacheMap, previous, FALSE, FALSE, FALSE); - } - return Status; - } - current_size = 0; - while (current != NULL && !current->Valid && current_size < MAX_RW_LENGTH) - { - previous = current; - current = current->NextInChain; - TempLength = min(VACB_MAPPING_GRANULARITY, Length); - RtlCopyMemory(Buffer, previous->BaseAddress, TempLength); - - Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); - - Length = Length - TempLength; - CcRosReleaseVacb(SharedCacheMap, previous, TRUE, FALSE, FALSE); - current_size += VACB_MAPPING_GRANULARITY; - } - } - } - return STATUS_SUCCESS; -} - NTSTATUS NTAPI CcReadVirtualAddress ( @@ -288,6 +163,170 @@ CcWriteVirtualAddress ( return STATUS_SUCCESS; } +NTSTATUS +ReadWriteOrZero( + _Inout_ PVOID BaseAddress, + _Inout_opt_ PVOID Buffer, + _In_ ULONG Length, + _In_ CC_COPY_OPERATION Operation) +{ + NTSTATUS Status = STATUS_SUCCESS; + + if (Operation == CcOperationZero) + { + /* Zero */ + RtlZeroMemory(BaseAddress, Length); + } + else + { + _SEH2_TRY + { + if (Operation == CcOperationWrite) + RtlCopyMemory(BaseAddress, Buffer, Length); + else + RtlCopyMemory(Buffer, BaseAddress, Length); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + } + return Status; +} + +BOOLEAN +CcCopyData ( + _In_ PFILE_OBJECT FileObject, + _In_ LONGLONG FileOffset, + _Inout_ PVOID Buffer, + _In_ ULONG Length, + _In_ CC_COPY_OPERATION Operation, + _In_ BOOLEAN Wait, + _Out_ PIO_STATUS_BLOCK IoStatus) +{ + NTSTATUS Status; + LONGLONG CurrentOffset; + ULONG BytesCopied; + KIRQL OldIrql; + PROS_SHARED_CACHE_MAP SharedCacheMap; + PLIST_ENTRY ListEntry; + PROS_VACB Vacb; + ULONG PartialLength; + PVOID BaseAddress; + BOOLEAN Valid; + + SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; + CurrentOffset = FileOffset; + BytesCopied = 0; + + if (!Wait) + { + /* test if the requested data is available */ + KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &OldIrql); + /* FIXME: this loop doesn't take into account areas that don't have + * a VACB in the list yet */ + ListEntry = SharedCacheMap->CacheMapVacbListHead.Flink; + while (ListEntry != &SharedCacheMap->CacheMapVacbListHead) + { + Vacb = CONTAINING_RECORD(ListEntry, + ROS_VACB, + CacheMapVacbListEntry); + ListEntry = ListEntry->Flink; + if (!Vacb->Valid && + DoRangesIntersect(Vacb->FileOffset.QuadPart, + VACB_MAPPING_GRANULARITY, + CurrentOffset, Length)) + { + KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql); + /* data not available */ + return FALSE; + } + if (Vacb->FileOffset.QuadPart >= CurrentOffset + Length) + break; + } + KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, OldIrql); + } + + PartialLength = CurrentOffset % VACB_MAPPING_GRANULARITY; + if (PartialLength != 0) + { + PartialLength = min(Length, VACB_MAPPING_GRANULARITY - PartialLength); + Status = CcRosRequestVacb(SharedCacheMap, + ROUND_DOWN(CurrentOffset, + VACB_MAPPING_GRANULARITY), + &BaseAddress, + &Valid, + &Vacb); + if (!NT_SUCCESS(Status)) + ExRaiseStatus(Status); + if (!Valid) + { + Status = CcReadVirtualAddress(Vacb); + if (!NT_SUCCESS(Status)) + { + CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE); + ExRaiseStatus(Status); + } + } + Status = ReadWriteOrZero((PUCHAR)BaseAddress + CurrentOffset % VACB_MAPPING_GRANULARITY, + Buffer, + PartialLength, + Operation); + + CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, Operation != CcOperationRead, FALSE); + + if (!NT_SUCCESS(Status)) + ExRaiseStatus(STATUS_INVALID_USER_BUFFER); + + Length -= PartialLength; + CurrentOffset += PartialLength; + BytesCopied += PartialLength; + + if (Buffer) + Buffer = (PVOID)((ULONG_PTR)Buffer + PartialLength); + } + + while (Length > 0) + { + ASSERT(CurrentOffset % VACB_MAPPING_GRANULARITY == 0); + PartialLength = min(VACB_MAPPING_GRANULARITY, Length); + Status = CcRosRequestVacb(SharedCacheMap, + CurrentOffset, + &BaseAddress, + &Valid, + &Vacb); + if (!NT_SUCCESS(Status)) + ExRaiseStatus(Status); + if (!Valid && + (Operation == CcOperationRead || + PartialLength < VACB_MAPPING_GRANULARITY)) + { + Status = CcReadVirtualAddress(Vacb); + if (!NT_SUCCESS(Status)) + { + CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE); + ExRaiseStatus(Status); + } + } + Status = ReadWriteOrZero(BaseAddress, Buffer, PartialLength, Operation); + + CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, Operation != CcOperationRead, FALSE); + + if (!NT_SUCCESS(Status)) + ExRaiseStatus(STATUS_INVALID_USER_BUFFER); + + Length -= PartialLength; + CurrentOffset += PartialLength; + BytesCopied += PartialLength; + + if (Buffer) + Buffer = (PVOID)((ULONG_PTR)Buffer + PartialLength); + } + IoStatus->Status = STATUS_SUCCESS; + IoStatus->Information = BytesCopied; + return TRUE; +} /* * @unimplemented @@ -304,7 +343,6 @@ CcCanIWrite ( return FALSE; } - /* * @implemented */ @@ -318,121 +356,18 @@ CcCopyRead ( OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus) { - ULONG ReadOffset; - ULONG TempLength; - NTSTATUS Status = STATUS_SUCCESS; - PVOID BaseAddress; - PROS_VACB Vacb; - BOOLEAN Valid; - ULONG ReadLength = 0; - PROS_SHARED_CACHE_MAP SharedCacheMap; - KIRQL oldirql; - PLIST_ENTRY current_entry; - PROS_VACB current; - DPRINT("CcCopyRead(FileObject 0x%p, FileOffset %I64x, " "Length %lu, Wait %u, Buffer 0x%p, IoStatus 0x%p)\n", FileObject, FileOffset->QuadPart, Length, Wait, Buffer, IoStatus); - SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; - ReadOffset = (ULONG)FileOffset->QuadPart; - - DPRINT("SectionSize %I64d, FileSize %I64d\n", - SharedCacheMap->SectionSize.QuadPart, - SharedCacheMap->FileSize.QuadPart); - - /* - * Check for the nowait case that all the cache VACBs that would - * cover this read are in memory. - */ - if (!Wait) - { - KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql); - /* FIXME: this loop doesn't take into account areas that don't have - * a VACB in the list yet */ - current_entry = SharedCacheMap->CacheMapVacbListHead.Flink; - while (current_entry != &SharedCacheMap->CacheMapVacbListHead) - { - current = CONTAINING_RECORD(current_entry, - ROS_VACB, - CacheMapVacbListEntry); - if (!current->Valid && - DoRangesIntersect(current->FileOffset.QuadPart, - VACB_MAPPING_GRANULARITY, - ReadOffset, Length)) - { - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - IoStatus->Status = STATUS_UNSUCCESSFUL; - IoStatus->Information = 0; - return FALSE; - } - if (current->FileOffset.QuadPart >= ReadOffset + Length) - break; - current_entry = current_entry->Flink; - } - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - } - - TempLength = ReadOffset % VACB_MAPPING_GRANULARITY; - if (TempLength != 0) - { - TempLength = min(Length, VACB_MAPPING_GRANULARITY - TempLength); - Status = CcRosRequestVacb(SharedCacheMap, - ROUND_DOWN(ReadOffset, - VACB_MAPPING_GRANULARITY), - &BaseAddress, &Valid, &Vacb); - if (!NT_SUCCESS(Status)) - { - IoStatus->Information = 0; - IoStatus->Status = Status; - DPRINT("CcRosRequestVacb failed, Status %x\n", Status); - return FALSE; - } - if (!Valid) - { - Status = CcReadVirtualAddress(Vacb); - if (!NT_SUCCESS(Status)) - { - IoStatus->Information = 0; - IoStatus->Status = Status; - CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE); - return FALSE; - } - } - RtlCopyMemory(Buffer, - (char*)BaseAddress + ReadOffset % VACB_MAPPING_GRANULARITY, - TempLength); - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, FALSE, FALSE); - ReadLength += TempLength; - Length -= TempLength; - ReadOffset += TempLength; - Buffer = (PVOID)((char*)Buffer + TempLength); - } - - while (Length > 0) - { - TempLength = min(VACB_MAPPING_GRANULARITY, Length); - Status = ReadVacbChain(SharedCacheMap, ReadOffset, TempLength, Buffer); - if (!NT_SUCCESS(Status)) - { - IoStatus->Information = 0; - IoStatus->Status = Status; - DPRINT("ReadVacbChain failed, Status %x\n", Status); - return FALSE; - } - - ReadLength += TempLength; - Length -= TempLength; - ReadOffset += TempLength; - - Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); - } - - IoStatus->Status = STATUS_SUCCESS; - IoStatus->Information = ReadLength; - DPRINT("CcCopyRead O.K.\n"); - return TRUE; + return CcCopyData(FileObject, + FileOffset->QuadPart, + Buffer, + Length, + CcOperationRead, + Wait, + IoStatus); } /* @@ -447,109 +382,19 @@ CcCopyWrite ( IN BOOLEAN Wait, IN PVOID Buffer) { - NTSTATUS Status; - ULONG WriteOffset; - KIRQL oldirql; - PROS_SHARED_CACHE_MAP SharedCacheMap; - PLIST_ENTRY current_entry; - PROS_VACB Vacb; - ULONG TempLength; - PVOID BaseAddress; - BOOLEAN Valid; + IO_STATUS_BLOCK IoStatus; DPRINT("CcCopyWrite(FileObject 0x%p, FileOffset %I64x, " "Length %lu, Wait %u, Buffer 0x%p)\n", FileObject, FileOffset->QuadPart, Length, Wait, Buffer); - SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; - WriteOffset = (ULONG)FileOffset->QuadPart; - - if (!Wait) - { - /* testing, if the requested datas are available */ - KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql); - /* FIXME: this loop doesn't take into account areas that don't have - * a VACB in the list yet */ - current_entry = SharedCacheMap->CacheMapVacbListHead.Flink; - while (current_entry != &SharedCacheMap->CacheMapVacbListHead) - { - Vacb = CONTAINING_RECORD(current_entry, - ROS_VACB, - CacheMapVacbListEntry); - if (!Vacb->Valid && - DoRangesIntersect(Vacb->FileOffset.QuadPart, - VACB_MAPPING_GRANULARITY, - WriteOffset, Length)) - { - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - /* datas not available */ - return FALSE; - } - if (Vacb->FileOffset.QuadPart >= WriteOffset + Length) - break; - current_entry = current_entry->Flink; - } - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - } - - TempLength = WriteOffset % VACB_MAPPING_GRANULARITY; - if (TempLength != 0) - { - ULONG ROffset; - ROffset = ROUND_DOWN(WriteOffset, VACB_MAPPING_GRANULARITY); - TempLength = min(Length, VACB_MAPPING_GRANULARITY - TempLength); - Status = CcRosRequestVacb(SharedCacheMap, ROffset, - &BaseAddress, &Valid, &Vacb); - if (!NT_SUCCESS(Status)) - { - return FALSE; - } - if (!Valid) - { - if (!NT_SUCCESS(CcReadVirtualAddress(Vacb))) - { - return FALSE; - } - } - RtlCopyMemory((char*)BaseAddress + WriteOffset % VACB_MAPPING_GRANULARITY, + return CcCopyData(FileObject, + FileOffset->QuadPart, Buffer, - TempLength); - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, TRUE, FALSE); - - Length -= TempLength; - WriteOffset += TempLength; - - Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); - } - - while (Length > 0) - { - TempLength = min(VACB_MAPPING_GRANULARITY, Length); - Status = CcRosRequestVacb(SharedCacheMap, - WriteOffset, - &BaseAddress, - &Valid, - &Vacb); - if (!NT_SUCCESS(Status)) - { - return FALSE; - } - if (!Valid && TempLength < VACB_MAPPING_GRANULARITY) - { - if (!NT_SUCCESS(CcReadVirtualAddress(Vacb))) - { - CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE); - return FALSE; - } - } - RtlCopyMemory(BaseAddress, Buffer, TempLength); - CcRosReleaseVacb(SharedCacheMap, Vacb, TRUE, TRUE, FALSE); - Length -= TempLength; - WriteOffset += TempLength; - - Buffer = (PVOID)((ULONG_PTR)Buffer + TempLength); - } - return TRUE; + Length, + CcOperationWrite, + Wait, + &IoStatus); } /* @@ -679,102 +524,15 @@ CcZeroData ( } else { - /* File is cached */ - KIRQL oldirql; - PROS_SHARED_CACHE_MAP SharedCacheMap; - PLIST_ENTRY current_entry; - PROS_VACB Vacb, current, previous; - ULONG TempLength; + IO_STATUS_BLOCK IoStatus; - SharedCacheMap = FileObject->SectionObjectPointer->SharedCacheMap; - if (!Wait) - { - /* testing, if the requested datas are available */ - KeAcquireSpinLock(&SharedCacheMap->CacheMapLock, &oldirql); - /* FIXME: this loop doesn't take into account areas that don't have - * a VACB in the list yet */ - current_entry = SharedCacheMap->CacheMapVacbListHead.Flink; - while (current_entry != &SharedCacheMap->CacheMapVacbListHead) - { - Vacb = CONTAINING_RECORD(current_entry, - ROS_VACB, - CacheMapVacbListEntry); - if (!Vacb->Valid && - DoRangesIntersect(Vacb->FileOffset.QuadPart, - VACB_MAPPING_GRANULARITY, - WriteOffset.u.LowPart, Length)) - { - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - /* datas not available */ - return FALSE; - } - if (Vacb->FileOffset.QuadPart >= WriteOffset.u.LowPart + Length) - break; - current_entry = current_entry->Flink; - } - KeReleaseSpinLock(&SharedCacheMap->CacheMapLock, oldirql); - } - - while (Length > 0) - { - ULONG Offset; - Offset = WriteOffset.u.LowPart % VACB_MAPPING_GRANULARITY; - if (Length + Offset > MAX_ZERO_LENGTH) - { - CurrentLength = MAX_ZERO_LENGTH - Offset; - } - else - { - CurrentLength = Length; - } - Status = CcRosGetVacbChain(SharedCacheMap, WriteOffset.u.LowPart - Offset, - Offset + CurrentLength, &Vacb); - if (!NT_SUCCESS(Status)) - { - return FALSE; - } - current = Vacb; - - while (current != NULL) - { - Offset = WriteOffset.u.LowPart % VACB_MAPPING_GRANULARITY; - if ((Offset != 0) || - (Offset + CurrentLength < VACB_MAPPING_GRANULARITY)) - { - if (!current->Valid) - { - /* read the block */ - Status = CcReadVirtualAddress(current); - if (!NT_SUCCESS(Status)) - { - DPRINT1("CcReadVirtualAddress failed, status %x\n", - Status); - } - } - TempLength = min(CurrentLength, VACB_MAPPING_GRANULARITY - Offset); - } - else - { - TempLength = VACB_MAPPING_GRANULARITY; - } - RtlZeroMemory((PUCHAR)current->BaseAddress + Offset, - TempLength); - - WriteOffset.QuadPart += TempLength; - CurrentLength -= TempLength; - Length -= TempLength; - - current = current->NextInChain; - } - - current = Vacb; - while (current != NULL) - { - previous = current; - current = current->NextInChain; - CcRosReleaseVacb(SharedCacheMap, previous, TRUE, TRUE, FALSE); - } - } + return CcCopyData(FileObject, + WriteOffset.QuadPart, + NULL, + Length, + CcOperationZero, + Wait, + &IoStatus); } return TRUE; diff --git a/reactos/ntoskrnl/cc/view.c b/reactos/ntoskrnl/cc/view.c index 05544f9f69f..d54f16a8032 100644 --- a/reactos/ntoskrnl/cc/view.c +++ b/reactos/ntoskrnl/cc/view.c @@ -725,73 +725,6 @@ CcRosCreateVacb ( return STATUS_SUCCESS; } -NTSTATUS -NTAPI -CcRosGetVacbChain ( - PROS_SHARED_CACHE_MAP SharedCacheMap, - ULONG FileOffset, - ULONG Length, - PROS_VACB *Vacb) -{ - PROS_VACB current; - ULONG i; - PROS_VACB *VacbList; - PROS_VACB Previous = NULL; - - ASSERT(SharedCacheMap); - - DPRINT("CcRosGetVacbChain()\n"); - - Length = ROUND_UP(Length, VACB_MAPPING_GRANULARITY); - - VacbList = _alloca(sizeof(PROS_VACB) * - (Length / VACB_MAPPING_GRANULARITY)); - - /* - * Look for a VACB already mapping the same data. - */ - for (i = 0; i < (Length / VACB_MAPPING_GRANULARITY); i++) - { - ULONG CurrentOffset = FileOffset + (i * VACB_MAPPING_GRANULARITY); - current = CcRosLookupVacb(SharedCacheMap, CurrentOffset); - if (current != NULL) - { - KeAcquireGuardedMutex(&ViewLock); - - /* Move to tail of LRU list */ - RemoveEntryList(¤t->VacbLruListEntry); - InsertTailList(&VacbLruListHead, ¤t->VacbLruListEntry); - - KeReleaseGuardedMutex(&ViewLock); - - VacbList[i] = current; - } - else - { - CcRosCreateVacb(SharedCacheMap, CurrentOffset, ¤t); - VacbList[i] = current; - } - } - - for (i = 0; i < Length / VACB_MAPPING_GRANULARITY; i++) - { - if (i == 0) - { - *Vacb = VacbList[i]; - Previous = VacbList[i]; - } - else - { - Previous->NextInChain = VacbList[i]; - Previous = VacbList[i]; - } - } - ASSERT(Previous); - Previous->NextInChain = NULL; - - return STATUS_SUCCESS; -} - NTSTATUS NTAPI CcRosGetVacb ( diff --git a/reactos/ntoskrnl/include/internal/cc.h b/reactos/ntoskrnl/include/internal/cc.h index 30c657d6dbc..48b3ea5c311 100644 --- a/reactos/ntoskrnl/include/internal/cc.h +++ b/reactos/ntoskrnl/include/internal/cc.h @@ -145,7 +145,6 @@ typedef struct _ROS_VACB /* Pointer to the shared cache map for the file which this view maps data for. */ PROS_SHARED_CACHE_MAP SharedCacheMap; /* Pointer to the next VACB in a chain. */ - struct _ROS_VACB *NextInChain; } ROS_VACB, *PROS_VACB; typedef struct _INTERNAL_BCB @@ -223,15 +222,6 @@ CcRosLookupVacb( ULONG FileOffset ); -NTSTATUS -NTAPI -CcRosGetVacbChain( - PROS_SHARED_CACHE_MAP SharedCacheMap, - ULONG FileOffset, - ULONG Length, - PROS_VACB *Vacb -); - VOID NTAPI CcInitCacheZeroPage(VOID); From 4ba08b1994aac47b08c2c9166c326c85a4678140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Mon, 18 Aug 2014 17:45:26 +0000 Subject: [PATCH 36/55] [NPFS]: The third argument of ObLogSecurityDescriptor is an integer, not a boolean. svn path=/trunk/; revision=63904 --- reactos/drivers/filesystems/npfs/seinfo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/drivers/filesystems/npfs/seinfo.c b/reactos/drivers/filesystems/npfs/seinfo.c index 5b1b0e1ca69..546388dd1c6 100644 --- a/reactos/drivers/filesystems/npfs/seinfo.c +++ b/reactos/drivers/filesystems/npfs/seinfo.c @@ -84,7 +84,7 @@ NpCommonSetSecurityInfo(IN PDEVICE_OBJECT DeviceObject, IoGetFileObjectGenericMapping()); if (!NT_SUCCESS(Status)) return Status; - Status = ObLogSecurityDescriptor(TempSecurityDescriptor, &NewSecurityDescriptor, TRUE); + Status = ObLogSecurityDescriptor(TempSecurityDescriptor, &NewSecurityDescriptor, 1); ExFreePool(TempSecurityDescriptor); if (!NT_SUCCESS(Status)) return Status; From 73b83f8495b555c979e80d7ec3c207091ba55143 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Wed, 20 Aug 2014 13:23:11 +0000 Subject: [PATCH 37/55] [PSDK] - Fix __drv_functionClass dummy. By Alex Radocea svn path=/trunk/; revision=63910 --- reactos/include/psdk/driverspecs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/include/psdk/driverspecs.h b/reactos/include/psdk/driverspecs.h index 783d9a36429..b73b3ec13fd 100644 --- a/reactos/include/psdk/driverspecs.h +++ b/reactos/include/psdk/driverspecs.h @@ -207,7 +207,7 @@ __ANNOTATION(SAL_IoGetDmaAdapter(void);) #define __drv_formatString(kind) #define __drv_freesMem(kind) #define __drv_fun(annotes) -#define __drv_functionClass +#define __drv_functionClass(x) #define __drv_holdsCancelSpinLock() #define __drv_holdsCriticalRegion() #define __drv_holdsPriorityRegion() From ddcf6ee167287b0c05b8f4f68befd4b3f5215e95 Mon Sep 17 00:00:00 2001 From: Sylvain Petreolle Date: Thu, 21 Aug 2014 12:28:24 +0000 Subject: [PATCH 38/55] [RAPPS] Fix the registry key of the Event Source. svn path=/trunk/; revision=63913 --- reactos/base/applications/rapps/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reactos/base/applications/rapps/misc.c b/reactos/base/applications/rapps/misc.c index 2bb16b6950b..7f7ba208ac0 100644 --- a/reactos/base/applications/rapps/misc.c +++ b/reactos/base/applications/rapps/misc.c @@ -293,7 +293,7 @@ ExtractFilesFromCab(LPWSTR lpCabName, LPWSTR lpOutputPath) VOID InitLogs(VOID) { - WCHAR szBuf[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\ReactOS Application Manager\\ReactOS Application Manager"; + WCHAR szBuf[MAX_PATH] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\ReactOS Application Manager"; WCHAR szPath[MAX_PATH]; DWORD dwCategoryNum = 1; DWORD dwDisp, dwData; From ce2f155e05e008e5a639375e7c41053a0cabd659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Thu, 21 Aug 2014 19:18:25 +0000 Subject: [PATCH 39/55] [EXPLORER_OLD] Disable ScanNTFSStreams calls because this function exclusively calls BackupRead that is not implemented on ReactOS, and as a consequence makes lots of debug spam when browsing the start (sub-)menus. svn path=/trunk/; revision=63914 --- reactos/base/shell/explorer/shell/shellfs.cpp | 2 ++ reactos/base/shell/explorer/shell/winfs.cpp | 4 ++++ reactos/base/shell/explorer/shell/winfs.h | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/reactos/base/shell/explorer/shell/shellfs.cpp b/reactos/base/shell/explorer/shell/shellfs.cpp index 1243a0d0055..6c243e46467 100644 --- a/reactos/base/shell/explorer/shell/shellfs.cpp +++ b/reactos/base/shell/explorer/shell/shellfs.cpp @@ -313,8 +313,10 @@ void ShellDirectory::read_directory(int scan_flags) if (GetFileInformationByHandle(hFile, &entry->_bhfi)) entry->_bhfi_valid = true; +#ifdef BACKUP_READ_IMPLEMENTED if (ScanNTFSStreams(entry, hFile)) entry->_scanned = true; // There exist named NTFS sub-streams in this file. +#endif CloseHandle(hFile); } diff --git a/reactos/base/shell/explorer/shell/winfs.cpp b/reactos/base/shell/explorer/shell/winfs.cpp index b3ed57676ff..6415d28150f 100644 --- a/reactos/base/shell/explorer/shell/winfs.cpp +++ b/reactos/base/shell/explorer/shell/winfs.cpp @@ -33,6 +33,7 @@ //#include "winfs.h" +#ifdef BACKUP_READ_IMPLEMENTED int ScanNTFSStreams(Entry* entry, HANDLE hFile) { PVOID ctx = 0; @@ -116,6 +117,7 @@ int ScanNTFSStreams(Entry* entry, HANDLE hFile) return cnt; } +#endif void WinDirectory::read_directory(int scan_flags) @@ -167,8 +169,10 @@ void WinDirectory::read_directory(int scan_flags) if (GetFileInformationByHandle(hFile, &entry->_bhfi)) entry->_bhfi_valid = true; +#ifdef BACKUP_READ_IMPLEMENTED if (ScanNTFSStreams(entry, hFile)) entry->_scanned = true; // There exist named NTFS sub-streams in this file. +#endif CloseHandle(hFile); } diff --git a/reactos/base/shell/explorer/shell/winfs.h b/reactos/base/shell/explorer/shell/winfs.h index b58803562ac..893b49b824c 100644 --- a/reactos/base/shell/explorer/shell/winfs.h +++ b/reactos/base/shell/explorer/shell/winfs.h @@ -25,6 +25,8 @@ // Martin Fuchs, 23.07.2003 // +/* Enable this when the BackupRead API is implemented */ +// #define BACKUP_READ_IMPLEMENTED /// Windows file system file-entry struct WinEntry : public Entry @@ -65,4 +67,6 @@ struct WinDirectory : public WinEntry, public Directory virtual Entry* find_entry(const void*); }; +#ifdef BACKUP_READ_IMPLEMENTED extern int ScanNTFSStreams(Entry* entry, HANDLE hFile); +#endif From b36bcbb154b5f8ee7b32457a2c0fd86db193fbaa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 22 Aug 2014 19:13:31 +0000 Subject: [PATCH 40/55] [NDISUIO] Add required PnPEventHandler CORE-8292 svn path=/trunk/; revision=63916 --- reactos/drivers/network/ndisuio/main.c | 1 + reactos/drivers/network/ndisuio/ndisuio.h | 5 +++++ reactos/drivers/network/ndisuio/protocol.c | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/reactos/drivers/network/ndisuio/main.c b/reactos/drivers/network/ndisuio/main.c index 07567770240..b95cf357517 100644 --- a/reactos/drivers/network/ndisuio/main.c +++ b/reactos/drivers/network/ndisuio/main.c @@ -74,6 +74,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject, Chars.MinorNdisVersion = NDIS_MINOR_VERSION; Chars.OpenAdapterCompleteHandler = NduOpenAdapterComplete; Chars.CloseAdapterCompleteHandler = NduCloseAdapterComplete; + Chars.PnPEventHandler = NduNetPnPEvent; Chars.SendCompleteHandler = NduSendComplete; Chars.TransferDataCompleteHandler = NduTransferDataComplete; Chars.ResetCompleteHandler = NduResetComplete; diff --git a/reactos/drivers/network/ndisuio/ndisuio.h b/reactos/drivers/network/ndisuio/ndisuio.h index 00a375531a1..e4f3b2d5262 100644 --- a/reactos/drivers/network/ndisuio/ndisuio.h +++ b/reactos/drivers/network/ndisuio/ndisuio.h @@ -134,6 +134,11 @@ NTAPI NduCloseAdapterComplete(NDIS_HANDLE ProtocolBindingContext, NDIS_STATUS Status); +NDIS_STATUS +NTAPI +NduNetPnPEvent(NDIS_HANDLE ProtocolBindingContext, + PNET_PNP_EVENT NetPnPEvent); + VOID NTAPI NduSendComplete(NDIS_HANDLE ProtocolBindingContext, diff --git a/reactos/drivers/network/ndisuio/protocol.c b/reactos/drivers/network/ndisuio/protocol.c index 76417b7cf29..1eaa46b73aa 100644 --- a/reactos/drivers/network/ndisuio/protocol.c +++ b/reactos/drivers/network/ndisuio/protocol.c @@ -40,6 +40,25 @@ NduCloseAdapterComplete(NDIS_HANDLE ProtocolBindingContext, KeSetEvent(&AdapterContext->AsyncEvent, IO_NO_INCREMENT, FALSE); } +NDIS_STATUS +NTAPI +NduNetPnPEvent(NDIS_HANDLE ProtocolBindingContext, + PNET_PNP_EVENT NetPnPEvent) +{ + DPRINT("NetPnPEvent\n"); + + switch (NetPnPEvent->NetEvent) + { + case NetEventQueryRemoveDevice: + /* Nothing to do */ + return NDIS_STATUS_SUCCESS; + + default: + DPRINT1("NetPnPEvent unimplemented for net event 0x%x\n", NetPnPEvent->NetEvent); + return NDIS_STATUS_FAILURE; + } +} + VOID NTAPI NduSendComplete(NDIS_HANDLE ProtocolBindingContext, From e3ab3c712a6e80b59a3fc66e6406494ac8ae15dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Fri, 22 Aug 2014 19:14:31 +0000 Subject: [PATCH 41/55] [NTOS:IO] - Do not crash if an invalid PDO is given to IopEditDeviceList - Always dereference device object when removing it (should be the last reference) CORE-8294 svn path=/trunk/; revision=63917 --- reactos/ntoskrnl/io/iomgr/device.c | 5 +++++ reactos/ntoskrnl/io/pnpmgr/pnpmgr.c | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/reactos/ntoskrnl/io/iomgr/device.c b/reactos/ntoskrnl/io/iomgr/device.c index a0e19615056..c68d8306dbd 100644 --- a/reactos/ntoskrnl/io/iomgr/device.c +++ b/reactos/ntoskrnl/io/iomgr/device.c @@ -351,6 +351,11 @@ IopEditDeviceList(IN PDRIVER_OBJECT DriverObject, while (Previous->NextDevice != DeviceObject) { /* Not this one, keep moving */ + if (!Previous->NextDevice) + { + DPRINT1("Failed to remove PDO %p on driver %wZ (not found)\n", DeviceObject, &DeviceObject->DriverObject->DriverName); + return; + } Previous = Previous->NextDevice; } diff --git a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c index ee036a78770..cf84e79e8a5 100644 --- a/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/reactos/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -597,6 +597,7 @@ IopSendRemoveDevice(IN PDEVICE_OBJECT DeviceObject) &GUID_TARGET_DEVICE_REMOVE_COMPLETE, NULL, NULL); + ObDereferenceObject(DeviceObject); } static @@ -4431,7 +4432,6 @@ IopSendRemoveDeviceRelations(PDEVICE_RELATIONS DeviceRelations) for (i = 0; i < DeviceRelations->Count; i++) { IopSendRemoveDevice(DeviceRelations->Objects[i]); - ObDereferenceObject(DeviceRelations->Objects[i]); DeviceRelations->Objects[i] = NULL; } From 7cd7bc2b9798717e1bfe127de04da6470df84618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 10:19:57 +0000 Subject: [PATCH 42/55] [INCLUDE/CRT] - import ivec.h from mingw-w64 [INCLUDE/PSDK] - import bthdef and stralign.h from mingw-w64 svn path=/trunk/; revision=63918 --- reactos/include/crt/ivec.h | 55 +++ reactos/include/psdk/bthdef.h | 627 ++++++++++++++++++++++++++++++++ reactos/include/psdk/stralign.h | 206 +++++++++++ 3 files changed, 888 insertions(+) create mode 100644 reactos/include/crt/ivec.h create mode 100644 reactos/include/psdk/bthdef.h create mode 100644 reactos/include/psdk/stralign.h diff --git a/reactos/include/crt/ivec.h b/reactos/include/crt/ivec.h new file mode 100644 index 00000000000..7d10e0317c1 --- /dev/null +++ b/reactos/include/crt/ivec.h @@ -0,0 +1,55 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef _IVEC_H_INCLUDED +#define _IVEC_H_INCLUDED +#ifndef RC_INVOKED + +#if !defined __cplusplus +#error This file is only supported in C++ compilations! +#endif + +#include +#include +#include +#include + +#pragma pack(push,_CRT_PACKING) + +#if defined(_ENABLE_VEC_DEBUG) +#include +#endif + +#pragma pack(pop) + +#ifdef __SSE__ + +#define _MM_QW (*((__int64*)&vec)) + +#pragma pack(push,16) + +class M64 +{ +protected: + __m64 vec; +public: + M64() {} + M64(__m64 mm) { vec = mm; } + M64(__int64 mm) { _MM_QW = mm; } + M64(int i) { vec = _m_from_int(i); } + + operator __m64() const { return vec; } + + M64& operator&=(const M64 &a) { return *this = (M64) _m_pand(vec,a); } + M64& operator|=(const M64 &a) { return *this = (M64) _m_por(vec,a); } + M64& operator^=(const M64 &a) { return *this = (M64) _m_pxor(vec,a); } +}; + +#pragma pack(pop) + +#endif /* ifdef __SSE__ */ + +#endif +#endif diff --git a/reactos/include/psdk/bthdef.h b/reactos/include/psdk/bthdef.h new file mode 100644 index 00000000000..d49a60a8f4e --- /dev/null +++ b/reactos/include/psdk/bthdef.h @@ -0,0 +1,627 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef _INC_BTHDEF +#define _INC_BTHDEF + +#include <_mingw_unicode.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* ULONGLONG according to google */ +__MINGW_EXTENSION typedef ULONGLONG BTH_ADDR; +/* ULONG according to google */ +typedef ULONG BTH_COD; + +/*http://www.koders.com/delphi/fidD54082EB25FCAB99B74E5FDB4F3937EFB567FE9A.aspx*/ +/* The following parts are under LGPL */ + +DEFINE_GUID(GUID_BTHPORT_DEVICE_INTERFACE,0x0850302A,0xB344,0x4fda,0x9B,0xE9,0x90,0x57,0x6B,0x8D,0x46,0xF0); +DEFINE_GUID(GUID_BLUETOOTH_RADIO_IN_RANGE,0xEA3B5B82,0x26EE,0x450E,0xB0,0xD8,0xD2,0x6F,0xE3,0x0A,0x38,0x69); +DEFINE_GUID(GUID_BLUETOOTH_RADIO_OUT_OF_RANGE,0xE28867C9,0xC2AA,0x4CED,0xB9,0x69,0x45,0x70,0x86,0x60,0x37,0xC4); +DEFINE_GUID(GUID_BLUETOOTH_PIN_REQUEST,0xBD198B7C,0x24AB,0x4B9A,0x8C,0x0D,0xA8,0xEA,0x83,0x49,0xAA,0x16); +DEFINE_GUID(GUID_BLUETOOTH_L2CAP_EVENT,0x7EAE4030,0xB709,0x4AA8,0xAC,0x55,0xE9,0x53,0x82,0x9C,0x9D,0xAA); +DEFINE_GUID(GUID_BLUETOOTH_HCI_EVENT,0xFC240062,0x1541,0x49BE,0xB4,0x63,0x84,0xC4,0xDC,0xD7,0xBF,0x7F); +DEFINE_GUID(BLUETOOTH_BASE_UUID,0x00000000,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(SDP_PROTOCOL_UUID,0x00000001,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(UDP_PROTOCOL_UUID,0x00000002,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(RFCOMM_PROTOCOL_UUID,0x00000003,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(TCP_PROTOCOL_UUID,0x00000004,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(TCSBIN_PROTOCOL_UUID,0x00000005,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(TCSAT_PROTOCOL_UUID,0x00000006,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(OBEX_PROTOCOL_UUID,0x00000008,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(IP_PROTOCOL_UUID,0x00000009,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(FTP_PROTOCOL_UUID,0x0000000A,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HTTP_PROTOCOL_UUID,0x0000000C,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(WSP_PROTOCOL_UUID,0x0000000E,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(BNEP_PROTOCOL_UUID,0x0000000F,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(UPNP_PROTOCOL_UUID,0x00000010,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HCCC_PROTOCOL_UUID,0x00000012,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HCDC_PROTOCOL_UUID,0x00000014,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HN_PROTOCOL_UUID,0x00000016,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AVCTP_PROTOCOL_UUID,0x00000017,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AVDTP_PROTOCOL_UUID,0x00000019,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(CMPT_PROTOCOL_UUID,0x0000001B,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(UDI_C_PLANE_PROTOCOL_UUID,0x0000001D,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(L2CAP_PROTOCOL_UUID,0x00000100,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); + +#define SDP_PROTOCOL_UUID16 0x0001 +#define UDP_PROTOCOL_UUID16 0x0002 +#define RFCOMM_PROTOCOL_UUID16 0x0003 +#define TCP_PROTOCOL_UUID16 0x0004 +#define TCSBIN_PROTOCOL_UUID16 0x0005 +#define TCSAT_PROTOCOL_UUID16 0x0006 +#define OBEX_PROTOCOL_UUID16 0x0008 +#define IP_PROTOCOL_UUID16 0x0009 +#define FTP_PROTOCOL_UUID16 0x000A +#define HTTP_PROTOCOL_UUID16 0x000C +#define WSP_PROTOCOL_UUID16 0x000E +#define BNEP_PROTOCOL_UUID16 0x000F +#define UPNP_PROTOCOL_UUID16 0x0010 +#define HID_PROTOCOL_UUID16 0x0011 +#define HCCC_PROTOCOL_UUID16 0x0012 +#define HCDC_PROTOCOL_UUID16 0x0014 +#define HCN_PROTOCOL_UUID16 0x0016 +#define AVCTP_PROTOCOL_UUID16 0x0017 +#define AVDTP_PROTOCOL_UUID16 0x0019 +#define CMPT_PROTOCOL_UUID16 0x001B +#define UDI_C_PLANE_PROTOCOL_UUID16 0x001D +#define L2CAP_PROTOCOL_UUID16 0x0100 + +DEFINE_GUID(ServiceDiscoveryServerServiceClassID_UUID,0x00001000,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(BrowseGroupDescriptorServiceClassID_UUID,0x00001001,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(PublicBrowseGroupServiceClass_UUID,0x00001002,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(SerialPortServiceClass_UUID,0x00001101,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(LANAccessUsingPPPServiceClass_UUID,0x00001102,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(DialupNetworkingServiceClass_UUID,0x00001103,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(IrMCSyncServiceClass_UUID,0x00001104,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(OBEXObjectPushServiceClass_UUID,0x00001105,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(OBEXFileTransferServiceClass_UUID,0x00001106,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(IrMCSyncCommandServiceClass_UUID,0x00001107,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HeadsetServiceClass_UUID,0x00001108,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(CordlessTelephonyServiceClass_UUID,0x00001109,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AudioSourceServiceClass_UUID,0x0000110A,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AudioSinkServiceClass_UUID,0x0000110B,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AVRemoteControlTargetServiceClass_UUID,0x0000110C,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AdvancedAudioDistributionServiceClass_UUID,0x0000110D,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AVRemoteControlServiceClass_UUID,0x0000110E,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(VideoConferencingServiceClass_UUID,0x0000110F,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(IntercomServiceClass_UUID,0x00001110,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(FaxServiceClass_UUID,0x00001111,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HeadsetAudioGatewayServiceClass_UUID,0x00001112,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(WAPServiceClass_UUID,0x00001113,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(WAPClientServiceClass_UUID,0x00001114,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(PANUServiceClass_UUID,0x00001115,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(NAPServiceClass_UUID,0x00001116,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(GNServiceClass_UUID,0x00001117,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(DirectPrintingServiceClass_UUID,0x00001118,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ReferencePrintingServiceClass_UUID,0x00001119,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ImagingServiceClass_UUID,0x0000111A,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ImagingResponderServiceClass_UUID,0x0000111B,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ImagingAutomaticArchiveServiceClass_UUID,0x0000111C,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ImagingReferenceObjectsServiceClass_UUID,0x0000111D,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HandsfreeServiceClass_UUID,0x0000111E,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HandsfreeAudioGatewayServiceClass_UUID,0x0000111F,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(DirectPrintingReferenceObjectsServiceClass_UUID,0x00001120,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(ReflectedUIServiceClass_UUID,0x00001121,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(BasicPringingServiceClass_UUID,0x00001122,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(PrintingStatusServiceClass_UUID,0x00001123,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HumanInterfaceDeviceServiceClass_UUID,0x00001124,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HardcopyCableReplacementServiceClass_UUID,0x00001125,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HCRPrintServiceClass_UUID,0x00001126,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(HCRScanServiceClass_UUID,0x00001127,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(CommonISDNAccessServiceClass_UUID,0x00001128,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(VideoConferencingGWServiceClass_UUID,0x00001129,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(UDIMTServiceClass_UUID,0x0000112A,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(UDITAServiceClass_UUID,0x0000112B,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(AudioVideoServiceClass_UUID,0x0000112C,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(PnPInformationServiceClass_UUID,0x00001200,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(GenericNetworkingServiceClass_UUID,0x00001201,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(GenericFileTransferServiceClass_UUID,0x00001202,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(GenericAudioServiceClass_UUID,0x00001203,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); +DEFINE_GUID(GenericTelephonyServiceClass_UUID,0x00001204,0x0000,0x1000,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB); + +#define ServiceDiscoveryServerServiceClassID_UUID16 0x1000 +#define BrowseGroupDescriptorServiceClassID_UUID16 0x1001 +#define PublicBrowseGroupServiceClassID_UUID16 0x1002 +#define SerialPortServiceClassID_UUID16 0x1101 +#define LANAccessUsingPPPServiceClassID_UUID16 0x1102 +#define DialupNetworkingServiceClassID_UUID16 0x1103 +#define IrMCSyncServiceClassID_UUID16 0x1104 +#define OBEXObjectPushServiceClassID_UUID16 0x1105 +#define OBEXFileTransferServiceClassID_UUID16 0x1106 +#define IrMcSyncCommandServiceClassID_UUID16 0x1107 +#define HeadsetServiceClassID_UUID16 0x1108 +#define CordlessServiceClassID_UUID16 0x1109 +#define AudioSourceServiceClassID_UUID16 0x110A +#define AudioSinkSourceServiceClassID_UUID16 0x110B +#define AVRemoteControlTargetServiceClassID_UUID16 0x110C +#define AdvancedAudioDistributionServiceClassID_UUID16 0x110D +#define AVRemoteControlServiceClassID_UUID16 0x110E +#define VideoConferencingServiceClassID_UUID16 0x110F +#define IntercomServiceClassID_UUID16 0x1110 +#define FaxServiceClassID_UUID16 0x1111 +#define HeadsetAudioGatewayServiceClassID_UUID16 0x1112 +#define WAPServiceClassID_UUID16 0x1113 +#define WAPClientServiceClassID_UUID16 0x1114 +#define PANUServiceClassID_UUID16 0x1115 +#define NAPServiceClassID_UUID16 0x1116 +#define GNServiceClassID_UUID16 0x1117 +#define DirectPrintingServiceClassID_UUID16 0x1118 +#define ReferencePrintingServiceClassID_UUID16 0x1119 +#define ImagingServiceClassID_UUID16 0x111A +#define ImagingResponderServiceClassID_UUID16 0x111B +#define ImagingAutomaticArchiveServiceClassID_UUID16 0x111C +#define ImagingReferenceObjectsServiceClassID_UUID16 0x111D +#define HandsfreeServiceClassID_UUID16 0x111E +#define HandsfreeAudioGatewayServiceClassID_UUID16 0x111F +#define DirectPrintingReferenceObjectsServiceClassID_UUID16 0x1120 +#define ReflectsUIServiceClassID_UUID16 0x1121 +#define BasicPrintingServiceClassID_UUID16 0x1122 +#define PrintingStatusServiceClassID_UUID16 0x1123 +#define HumanInterfaceDeviceServiceClassID_UUID16 0x1124 +#define HardcopyCableReplacementServiceClassID_UUID16 0x1125 +#define HCRPrintServiceClassID_UUID16 0x1126 +#define HCRScanServiceClassID_UUID16 0x1127 +#define CommonISDNAccessServiceClass_UUID16 0x1128 +#define VideoConferencingGWServiceClass_UUID16 0x1129 +#define UDIMTServiceClass_UUID16 0x112A +#define UDITAServiceClass_UUID16 0x112B +#define AudioVideoServiceClass_UUID16 0x112C + +#define PnPInformationServiceClassID_UUID16 0x1200 +#define GenericNetworkingServiceClassID_UUID16 0x1201 +#define GenericFileTransferServiceClassID_UUID16 0x1202 +#define GenericAudioServiceClassID_UUID16 0x1203 +#define GenericTelephonyServiceClassID_UUID16 0x1204 + +#define BTH_MAX_NAME_SIZE 248 +#define BTH_MAX_PIN_SIZE 16 +#define BTH_LINK_KEY_LENGTH 16 + +#define BTH_MFG_ERICSSON 0 +#define BTH_MFG_NOKIA 1 +#define BTH_MFG_INTEL 2 +#define BTH_MFG_IBM 3 +#define BTH_MFG_TOSHIBA 4 +#define BTH_MFG_3COM 5 +#define BTH_MFG_MICROSOFT 6 +#define BTH_MFG_LUCENT 7 +#define BTH_MFG_MOTOROLA 8 +#define BTH_MFG_INFINEON 9 +#define BTH_MFG_CSR 10 +#define BTH_MFG_SILICONWAVE 11 +#define BTH_MFG_DIGIANSWER 12 +#define BTH_MFG_TI 13 +#define BTH_MFG_PARTHUS 14 +#define BTH_MFG_BROADCOM 15 +#define BTH_MFG_MITEL 16 +#define BTH_MFG_WIDCOMM 17 +#define BTH_MFG_ZEEVO 18 +#define BTH_MFG_ATMEL 19 +#define BTH_MFG_MITSIBUSHI 20 +#define BTH_MFG_RTX_TELECOM 21 +#define BTH_MFG_KC_TECHNOLOGY 22 +#define BTH_MFG_NEWLOGIC 23 +#define BTH_MFG_TRANSILICA 24 +#define BTH_MFG_ROHDE_SCHWARZ 25 +#define BTH_MFG_TTPCOM 26 +#define BTH_MFG_SIGNIA 27 +#define BTH_MFG_CONEXANT 28 +#define BTH_MFG_QUALCOMM 29 +#define BTH_MFG_INVENTEL 30 +#define BTH_MFG_AVM_BERLIN 31 +#define BTH_MFG_BANDSPEED 32 +#define BTH_MFG_MANSELLA 33 +#define BTH_MFG_NEC 34 +#define BTH_MFG_WAVEPLUS_TECHNOLOGY_CO 35 +#define BTH_MFG_ALCATEL 36 +#define BTH_MFG_PHILIPS_SEMICONDUCTOR 37 +#define BTH_MFG_C_TECHNOLOGIES 38 +#define BTH_MFG_OPEN_INTERFACE 39 +#define BTH_MFG_RF_MICRO_DEVICES 40 +#define BTH_MFG_HITACHI 41 +#define BTH_MFG_SYMBOL_TECHNOLOGIES 42 +#define BTH_MFG_TENOVIS 43 +#define BTH_MFG_MACRONIX_INTERNATIONAL 44 +#define BTH_MFG_INTERNAL_USE 65535 + +#define BTH_ADDR_NULL 0ULL + +#define NAP_MASK 0xFFFF00000000ULL +#define SAP_MASK 0x0000FFFFFFFFULL +#define NAP_BIT_OFFSET 32 +#define SAP_BIT_OFFSET 0 + +#define GET_NAP(X) (((X)&NAP_MASK)>>NAP_BIT_OFFSET) +#define GET_SAP(X) (((X)&SAP_MASK)>>SAP_BIT_OFFSET) +#define SET_NAP(X) ((X)<> COD_FORMAT_BIT_OFFSET) +#define GET_COD_MINOR(X) (((X) & COD_MINOR_MASK) >> COD_MINOR_BIT_OFFSET) +#define GET_COD_MAJOR(X) (((X) & COD_MAJOR_MASK) >> COD_MAJOR_BIT_OFFSET) +#define GET_COD_SERVICE(X) (((X) & COD_SERVICE_MASK) >> COD_SERVICE_BIT_OFFSET) + +#define SET_COD_MINOR(X,Y) (((X) & ~(COD_MINOR_MASK)) | ((Y) << COD_MINOR_BIT_OFFSET)) +#define SET_COD_MAJOR(X,Y) (((X) & ~(COD_MAJOR_MASK)) | ((Y) << COD_MAJOR_BIT_OFFSET)) +#define SET_COD_SERVICE(X,Y) (((X) & ~(COD_SERVICE_MASK)) | ((Y) << COD_SERVICE_BIT_OFFSET)) + +#define COD_VERSION 0 + +#define COD_SERVICE_LIMITED 0x0001 +#define COD_SERVICE_POSITIONING 0x0008 +#define COD_SERVICE_NETWORKING 0x0010 +#define COD_SERVICE_RENDERING 0x0020 +#define COD_SERVICE_CAPTURING 0x0040 +#define COD_SERVICE_OBJECT_XFER 0x0080 +#define COD_SERVICE_AUDIO 0x0100 +#define COD_SERVICE_TELEPHONY 0x0200 +#define COD_SERVICE_INFORMATION 0x0400 + +#define COD_SERVICE_VALID_MASK (COD_SERVICE_LIMITED|COD_SERVICE_POSITIONING|COD_SERVICE_NETWORKING|COD_SERVICE_RENDERING|COD_SERVICE_CAPTURING|COD_SERVICE_OBJECT_XFER|COD_SERVICE_AUDIO|COD_SERVICE_TELEPHONY|COD_SERVICE_INFORMATION) + +#define COD_SERVICE_MAX_COUNT 9 + +#define COD_MAJOR_MISCELLANEOUS 0x00 +#define COD_MAJOR_COMPUTER 0x01 +#define COD_MAJOR_PHONE 0x02 +#define COD_MAJOR_LAN_ACCESS 0x03 +#define COD_MAJOR_AUDIO 0x04 +#define COD_MAJOR_PERIPHERAL 0x05 +#define COD_MAJOR_IMAGING 0x06 +#define COD_MAJOR_UNCLASSIFIED 0x1F + +#define COD_COMPUTER_MINOR_UNCLASSIFIED 0x00 +#define COD_COMPUTER_MINOR_DESKTOP 0x01 +#define COD_COMPUTER_MINOR_SERVER 0x02 +#define COD_COMPUTER_MINOR_LAPTOP 0x03 +#define COD_COMPUTER_MINOR_HANDHELD 0x04 +#define COD_COMPUTER_MINOR_PALM 0x05 +#define COD_COMPUTER_MINOR_WEARABLE 0x06 + +#define COD_PHONE_MINOR_UNCLASSIFIED 0x00 +#define COD_PHONE_MINOR_CELLULAR 0x01 +#define COD_PHONE_MINOR_CORDLESS 0x02 +#define COD_PHONE_MINOR_SMART 0x03 +#define COD_PHONE_MINOR_WIRED_MODEM 0x04 + +#define COD_AUDIO_MINOR_UNCLASSIFIED 0x00 +#define COD_AUDIO_MINOR_HEADSET 0x01 +#define COD_AUDIO_MINOR_HANDS_FREE 0x02 +#define COD_AUDIO_MINOR_HEADSET_HANDS_FREE 0x03 +#define COD_AUDIO_MINOR_MICROPHONE 0x04 +#define COD_AUDIO_MINOR_LOUDSPEAKER 0x05 +#define COD_AUDIO_MINOR_HEADPHONES 0x06 +#define COD_AUDIO_MINOR_PORTABLE_AUDIO 0x07 +#define COD_AUDIO_MINOR_CAR_AUDIO 0x08 +#define COD_AUDIO_MINOR_SET_TOP_BOX 0x09 +#define COD_AUDIO_MINOR_HIFI_AUDIO 0x0A +#define COD_AUDIO_MINOR_VCR 0x0B +#define COD_AUDIO_MINOR_VIDEO_CAMERA 0x0C +#define COD_AUDIO_MINOR_CAMCORDER 0x0D +#define COD_AUDIO_MINOR_VIDEO_MONITOR 0x0E +#define COD_AUDIO_MINOR_VIDEO_DISPLAY_LOUDSPEAKER 0x0F +#define COD_AUDIO_MINOR_VIDEO_DISPLAY_CONFERENCING 0x10 +/* #define COD_AUDIO_MINOR_RESERVED 0x11 */ +#define COD_AUDIO_MINOR_GAMING_TOY 0x12 + +#define COD_PERIPHERAL_MINOR_KEYBOARD_MASK 0x10 +#define COD_PERIPHERAL_MINOR_POINTER_MASK 0x20 + +#define COD_PERIPHERAL_MINOR_NO_CATEGORY 0x00 +#define COD_PERIPHERAL_MINOR_JOYSTICK 0x01 +#define COD_PERIPHERAL_MINOR_GAMEPAD 0x02 +#define COD_PERIPHERAL_MINOR_REMOTE_CONTROL 0x03 +#define COD_PERIPHERAL_MINOR_SENSING 0x04 + +#define COD_IMAGING_MINOR_DISPLAY_MASK 0x04 +#define COD_IMAGING_MINOR_CAMERA_MASK 0x08 +#define COD_IMAGING_MINOR_SCANNER_MASK 0x10 +#define COD_IMAGING_MINOR_PRINTER_MASK 0x20 + +#define COD_LAN_ACCESS_BIT_OFFSET 5 +#define COD_LAN_MINOR_MASK 0x0000001C +#define COD_LAN_ACCESS_MASK 0x000000E0 + +#define GET_COD_LAN_MINOR(X) (((X) & COD_LAN_MINOR_MASK) >> COD_MINOR_BIT_OFFSET) +#define GET_COD_LAN_ACCESS(X) (((X) & COD_LAN_ACCESS_MASK) >> COD_LAN_ACCESS_BIT_OFFSET) + +#define COD_LAN_MINOR_UNCLASSIFIED 0x00 + +#define COD_LAN_ACCESS_0_USED 0x00 +#define COD_LAN_ACCESS_17_USED 0x01 +#define COD_LAN_ACCESS_33_USED 0x02 +#define COD_LAN_ACCESS_50_USED 0x03 +#define COD_LAN_ACCESS_67_USED 0x04 +#define COD_LAN_ACCESS_83_USED 0x05 +#define COD_LAN_ACCESS_99_USED 0x06 +#define COD_LAN_ACCESS_FULL 0x07 + +#define LAP_GIAC_VALUE 0x009E8B00 + +#define LAP_LIAC_VALUE 0x009E8B00 +#define BTH_ADDR_IAC_FIRST 0x9E8B00 +#define BTH_ADDR_IAC_LAST 0x9E8B3 +#define BTH_ADDR_LIAC 0x9E8B00 +#define BTH_ADDR_GIAC 0x9E8B33 + +typedef UCHAR BTHSTATUS, *PBTHSTATUS; + +#define BTH_ERROR(X) ((X) != BTH_ERROR_SUCCESS) +#define BTH_SUCCESS(X) ((X) === BTH_ERROR_SUCCESS) + +#define BTH_ERROR_SUCCESS 0x00 +#define BTH_ERROR_UNKNOWN_HCI_COMMAND 0x01 +#define BTH_ERROR_NO_CONNECTION 0x02 +#define BTH_ERROR_HARDWARE_FAILURE 0x03 +#define BTH_ERROR_PAGE_TIMEOUT 0x04 +#define BTH_ERROR_AUTHENTICATION_FAILURE 0x05 +#define BTH_ERROR_KEY_MISSING 0x06 +#define BTH_ERROR_MEMORY_FULL 0x07 +#define BTH_ERROR_CONNECTION_TIMEOUT 0x08 +#define BTH_ERROR_MAX_NUMBER_OF_CONNECTIONS 0x09 +#define BTH_ERROR_MAX_NUMBER_OF_SCO_CONNECTIONS 0x0A +#define BTH_ERROR_ACL_CONNECTION_ALREADY_EXISTS 0x0B +#define BTH_ERROR_COMMAND_DISALLOWED 0x0C +#define TH_ERROR_COMMAND_DISALLOWED 0x0D +#define BTH_ERROR_HOST_REJECTED_SECURITY_REASONS 0x0E +#define BTH_ERROR_HOST_REJECTED_PERSONAL_DEVICE 0x0F +#define BTH_ERROR_HOST_TIMEOUT 0x10 +#define BTH_ERROR_UNSUPPORTED_FEATURE_OR_PARAMETER 0x11 +#define BTH_ERROR_INVALID_HCI_PARAMETER 0x12 +#define BTH_ERROR_REMOTE_USER_ENDED_CONNECTION 0x13 +#define BTH_ERROR_REMOTE_LOW_RESOURCES 0x14 +#define BTH_ERROR_REMOTE_POWERING_OFF 0x15 +#define BTH_ERROR_LOCAL_HOST_TERMINATED_CONNECTION 0x16 +#define BTH_ERROR_REPEATED_ATTEMPTS 0x17 +#define BTH_ERROR_PAIRING_NOT_ALLOWED 0x18 +#define BTH_ERROR_UKNOWN_LMP_PDU 0x19 +#define BTH_ERROR_UNSUPPORTED_REMOTE_FEATURE 0x1A +#define BTH_ERROR_SCO_OFFSET_REJECTED 0x1B +#define BTH_ERROR_SCO_INTERVAL_REJECTED 0x1C +#define BTH_ERROR_SCO_AIRMODE_REJECTED 0x1D +#define BTH_ERROR_INVALID_LMP_PARAMETERS 0x1E +#define BTH_ERROR_UNSPECIFIED_ERROR 0x1F +#define BTH_ERROR_UNSUPPORTED_LMP_PARM_VALUE 0x20 +#define BTH_ERROR_ROLE_CHANGE_NOT_ALLOWED 0x21 +#define BTH_ERROR_LMP_RESPONSE_TIMEOUT 0x22 +#define BTH_ERROR_LMP_TRANSACTION_COLLISION 0x23 +#define BTH_ERROR_LMP_PDU_NOT_ALLOWED 0x24 +#define BTH_ERROR_ENCRYPTION_MODE_NOT_ACCEPTABLE 0x25 +#define BTH_ERROR_UNIT_KEY_NOT_USED 0x26 +#define BTH_ERROR_QOS_IS_NOT_SUPPORTED 0x27 +#define BTH_ERROR_INSTANT_PASSED 0x28 +#define BTH_ERROR_PAIRING_WITH_UNIT_KEY_NOT_SUPPORTED 0x29 +#define BTH_ERROR_UNSPECIFIED 0xFF + +#define L2CAP_MIN_MTU 48 +#define L2CAP_MAX_MTU 0xFFFF +#define L2CAP_DEFAULT_MTU 672 + +#define MAX_L2CAP_PING_DATA_LENGTH 44 +#define MAX_L2CAP_INFO_DATA_LENGTH 44 + +#define BDIF_ADDRESS 0x00000001 +#define BDIF_COD 0x00000002 +#define BDIF_NAME 0x00000004 +#define BDIF_PAIRED 0x00000008 +#define BDIF_PERSONAL 0x00000010 +#define BDIF_CONNECTED 0x00000020 +#define BDIF_VALID_FLAGS (BDIF_ADDRESS|BDIF_COD|BDIF_NAME|BDIF_PAIRED|BDIF_PERSONAL|BDIF_CONNECTED) + +typedef struct _BTH_DEVICE_INFO { + ULONG flags; + BTH_ADDR address; + BTH_COD classOfDevice; + CHAR name[BTH_MAX_NAME_SIZE]; +} BTH_DEVICE_INFO, *PBTH_DEVICE_INFO; + +typedef struct _BTH_RADIO_IN_RANGE { + BTH_DEVICE_INFO deviceInfo; + ULONG previousDeviceFlags; +} BTH_RADIO_IN_RANGE, *PBTH_RADIO_IN_RANGE; + +typedef struct _BTH_L2CAP_EVENT_INFO { + BTH_ADDR bthAddress; + USHORT psm; + UCHAR connected; + UCHAR initiated; +} BTH_L2CAP_EVENT_INFO, *PBTH_L2CAP_EVENT_INFO; + +#define HCI_CONNNECTION_TYPE_ACL 1 +#define HCI_CONNNECTION_TYPE_SCO 2 + +typedef struct _BTH_HCI_EVENT_INFO { + BTH_ADDR bthAddress; + UCHAR connectionType; + UCHAR connected; +} BTH_HCI_EVENT_INFO, *PBTH_HCI_EVENT_INFO; + +#define MAX_UUIDS_IN_QUERY 12 +#define BTH_VID_DEFAULT_VALUE 0xFFFF + +#define SDP_ERROR_INVALID_SDP_VERSION 0x0001 +#define SDP_ERROR_INVALID_RECORD_HANDLE 0x0002 +#define SDP_ERROR_INVALID_REQUEST_SYNTAX 0x0003 +#define SDP_ERROR_INVALID_PDU_SIZE 0x0004 +#define SDP_ERROR_INVALID_CONTINUATION_STATE 0x0005 +#define SDP_ERROR_INSUFFICIENT_RESOURCES 0x0006 + +#define SDP_ERROR_SUCCESS 0x0000 +#define SDP_ERROR_SERVER_INVALID_RESPONSE 0x0100 +#define SDP_ERROR_SERVER_RESPONSE_DID_NOT_PARSE 0x0200 +#define SDP_ERROR_SERVER_BAD_FORMAT 0x0300 +#define SDP_ERROR_COULD_NOT_SEND_CONTINUE 0x0400 +#define SDP_ERROR_RESPONSE_TOO_LARGE 0x0500 + +#define SDP_ATTRIB_RECORD_HANDLE 0x0000 +#define SDP_ATTRIB_CLASS_ID_LIST 0x0001 +#define SDP_ATTRIB_RECORD_STATE 0x0002 +#define SDP_ATTRIB_SERVICE_ID 0x0003 +#define SDP_ATTRIB_PROTOCOL_DESCRIPTOR_LIST 0x0004 +#define SDP_ATTRIB_BROWSE_GROUP_LIST 0x0005 +#define SDP_ATTRIB_LANG_BASE_ATTRIB_ID_LIST 0x0006 +#define SDP_ATTRIB_INFO_TIME_TO_LIVE 0x0007 +#define SDP_ATTRIB_AVAILABILITY 0x0008 +#define SDP_ATTRIB_PROFILE_DESCRIPTOR_LIST 0x0009 +#define SDP_ATTRIB_DOCUMENTATION_URL 0x000A +#define SDP_ATTRIB_CLIENT_EXECUTABLE_URL 0x000B +#define SDP_ATTRIB_ICON_URL 0x000C +#define SDP_ATTRIB_ADDITIONAL_PROTOCOL_DESCRIPTOR_LIST 0x000D + +#define SDP_ATTRIB_PROFILE_SPECIFIC 0x0200 + +#define LANG_BASE_LANGUAGE_INDEX 0x0000 +#define LANG_BASE_ENCODING_INDEX 0x0001 +#define LANG_BASE_OFFSET_INDEX 0x0002 +#define LANG_DEFAULT_ID 0x0100 + +#define STRING_NAME_OFFSET 0x0000 +#define STRING_DESCRIPTION_OFFSET 0x0001 +#define STRING_PROVIDER_NAME_OFFSET 0x0002 + +#define SDP_ATTRIB_SDP_VERSION_NUMBER_LIST 0x0200 +#define SDP_ATTRIB_SDP_DATABASE_STATE 0x0201 + +#define SDP_ATTRIB_BROWSE_GROUP_ID 0x0200 + +#define SDP_ATTRIB_CORDLESS_EXTERNAL_NETWORK 0x0301 + +#define SDP_ATTRIB_FAX_CLASS_1_SUPPORT 0x0302 +#define SDP_ATTRIB_FAX_CLASS_2_0_SUPPORT 0x0303 +#define SDP_ATTRIB_FAX_CLASS_2_SUPPORT 0x0304 +#define SDP_ATTRIB_FAX_AUDIO_FEEDBACK_SUPPORT 0x0305 + +#define SDP_ATTRIB_HEADSET_REMOTE_AUDIO_VOLUME_CONTROL 0x0302 + +#define SDP_ATTRIB_LAN_LPSUBNET 0x0200 + +#define SDP_ATTRIB_OBJECT_PUSH_SUPPORTED_FORMATS_LIST 0x0303 +#define SDP_ATTRIB_SYNCH_SUPPORTED_DATA_STORES_LIST 0x0301 + +#define SDP_ATTRIB_SERVICE_VERSION 0x0300 + +#define SDP_ATTRIB_PAN_NETWORK_ADDRESS 0x0306 +#define SDP_ATTRIB_PAN_WAP_GATEWAY 0x0307 +#define SDP_ATTRIB_PAN_HOME_PAGE_URL 0x0308 +#define SDP_ATTRIB_PAN_WAP_STACK_TYPE 0x0309 +#define SDP_ATTRIB_PAN_SECURITY_DESCRIPTION 0x030A +#define SDP_ATTRIB_PAN_NET_ACCESS_TYPE 0x030B +#define SDP_ATTRIB_PAN_MAX_NET_ACCESS_RATE 0x030C + +#define SDP_ATTRIB_IMAGING_SUPPORTED_CAPABILITIES 0x0310 +#define SDP_ATTRIB_IMAGING_SUPPORTED_FEATURES 0x0311 +#define SDP_ATTRIB_IMAGING_SUPPORTED_FUNCTIONS 0x0312 +#define SDP_ATTRIB_IMAGING_TOTAL_DATA_CAPACITY 0x0313 + +#define SDP_ATTRIB_DI_SPECIFICATION_ID 0x0200 +#define SDP_ATTRIB_DI_VENDOR_ID 0x0201 +#define SDP_ATTRIB_DI_PRODUCT_ID 0x0202 +#define SDP_ATTRIB_DI_VERSION 0x0203 +#define SDP_ATTRIB_DI_PRIMARY_RECORD 0x0204 +#define SDP_ATTRIB_DI_VENDOR_ID_SOURCE 0x0205 + +#define SDP_ATTRIB_HID_DEVICE_RELEASE_NUMBER 0x0200 +#define SDP_ATTRIB_HID_PARSER_VERSION 0x0201 +#define SDP_ATTRIB_HID_DEVICE_SUBCLASS 0x0202 +#define SDP_ATTRIB_HID_COUNTRY_CODE 0x0203 +#define SDP_ATTRIB_HID_VIRTUAL_CABLE 0x0204 +#define SDP_ATTRIB_HID_RECONNECT_INITIATE 0x0205 +#define SDP_ATTRIB_HID_DESCRIPTOR_LIST 0x0206 +#define SDP_ATTRIB_HID_LANG_ID_BASE_LIST 0x0207 +#define SDP_ATTRIB_HID_SDP_DISABLE 0x0208 +#define SDP_ATTRIB_HID_BATTERY_POWER 0x0209 +#define SDP_ATTRIB_HID_REMOTE_WAKE 0x020A +#define SDP_ATTRIB_HID_REPORT_LIST 0x020B +#define SDP_ATTRIB_HID_SUPERVISION_TIMEOUT 0x020C +#define SDP_ATTRIB_HID_NORMALLY_CONNECTABLE 0x020D +#define SDP_ATTRIB_HID_BOOT_DEVICE 0x020E + +#define CORDLESS_EXTERNAL_NETWORK_PSTN 0x01 +#define CORDLESS_EXTERNAL_NETWORK_ISDN 0x02 +#define CORDLESS_EXTERNAL_NETWORK_GSM 0x03 +#define CORDLESS_EXTERNAL_NETWORK_CDMA 0x04 +#define CORDLESS_EXTERNAL_NETWORK_ANALOG_CELLULAR 0x05 +#define CORDLESS_EXTERNAL_NETWORK_PACKET_SWITCHED 0x06 +#define CORDLESS_EXTERNAL_NETWORK_OTHER 0x07 + +#define OBJECT_PUSH_FORMAT_VCARD_2_1 0x01 +#define OBJECT_PUSH_FORMAT_VCARD_3_0 0x02 +#define OBJECT_PUSH_FORMAT_VCAL_1_0 0x03 +#define OBJECT_PUSH_FORMAT_ICAL_2_0 0x04 +#define OBJECT_PUSH_FORMAT_VNOTE 0x05 +#define OBJECT_PUSH_FORMAT_VMESSAGE 0x06 +#define OBJECT_PUSH_FORMAT_ANY 0xFF + +#define SYNCH_DATA_STORE_PHONEBOOK 0x01 +#define SYNCH_DATA_STORE_CALENDAR 0x03 +#define SYNCH_DATA_STORE_NOTES 0x05 +#define SYNCH_DATA_STORE_MESSAGES 0x06 + +#define DI_VENDOR_ID_SOURCE_BLUETOOTH_SIG 0x0001 +#define DI_VENDOR_ID_SOURCE_USB_IF 0x0002 + +#define PSM_SDP 0x0001 +#define PSM_RFCOMM 0x0003 +#define PSM_TCS_BIN 0x0005 +#define PSM_TCS_BIN_CORDLESS 0x0007 +#define PSM_BNEP 0x0000 +#define PSM_HID_CONTROL 0x0011 +#define PSM_HID_INTERRUPT 0x0013 +#define PSM_AVCTP 0x0017 +#define PSM_AVDTP 0x0019 +#define PSM_UDI_C_PLANE 0x001D + +#define STR_ADDR_FMTA "(%02x:%02x:%02x:%02x:%02x:%02x)" +#define STR_ADDR_FMTW L"(%02x:%02x:%02x:%02x:%02x:%02x)" + +#define STR_ADDR_SHORT_FMTA "%04x%08x" +#define STR_ADDR_SHORT_FMTW L"%04x%08x" + +#define STR_ADDR_FMT __MINGW_NAME_AW(STR_ADDR_FMT) +#define STR_ADDR_SHORT_FMT __MINGW_NAME_AW(STR_ADDR_SHORT_FMT) + +#define GET_BITS(X,Y,Z) (((X)>>(Y))&Z) +#define GET_BIT(X,Y) GET_BITS(X,Y,0x1) + +#define LMP_3_SLOT_PACKETS(X) GET_BIT(X, 1) +#define LMP_ENCRYPTION(X) GET_BIT(X, 2) +#define LMP_SLOT_OFFSET(X) GET_BIT(X, 3) +#define LMP_TIMING_ACCURACY(X) GET_BIT(X, 4) +#define LMP_SWITCH(X) GET_BIT(X, 5) +#define LMP_HOLD_MODE(X) GET_BIT(X, 6) +#define LMP_SNIFF_MODE(X) GET_BIT(X, 7) +#define LMP_PARK_MODE(X) GET_BIT(X, 8) +#define LMP_RSSI(X) GET_BIT(X, 9) +#define LMP_CHANNEL_QUALITY_DRIVEN_MODE(X) GET_BIT(X, 10) +#define LMP_SCO_LINK(X) GET_BIT(X, 11) +#define LMP_HV2_PACKETS(X) GET_BIT(X, 12) +#define LMP_HV3_PACKETS(X) GET_BIT(X, 13) +#define LMP_MU_LAW_LOG(X) GET_BIT(X, 14) +#define LMP_A_LAW_LOG(X) GET_BIT(X, 15) +#define LMP_CVSD(X) GET_BIT(X, 16) +#define LMP_PAGING_SCHEME(X) GET_BIT(X, 17) +#define LMP_POWER_CONTROL(X) GET_BIT(X, 18) +#define LMP_TRANSPARENT_SCO_DATA(X) GET_BIT(X, 19) +#define LMP_FLOW_CONTROL_LAG(X) GET_BITS(X, 20, 0x3) + +#ifdef __cplusplus +} +#endif +#endif /*_INC_BTHDEF*/ diff --git a/reactos/include/psdk/stralign.h b/reactos/include/psdk/stralign.h new file mode 100644 index 00000000000..9b5637d6d6f --- /dev/null +++ b/reactos/include/psdk/stralign.h @@ -0,0 +1,206 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#ifndef __STRALIGN_H_ +#define __STRALIGN_H_ + +#ifndef _STRALIGN_USE_SECURE_CRT +#define _STRALIGN_USE_SECURE_CRT 0 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef WSTR_ALIGNED +#if defined (__amd64__) || defined (__arm__) +#define WSTR_ALIGNED(s) TRUE +#else +#define WSTR_ALIGNED(s) (((DWORD_PTR)(s) & 1) == 0) +#endif +#endif + +#if defined(_X86_) +#define ua_CharUpperW CharUpperW +#define ua_lstrcmpiW lstrcmpiW +#define ua_lstrcmpW lstrcmpW +#define ua_lstrlenW lstrlenW +#define ua_wcschr wcschr +#define ua_wcsicmp wcsicmp +#define ua_wcslen wcslen +#define ua_wcsrchr wcsrchr + + PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source); +#if !defined (__CRT__NO_INLINE) && !defined (__CYGWIN__) + __CRT_INLINE PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source) { return wcscpy(Destination,Source); } +#else +#define ua_wcscpy wcscpy +#endif + +#else /* not _X86_ : */ + +#ifndef WSTR_ALIGNED +#define WSTR_ALIGNED(s) (((DWORD_PTR)(s) & (sizeof(WCHAR)-1))==0) +#endif + + /* TODO: This method seems to be not present for amd64. */ + LPUWSTR WINAPI uaw_CharUpperW(LPUWSTR String); + int WINAPI uaw_lstrcmpW(PCUWSTR String1,PCUWSTR String2); + int WINAPI uaw_lstrcmpiW(PCUWSTR String1,PCUWSTR String2); + int WINAPI uaw_lstrlenW(LPCUWSTR String); + PUWSTR __cdecl uaw_wcschr(PCUWSTR String,WCHAR Character); + PUWSTR __cdecl uaw_wcscpy(PUWSTR Destination,PCUWSTR Source); + int __cdecl uaw_wcsicmp(PCUWSTR String1,PCUWSTR String2); + size_t __cdecl uaw_wcslen(PCUWSTR String); + PUWSTR __cdecl uaw_wcsrchr(PCUWSTR String,WCHAR Character); +#ifdef CharUpper + LPUWSTR ua_CharUpperW(LPUWSTR String); +#ifndef __CRT__NO_INLINE + __CRT_INLINE LPUWSTR ua_CharUpperW(LPUWSTR String) { + if(WSTR_ALIGNED(String)) return CharUpperW((PWSTR)String); + return uaw_CharUpperW(String); + } +#endif /* !__CRT__NO_INLINE */ +#endif /* CharUpper */ + +#ifdef lstrcmp + int ua_lstrcmpW(LPCUWSTR String1,LPCUWSTR String2); +#endif +#ifdef lstrcmpi + int ua_lstrcmpiW(LPCUWSTR String1,LPCUWSTR String2); +#endif +#ifdef lstrlen + int ua_lstrlenW(LPCUWSTR String); +#endif + +#ifndef __CRT__NO_INLINE +#ifdef lstrcmp + __CRT_INLINE int ua_lstrcmpW(LPCUWSTR String1,LPCUWSTR String2) { + if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) + return lstrcmpW((LPCWSTR)String1,(LPCWSTR)String2); + return uaw_lstrcmpW(String1,String2); + } +#endif + +#ifdef lstrcmpi + __CRT_INLINE int ua_lstrcmpiW(LPCUWSTR String1,LPCUWSTR String2) { + if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) + return lstrcmpiW((LPCWSTR)String1,(LPCWSTR)String2); + return uaw_lstrcmpiW(String1,String2); + } +#endif + +#ifdef lstrlen + __CRT_INLINE int ua_lstrlenW(LPCUWSTR String) { + if(WSTR_ALIGNED(String)) return lstrlenW((PCWSTR)String); + return uaw_lstrlenW(String); + } +#endif +#endif /* !__CRT__NO_INLINE */ + +#if defined(_WSTRING_DEFINED) +#ifdef _WConst_return + typedef _WConst_return WCHAR UNALIGNED *PUWSTR_C; +#else + typedef WCHAR UNALIGNED *PUWSTR_C; +#endif + + PUWSTR_C ua_wcschr(PCUWSTR String,WCHAR Character); + PUWSTR_C ua_wcsrchr(PCUWSTR String,WCHAR Character); +#if defined(__cplusplus) && defined(_WConst_Return) + PUWSTR ua_wcschr(PUWSTR String,WCHAR Character); + PUWSTR ua_wcsrchr(PUWSTR String,WCHAR Character); +#endif + PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source); + size_t ua_wcslen(PCUWSTR String); + +#ifndef __CRT__NO_INLINE + __CRT_INLINE PUWSTR_C ua_wcschr(PCUWSTR String,WCHAR Character) { + if(WSTR_ALIGNED(String)) return wcschr((PCWSTR)String,Character); + return (PUWSTR_C)uaw_wcschr(String,Character); + } + __CRT_INLINE PUWSTR_C ua_wcsrchr(PCUWSTR String,WCHAR Character) { + if(WSTR_ALIGNED(String)) return wcsrchr((PCWSTR)String,Character); + return (PUWSTR_C)uaw_wcsrchr(String,Character); + } +#if defined(__cplusplus) && defined(_WConst_Return) + __CRT_INLINE PUWSTR ua_wcschr(PUWSTR String,WCHAR Character) { + if(WSTR_ALIGNED(String)) return wcscpy((PWSTR)Destination,(PCWSTR)Source); + return uaw_wcscpy(Destination,Source); + } + __CRT_INLINE PUWSTR ua_wcsrchr(PUWSTR String,WCHAR Character) { + if(WSTR_ALIGNED(String)) return wcsrchr(String,Character); + return uaw_wcsrchr((PCUWSTR)String,Character); + } +#endif + + __CRT_INLINE PUWSTR ua_wcscpy(PUWSTR Destination,PCUWSTR Source) { + if(WSTR_ALIGNED(Source) && WSTR_ALIGNED(Destination)) + return wcscpy((PWSTR)Destination,(PCWSTR)Source); + return uaw_wcscpy(Destination,Source); + } + __CRT_INLINE size_t ua_wcslen(PCUWSTR String) { + if(WSTR_ALIGNED(String)) return wcslen((PCWSTR)String); + return uaw_wcslen(String); + } +#endif /* !__CRT__NO_INLINE */ +#endif /* _X86_ */ + int ua_wcsicmp(LPCUWSTR String1,LPCUWSTR String2); + +#ifndef __CRT__NO_INLINE + __CRT_INLINE int ua_wcsicmp(LPCUWSTR String1,LPCUWSTR String2) { + if(WSTR_ALIGNED(String1) && WSTR_ALIGNED(String2)) + return _wcsicmp((LPCWSTR)String1,(LPCWSTR)String2); + return uaw_wcsicmp(String1,String2); + } +#endif /* !__CRT__NO_INLINE */ +#endif /* _WSTRING_DEFINED */ + +#ifndef __UA_WCSLEN +#define __UA_WCSLEN ua_wcslen +#endif + +#define __UA_WSTRSIZE(s) ((__UA_WCSLEN(s)+1)*sizeof(WCHAR)) +#define __UA_STACKCOPY(p,s) memcpy(_alloca(s),p,s) + +#if defined (__amd64__) || defined (__arm__) || defined (_X86_) +#define WSTR_ALIGNED_STACK_COPY(d,s) (*(d) = (PCWSTR)(s)) +#else +#define WSTR_ALIGNED_STACK_COPY(d,s) { PCUWSTR __ua_src; ULONG __ua_size; PWSTR __ua_dst; __ua_src = (s); if(WSTR_ALIGNED(__ua_src)) { __ua_dst = (PWSTR)__ua_src; } else { __ua_size = __UA_WSTRSIZE(__ua_src); __ua_dst = (PWSTR)_alloca(__ua_size); memcpy(__ua_dst,__ua_src,__ua_size); } *(d) = (PCWSTR)__ua_dst; } +#endif + +#define ASTR_ALIGNED_STACK_COPY(d,s) (*(d) = (PCSTR)(s)) + +#if !defined (_X86_) && !defined (__amd64__) && !defined (__arm__) +#define __UA_STRUC_ALIGNED(t,s) (((DWORD_PTR)(s) & (TYPE_ALIGNMENT(t)-1))==0) +#define STRUC_ALIGNED_STACK_COPY(t,s) __UA_STRUC_ALIGNED(t,s) ? ((t const *)(s)) : ((t const *)__UA_STACKCOPY((s),sizeof(t))) +#else +#define STRUC_ALIGNED_STACK_COPY(t,s) ((CONST t *)(s)) +#endif + +#if defined(UNICODE) +#define TSTR_ALIGNED_STACK_COPY(d,s) WSTR_ALIGNED_STACK_COPY(d,s) +#define TSTR_ALIGNED(x) WSTR_ALIGNED(x) +#define ua_CharUpper ua_CharUpperW +#define ua_lstrcmp ua_lstrcmpW +#define ua_lstrcmpi ua_lstrcmpiW +#define ua_lstrlen ua_lstrlenW +#define ua_tcscpy ua_wcscpy +#else +#define TSTR_ALIGNED_STACK_COPY(d,s) ASTR_ALIGNED_STACK_COPY(d,s) +#define TSTR_ALIGNED(x) TRUE +#define ua_CharUpper CharUpperA +#define ua_lstrcmp lstrcmpA +#define ua_lstrcmpi lstrcmpiA +#define ua_lstrlen lstrlenA +#define ua_tcscpy strcpy +#endif + +#ifdef __cplusplus +} +#endif + +#include +#endif From ea6842d69a5e95e3035b1e75e199ff3b54f9eeeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 10:20:18 +0000 Subject: [PATCH 43/55] [FORMATTING] - Reformat/refactor some code. No changes. svn path=/trunk/; revision=63919 --- reactos/win32ss/gdi/gdi32/objects/bitmap.c | 674 ++++++++++----------- 1 file changed, 325 insertions(+), 349 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/objects/bitmap.c b/reactos/win32ss/gdi/gdi32/objects/bitmap.c index 132d531b60a..ac0ba65abb5 100644 --- a/reactos/win32ss/gdi/gdi32/objects/bitmap.c +++ b/reactos/win32ss/gdi/gdi32/objects/bitmap.c @@ -13,25 +13,38 @@ * 11/16/1999 (RJJ) lifted from wine */ -INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO * info, WORD coloruse, BOOL max) +INT +FASTCALL DIB_BitmapInfoSize( + const BITMAPINFO * info, + WORD coloruse, + BOOL max) { unsigned int colors, size, masks = 0; if (info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { - const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *)info; - colors = (core->bcBitCount <= 8) ? 1 << core->bcBitCount : 0; - return sizeof(BITMAPCOREHEADER) + colors * - ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBTRIPLE) : sizeof(WORD)); + const BITMAPCOREHEADER *core = (const BITMAPCOREHEADER *) info; + size = sizeof(BITMAPCOREHEADER); + if (core->bcBitCount <= 8) + { + colors = 1 << core->bcBitCount; + if (coloruse == DIB_RGB_COLORS) + size += colors * sizeof(RGBTRIPLE); + else + size += colors * sizeof(WORD); + } + return size; } - else /* assume BITMAPINFOHEADER */ + else /* assume BITMAPINFOHEADER */ { - colors = max ? 1 << info->bmiHeader.biBitCount : info->bmiHeader.biClrUsed; - if (colors > 256) colors = 256; + colors = max ? (1 << info->bmiHeader.biBitCount) : info->bmiHeader.biClrUsed; + if (colors > 256) + colors = 256; if (!colors && (info->bmiHeader.biBitCount <= 8)) colors = 1 << info->bmiHeader.biBitCount; - if (info->bmiHeader.biCompression == BI_BITFIELDS) masks = 3; - size = max( info->bmiHeader.biSize, sizeof(BITMAPINFOHEADER) + masks * sizeof(DWORD) ); + if (info->bmiHeader.biCompression == BI_BITFIELDS) + masks = 3; + size = max(info->bmiHeader.biSize, sizeof(BITMAPINFOHEADER) + masks * sizeof(DWORD)); return size + colors * ((coloruse == DIB_RGB_COLORS) ? sizeof(RGBQUAD) : sizeof(WORD)); } } @@ -43,26 +56,32 @@ INT FASTCALL DIB_BitmapInfoSize(const BITMAPINFO * info, WORD coloruse, BOOL max */ UINT FASTCALL -DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines ) +DIB_BitmapMaxBitsSize( + PBITMAPINFO Info, + UINT ScanLines) { UINT Ret; - if (!Info) return 0; + if (!Info) + return 0; - if ( Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) + if (Info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { - PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)Info; - Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, Core->bcBitCount) * ScanLines; + PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER) Info; + Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, + Core->bcBitCount) * ScanLines; } else /* assume BITMAPINFOHEADER */ { - if (!(Info->bmiHeader.biCompression) || (Info->bmiHeader.biCompression == BI_BITFIELDS)) + if ((Info->bmiHeader.biCompression == BI_RGB) || (Info->bmiHeader.biCompression == BI_BITFIELDS)) { - Ret = WIDTH_BYTES_ALIGN32(Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes, Info->bmiHeader.biBitCount) * ScanLines; + Ret = WIDTH_BYTES_ALIGN32( + Info->bmiHeader.biWidth * Info->bmiHeader.biPlanes, + Info->bmiHeader.biBitCount) * ScanLines; } else { - Ret = Info->bmiHeader.biSizeImage; + Ret = Info->bmiHeader.biSizeImage; } } return Ret; @@ -75,61 +94,62 @@ DIB_BitmapMaxBitsSize( PBITMAPINFO Info, UINT ScanLines ) */ INT WINAPI -DIB_GetBitmapInfo(const BITMAPINFOHEADER *header, - PLONG width, - PLONG height, - PWORD planes, - PWORD bpp, - PLONG compr, - PLONG size ) +DIB_GetBitmapInfo( + const BITMAPINFOHEADER *header, + PLONG width, + PLONG height, + PWORD planes, + PWORD bpp, + PLONG compr, + PLONG size) { if (header->biSize == sizeof(BITMAPCOREHEADER)) { - BITMAPCOREHEADER *core = (BITMAPCOREHEADER *)header; - *width = core->bcWidth; + BITMAPCOREHEADER *core = (BITMAPCOREHEADER *) header; + *width = core->bcWidth; *height = core->bcHeight; *planes = core->bcPlanes; - *bpp = core->bcBitCount; - *compr = 0; - *size = 0; + *bpp = core->bcBitCount; + *compr = 0; + *size = 0; return 0; } if (header->biSize == sizeof(BITMAPINFOHEADER)) { - *width = header->biWidth; + *width = header->biWidth; *height = header->biHeight; *planes = header->biPlanes; - *bpp = header->biBitCount; - *compr = header->biCompression; - *size = header->biSizeImage; + *bpp = header->biBitCount; + *compr = header->biCompression; + *size = header->biSizeImage; return 1; } if (header->biSize == sizeof(BITMAPV4HEADER)) { - BITMAPV4HEADER *v4hdr = (BITMAPV4HEADER *)header; - *width = v4hdr->bV4Width; + BITMAPV4HEADER *v4hdr = (BITMAPV4HEADER *) header; + *width = v4hdr->bV4Width; *height = v4hdr->bV4Height; *planes = v4hdr->bV4Planes; - *bpp = v4hdr->bV4BitCount; - *compr = v4hdr->bV4V4Compression; - *size = v4hdr->bV4SizeImage; + *bpp = v4hdr->bV4BitCount; + *compr = v4hdr->bV4V4Compression; + *size = v4hdr->bV4SizeImage; return 4; } if (header->biSize == sizeof(BITMAPV5HEADER)) { - BITMAPV5HEADER *v5hdr = (BITMAPV5HEADER *)header; - *width = v5hdr->bV5Width; + BITMAPV5HEADER *v5hdr = (BITMAPV5HEADER *) header; + *width = v5hdr->bV5Width; *height = v5hdr->bV5Height; *planes = v5hdr->bV5Planes; - *bpp = v5hdr->bV5BitCount; - *compr = v5hdr->bV5Compression; - *size = v5hdr->bV5SizeImage; + *bpp = v5hdr->bV5BitCount; + *compr = v5hdr->bV5Compression; + *size = v5hdr->bV5SizeImage; return 5; } - DPRINT("(%lu): wrong size for header\n", header->biSize ); + DPRINT("(%lu): wrong size for header\n", header->biSize); return -1; } @@ -138,26 +158,32 @@ DIB_GetBitmapInfo(const BITMAPINFOHEADER *header, */ int WINAPI -GdiGetBitmapBitsSize(BITMAPINFO *lpbmi) +GdiGetBitmapBitsSize( + BITMAPINFO *lpbmi) { UINT Ret; - if (!lpbmi) return 0; + if (!lpbmi) + return 0; - if ( lpbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) + if (lpbmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) { - PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER)lpbmi; - Ret = WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, Core->bcBitCount) * Core->bcHeight; + PBITMAPCOREHEADER Core = (PBITMAPCOREHEADER) lpbmi; + Ret = + WIDTH_BYTES_ALIGN32(Core->bcWidth * Core->bcPlanes, + Core->bcBitCount) * Core->bcHeight; } else /* assume BITMAPINFOHEADER */ { if (!(lpbmi->bmiHeader.biCompression) || (lpbmi->bmiHeader.biCompression == BI_BITFIELDS)) { - Ret = WIDTH_BYTES_ALIGN32(lpbmi->bmiHeader.biWidth * lpbmi->bmiHeader.biPlanes, lpbmi->bmiHeader.biBitCount) * abs(lpbmi->bmiHeader.biHeight); + Ret = WIDTH_BYTES_ALIGN32( + lpbmi->bmiHeader.biWidth * lpbmi->bmiHeader.biPlanes, + lpbmi->bmiHeader.biBitCount) * abs(lpbmi->bmiHeader.biHeight); } else { - Ret = lpbmi->bmiHeader.biSizeImage; + Ret = lpbmi->bmiHeader.biSizeImage; } } return Ret; @@ -166,7 +192,8 @@ GdiGetBitmapBitsSize(BITMAPINFO *lpbmi) /* * @implemented */ -HBITMAP WINAPI +HBITMAP +WINAPI CreateDIBSection( HDC hDC, CONST BITMAPINFO *BitmapInfo, @@ -178,32 +205,29 @@ CreateDIBSection( PBITMAPINFO pConvertedInfo; UINT ConvertedInfoSize; HBITMAP hBitmap = NULL; - PVOID bmBits = NULL; + PVOID bmBits = NULL; + + pConvertedInfo = ConvertBitmapInfo(BitmapInfo, Usage, &ConvertedInfoSize, + FALSE); - pConvertedInfo = ConvertBitmapInfo(BitmapInfo, Usage, - &ConvertedInfoSize, FALSE); if (pConvertedInfo) { // Verify header due to converted may == info. - if ( pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) + if (pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) { - if ( pConvertedInfo->bmiHeader.biCompression == BI_JPEG || - pConvertedInfo->bmiHeader.biCompression == BI_PNG ) + if (pConvertedInfo->bmiHeader.biCompression == BI_JPEG + || pConvertedInfo->bmiHeader.biCompression == BI_PNG) { SetLastError(ERROR_INVALID_PARAMETER); return NULL; } } bmBits = Bits; - hBitmap = NtGdiCreateDIBSection( hDC, - hSection, - dwOffset, - pConvertedInfo, - Usage, - ConvertedInfoSize, - 0, // fl - 0, // dwColorSpace - &bmBits); + hBitmap = NtGdiCreateDIBSection(hDC, hSection, dwOffset, pConvertedInfo, Usage, + ConvertedInfoSize, 0, // fl + 0, // dwColorSpace + &bmBits); + if (BitmapInfo != pConvertedInfo) RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo); @@ -213,26 +237,27 @@ CreateDIBSection( } } - if (Bits) *Bits = bmBits; + if (Bits) + *Bits = bmBits; return hBitmap; } - /* * @implemented */ BOOL WINAPI -BitBlt(HDC hdcDest, /* handle to destination DC */ - int nXOriginDest, /* x-coord of destination upper-left corner */ - int nYOriginDest, /* y-coord of destination upper-left corner */ - int nWidthDest, /* width of destination rectangle */ - int nHeightDest, /* height of destination rectangle */ - HDC hdcSrc, /* handle to source DC */ - int nXSrc, /* x-coordinate of source upper-left corner */ - int nYSrc, /* y-coordinate of source upper-left corner */ - DWORD dwRop) /* raster operation code */ +BitBlt( + HDC hdcDest, /* handle to destination DC */ + int nXOriginDest, /* x-coord of destination upper-left corner */ + int nYOriginDest, /* y-coord of destination upper-left corner */ + int nWidthDest, /* width of destination rectangle */ + int nHeightDest, /* height of destination rectangle */ + HDC hdcSrc, /* handle to source DC */ + int nXSrc, /* x-coordinate of source upper-left corner */ + int nYSrc, /* y-coordinate of source upper-left corner */ + DWORD dwRop) /* raster operation code */ { /* use patBlt for no source blt Like windows does */ if (!ROP_USES_SOURCE(dwRop)) @@ -240,57 +265,50 @@ BitBlt(HDC hdcDest, /* handle to destination DC */ return PatBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, dwRop); } - return NtGdiBitBlt(hdcDest, - nXOriginDest, - nYOriginDest, - nWidthDest, - nHeightDest, - hdcSrc, - nXSrc, - nYSrc, - dwRop, - 0, - 0); + return NtGdiBitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, nXSrc, + nYSrc, dwRop, 0, 0); } /* * @implemented */ -BOOL WINAPI +BOOL +WINAPI StretchBlt( - HDC hdcDest, /* handle to destination DC */ + HDC hdcDest, /* handle to destination DC */ int nXOriginDest, /* x-coord of destination upper-left corner */ int nYOriginDest, /* y-coord of destination upper-left corner */ - int nWidthDest, /* width of destination rectangle */ - int nHeightDest, /* height of destination rectangle */ - HDC hdcSrc, /* handle to source DC */ - int nXOriginSrc, /* x-coord of source upper-left corner */ - int nYOriginSrc, /* y-coord of source upper-left corner */ - int nWidthSrc, /* width of source rectangle */ - int nHeightSrc, /* height of source rectangle */ - DWORD dwRop) /* raster operation code */ + int nWidthDest, /* width of destination rectangle */ + int nHeightDest, /* height of destination rectangle */ + HDC hdcSrc, /* handle to source DC */ + int nXOriginSrc, /* x-coord of source upper-left corner */ + int nYOriginSrc, /* y-coord of source upper-left corner */ + int nWidthSrc, /* width of source rectangle */ + int nHeightSrc, /* height of source rectangle */ + DWORD dwRop) /* raster operation code */ { if ((nWidthDest != nWidthSrc) || (nHeightDest != nHeightSrc)) { - return NtGdiStretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, - nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, - nWidthSrc, nHeightSrc, dwRop, 0); + return NtGdiStretchBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, + nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, dwRop, 0); } - return NtGdiBitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, - nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, dwRop, 0, 0); + return NtGdiBitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hdcSrc, + nXOriginSrc, nYOriginSrc, dwRop, 0, 0); } /* * @implemented */ -HBITMAP WINAPI -CreateBitmap(INT Width, - INT Height, - UINT Planes, - UINT BitsPixel, - CONST VOID* pUnsafeBits) +HBITMAP +WINAPI +CreateBitmap( + INT Width, + INT Height, + UINT Planes, + UINT BitsPixel, + CONST VOID* pUnsafeBits) { if (Width && Height) { @@ -306,22 +324,19 @@ CreateBitmap(INT Width, /* * @implemented */ -HBITMAP WINAPI -CreateBitmapIndirect(const BITMAP *pbm) +HBITMAP +WINAPI +CreateBitmapIndirect( + const BITMAP *pbm) { HBITMAP bitmap = NULL; /* Note windows xp/2003 does not check if pbm is NULL or not */ - if ( (pbm->bmWidthBytes != 0) && - (!(pbm->bmWidthBytes & 1)) ) + if ((pbm->bmWidthBytes != 0) && (!(pbm->bmWidthBytes & 1))) { - - bitmap = CreateBitmap(pbm->bmWidth, - pbm->bmHeight, - pbm->bmPlanes, - pbm->bmBitsPixel, - pbm->bmBits); + bitmap = CreateBitmap(pbm->bmWidth, pbm->bmHeight, pbm->bmPlanes, pbm->bmBitsPixel, + pbm->bmBits); } else { @@ -331,33 +346,34 @@ CreateBitmapIndirect(const BITMAP *pbm) return bitmap; } -HBITMAP WINAPI +HBITMAP +WINAPI CreateDiscardableBitmap( - HDC hDC, - INT Width, - INT Height) + HDC hDC, + INT Width, + INT Height) { - return CreateCompatibleBitmap(hDC, Width, Height); + return CreateCompatibleBitmap(hDC, Width, Height); } - -HBITMAP WINAPI +HBITMAP +WINAPI CreateCompatibleBitmap( - HDC hDC, - INT Width, - INT Height) + HDC hDC, + INT Width, + INT Height) { PDC_ATTR pDc_Attr; - if (!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) + if (!GdiGetHandleUserData(hDC, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) return NULL; - if ( !Width || !Height ) + if (!Width || !Height) return GetStockObject(DEFAULT_BITMAP); if (!(pDc_Attr->ulDirty_ & DC_DIBSECTION)) { - return NtGdiCreateCompatibleBitmap(hDC, Width, Height); + return NtGdiCreateCompatibleBitmap(hDC, Width, Height); } else { @@ -368,15 +384,15 @@ CreateCompatibleBitmap( BITMAPINFOHEADER bmih; RGBQUAD rgbquad[256]; } buffer; - DIBSECTION* pDIBs = (DIBSECTION*)&buffer; - BITMAPINFO* pbmi = (BITMAPINFO*)&buffer.bmih; + DIBSECTION* pDIBs = (DIBSECTION*) &buffer; + BITMAPINFO* pbmi = (BITMAPINFO*) &buffer.bmih; hBmp = NtGdiGetDCObject(hDC, GDI_OBJECT_TYPE_BITMAP); - if ( GetObjectA(hBmp, sizeof(DIBSECTION), pDIBs) != sizeof(DIBSECTION) ) + if (GetObjectA(hBmp, sizeof(DIBSECTION), pDIBs) != sizeof(DIBSECTION)) return NULL; - if ( pDIBs->dsBm.bmBitsPixel <= 8 ) + if (pDIBs->dsBm.bmBitsPixel <= 8) GetDIBColorTable(hDC, 0, 256, buffer.rgbquad); pDIBs->dsBmih.biWidth = Width; @@ -387,7 +403,6 @@ CreateCompatibleBitmap( return NULL; } - INT WINAPI GetDIBits( @@ -402,7 +417,7 @@ GetDIBits( UINT cjBmpScanSize; UINT cjInfoSize; - if (!hDC || !GdiIsHandleValid((HGDIOBJ)hDC) || !lpbmi) + if (!hDC || !GdiIsHandleValid((HGDIOBJ) hDC) || !lpbmi) { GdiSetLastError(ERROR_INVALID_PARAMETER); return 0; @@ -412,12 +427,12 @@ GetDIBits( /* Caller must provide maximum size possible */ cjInfoSize = DIB_BitmapInfoSize(lpbmi, uUsage, TRUE); - if ( lpvBits ) + if (lpvBits) { - if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) + if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) { - if ( lpbmi->bmiHeader.biCompression == BI_JPEG || - lpbmi->bmiHeader.biCompression == BI_PNG ) + if (lpbmi->bmiHeader.biCompression == BI_JPEG + || lpbmi->bmiHeader.biCompression == BI_PNG) { SetLastError(ERROR_INVALID_PARAMETER); return 0; @@ -425,15 +440,8 @@ GetDIBits( } } - return NtGdiGetDIBitsInternal(hDC, - hbmp, - uStartScan, - cScanLines, - lpvBits, - lpbmi, - uUsage, - cjBmpScanSize, - cjInfoSize); + return NtGdiGetDIBitsInternal(hDC, hbmp, uStartScan, cScanLines, lpvBits, lpbmi, uUsage, + cjBmpScanSize, cjInfoSize); } /* @@ -441,12 +449,13 @@ GetDIBits( */ HBITMAP WINAPI -CreateDIBitmap( HDC hDC, - const BITMAPINFOHEADER *Header, - DWORD Init, - LPCVOID Bits, - const BITMAPINFO *Data, - UINT ColorUse) +CreateDIBitmap( + HDC hDC, + const BITMAPINFOHEADER *Header, + DWORD Init, + LPCVOID Bits, + const BITMAPINFO *Data, + UINT ColorUse) { LONG width, height, compr, dibsize; WORD planes, bpp; @@ -488,7 +497,8 @@ CreateDIBitmap( HDC hDC, } /* Check if the Compr is incompatible */ - if ((compr == BI_JPEG) || (compr == BI_PNG) || (compr == BI_BITFIELDS)) return 0; + if ((compr == BI_JPEG) || (compr == BI_PNG) || (compr == BI_BITFIELDS)) + return 0; /* Only DIB_RGB_COLORS (0), DIB_PAL_COLORS (1) and 2 are valid. */ if (ColorUse > DIB_PAL_COLORS + 1) @@ -498,7 +508,8 @@ CreateDIBitmap( HDC hDC, } /* Negative width is not allowed */ - if (width < 0) return 0; + if (width < 0) + return 0; /* Top-down DIBs have a negative height. */ height = abs(height); @@ -506,11 +517,11 @@ CreateDIBitmap( HDC hDC, // For Icm support. // GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) - if(Data) + if (Data) { _SEH2_TRY { - cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *)Data); + cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *) Data); CalculateColorTableSize(&Data->bmiHeader, &ColorUse, &InfoSize); InfoSize += Data->bmiHeader.biSize; } @@ -521,29 +532,21 @@ CreateDIBitmap( HDC hDC, _SEH2_END } - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { GdiSetLastError(ERROR_INVALID_PARAMETER); return NULL; } - DPRINT("pBMI %p, Size bpp %u, dibsize %d, Conv %u, BSS %u\n", Data,bpp,dibsize,InfoSize,cjBmpScanSize); + DPRINT("pBMI %p, Size bpp %u, dibsize %d, Conv %u, BSS %u\n", Data, bpp, dibsize, InfoSize, + cjBmpScanSize); - if ( !width || !height ) + if (!width || !height) hBmp = GetStockObject(DEFAULT_BITMAP); else { - hBmp = NtGdiCreateDIBitmapInternal(hDC, - width, - height, - Init, - (LPBYTE)Bits, - (LPBITMAPINFO)Data, - ColorUse, - InfoSize, - cjBmpScanSize, - 0, - 0); + hBmp = NtGdiCreateDIBitmapInternal(hDC, width, height, Init, (LPBYTE) Bits, + (LPBITMAPINFO) Data, ColorUse, InfoSize, cjBmpScanSize, 0, 0); } return hBmp; } @@ -553,13 +556,14 @@ CreateDIBitmap( HDC hDC, */ INT WINAPI -SetDIBits(HDC hDC, - HBITMAP hBitmap, - UINT uStartScan, - UINT cScanLines, - CONST VOID *lpvBits, - CONST BITMAPINFO *lpbmi, - UINT fuColorUse) +SetDIBits( + HDC hDC, + HBITMAP hBitmap, + UINT uStartScan, + UINT cScanLines, + CONST VOID *lpvBits, + CONST BITMAPINFO *lpbmi, + UINT fuColorUse) { HDC hDCc, SavehDC, nhDC; DWORD dwWidth, dwHeight; @@ -568,14 +572,15 @@ SetDIBits(HDC hDC, INT LinesCopied = 0; BOOL newDC = FALSE; - if ( !lpvBits || (GDI_HANDLE_GET_TYPE(hBitmap) != GDI_OBJECT_TYPE_BITMAP) ) + if (!lpvBits || (GDI_HANDLE_GET_TYPE(hBitmap) != GDI_OBJECT_TYPE_BITMAP)) return 0; - if ( lpbmi ) + if (lpbmi) { - if ( lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) + if (lpbmi->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) { - if ( lpbmi->bmiHeader.biCompression == BI_JPEG || lpbmi->bmiHeader.biCompression == BI_PNG ) + if (lpbmi->bmiHeader.biCompression == BI_JPEG + || lpbmi->bmiHeader.biCompression == BI_PNG) { SetLastError(ERROR_INVALID_PARAMETER); return 0; @@ -585,24 +590,25 @@ SetDIBits(HDC hDC, hDCc = NtGdiGetDCforBitmap(hBitmap); // hDC can be NULL, so, get it from the bitmap. SavehDC = hDCc; - if ( !hDCc ) // No DC associated with bitmap, Clone or Create one. + if (!hDCc) // No DC associated with bitmap, Clone or Create one. { nhDC = CreateCompatibleDC(hDC); - if ( !nhDC ) return 0; + if (!nhDC) + return 0; newDC = TRUE; SavehDC = nhDC; } - else if ( !SaveDC(hDCc) ) + else if (!SaveDC(hDCc)) return 0; hOldBitmap = SelectObject(SavehDC, hBitmap); - if ( hOldBitmap ) + if (hOldBitmap) { - if ( hDC ) - hPal = SelectPalette(SavehDC, (HPALETTE)GetCurrentObject(hDC, OBJ_PAL), FALSE); + if (hDC) + hPal = SelectPalette(SavehDC, (HPALETTE) GetCurrentObject(hDC, OBJ_PAL), FALSE); - if ( lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) + if (lpbmi->bmiHeader.biSize < sizeof(BITMAPINFOHEADER)) { PBITMAPCOREINFO pbci = (PBITMAPCOREINFO) lpbmi; dwWidth = pbci->bmciHeader.bcWidth; @@ -614,25 +620,16 @@ SetDIBits(HDC hDC, dwHeight = abs(lpbmi->bmiHeader.biHeight); } - LinesCopied = SetDIBitsToDevice(SavehDC, - 0, - 0, - dwWidth, - dwHeight, - 0, - 0, - uStartScan, - cScanLines, - (void *)lpvBits, - (LPBITMAPINFO)lpbmi, - fuColorUse); + LinesCopied = SetDIBitsToDevice(SavehDC, 0, 0, dwWidth, dwHeight, 0, 0, uStartScan, + cScanLines, (void *) lpvBits, (LPBITMAPINFO) lpbmi, fuColorUse); - if ( hDC ) SelectPalette(SavehDC, hPal, FALSE); + if (hDC) + SelectPalette(SavehDC, hPal, FALSE); SelectObject(SavehDC, hOldBitmap); } - if ( newDC ) + if (newDC) DeleteDC(SavehDC); else RestoreDC(SavehDC, -1); @@ -666,16 +663,16 @@ SetDIBitsToDevice( INT LinesCopied = 0; UINT cjBmpScanSize = 0; BOOL Hit = FALSE; - PVOID pvSafeBits = (PVOID)Bits; + PVOID pvSafeBits = (PVOID) Bits; - if ( !ScanLines || !lpbmi || !Bits ) + if (!ScanLines || !lpbmi || !Bits) return 0; - if ( ColorUse && ColorUse != DIB_PAL_COLORS && ColorUse != DIB_PAL_COLORS+1 ) + if (ColorUse && ColorUse != DIB_PAL_COLORS && ColorUse != DIB_PAL_COLORS + 1) return 0; - pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse, - &ConvertedInfoSize, FALSE); + pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse, &ConvertedInfoSize, + FALSE); if (!pConvertedInfo) return 0; @@ -684,18 +681,18 @@ SetDIBitsToDevice( if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) - return MFDRV_SetDIBitsToDevice( hdc, - XDest, - YDest, - Width, - Height, - XSrc, - YSrc, - StartScan, - ScanLines, - Bits, - lpbmi, - ColorUse); + return MFDRV_SetDIBitsToDevice( hdc, + XDest, + YDest, + Width, + Height, + XSrc, + YSrc, + StartScan, + ScanLines, + Bits, + lpbmi, + ColorUse); else { PLDC pLDC = GdiGetLDC(hdc); @@ -707,76 +704,66 @@ SetDIBitsToDevice( if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_SetDIBitsToDevice(hdc, - XDest, - YDest, - Width, - Height, - XSrc, - YSrc, - StartScan, - ScanLines, - Bits, - lpbmi, - ColorUse); + XDest, + YDest, + Width, + Height, + XSrc, + YSrc, + StartScan, + ScanLines, + Bits, + lpbmi, + ColorUse); } return 0; } } #endif - cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO)lpbmi, ScanLines); + cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines); - pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize); - if (pvSafeBits) - { - _SEH2_TRY - { - RtlCopyMemory( pvSafeBits, Bits, cjBmpScanSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Hit = TRUE; - } - _SEH2_END + pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize); + if (pvSafeBits) + { + _SEH2_TRY + { + RtlCopyMemory(pvSafeBits, Bits, cjBmpScanSize); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Hit = TRUE; + } + _SEH2_END - if (Hit) - { - // We don't die, we continue on with a allocated safe pointer to kernel - // space..... - DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %p or Bits: %p & Size: %u\n",pConvertedInfo,Bits,cjBmpScanSize); - } - DPRINT("SetDIBitsToDevice Allocate Bits %u!!!\n", cjBmpScanSize); - } + if (Hit) + { + // We don't die, we continue on with a allocated safe pointer to kernel + // space..... + DPRINT1("SetDIBitsToDevice fail to read BitMapInfo: %p or Bits: %p & Size: %u\n", + pConvertedInfo, Bits, cjBmpScanSize); + } + DPRINT("SetDIBitsToDevice Allocate Bits %u!!!\n", cjBmpScanSize); + } - if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) + if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } /* - if ( !pDc_Attr || // DC is Public - ColorUse == DIB_PAL_COLORS || - ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && - (pConvertedInfo->bmiHeader.biCompression == BI_JPEG || - pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ + if ( !pDc_Attr || // DC is Public + ColorUse == DIB_PAL_COLORS || + ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && + (pConvertedInfo->bmiHeader.biCompression == BI_JPEG || + pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ { - LinesCopied = NtGdiSetDIBitsToDeviceInternal( hdc, - XDest, - YDest, - Width, - Height, - XSrc, - YSrc, - StartScan, - ScanLines, - (LPBYTE)pvSafeBits, - (LPBITMAPINFO)pConvertedInfo, - ColorUse, - cjBmpScanSize, - ConvertedInfoSize, - TRUE, - NULL); + LinesCopied = NtGdiSetDIBitsToDeviceInternal(hdc, XDest, YDest, Width, Height, XSrc, YSrc, + StartScan, ScanLines, (LPBYTE) pvSafeBits, (LPBITMAPINFO) pConvertedInfo, ColorUse, + cjBmpScanSize, ConvertedInfoSize, + TRUE, + NULL); } - if ( Bits != pvSafeBits) + if (Bits != pvSafeBits) RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits); if (lpbmi != pConvertedInfo) RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo); @@ -784,25 +771,25 @@ SetDIBitsToDevice( return LinesCopied; } - /* * @unimplemented */ int WINAPI -StretchDIBits(HDC hdc, - int XDest, - int YDest, - int nDestWidth, - int nDestHeight, - int XSrc, - int YSrc, - int nSrcWidth, - int nSrcHeight, - CONST VOID *lpBits, - CONST BITMAPINFO *lpBitsInfo, - UINT iUsage, - DWORD dwRop) +StretchDIBits( + HDC hdc, + int XDest, + int YDest, + int nDestWidth, + int nDestHeight, + int XSrc, + int YSrc, + int nSrcWidth, + int nSrcHeight, + CONST VOID *lpBits, + CONST BITMAPINFO *lpBitsInfo, + UINT iUsage, + DWORD dwRop) { PDC_ATTR pDc_Attr; @@ -819,19 +806,19 @@ StretchDIBits(HDC hdc, if (GDI_HANDLE_GET_TYPE(hdc) != GDI_OBJECT_TYPE_DC) { if (GDI_HANDLE_GET_TYPE(hdc) == GDI_OBJECT_TYPE_METADC) - return MFDRV_StretchBlt( hdc, - XDest, - YDest, - nDestWidth, - nDestHeight, - XSrc, - YSrc, - nSrcWidth, - nSrcHeight, - lpBits, - lpBitsInfo, - iUsage, - dwRop); + return MFDRV_StretchBlt( hdc, + XDest, + YDest, + nDestWidth, + nDestHeight, + XSrc, + YSrc, + nSrcWidth, + nSrcHeight, + lpBits, + lpBitsInfo, + iUsage, + dwRop); else { PLDC pLDC = GdiGetLDC(hdc); @@ -843,40 +830,40 @@ StretchDIBits(HDC hdc, if (pLDC->iType == LDC_EMFLDC) { return EMFDRV_StretchBlt(hdc, - XDest, - YDest, - nDestWidth, - nDestHeight, - XSrc, - YSrc, - nSrcWidth, - nSrcHeight, - lpBits, - lpBitsInfo, - iUsage, - dwRop); + XDest, + YDest, + nDestWidth, + nDestHeight, + XSrc, + YSrc, + nSrcWidth, + nSrcHeight, + lpBits, + lpBitsInfo, + iUsage, + dwRop); } return 0; } } #endif - pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, - &ConvertedInfoSize, FALSE); + pConvertedInfo = ConvertBitmapInfo(lpBitsInfo, iUsage, &ConvertedInfoSize, + FALSE); if (!pConvertedInfo) { return 0; } - cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *)pConvertedInfo); + cjBmpScanSize = GdiGetBitmapBitsSize((BITMAPINFO *) pConvertedInfo); - if ( lpBits ) + if (lpBits) { pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize); if (pvSafeBits) { _SEH2_TRY { - RtlCopyMemory( pvSafeBits, lpBits, cjBmpScanSize ); + RtlCopyMemory(pvSafeBits, lpBits, cjBmpScanSize); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -888,42 +875,31 @@ StretchDIBits(HDC hdc, { // We don't die, we continue on with a allocated safe pointer to kernel // space..... - DPRINT1("StretchDIBits fail to read BitMapInfo: %p or Bits: %p & Size: %u\n",pConvertedInfo,lpBits,cjBmpScanSize); + DPRINT1("StretchDIBits fail to read BitMapInfo: %p or Bits: %p & Size: %u\n", + pConvertedInfo, lpBits, cjBmpScanSize); } DPRINT("StretchDIBits Allocate Bits %u!!!\n", cjBmpScanSize); } } - if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID)&pDc_Attr)) + if (!GdiGetHandleUserData(hdc, GDI_OBJECT_TYPE_DC, (PVOID) & pDc_Attr)) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } /* - if ( !pDc_Attr || - iUsage == DIB_PAL_COLORS || - ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && - (pConvertedInfo->bmiHeader.biCompression == BI_JPEG || - pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ + if ( !pDc_Attr || + iUsage == DIB_PAL_COLORS || + ((pConvertedInfo->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER)) && + (pConvertedInfo->bmiHeader.biCompression == BI_JPEG || + pConvertedInfo->bmiHeader.biCompression == BI_PNG )) )*/ { - LinesCopied = NtGdiStretchDIBitsInternal( hdc, - XDest, - YDest, - nDestWidth, - nDestHeight, - XSrc, - YSrc, - nSrcWidth, - nSrcHeight, - pvSafeBits, - pConvertedInfo, - (DWORD)iUsage, - dwRop, - ConvertedInfoSize, - cjBmpScanSize, - NULL); + LinesCopied = NtGdiStretchDIBitsInternal(hdc, XDest, YDest, nDestWidth, nDestHeight, XSrc, + YSrc, nSrcWidth, nSrcHeight, pvSafeBits, pConvertedInfo, (DWORD) iUsage, dwRop, + ConvertedInfoSize, cjBmpScanSize, + NULL); } - if ( pvSafeBits ) + if (pvSafeBits) RtlFreeHeap(RtlGetProcessHeap(), 0, pvSafeBits); if (lpBitsInfo != pConvertedInfo) RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo); From ec5927ad19cd6587dd3fe784dad9b479c67b9a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 14:20:16 +0000 Subject: [PATCH 44/55] [WIN32K] - Improve the "infamous RLE hack" in SetDIBitsToDevice by using a mask bitmap corresponding to the valid RLE data [GDI32] - Improve some input checks svn path=/trunk/; revision=63920 --- reactos/win32ss/gdi/gdi32/objects/bitmap.c | 12 +- reactos/win32ss/gdi/gdi32/objects/utils.c | 29 +++++ reactos/win32ss/gdi/ntgdi/dibobj.c | 144 ++++++++++++++++++++- 3 files changed, 178 insertions(+), 7 deletions(-) diff --git a/reactos/win32ss/gdi/gdi32/objects/bitmap.c b/reactos/win32ss/gdi/gdi32/objects/bitmap.c index ac0ba65abb5..3ba54c165ef 100644 --- a/reactos/win32ss/gdi/gdi32/objects/bitmap.c +++ b/reactos/win32ss/gdi/gdi32/objects/bitmap.c @@ -671,8 +671,7 @@ SetDIBitsToDevice( if (ColorUse && ColorUse != DIB_PAL_COLORS && ColorUse != DIB_PAL_COLORS + 1) return 0; - pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse, &ConvertedInfoSize, - FALSE); + pConvertedInfo = ConvertBitmapInfo(lpbmi, ColorUse, &ConvertedInfoSize, FALSE); if (!pConvertedInfo) return 0; @@ -720,6 +719,15 @@ SetDIBitsToDevice( } } #endif + + if ((pConvertedInfo->bmiHeader.biCompression == BI_RLE8) || + (pConvertedInfo->bmiHeader.biCompression == BI_RLE4)) + { + /* For compressed data, we must set the whole thing */ + StartScan = 0; + ScanLines = pConvertedInfo->bmiHeader.biHeight; + } + cjBmpScanSize = DIB_BitmapMaxBitsSize((LPBITMAPINFO) lpbmi, ScanLines); pvSafeBits = RtlAllocateHeap(GetProcessHeap(), 0, cjBmpScanSize); diff --git a/reactos/win32ss/gdi/gdi32/objects/utils.c b/reactos/win32ss/gdi/gdi32/objects/utils.c index 5b29ff2aa02..5a0bca1e93b 100644 --- a/reactos/win32ss/gdi/gdi32/objects/utils.c +++ b/reactos/win32ss/gdi/gdi32/objects/utils.c @@ -296,6 +296,35 @@ ConvertBitmapInfo( RtlCopyMemory((PVOID)NewDataPtr, (PVOID)OldDataPtr, DataSize); } } + else + { + /* Verify some data validity */ + switch (BitmapInfo->bmiHeader.biCompression) + { + case BI_RLE8: + if (BitmapInfo->bmiHeader.biBitCount != 8) + return NULL; + if (BitmapInfo->bmiHeader.biHeight < 0) + return NULL; + break; + case BI_RLE4: + if (BitmapInfo->bmiHeader.biBitCount != 4) + return NULL; + if (BitmapInfo->bmiHeader.biHeight < 0) + return NULL; + break; + default: + break; + } + + /* Non "standard" formats must have a valid size set */ + if ((BitmapInfo->bmiHeader.biCompression != BI_RGB) && + (BitmapInfo->bmiHeader.biCompression != BI_BITFIELDS)) + { + if (BitmapInfo->bmiHeader.biSizeImage == 0) + return NULL; + } + } Size = NewBitmapInfo->bmiHeader.biSize; if (ColorSpec == DIB_RGB_COLORS) diff --git a/reactos/win32ss/gdi/ntgdi/dibobj.c b/reactos/win32ss/gdi/ntgdi/dibobj.c index e391290ffe0..28c7a2b5ed1 100644 --- a/reactos/win32ss/gdi/ntgdi/dibobj.c +++ b/reactos/win32ss/gdi/ntgdi/dibobj.c @@ -375,6 +375,115 @@ cleanup: return result; } +static +HBITMAP +IntGdiCreateMaskFromRLE( + DWORD Width, + DWORD Height, + ULONG Compression, + const BYTE* Bits, + DWORD BitsSize) +{ + HBITMAP Mask; + DWORD x, y; + SURFOBJ* SurfObj; + UINT i = 0; + BYTE Data, NumPixels, ToSkip; + + ASSERT((Compression == BI_RLE8) || (Compression == BI_RLE4)); + + /* Create the bitmap */ + Mask = GreCreateBitmapEx(Width, Height, 0, BMF_1BPP, 0, 0, NULL, 0); + if (!Mask) + return NULL; + + SurfObj = EngLockSurface((HSURF)Mask); + if (!SurfObj) + { + GreDeleteObject(Mask); + return NULL; + } + ASSERT(SurfObj->pvBits != NULL); + + x = y = 0; + + while (i < BitsSize) + { + NumPixels = Bits[i]; + Data = Bits[i + 1]; + i += 2; + + if (NumPixels != 0) + { + if ((x + NumPixels) > Width) + NumPixels = Width - x; + + if (NumPixels == 0) + continue; + + DIB_1BPP_HLine(SurfObj, x, x + NumPixels, y, 1); + x += NumPixels; + continue; + } + + if (Data < 3) + { + switch (Data) + { + case 0: + /* End of line */ + y++; + if (y == Height) + goto done; + x = 0; + break; + case 1: + /* End of file */ + goto done; + case 2: + /* Jump */ + if (i >= (BitsSize - 1)) + goto done; + x += Bits[i]; + if (x > Width) + x = Width; + y += Bits[i + 1]; + if (y >= Height) + goto done; + i += 2; + break; + } + /* Done for this run */ + continue; + } + + /* Embedded data into the RLE */ + NumPixels = Data; + if (Compression == BI_RLE8) + ToSkip = NumPixels; + else + ToSkip = (NumPixels / 2) + (NumPixels & 1); + + if ((i + ToSkip) > BitsSize) + goto done; + ToSkip = (ToSkip + 1) & ~1; + + if ((x + NumPixels) > Width) + NumPixels = Width - x; + + if (NumPixels != 0) + { + DIB_1BPP_HLine(SurfObj, x, x + NumPixels, y, 1); + x += NumPixels; + } + i += ToSkip; + } + +done: + EngUnlockSurface(SurfObj); + return Mask; +} + W32KAPI INT APIENTRY @@ -399,8 +508,8 @@ NtGdiSetDIBitsToDeviceInternal( INT ret = 0; NTSTATUS Status = STATUS_SUCCESS; PDC pDC; - HBITMAP hSourceBitmap = NULL; - SURFOBJ *pDestSurf, *pSourceSurf = NULL; + HBITMAP hSourceBitmap = NULL, hMaskBitmap = NULL; + SURFOBJ *pDestSurf, *pSourceSurf = NULL, *pMaskSurf = NULL; SURFACE *pSurf; RECTL rcDest; POINTL ptSource; @@ -492,6 +601,29 @@ NtGdiSetDIBitsToDeviceInternal( goto Exit; } + /* HACK: If this is a RLE bitmap, only the relevant pixels must be set. */ + if ((bmi->bmiHeader.biCompression == BI_RLE8) || (bmi->bmiHeader.biCompression == BI_RLE4)) + { + ASSERT(ScanLines == bmi->bmiHeader.biHeight); + hMaskBitmap = IntGdiCreateMaskFromRLE(bmi->bmiHeader.biWidth, + ScanLines, + bmi->bmiHeader.biCompression, + Bits, + cjMaxBits); + if (!hMaskBitmap) + { + EngSetLastError(ERROR_NO_SYSTEM_RESOURCES); + Status = STATUS_NO_MEMORY; + goto Exit; + } + pMaskSurf = EngLockSurface((HSURF)hMaskBitmap); + if (!pMaskSurf) + { + Status = STATUS_UNSUCCESSFUL; + goto Exit; + } + } + /* Create a palette for the DIB */ ppalDIB = CreateDIBPalette(bmi, pDC, ColorUse); if (!ppalDIB) @@ -529,15 +661,15 @@ NtGdiSetDIBitsToDeviceInternal( ptSource.x, ptSource.y, SourceSize.cx, SourceSize.cy); Status = IntEngBitBlt(pDestSurf, pSourceSurf, - NULL, + pMaskSurf, &pDC->co.ClipObj, &exlo.xlo, &rcDest, &ptSource, + pMaskSurf ? &ptSource : NULL, NULL, NULL, - NULL, - ROP4_FROM_INDEX(R3_OPINDEX_SRCCOPY)); + pMaskSurf ? ROP4_MASK : ROP4_FROM_INDEX(R3_OPINDEX_SRCCOPY)); /* Cleanup EXLATEOBJ */ EXLATEOBJ_vCleanup(&exlo); @@ -555,6 +687,8 @@ Exit: if (pSourceSurf) EngUnlockSurface(pSourceSurf); if (hSourceBitmap) EngDeleteSurface((HSURF)hSourceBitmap); + if (pMaskSurf) EngUnlockSurface(pMaskSurf); + if (hMaskBitmap) EngDeleteSurface((HSURF)hMaskBitmap); DC_UnlockDc(pDC); Exit2: ExFreePoolWithTag(pbmiSafe, 'pmTG'); From c8ed53856bd00bd72612ab653ab40d5bee6fc1a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 14:40:00 +0000 Subject: [PATCH 45/55] [CMAKE] - make reactos_cab_inf an unconditional target. Should fix windows testbot svn path=/trunk/; revision=63921 --- reactos/boot/bootdata/packages/CMakeLists.txt | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/reactos/boot/bootdata/packages/CMakeLists.txt b/reactos/boot/bootdata/packages/CMakeLists.txt index d65a1049cb6..f9d1e847acc 100644 --- a/reactos/boot/bootdata/packages/CMakeLists.txt +++ b/reactos/boot/bootdata/packages/CMakeLists.txt @@ -31,17 +31,13 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.dyn ) -# And now we build reactos.inf -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf +add_custom_target( + reactos_cab_inf COMMAND native-cabman -C ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff -L ${CMAKE_CURRENT_BINARY_DIR} -I -P ${REACTOS_SOURCE_DIR} DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff native-cabman) -# reactos.cab generation will be made later (cf. CMakeMacros.cmake - create iso lists) -add_custom_target(reactos_cab_inf DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf) - add_cd_file( - TARGET reactos_cab + TARGET reactos_cab_inf FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf DESTINATION reactos NO_CAB FOR bootcd regtest) From 9a96133a37f129a24ba06fc451fbac12a816aeb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 15:20:44 +0000 Subject: [PATCH 46/55] [WIN32K] - Remove left-over assert svn path=/trunk/; revision=63922 --- reactos/win32ss/gdi/ntgdi/dibobj.c | 1 - 1 file changed, 1 deletion(-) diff --git a/reactos/win32ss/gdi/ntgdi/dibobj.c b/reactos/win32ss/gdi/ntgdi/dibobj.c index 28c7a2b5ed1..83252a91628 100644 --- a/reactos/win32ss/gdi/ntgdi/dibobj.c +++ b/reactos/win32ss/gdi/ntgdi/dibobj.c @@ -604,7 +604,6 @@ NtGdiSetDIBitsToDeviceInternal( /* HACK: If this is a RLE bitmap, only the relevant pixels must be set. */ if ((bmi->bmiHeader.biCompression == BI_RLE8) || (bmi->bmiHeader.biCompression == BI_RLE4)) { - ASSERT(ScanLines == bmi->bmiHeader.biHeight); hMaskBitmap = IntGdiCreateMaskFromRLE(bmi->bmiHeader.biWidth, ScanLines, bmi->bmiHeader.biCompression, From c5bd762892ba66ba64095a52d759639d4a525acd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 15:53:58 +0000 Subject: [PATCH 47/55] [CMAKE] - Make a conditional copy of reactos.inf when it is really modified, make reactos.acb depend on it. Hopefully the last commit so that windows buildbot gets really fixed svn path=/trunk/; revision=63924 --- reactos/cmake/CMakeMacros.cmake | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/reactos/cmake/CMakeMacros.cmake b/reactos/cmake/CMakeMacros.cmake index 1a722fa0ded..8201da680c6 100644 --- a/reactos/cmake/CMakeMacros.cmake +++ b/reactos/cmake/CMakeMacros.cmake @@ -376,10 +376,17 @@ endfunction() function(create_iso_lists) # generate reactos.cab before anything else get_property(_filelist GLOBAL PROPERTY REACTOS_CAB_DEPENDS) + + # begin with reactos.inf. It doesn't depend on anything so that it's always generated (that's for optional modules) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf + DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf) + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab - COMMAND native-cabman -C ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff -RC ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf -N -P ${REACTOS_SOURCE_DIR} - DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf native-cabman ${_filelist}) + COMMAND native-cabman -C ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff -RC ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf -N -P ${REACTOS_SOURCE_DIR} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf native-cabman ${_filelist}) add_custom_target(reactos_cab DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab) add_dependencies(reactos_cab reactos_cab_inf) From 21435dd1aea3a3a78af805d6dfd9904773382a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sat, 23 Aug 2014 16:22:12 +0000 Subject: [PATCH 48/55] [FONTS] Updated UniVGA font by Roy Tam, thanks ;) CORE-7706 svn path=/trunk/; revision=63925 --- reactos/media/fonts/UniVGA16.ttf | Bin 286996 -> 287392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/reactos/media/fonts/UniVGA16.ttf b/reactos/media/fonts/UniVGA16.ttf index a7b6f2ed950bc82d384e43b4e768f7354a986616..48c0d0e82e1963ca46b44a9e594c281caef2a1d3 100644 GIT binary patch delta 37861 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 Ro12^Xj~esmJ^i%#{|9NrXdwUq delta 40880 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

NuH5+dnE(u<@Q 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 From 2e0d75e093f3211ddf583859cff1889386b0f271 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sat, 23 Aug 2014 16:47:58 +0000 Subject: [PATCH 49/55] [CMAKE] - Try a ninja (the warrior) technique to finally get the dependencies on reactos.cab right svn path=/trunk/; revision=63927 --- reactos/cmake/CMakeMacros.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reactos/cmake/CMakeMacros.cmake b/reactos/cmake/CMakeMacros.cmake index 8201da680c6..ebff1446671 100644 --- a/reactos/cmake/CMakeMacros.cmake +++ b/reactos/cmake/CMakeMacros.cmake @@ -377,11 +377,11 @@ function(create_iso_lists) # generate reactos.cab before anything else get_property(_filelist GLOBAL PROPERTY REACTOS_CAB_DEPENDS) - # begin with reactos.inf. It doesn't depend on anything so that it's always generated (that's for optional modules) + # begin with reactos.inf. We want this command to be always executed, so we pretend it generates another file although it will never do. add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf ${CMAKE_CURRENT_BINARY_DIR}/__some_non_existent_file COMMAND ${CMAKE_COMMAND} -E copy_if_different ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf - DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf) + DEPENDS ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.inf reactos_cab_inf) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab From b82e2bf9722665169fc50edac2d5b08301c02bf4 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Sun, 24 Aug 2014 03:28:01 +0000 Subject: [PATCH 50/55] [FASTFAT] - Properly handle errors in CcInitializeCacheMap, CcCopyRead and CcCopyWrite CORE-8410 svn path=/trunk/; revision=63928 --- .../filesystems/fastfat/CMakeLists.txt | 1 + reactos/drivers/filesystems/fastfat/fcb.c | 25 ++++-- reactos/drivers/filesystems/fastfat/fsctl.c | 19 +++-- reactos/drivers/filesystems/fastfat/rw.c | 83 ++++++++++++------- reactos/drivers/filesystems/fastfat/vfat.h | 1 + 5 files changed, 90 insertions(+), 39 deletions(-) diff --git a/reactos/drivers/filesystems/fastfat/CMakeLists.txt b/reactos/drivers/filesystems/fastfat/CMakeLists.txt index fdc90bebc66..40f0988ac27 100644 --- a/reactos/drivers/filesystems/fastfat/CMakeLists.txt +++ b/reactos/drivers/filesystems/fastfat/CMakeLists.txt @@ -26,6 +26,7 @@ list(APPEND SOURCE add_library(fastfat SHARED ${SOURCE} vfatfs.rc) set_module_type(fastfat kernelmodedriver) +target_link_libraries(fastfat ${PSEH_LIB}) add_importlibs(fastfat ntoskrnl hal) add_pch(fastfat vfat.h SOURCE) diff --git a/reactos/drivers/filesystems/fastfat/fcb.c b/reactos/drivers/filesystems/fastfat/fcb.c index a4eef71a64a..fad85a26c10 100644 --- a/reactos/drivers/filesystems/fastfat/fcb.c +++ b/reactos/drivers/filesystems/fastfat/fcb.c @@ -340,12 +340,14 @@ vfatFCBInitializeCacheFromVolume( { PFILE_OBJECT fileObject; PVFATCCB newCCB; + NTSTATUS status; fileObject = IoCreateStreamFileObject (NULL, vcb->StorageDevice); newCCB = ExAllocateFromNPagedLookasideList(&VfatGlobalData->CcbLookasideList); if (newCCB == NULL) { + ObDereferenceObject(fileObject); return STATUS_INSUFFICIENT_RESOURCES; } RtlZeroMemory(newCCB, sizeof (VFATCCB)); @@ -356,11 +358,24 @@ vfatFCBInitializeCacheFromVolume( fcb->FileObject = fileObject; fcb->RefCount++; - CcInitializeCacheMap(fileObject, - (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize), - TRUE, - &VfatGlobalData->CacheMgrCallbacks, - fcb); + _SEH2_TRY + { + CcInitializeCacheMap(fileObject, + (PCC_FILE_SIZES)(&fcb->RFCB.AllocationSize), + TRUE, + &VfatGlobalData->CacheMgrCallbacks, + fcb); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + status = _SEH2_GetExceptionCode(); + fcb->RefCount--; + fcb->FileObject = NULL; + ExFreeToNPagedLookasideList(&VfatGlobalData->CcbLookasideList, newCCB); + ObDereferenceObject(fileObject); + return status; + } + _SEH2_END; fcb->Flags |= FCB_CACHE_INITIALIZED; return STATUS_SUCCESS; diff --git a/reactos/drivers/filesystems/fastfat/fsctl.c b/reactos/drivers/filesystems/fastfat/fsctl.c index e196282d2a6..52d485724ef 100644 --- a/reactos/drivers/filesystems/fastfat/fsctl.c +++ b/reactos/drivers/filesystems/fastfat/fsctl.c @@ -550,11 +550,20 @@ VfatMount( Fcb->RFCB.ValidDataLength = Fcb->RFCB.FileSize; Fcb->RFCB.AllocationSize = Fcb->RFCB.FileSize; - CcInitializeCacheMap(DeviceExt->FATFileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - TRUE, - &VfatGlobalData->CacheMgrCallbacks, - Fcb); + _SEH2_TRY + { + CcInitializeCacheMap(DeviceExt->FATFileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + TRUE, + &VfatGlobalData->CacheMgrCallbacks, + Fcb); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + goto ByeBye; + } + _SEH2_END; DeviceExt->LastAvailableCluster = 2; ExInitializeResourceLite(&DeviceExt->FatResource); diff --git a/reactos/drivers/filesystems/fastfat/rw.c b/reactos/drivers/filesystems/fastfat/rw.c index 7474c5ba348..72784816ce0 100644 --- a/reactos/drivers/filesystems/fastfat/rw.c +++ b/reactos/drivers/filesystems/fastfat/rw.c @@ -673,22 +673,35 @@ VfatRead( Status = /*STATUS_END_OF_FILE*/STATUS_SUCCESS; } - if (IrpContext->FileObject->PrivateCacheMap == NULL) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &(VfatGlobalData->CacheMgrCallbacks), - Fcb); - } + if (IrpContext->FileObject->PrivateCacheMap == NULL) + { + CcInitializeCacheMap(IrpContext->FileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + FALSE, + &(VfatGlobalData->CacheMgrCallbacks), + Fcb); + } - if (!CcCopyRead(IrpContext->FileObject, &ByteOffset, Length, - (BOOLEAN)(IrpContext->Flags & IRPCONTEXT_CANWAIT), Buffer, - &IrpContext->Irp->IoStatus)) + if (!CcCopyRead(IrpContext->FileObject, + &ByteOffset, + Length, + (IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0, + Buffer, + &IrpContext->Irp->IoStatus)) + { + ASSERT((IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0); + Status = STATUS_PENDING; + goto ByeBye; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_PENDING; + Status = _SEH2_GetExceptionCode(); goto ByeBye; } + _SEH2_END; if (!NT_SUCCESS(IrpContext->Irp->IoStatus.Status)) { @@ -947,30 +960,42 @@ VfatWrite( { // cached write - if (IrpContext->FileObject->PrivateCacheMap == NULL) + _SEH2_TRY { - CcInitializeCacheMap(IrpContext->FileObject, - (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), - FALSE, - &VfatGlobalData->CacheMgrCallbacks, - Fcb); - } + if (IrpContext->FileObject->PrivateCacheMap == NULL) + { + CcInitializeCacheMap(IrpContext->FileObject, + (PCC_FILE_SIZES)(&Fcb->RFCB.AllocationSize), + FALSE, + &VfatGlobalData->CacheMgrCallbacks, + Fcb); + } - if (ByteOffset.QuadPart > OldFileSize.QuadPart) - { - CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE); - } + if (ByteOffset.QuadPart > OldFileSize.QuadPart) + { + CcZeroData(IrpContext->FileObject, &OldFileSize, &ByteOffset, TRUE); + } - if (CcCopyWrite(IrpContext->FileObject, &ByteOffset, Length, - 1 /*IrpContext->Flags & IRPCONTEXT_CANWAIT*/, Buffer)) - { - IrpContext->Irp->IoStatus.Information = Length; - Status = STATUS_SUCCESS; + if (CcCopyWrite(IrpContext->FileObject, + &ByteOffset, + Length, + TRUE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) != 0*/, + Buffer)) + { + IrpContext->Irp->IoStatus.Information = Length; + Status = STATUS_SUCCESS; + } + else + { + ASSERT(FALSE /*(IrpContext->Flags & IRPCONTEXT_CANWAIT) == 0*/); + Status = STATUS_UNSUCCESSFUL; + } } - else + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - Status = STATUS_UNSUCCESSFUL; + Status = _SEH2_GetExceptionCode(); } + _SEH2_END; } else { diff --git a/reactos/drivers/filesystems/fastfat/vfat.h b/reactos/drivers/filesystems/fastfat/vfat.h index 28a047a5b1e..4faab7e0340 100644 --- a/reactos/drivers/filesystems/fastfat/vfat.h +++ b/reactos/drivers/filesystems/fastfat/vfat.h @@ -4,6 +4,7 @@ #include #include #include +#include #define USE_ROS_CC_AND_FS From ac9576edbfbe4eff15e8dd61f24f636f3c326646 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 24 Aug 2014 11:42:49 +0000 Subject: [PATCH 51/55] [DEVMGR]: Fix a french misspelling. [EVENTVWR]: Fix a french misspelling and fix event description dialog layout. svn path=/trunk/; revision=63929 --- .../mscutils/eventvwr/lang/fr-FR.rc | 32 +++++++++---------- reactos/dll/win32/devmgr/lang/fr-FR.rc | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc index f123ba5deb6..fc4ae169fc7 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc @@ -12,7 +12,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR - MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED + MENUITEM "Effacer tous &les événements", ID_CLEAR_EVENTS, GRAYED MENUITEM SEPARATOR MENUITEM "Quitter", IDM_EXIT END @@ -48,10 +48,10 @@ END IDD_PROGRESSBOX DIALOGEX 0, 0, 230, 40 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER -CAPTION "Patientez.." +CAPTION "Patientez..." FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - CTEXT "Chargement des journaux d'événements. Veuillez patienter ...", IDC_STATIC, 0, 15, 230, 8, SS_NOPREFIX + CTEXT "Chargement des journaux d'événements. Veuillez patienter...", IDC_STATIC, 0, 15, 230, 8, SS_NOPREFIX END IDD_EVENTDETAILDIALOG DIALOGEX 0, 0, 276, 282 @@ -65,27 +65,27 @@ BEGIN PUSHBUTTON "Suiva&nt", IDNEXT, 144, 258, 50, 14 PUSHBUTTON "Aide", IDHELP, 210, 258, 50, 14 EDITTEXT IDC_EVENTTEXTEDIT, 14, 81, 247, 108, ES_MULTILINE | ES_READONLY - LTEXT "&Description:", IDC_STATIC, 15, 70, 39, 8 - LTEXT "Date:", IDC_STATIC, 14, 14, 36, 8 + LTEXT "&Description :", IDC_STATIC, 14, 70, 45, 8 + LTEXT "Date :", IDC_STATIC, 14, 14, 40, 8 EDITTEXT IDC_EVENTDATESTATIC, 56, 14, 72, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Heure :", IDC_STATIC, 14, 27, 36, 8 + LTEXT "Heure :", IDC_STATIC, 14, 27, 40, 8 EDITTEXT IDC_EVENTTIMESTATIC, 56, 27, 72, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "&Utilisateur :", IDC_STATIC, 14, 41, 36, 8 + LTEXT "&Utilisateur :", IDC_STATIC, 14, 41, 40, 8 EDITTEXT IDC_EVENTUSERSTATIC, 56, 41, 72, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Ordinateur :", IDC_STATIC, 14, 54, 36, 8 + LTEXT "Ordinateur :", IDC_STATIC, 14, 54, 40, 8 EDITTEXT IDC_EVENTCOMPUTERSTATIC, 56, 54, 72, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Événement :", IDC_STATIC, 133, 15, 36, 8 + LTEXT "Événement :", IDC_STATIC, 133, 15, 42, 8 EDITTEXT IDC_EVENTIDSTATIC, 175, 15, 87, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Source:", IDC_STATIC, 133, 28, 36, 8 + LTEXT "Source :", IDC_STATIC, 133, 28, 42, 8 EDITTEXT IDC_EVENTSOURCESTATIC, 175, 28, 87, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Type:", IDC_STATIC, 133, 42, 36, 8 + LTEXT "Type :", IDC_STATIC, 133, 42, 42, 8 EDITTEXT IDC_EVENTTYPESTATIC, 175, 42, 87, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL - LTEXT "Catégorie :", IDC_STATIC, 133, 55, 36, 8 + LTEXT "Catégorie :", IDC_STATIC, 133, 55, 42, 8 EDITTEXT IDC_EVENTCATEGORYSTATIC, 175, 55, 87, 8, ES_LEFT | ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP | ES_AUTOHSCROLL EDITTEXT IDC_EVENTDATAEDIT, 14, 204, 247, 44, ES_MULTILINE | ES_READONLY - LTEXT "Données", IDC_STATIC, 14, 194, 20, 8 - CONTROL "&Octets", IDC_BYTESRADIO, "Button", BS_AUTORADIOBUTTON, 39, 194, 34, 8 - CONTROL "&Mots", IDC_WORDRADIO, "Button", BS_AUTORADIOBUTTON, 77, 194, 33, 8 + LTEXT "Données :", IDC_STATIC, 14, 194, 35, 8 + CONTROL "&Octets", IDC_BYTESRADIO, "Button", BS_AUTORADIOBUTTON, 50, 194, 34, 8 + CONTROL "&Mots", IDC_WORDRADIO, "Button", BS_AUTORADIOBUTTON, 88, 194, 33, 8 END STRINGTABLE @@ -93,7 +93,7 @@ BEGIN IDS_APP_TITLE "Visionneuse d'événements" IDS_APP_TITLE_EX "%s - %s Log on \\\\" IDS_STATUS_MSG "%s has %lu event(s)" - 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écéssaires ou les fichiers DLL de message pour afficher les messages depuis un ordinateur distant." + 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." IDS_EVENTLOG_ERROR_TYPE "Erreur" IDS_EVENTLOG_WARNING_TYPE "Avertissement" IDS_EVENTLOG_INFORMATION_TYPE "Informations" diff --git a/reactos/dll/win32/devmgr/lang/fr-FR.rc b/reactos/dll/win32/devmgr/lang/fr-FR.rc index de0cc1adfda..56446fe4ea1 100644 --- a/reactos/dll/win32/devmgr/lang/fr-FR.rc +++ b/reactos/dll/win32/devmgr/lang/fr-FR.rc @@ -44,7 +44,7 @@ BEGIN IDS_DEV_OUT_OF_MEMORY "Le pilote de ce périphérique peut être mauvais, ou votre système peut être à court de mémoire ou d'autres ressources." IDS_DEV_ENTRY_IS_WRONG_TYPE "Ce périphérique ne fonctionne pas correctement parce qu'un des pilotes de ce périphérique peut être mauvais, ou votre base de registres peut être mauvaise." IDS_DEV_LACKED_ARBITRATOR "Le pilote de ce périphérique a demandé une ressource que ReactOS ne sait pas prendre en compte." - IDS_DEV_BOOT_CONFIG_CONFLICT "Un autre périphérique utilise les ressources nécéssaires à ce périphérique." + IDS_DEV_BOOT_CONFIG_CONFLICT "Un autre périphérique utilise les ressources nécessaires à ce périphérique." IDS_DEV_FAILED_FILTER "Les pilotes de ce périphérique doivent être réinstallés." IDS_DEV_DEVLOADER_NOT_FOUND "Ce périphérique ne fonctionne pas correctement parce que ReactOS ne peut charger le fichier %1 qui charge les pilotes de ce périphérique." IDS_DEV_DEVLOADER_NOT_FOUND2 "Ce périphérique ne fonctionne pas correctement parce que le fichier %1 qui charge les pilotes de ce périphérique est mauvais." From e2bb0affc731e5e55f64f1b6ffb2b14cacc2c048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 24 Aug 2014 12:00:57 +0000 Subject: [PATCH 52/55] [EVENTVWR] Do not hardcode event logs, but retrieve them from the registry. Patch by Ricardo Hanke. CORE-8458 #resolve #comment Committed, thanks! svn path=/trunk/; revision=63930 --- .../applications/mscutils/eventvwr/eventvwr.c | 286 +++++++++++++----- .../mscutils/eventvwr/lang/bg-BG.rc | 4 - .../mscutils/eventvwr/lang/cs-CZ.rc | 4 - .../mscutils/eventvwr/lang/de-DE.rc | 4 - .../mscutils/eventvwr/lang/el-GR.rc | 4 - .../mscutils/eventvwr/lang/en-US.rc | 4 - .../mscutils/eventvwr/lang/es-ES.rc | 4 - .../mscutils/eventvwr/lang/fr-FR.rc | 4 - .../mscutils/eventvwr/lang/he-IL.rc | 4 - .../mscutils/eventvwr/lang/it-IT.rc | 4 - .../mscutils/eventvwr/lang/ja-JP.rc | 4 - .../mscutils/eventvwr/lang/ko-KR.rc | 4 - .../mscutils/eventvwr/lang/no-NO.rc | 4 - .../mscutils/eventvwr/lang/pl-PL.rc | 4 - .../mscutils/eventvwr/lang/pt-BR.rc | 4 - .../mscutils/eventvwr/lang/ro-RO.rc | 4 - .../mscutils/eventvwr/lang/ru-RU.rc | 4 - .../mscutils/eventvwr/lang/sk-SK.rc | 4 - .../mscutils/eventvwr/lang/sq-AL.rc | 4 - .../mscutils/eventvwr/lang/sv-SE.rc | 4 - .../mscutils/eventvwr/lang/tr-TR.rc | 4 - .../mscutils/eventvwr/lang/uk-UA.rc | 4 - .../mscutils/eventvwr/lang/zh-CN.rc | 4 - .../applications/mscutils/eventvwr/resource.h | 25 +- 24 files changed, 218 insertions(+), 181 deletions(-) diff --git a/reactos/base/applications/mscutils/eventvwr/eventvwr.c b/reactos/base/applications/mscutils/eventvwr/eventvwr.c index 86b7666aa8d..e44b35357c2 100644 --- a/reactos/base/applications/mscutils/eventvwr/eventvwr.c +++ b/reactos/base/applications/mscutils/eventvwr/eventvwr.c @@ -41,12 +41,10 @@ #define _CRT_SECURE_NO_DEPRECATE /* all deprecated unsafe string functions */ #endif -static const LPWSTR EVENT_SOURCE_APPLICATION = L"Application"; -static const LPWSTR EVENT_SOURCE_SECURITY = L"Security"; -static const LPWSTR EVENT_SOURCE_SYSTEM = L"System"; static const WCHAR szWindowClass[] = L"EVENTVWR"; /* the main window class name*/ +static const WCHAR EVENTLOG_BASE_KEY[] = L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\"; -//MessageFile message buffer size +// MessageFile message buffer size #define EVENT_MESSAGE_EVENTTEXT_BUFFER 1024*10 #define EVENT_MESSAGE_FILE_BUFFER 1024*10 #define EVENT_DLL_SEPARATOR L";" @@ -73,6 +71,9 @@ OPENFILENAMEW sfn; LPWSTR lpSourceLogName = NULL; LPWSTR lpComputerName = NULL; +DWORD dwNumLogs = 0; +WCHAR **LogNames; + /* Forward declarations of functions included in this code module: */ ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); @@ -838,19 +839,6 @@ Refresh(VOID) } -// -// FUNCTION: MyRegisterClass() -// -// PURPOSE: Registers the window class. -// -// COMMENTS: -// -// This function and its usage are only necessary if you want this code -// to be compatible with Win32 systems prior to the 'RegisterClassEx' -// function that was added to Windows 95. It is important to call this function -// so that the application will get 'well formed' small icons associated -// with it. -// ATOM MyRegisterClass(HINSTANCE hInstance) { @@ -874,16 +862,188 @@ MyRegisterClass(HINSTANCE hInstance) } -// -// FUNCTION: InitInstance(HINSTANCE, int) -// -// PURPOSE: Saves instance handle and creates main window -// -// COMMENTS: -// -// In this function, we save the instance handle in a global variable and -// create and display the main program window. -// +VOID +GetDisplayNameFile(LPCWSTR lpLogName, LPWSTR lpModuleName) +{ + HKEY hKey; + WCHAR *KeyPath; + WCHAR szModuleName[MAX_PATH]; + DWORD dwData; + + + KeyPath = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (wcslen(EVENTLOG_BASE_KEY) + wcslen(lpLogName) + 1) * sizeof(WCHAR)); + if (!KeyPath) + { + return; + } + + wcscpy(KeyPath, EVENTLOG_BASE_KEY); + wcscat(KeyPath, lpLogName); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, KeyPath); + return; + } + + dwData = MAX_PATH; + + if (RegQueryValueExW(hKey, L"DisplayNameFile", NULL, NULL, (LPBYTE)szModuleName, &dwData) == ERROR_SUCCESS) + { + ExpandEnvironmentStringsW(szModuleName, lpModuleName, MAX_PATH); + } + + RegCloseKey(hKey); + HeapFree(GetProcessHeap(), 0, KeyPath); +} + + +DWORD +GetDisplayNameID(LPCWSTR lpLogName) +{ + HKEY hKey; + WCHAR *KeyPath; + DWORD dwMessageID = 0; + DWORD dwData; + + KeyPath = (WCHAR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (wcslen(EVENTLOG_BASE_KEY) + wcslen(lpLogName) + 1) * sizeof(WCHAR)); + if (!KeyPath) + { + return 0; + } + + wcscpy(KeyPath, EVENTLOG_BASE_KEY); + wcscat(KeyPath, lpLogName); + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, KeyPath, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { + HeapFree(GetProcessHeap(), 0, KeyPath); + return 0; + } + + dwData = sizeof(dwMessageID); + + RegQueryValueExW(hKey, L"DisplayNameID", NULL, NULL, (LPBYTE)&dwMessageID, &dwData); + + RegCloseKey(hKey); + HeapFree(GetProcessHeap(), 0, KeyPath); + + return dwMessageID; +} + + +VOID +BuildLogList(void) +{ + HKEY hKey; + DWORD lpcName; + DWORD dwIndex; + DWORD dwMessageID; + DWORD dwMaxKeyLength; + WCHAR szModuleName[MAX_PATH]; + LPWSTR lpDisplayName; + HANDLE hLibrary = NULL; + + if (RegOpenKeyExW(HKEY_LOCAL_MACHINE, EVENTLOG_BASE_KEY, 0, KEY_READ, &hKey) != ERROR_SUCCESS) + { + return; + } + + if (RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &dwNumLogs, &dwMaxKeyLength, NULL, NULL, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + { + RegCloseKey(hKey); + return; + } + + if (!dwNumLogs) + { + RegCloseKey(hKey); + return; + } + + LogNames = (WCHAR**)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (dwNumLogs + 1) * sizeof(WCHAR*)); + + if (!LogNames) + { + RegCloseKey(hKey); + return; + } + + for (dwIndex = 0; dwIndex < dwNumLogs; dwIndex++) + { + LogNames[dwIndex] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, ((dwMaxKeyLength + 1) * sizeof(WCHAR))); + + if (LogNames[dwIndex] != NULL) + { + lpcName = dwMaxKeyLength + 1; + + if (RegEnumKeyExW(hKey, dwIndex, LogNames[dwIndex], &lpcName, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + lpDisplayName = NULL; + + ZeroMemory(szModuleName, sizeof(szModuleName)); + GetDisplayNameFile(LogNames[dwIndex], szModuleName); + dwMessageID = GetDisplayNameID(LogNames[dwIndex]); + + hLibrary = LoadLibraryExW(szModuleName, NULL, DONT_RESOLVE_DLL_REFERENCES | LOAD_LIBRARY_AS_DATAFILE); + if (hLibrary != NULL) + { + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, hLibrary, dwMessageID, 0, (LPWSTR)&lpDisplayName, 0, NULL); + FreeLibrary(hLibrary); + } + + if (lpDisplayName) + { + InsertMenuW(hMainMenu, ID_SAVE_PROTOCOL, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, lpDisplayName); + } + else + { + InsertMenuW(hMainMenu, ID_SAVE_PROTOCOL, MF_BYCOMMAND | MF_STRING, ID_FIRST_LOG + dwIndex, LogNames[dwIndex]); + } + + LocalFree(lpDisplayName); + } + } + } + + InsertMenuW(hMainMenu, ID_SAVE_PROTOCOL, MF_BYCOMMAND | MF_SEPARATOR, ID_FIRST_LOG + dwIndex + 1, NULL); + + RegCloseKey(hKey); + + return; +} + + +VOID +FreeLogList(void) +{ + DWORD dwIndex; + + if (!LogNames) + { + return; + } + + for (dwIndex = 0; dwIndex < dwNumLogs; dwIndex++) + { + if (LogNames[dwIndex]) + { + HeapFree(GetProcessHeap(), 0, LogNames[dwIndex]); + } + + DeleteMenu(hMainMenu, ID_FIRST_LOG + dwIndex, MF_BYCOMMAND); + } + + DeleteMenu(hMainMenu, ID_FIRST_LOG + dwIndex + 1, MF_BYCOMMAND); + + HeapFree(GetProcessHeap(), 0, LogNames); + + dwNumLogs = 0; + + return; +} + + BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) @@ -1042,23 +1202,16 @@ InitInstance(HINSTANCE hInstance, ShowWindow(hwndMainWindow, nCmdShow); UpdateWindow(hwndMainWindow); - QueryEventMessages(lpComputerName, // Use the local computer. - EVENT_SOURCE_APPLICATION); // The event log category + BuildLogList(); + + QueryEventMessages(lpComputerName, LogNames[0]); + + CheckMenuRadioItem(GetMenu(hwndMainWindow), ID_FIRST_LOG, ID_FIRST_LOG + dwNumLogs, ID_FIRST_LOG, MF_BYCOMMAND); return TRUE; } -// -// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM) -// -// PURPOSE: Processes messages for the main window. -// -// WM_COMMAND - process the application menu -// WM_PAINT - Paint the main window -// WM_DESTROY - post a quit message and return -// -// LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -1069,11 +1222,6 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { case WM_CREATE: hMainMenu = GetMenu(hWnd); - CheckMenuRadioItem(GetMenu(hWnd), - ID_LOG_APPLICATION, - ID_LOG_SYSTEM, - ID_LOG_APPLICATION, - MF_BYCOMMAND); break; case WM_NOTIFY: @@ -1099,44 +1247,21 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_COMMAND: // Parse the menu selections: + + if ((LOWORD(wParam) >= ID_FIRST_LOG) && (LOWORD(wParam) <= ID_FIRST_LOG + dwNumLogs)) + { + if (LogNames[LOWORD(wParam) - ID_FIRST_LOG]) + { + if (QueryEventMessages(lpComputerName, LogNames[LOWORD(wParam) - ID_FIRST_LOG])) + { + CheckMenuRadioItem(GetMenu(hWnd), ID_FIRST_LOG, ID_FIRST_LOG + dwNumLogs, LOWORD(wParam), MF_BYCOMMAND); + } + } + } + else + switch (LOWORD(wParam)) { - case ID_LOG_APPLICATION: - if (QueryEventMessages(lpComputerName, // Use the local computer. - EVENT_SOURCE_APPLICATION)) // The event log category - { - CheckMenuRadioItem(GetMenu(hWnd), - ID_LOG_APPLICATION, - ID_LOG_SYSTEM, - ID_LOG_APPLICATION, - MF_BYCOMMAND); - } - break; - - case ID_LOG_SECURITY: - if (QueryEventMessages(lpComputerName, // Use the local computer. - EVENT_SOURCE_SECURITY)) // The event log category - { - CheckMenuRadioItem(GetMenu(hWnd), - ID_LOG_APPLICATION, - ID_LOG_SYSTEM, - ID_LOG_SECURITY, - MF_BYCOMMAND); - } - break; - - case ID_LOG_SYSTEM: - if (QueryEventMessages(lpComputerName, // Use the local computer. - EVENT_SOURCE_SYSTEM)) // The event log category - { - CheckMenuRadioItem(GetMenu(hWnd), - ID_LOG_APPLICATION, - ID_LOG_SYSTEM, - ID_LOG_SYSTEM, - MF_BYCOMMAND); - } - break; - case ID_SAVE_PROTOCOL: SaveProtocol(); break; @@ -1191,6 +1316,7 @@ WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_DESTROY: FreeRecords(); + FreeLogList(); PostQuitMessage(0); break; diff --git a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc index 360802294a2..db30ca55b80 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/bg-BG.rc @@ -4,10 +4,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Дневник" BEGIN - MENUITEM "&Приложение", ID_LOG_APPLICATION - MENUITEM "&Сигурност", ID_LOG_SECURITY - MENUITEM "&Уредба", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/cs-CZ.rc b/reactos/base/applications/mscutils/eventvwr/lang/cs-CZ.rc index a939a0724e8..ef28104cc03 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/cs-CZ.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/cs-CZ.rc @@ -4,10 +4,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Protokol" BEGIN - MENUITEM "&Aplikace", ID_LOG_APPLICATION - MENUITEM "&Zabezpečení", ID_LOG_SECURITY - MENUITEM "&Systém", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Uložit &Protokol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "&Odstranit události", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc index e9c0234f69d..00b2fdf2510 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/de-DE.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Protokoll" BEGIN - MENUITEM "&Anwendung", ID_LOG_APPLICATION - MENUITEM "&Sicherheit", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Protokoll s&peichern...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "Alle E&reignisse löschen", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc index e4e757bdcb5..c40203aa0b6 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/el-GR.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Log" BEGIN - MENUITEM "&Εφαρμογή", ID_LOG_APPLICATION - MENUITEM "&Ασφάλεια", ID_LOG_SECURITY - MENUITEM "&Σύστημα", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc index a02247904ac..7cda9ee606f 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/en-US.rc @@ -12,10 +12,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Log" BEGIN - MENUITEM "&Application", ID_LOG_APPLICATION - MENUITEM "&Security", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc index d7dfb8bde9b..97ce5eb126b 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/es-ES.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Log" BEGIN - MENUITEM "&Aplicación", ID_LOG_APPLICATION - MENUITEM "&Seguridad", ID_LOG_SECURITY - MENUITEM "&Sistema", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc index fc4ae169fc7..83ff4a1176d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/fr-FR.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "Journa&l" BEGIN - MENUITEM "&Application", ID_LOG_APPLICATION - MENUITEM "&Sécurité", ID_LOG_SECURITY - MENUITEM "&Système", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "Effacer tous &les événements", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/he-IL.rc b/reactos/base/applications/mscutils/eventvwr/lang/he-IL.rc index aafdb5bbf15..6b46f4ace85 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/he-IL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/he-IL.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "מציג האירועים (מקומי)" BEGIN - MENUITEM "יישום", ID_LOG_APPLICATION - MENUITEM "אבטחה", ID_LOG_SECURITY - MENUITEM "מערכת", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc index d1543a1626c..90462eb1d13 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/it-IT.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Log" BEGIN - MENUITEM "&Applicazioni", ID_LOG_APPLICATION - MENUITEM "&Sicurezza", ID_LOG_SECURITY - MENUITEM "&Sistema", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc index 5fb5194e80d..9ccff1e78b0 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ja-JP.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "ログ(&L)" BEGIN - MENUITEM "アプリケーション(&A)", ID_LOG_APPLICATION - MENUITEM "セキュリティ(&S)", ID_LOG_SECURITY - MENUITEM "システム(&S)", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc index 5d02fc087ba..d48971915d6 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ko-KR.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "로그(&L)" BEGIN - MENUITEM "애플리케이션(&A)", ID_LOG_APPLICATION - MENUITEM "보안(&S)", ID_LOG_SECURITY - MENUITEM "시스템(&S)", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc index f66eca5bc68..ff2bf2f824a 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/no-NO.rc @@ -4,10 +4,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Logg" BEGIN - MENUITEM "&Applikasjon", ID_LOG_APPLICATION - MENUITEM "&Sikkerhet", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc index 7432a6686ab..d139ed1969c 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pl-PL.rc @@ -8,10 +8,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Logi" BEGIN - MENUITEM "&Aplikacja", ID_LOG_APPLICATION - MENUITEM "&Zabezpieczenia", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Zapisz &protokół...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "W&yczyść wszystkie zdarzenia", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/pt-BR.rc b/reactos/base/applications/mscutils/eventvwr/lang/pt-BR.rc index 47f33b21bc9..ceb727e0d9d 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/pt-BR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/pt-BR.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Registro" BEGIN - MENUITEM "&Aplicativo", ID_LOG_APPLICATION - MENUITEM "S&egurança", ID_LOG_SECURITY - MENUITEM "&Sistema", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc index 2ddd76f241d..ebb1f6182e8 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ro-RO.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "J&urnal" BEGIN - MENUITEM "&Aplicație", ID_LOG_APPLICATION - MENUITEM "Se&curitate", ID_LOG_SECURITY - MENUITEM "&Sistem", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Păstrare p&rotocol…", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "Înlăt&ură toate evenimentele", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc index 8a1a767751f..be6eb7fbb75 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/ru-RU.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Логи" BEGIN - MENUITEM "&Приложений", ID_LOG_APPLICATION - MENUITEM "&Безопасности", ID_LOG_SECURITY - MENUITEM "&Системы", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc index a751ec062bc..12e3b00a094 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sk-SK.rc @@ -9,10 +9,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Záznam" BEGIN - MENUITEM "&Application", ID_LOG_APPLICATION - MENUITEM "&Security", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sq-AL.rc b/reactos/base/applications/mscutils/eventvwr/lang/sq-AL.rc index bb0be3429f3..7dc078369c3 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sq-AL.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sq-AL.rc @@ -12,10 +12,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Log" BEGIN - MENUITEM "&Aplikacion", ID_LOG_APPLICATION - MENUITEM "&Siguri", ID_LOG_SECURITY - MENUITEM "&Sistemi", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc index f9eb385f189..8b8e01e6a87 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/sv-SE.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Logg" BEGIN - MENUITEM "&Applikation", ID_LOG_APPLICATION - MENUITEM "&Säkerhet", ID_LOG_SECURITY - MENUITEM "&System", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/tr-TR.rc b/reactos/base/applications/mscutils/eventvwr/lang/tr-TR.rc index 1b54204c7ec..5c979d4c820 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/tr-TR.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/tr-TR.rc @@ -12,10 +12,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Kayıt" BEGIN - MENUITEM "&Uygulama", ID_LOG_APPLICATION - MENUITEM "&Güvenlik", ID_LOG_SECURITY - MENUITEM "&Dizge", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "&Protokolü Kaydet...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "&Tüm Olayları Sil", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc index 82c61cab7a1..c6c6353c3e4 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/uk-UA.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "&Звіт" BEGIN - MENUITEM "&Програма", ID_LOG_APPLICATION - MENUITEM "&Захист", ID_LOG_SECURITY - MENUITEM "&Система", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/lang/zh-CN.rc b/reactos/base/applications/mscutils/eventvwr/lang/zh-CN.rc index 524cf3dd552..7ec7f850e55 100644 --- a/reactos/base/applications/mscutils/eventvwr/lang/zh-CN.rc +++ b/reactos/base/applications/mscutils/eventvwr/lang/zh-CN.rc @@ -6,10 +6,6 @@ IDC_EVENTVWR MENU BEGIN POPUP "日志(&L)" BEGIN - MENUITEM "应用程序日志(&A)", ID_LOG_APPLICATION - MENUITEM "安全日志(&S)", ID_LOG_SECURITY - MENUITEM "系统日志(&Y)", ID_LOG_SYSTEM - MENUITEM SEPARATOR MENUITEM "Save &Protocol...", ID_SAVE_PROTOCOL, GRAYED MENUITEM SEPARATOR MENUITEM "C&lear all Events", ID_CLEAR_EVENTS, GRAYED diff --git a/reactos/base/applications/mscutils/eventvwr/resource.h b/reactos/base/applications/mscutils/eventvwr/resource.h index b98a189c02e..f5cd0cb49fd 100644 --- a/reactos/base/applications/mscutils/eventvwr/resource.h +++ b/reactos/base/applications/mscutils/eventvwr/resource.h @@ -35,19 +35,18 @@ #define IDC_WORDRADIO 1013 #define IDC_EVENTDATAEDIT 1014 -#define ID_LOG_APPLICATION 32771 -#define ID_LOG_SECURITY 32772 -#define ID_LOG_SYSTEM 32773 -#define ID_HELP_HELP 32775 -#define ID_HELP 32776 -#define ID_OPTIONS 32777 -#define ID_VIEW 32778 -#define IDM_HELP 32779 -#define ID_VIEW_REFRESH 32780 -#define ID_REFRESH 32781 -#define IDM_REFRESH 32782 -#define ID_CLEAR_EVENTS 32783 -#define ID_SAVE_PROTOCOL 32784 +#define ID_HELP_HELP 32771 +#define ID_HELP 32772 +#define ID_OPTIONS 32773 +#define ID_VIEW 32774 +#define IDM_HELP 32775 +#define ID_VIEW_REFRESH 32776 +#define ID_REFRESH 32777 +#define IDM_REFRESH 32778 +#define ID_CLEAR_EVENTS 32779 +#define ID_SAVE_PROTOCOL 32780 + +#define ID_FIRST_LOG 45000 /* String IDs */ #define IDS_APP_TITLE 103 From bd13d223c548b388772e7c3f1e58a698e620cfd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Sun, 24 Aug 2014 12:19:35 +0000 Subject: [PATCH 53/55] [DESK.CPL] Set a default choice for the options of the first tab of Settings/Advanced. svn path=/trunk/; revision=63931 --- reactos/dll/cpl/desk/general.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/reactos/dll/cpl/desk/general.c b/reactos/dll/cpl/desk/general.c index 4bd48e2439a..7ec2a9620c2 100644 --- a/reactos/dll/cpl/desk/general.c +++ b/reactos/dll/cpl/desk/general.c @@ -95,9 +95,13 @@ InitRadioButtons(HWND hWnd) break; } } + else + SendDlgItemMessage(hWnd, IDC_WITHOUTREBOOT_RB, BM_SETCHECK, 1, 1); RegCloseKey(hKey); } + else + SendDlgItemMessage(hWnd, IDC_WITHOUTREBOOT_RB, BM_SETCHECK, 1, 1); } INT_PTR CALLBACK From 3decbe052b4f5b16ef1eccfe611c07047b9df7ba Mon Sep 17 00:00:00 2001 From: Daniel Reimer Date: Sun, 24 Aug 2014 13:25:12 +0000 Subject: [PATCH 54/55] [SHELL32] Marshall interface pointers during background delete by Huw Campbell CORE-8460 #resolve #comment Committed by request of Victor. Have fun ^^ svn path=/trunk/; revision=63932 --- reactos/dll/win32/shell32/defcontextmenu.cpp | 11 +++++------ reactos/dll/win32/shell32/folders/fs.cpp | 1 + .../dll/win32/shell32/folders/recyclebin.cpp | 17 +++++++++++------ 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/reactos/dll/win32/shell32/defcontextmenu.cpp b/reactos/dll/win32/shell32/defcontextmenu.cpp index 94863d7f35a..db24a4c17a2 100644 --- a/reactos/dll/win32/shell32/defcontextmenu.cpp +++ b/reactos/dll/win32/shell32/defcontextmenu.cpp @@ -1144,18 +1144,17 @@ CDefaultContextMenu::DoCreateLink( HRESULT CDefaultContextMenu::DoDelete(LPCMINVOKECOMMANDINFO lpcmi) { TRACE("(%p) Deleting\n", this); - LPDATAOBJECT pDataObj; + CComPtr pDataObject; - if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObj)))) + if (SUCCEEDED(SHCreateDataObject(m_pidlFolder, m_cidl, m_apidl, NULL, IID_PPV_ARG(IDataObject, &pDataObject)))) { - pDataObj->AddRef(); - SHCreateThread(DoDeleteThreadProc, pDataObj, NULL, NULL); - pDataObj->Release(); + IStream *s; + CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s); + SHCreateThread(DoDeleteThreadProc, s, NULL, NULL); } else return E_FAIL; return S_OK; - } HRESULT diff --git a/reactos/dll/win32/shell32/folders/fs.cpp b/reactos/dll/win32/shell32/folders/fs.cpp index ef16c7b41af..2bd8b9124eb 100644 --- a/reactos/dll/win32/shell32/folders/fs.cpp +++ b/reactos/dll/win32/shell32/folders/fs.cpp @@ -1763,6 +1763,7 @@ DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) { data->This->Release(); //Release the parameter from the heap. HeapFree(GetProcessHeap(), 0, data); + CoUninitialize(); return 0; } diff --git a/reactos/dll/win32/shell32/folders/recyclebin.cpp b/reactos/dll/win32/shell32/folders/recyclebin.cpp index 4365297b7d0..18982fb072e 100644 --- a/reactos/dll/win32/shell32/folders/recyclebin.cpp +++ b/reactos/dll/win32/shell32/folders/recyclebin.cpp @@ -1459,8 +1459,9 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject, /* Handle cfShellIDList Drop objects here, otherwise send the approriate message to other software */ if (SUCCEEDED(pDataObject->QueryGetData(&fmt))) { - pDataObject->AddRef(); - SHCreateThread(DoDeleteThreadProc, pDataObject, NULL, NULL); + IStream *s; + CoMarshalInterThreadInterfaceInStream(IID_IDataObject, pDataObject, &s); + SHCreateThread(DoDeleteThreadProc, s, NULL, NULL); } else { @@ -1474,10 +1475,14 @@ HRESULT WINAPI CRecycleBin::Drop(IDataObject *pDataObject, DWORD WINAPI DoDeleteThreadProc(LPVOID lpParameter) { - IDataObject *pda = (IDataObject*) lpParameter; - DoDeleteDataObject(pda); - //Release the data object - pda->Release(); + CoInitialize(NULL); + CComPtr pDataObject; + HRESULT hr = CoGetInterfaceAndReleaseStream (static_cast(lpParameter), IID_PPV_ARG(IDataObject, &pDataObject)); + if (SUCCEEDED(hr)) + { + DoDeleteDataObject(pDataObject); + } + CoUninitialize(); return 0; } From cb9669d96786d96a5f68f9d7f7786bfbf6d58d52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Sun, 24 Aug 2014 13:28:33 +0000 Subject: [PATCH 55/55] [WIN32K] - Enable commented freetype call: set font face size and coordinate transformation matrix Patch by Huw Campbell, reviewed by a gazillion of people. CORE-4657 #resolve #comment committed in r63933, a million thanks svn path=/trunk/; revision=63933 --- reactos/win32ss/gdi/ntgdi/freetype.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/reactos/win32ss/gdi/ntgdi/freetype.c b/reactos/win32ss/gdi/ntgdi/freetype.c index aa2d36fac5a..17d7bcf5f20 100644 --- a/reactos/win32ss/gdi/ntgdi/freetype.c +++ b/reactos/win32ss/gdi/ntgdi/freetype.c @@ -1600,12 +1600,12 @@ ftGdiGetGlyphOutline( } } -// FT_Set_Pixel_Sizes(ft_face, -// TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, + FT_Set_Pixel_Sizes(ft_face, + TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfWidth, /* FIXME: Should set character height if neg */ -// (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? -// dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); -// FtSetCoordinateTransform(face, DC_pmxWorldToDevice(dc)); + (TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight == 0 ? + dc->ppdev->devinfo.lfDefaultFont.lfHeight : abs(TextObj->logfont.elfEnumLogfontEx.elfLogFont.lfHeight))); + FtSetCoordinateTransform(ft_face, DC_pmxWorldToDevice(dc)); TEXTOBJ_UnlockText(TextObj); @@ -3674,6 +3674,7 @@ GreExtTextOutW( } else { + // FIXME this should probably be a matrix transform with TextTop as well. Scale = pdcattr->mxWorldToDevice.efM11; if (_FLOATOBJ_Equal0(&Scale)) FLOATOBJ_Set1(&Scale);