diff --git a/CMakeLists.txt b/CMakeLists.txt index d4736894667..3d438d53350 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,10 +137,10 @@ else() add_definitions(-D_WINKD_=1) endif() - if((NOT DEFINED PCH) AND (CMAKE_VERSION STREQUAL "2.8.12.1-ReactOS") AND (NOT CMAKE_C_COMPILER_ID STREQUAL "Clang")) - set(PCH 1) + if((CMAKE_VERSION STREQUAL "2.8.12.1-ReactOS") AND (NOT CMAKE_C_COMPILER_ID STREQUAL "Clang")) + set(PCH 1 CACHE BOOL "Whether to use precompiled headers") else() - set(PCH 0) + set(PCH 0 CACHE BOOL "Whether to use precompiled headers") endif() # Version Options diff --git a/base/applications/calc/lang/tr-TR.rc b/base/applications/calc/lang/tr-TR.rc index ece24b3bc8f..c8e0250c5a0 100644 --- a/base/applications/calc/lang/tr-TR.rc +++ b/base/applications/calc/lang/tr-TR.rc @@ -325,7 +325,7 @@ END IDR_MENU_SCIENTIFIC_1 MENU BEGIN - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Çoğalt\tCtrl+C", IDM_EDIT_COPY MENUITEM "&Yapıştır\tCtrl+V", IDM_EDIT_PASTE @@ -357,7 +357,7 @@ END IDR_MENU_SCIENTIFIC_2 MENU BEGIN - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Çoğalt\tCtrl+C", IDM_EDIT_COPY MENUITEM "&Yapıştır\tCtrl+V", IDM_EDIT_PASTE @@ -390,7 +390,7 @@ END IDR_MENU_STANDARD MENU BEGIN - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Çoğalt\tCtrl+C", IDM_EDIT_COPY MENUITEM "&Yapıştır\tCtrl+V", IDM_EDIT_PASTE @@ -490,7 +490,7 @@ STRINGTABLE BEGIN IDS_CONSUMPTION_KM_PER_L "Kilometre/Litre" IDS_CONSUMPTION_L_PER_100_KM "Litre/100 Kilometre" - IDS_CONSUMPTION_MILES_GALLON_UK "Mil/Galon (BB)" + IDS_CONSUMPTION_MILES_GALLON_UK "Mil/Galon (BK)" IDS_CONSUMPTION_MILES_GALLON_US "Mil/Galon (ABD)" END @@ -541,7 +541,7 @@ BEGIN IDS_LENGTH_ASTRONOMICAL_UNITS "Astronomi birimi" IDS_LENGTH_BARLEYCORNS "Arpa tânesi" IDS_LENGTH_CENTIMETERS "Santimetre" - IDS_LENGTH_CHAINS_UK "Zincir (BB)" + IDS_LENGTH_CHAINS_UK "Zincir (BK)" IDS_LENGTH_CHI "Çi" IDS_LENGTH_CHOU "Çou" IDS_LENGTH_CHR "Çır" @@ -562,7 +562,7 @@ BEGIN IDS_LENGTH_KILOMETERS "Kilometre" IDS_LENGTH_LAR "Lar" IDS_LENGTH_LIGHT_YEARS "Işık yılı" - IDS_LENGTH_LINKS_UK "Zincir bağlantısı (BB)" + IDS_LENGTH_LINKS_UK "Zincir bağlantısı (BK)" IDS_LENGTH_METERS "Metre" IDS_LENGTH_MICRONS "Mikron" IDS_LENGTH_MILES "Mil" @@ -648,10 +648,10 @@ END /* Volumes */ STRINGTABLE BEGIN - IDS_VOLUME_BARRELS_UK "Fıçı (BB)" + IDS_VOLUME_BARRELS_UK "Fıçı (BK)" IDS_VOLUME_BARRELS_OIL "Yağ Fıçısı" IDS_VOLUME_BUN "Bun" - IDS_VOLUME_BUSHELS_UK "Ölçek (BB)" + IDS_VOLUME_BUSHELS_UK "Ölçek (BK)" IDS_VOLUME_BUSHELS_US "Ölçek (ABD)" IDS_VOLUME_CUBIC_CENTIMETERS "Santimetreküp" IDS_VOLUME_CUBIC_FEET "Ayakküp" @@ -659,9 +659,9 @@ BEGIN IDS_VOLUME_CUBIC_METERS "Metreküp" IDS_VOLUME_CUBIC_YARDS "Yardaküp" IDS_VOLUME_DOE "Do" - IDS_VOLUME_FLUID_OUNCES_UK "Sıvı onsu (BB)" + IDS_VOLUME_FLUID_OUNCES_UK "Sıvı onsu (BK)" IDS_VOLUME_FLUID_OUNCES_US "Sıvı onsu (ABD)" - IDS_VOLUME_GALLONS_UK "Galon (BB)" + IDS_VOLUME_GALLONS_UK "Galon (BK)" IDS_VOLUME_GALLONS_DRY_US "Galon, kuru (ABD)" IDS_VOLUME_GALLONS_LIQUID_US "Galon, sıvı (ABD)" IDS_VOLUME_GOU "Go" @@ -671,10 +671,10 @@ BEGIN IDS_VOLUME_LITERS "Litre" IDS_VOLUME_MAL "Mal" IDS_VOLUME_MILLILITERS "Mililitre" - IDS_VOLUME_PINTS_UK "Bira bardağı (BB)" + IDS_VOLUME_PINTS_UK "Bira bardağı (BK)" IDS_VOLUME_PINTS_DRY_US "Bira bardağı, katı (ABD)" IDS_VOLUME_PINTS_LIQUID_US "Bira bardağı, sıvı (ABD)" - IDS_VOLUME_QUARTS_UK "Kuart (BB)" + IDS_VOLUME_QUARTS_UK "Kuart (BK)" IDS_VOLUME_QUARTS_DRY_US "Kuart, katı (ABD)" IDS_VOLUME_QUARTS_LIQUID_US "Kuart, sıvı (ABD)" IDS_VOLUME_SEKI "Seki" @@ -711,6 +711,6 @@ BEGIN IDS_WEIGHT_STONES "Taş" IDS_WEIGHT_TAMLUNG "Tamlung" IDS_WEIGHT_TONNES "Ton" - IDS_WEIGHT_TONS_UK "Ton (BB)" + IDS_WEIGHT_TONS_UK "Ton (BK)" IDS_WEIGHT_TONS_US "Ton (ABD)" END diff --git a/base/applications/charmap/about.c b/base/applications/charmap/about.c index 60716fe3cdf..33ca0bdea3e 100644 --- a/base/applications/charmap/about.c +++ b/base/applications/charmap/about.c @@ -7,7 +7,7 @@ * */ -#include +#include "precomp.h" static INT_PTR diff --git a/base/applications/charmap/charmap.c b/base/applications/charmap/charmap.c index f3d78298fee..0fc2fd068ef 100644 --- a/base/applications/charmap/charmap.c +++ b/base/applications/charmap/charmap.c @@ -7,7 +7,7 @@ * */ -#include +#include "precomp.h" #include #include diff --git a/base/applications/charmap/lrgcell.c b/base/applications/charmap/lrgcell.c index 0e12b3a7f99..fe086b2e50b 100644 --- a/base/applications/charmap/lrgcell.c +++ b/base/applications/charmap/lrgcell.c @@ -7,7 +7,7 @@ * */ -#include +#include "precomp.h" static HFONT diff --git a/base/applications/charmap/map.c b/base/applications/charmap/map.c index 9c7b3ee06c7..cd8ee8e4b88 100644 --- a/base/applications/charmap/map.c +++ b/base/applications/charmap/map.c @@ -7,7 +7,7 @@ * */ -#include +#include "precomp.h" #include diff --git a/base/applications/charmap/settings.c b/base/applications/charmap/settings.c index ef2d5302c2b..8b33cfaba79 100644 --- a/base/applications/charmap/settings.c +++ b/base/applications/charmap/settings.c @@ -7,7 +7,7 @@ * */ -#include +#include "precomp.h" #include #include diff --git a/base/applications/games/spider/spider.cpp b/base/applications/games/spider/spider.cpp index b59bc33aaa3..b4ec3f1eb79 100644 --- a/base/applications/games/spider/spider.cpp +++ b/base/applications/games/spider/spider.cpp @@ -359,7 +359,7 @@ LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) MINMAXINFO *mmi; mmi = (MINMAXINFO *)lParam; - mmi->ptMinTrackSize.x = NUM_STACKS * __cardwidth + (NUM_STACKS + 3) * X_BORDER + 20; // Border left and right of 10px + mmi->ptMinTrackSize.x = NUM_STACKS * __cardwidth + (NUM_STACKS + 3) * X_BORDER + 12; // Border left and right of 6px mmi->ptMinTrackSize.y = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYMENU) + 2 * Y_BORDER + diff --git a/base/applications/games/spider/spider.h b/base/applications/games/spider/spider.h index 5385de7af55..71383d2514e 100644 --- a/base/applications/games/spider/spider.h +++ b/base/applications/games/spider/spider.h @@ -15,8 +15,8 @@ #define CARDBACK_OPTIONS_WIDTH 72 #define CARDBACK_OPTIONS_HEIGHT 112 -#define X_BORDER 6 -#define Y_BORDER 6 +#define X_BORDER 5 +#define Y_BORDER 5 #define NUM_STACKS 10 diff --git a/base/applications/games/spider/spigame.cpp b/base/applications/games/spider/spigame.cpp index f56f20616ab..c01dcd4f26e 100644 --- a/base/applications/games/spider/spigame.cpp +++ b/base/applications/games/spider/spigame.cpp @@ -298,7 +298,7 @@ void CreateSpider() pStack[i]->SetFaceDirection(CS_FACE_DOWN, 0); pos = i - NUM_STACKS/2; pStack[i]->SetPlacement(CS_XJUST_CENTER, 0, - pos * (__cardwidth + X_BORDER) + 6 * X_BORDER, 0); + pos * (__cardwidth + X_BORDER) + 6 * (X_BORDER + 1) + 3, 0); pStack[i]->SetEmptyImage(CS_EI_SUNK); pStack[i]->SetDragRule(CS_DRAG_CALLBACK, StackDragProc); pStack[i]->SetDropRule(CS_DROP_CALLBACK, StackDropProc); diff --git a/base/applications/mplay32/lang/tr-TR.rc b/base/applications/mplay32/lang/tr-TR.rc index 0d6c416f558..e28558a62cd 100644 --- a/base/applications/mplay32/lang/tr-TR.rc +++ b/base/applications/mplay32/lang/tr-TR.rc @@ -35,6 +35,6 @@ BEGIN IDS_TOOLTIP_FORWARD "Bir Sonrakine Geç" IDS_APPTITLE "Çoklu Ortam Oynatıcısı" IDS_PLAY "Çal" - IDS_DEFAULTMCIERRMSG "Bu yanlışlığın hiçbir tanımı yoktur." + IDS_DEFAULTMCIERRMSG "Bu yanlışlığın tanımı yoktur." IDS_UNKNOWNFILEEXT "Verilen kütük türünden aygıt türü belirlenemiyor." END diff --git a/base/applications/mscutils/servman/lang/tr-TR.rc b/base/applications/mscutils/servman/lang/tr-TR.rc index 4d3aac2fcc2..5b290d925f5 100644 --- a/base/applications/mscutils/servman/lang/tr-TR.rc +++ b/base/applications/mscutils/servman/lang/tr-TR.rc @@ -145,7 +145,7 @@ FONT 8, "MS Shell Dlg", 0, 0 STYLE DS_SHELLFONT | WS_BORDER | WS_DLGFRAME | DS_MODALFRAME BEGIN ICON IDI_WARNING, IDC_STATIC, 10, 8, 24, 22 - LTEXT "Aşağıdaki hizmeti silmek istemeyi doğruluyor musunuz? Bu silinme geri alınamaz!", IDC_STATIC, 50, 6, 125, 25 + LTEXT "Aşağıdaki hizmeti silmek istediğinizden emin misiniz? Bu silinme geri alınamaz!", IDC_STATIC, 50, 6, 125, 25 LTEXT "Hizmet Adı:", IDC_STATIC, 6, 40, 80, 9 LTEXT "", IDC_DEL_NAME, 15, 53, 160, 15 EDITTEXT IDC_DEL_DESC, 6, 73, 174, 48, WS_CHILD | WS_VISIBLE | WS_VSCROLL | diff --git a/base/applications/mspaint/lang/tr-TR.rc b/base/applications/mspaint/lang/tr-TR.rc index 11b00909982..65842350458 100644 --- a/base/applications/mspaint/lang/tr-TR.rc +++ b/base/applications/mspaint/lang/tr-TR.rc @@ -23,7 +23,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çıkış\tAlt+F4", IDM_FILEEXIT END - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Geri Al\tCtrl+Z", IDM_EDITUNDO MENUITEM "&Yinele\tCtrl+Y", IDM_EDITREDO diff --git a/base/applications/notepad/lang/tr-TR.rc b/base/applications/notepad/lang/tr-TR.rc index 211586744dd..4d01c3d8981 100644 --- a/base/applications/notepad/lang/tr-TR.rc +++ b/base/applications/notepad/lang/tr-TR.rc @@ -35,7 +35,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çıkış", CMD_EXIT END - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Geri Al\tCtrl+Z", CMD_UNDO MENUITEM SEPARATOR @@ -76,7 +76,7 @@ END DIALOG_PAGESETUP DIALOGEX 0, 0, 225, 95 STYLE DS_SHELLFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU FONT 8, "MS Shell Dlg" -CAPTION "Sayfa Yapısı" +CAPTION "Sayfa Ayarla" BEGIN LTEXT "&Üst Bilgi:", 0x140, 10, 07, 40, 15 EDITTEXT 0x141, 60, 05, 110, 12, WS_BORDER | WS_TABSTOP @@ -153,7 +153,7 @@ BEGIN STRING_ALL_FILES "Tüm Kütükler (*.*)" STRING_TEXT_FILES_TXT "Metin Belgeleri (*.txt)" STRING_TOOLARGE "%s kütüğü Not Defteri için çok büyük. Lütfen başka bir düzenleyici kullanınız." - STRING_NOTEXT "Hiçbir metin girmediniz. Lütfen birşeyler yazıp yeniden deneyiniz." + STRING_NOTEXT "Hiç metin girmediniz. Lütfen birşeyler yazıp yeniden deneyiniz." STRING_DOESNOTEXIST "%s kütüğü yok. Yeni bir kütük oluşturmak ister misiniz?" STRING_NOTSAVED "%s kütüğü değiştirilmiş. Değişiklikleri kaydetmek ister misiniz?" STRING_NOTFOUND "%s bulunamadı." diff --git a/base/applications/rapps/lang/tr-TR.rc b/base/applications/rapps/lang/tr-TR.rc index 9459c1fe3d7..bd117efaadd 100644 --- a/base/applications/rapps/lang/tr-TR.rc +++ b/base/applications/rapps/lang/tr-TR.rc @@ -188,7 +188,7 @@ BEGIN IDS_APPLICATIONS "Uygulamalar" IDS_CHOOSE_FOLDER_TEXT "İndirilenlerin saklanacağı bir dizin seçiniz:" IDS_CHOOSE_FOLDER_ERROR "Belirttiğiniz dizin yok. Belirttiğiniz dizin oluşturulsun mu?" - IDS_APP_REG_REMOVE "Kurulan izlencenin girişini değer defterinden silmek istemeyi doğruluyor musunuz?" + IDS_APP_REG_REMOVE "Kurulan izlencenin girişini değer defterinden silmek istediğinizden emin misiniz?" IDS_INFORMATION "Bilgi" IDS_UNABLE_TO_REMOVE "İzlencenin girişi değer defterinden silinemiyor." END diff --git a/base/applications/rapps/rapps/ghostscript.txt b/base/applications/rapps/rapps/ghostscript.txt index 2592d420443..62f00b9ab67 100644 --- a/base/applications/rapps/rapps/ghostscript.txt +++ b/base/applications/rapps/rapps/ghostscript.txt @@ -15,3 +15,7 @@ Description = Ein offener Interpreter für die PostScript Sprache und PDF. [Section.0418] Description = Un interpretor pentru limbajul PostScript și pentru PDF. Size = 12,44 Mo + +[Section.041f] +Description = PostScript dili ve PDF için bir açık kaynak yorumlayıcı. +Size = 12,44 MB diff --git a/base/applications/rapps/rapps/ghostview.txt b/base/applications/rapps/rapps/ghostview.txt index 11a88172ffe..38d08b8e2aa 100644 --- a/base/applications/rapps/rapps/ghostview.txt +++ b/base/applications/rapps/rapps/ghostview.txt @@ -16,3 +16,8 @@ Description = Ein grafisches Interface für Ghostscript. Licence = Licență publică gratuită „Aladdin” Description = O interfață grafică pentru GhostScript. Size = 1,94 Mo + +[Section.041f] +Licence = Aladdin Özgür Kamu Ruhsatı +Description = Ghostscript için bir çizgelik arayüz. +Size = 1,94 MB diff --git a/base/applications/rapps/rapps/miktex.txt b/base/applications/rapps/rapps/miktex.txt index e074b1eb440..7175ac5af8b 100644 --- a/base/applications/rapps/rapps/miktex.txt +++ b/base/applications/rapps/rapps/miktex.txt @@ -16,3 +16,8 @@ Description = MiKTeX ist eine aktuelle Implementierung von TeX/LaTeX und zugehö Licence = Gratuită Description = MikTEX este o implementare actualizată de TeX/LaTeX și aprogramelor aferente. Size = 163,18 Mo + +[Section.041f] +Licence = Ücretsiz +Description = MiKTeX, Windows için, TeX'in, LaTeX'in ve ilişkili izlencelerin bir şimdiki uygulaması. +Size = 163,18 MB diff --git a/base/applications/rapps/rapps/net20.txt b/base/applications/rapps/rapps/net20.txt index 15a81edc3a0..91e2e775dc0 100644 --- a/base/applications/rapps/rapps/net20.txt +++ b/base/applications/rapps/rapps/net20.txt @@ -22,6 +22,10 @@ Description = Microsoft .NET Framework versión 2.0 - Paquete redistribuible. Description = Microsoft .NET Framework version 2.0 - Paquet redistribuable. Size = 22,42 Mo +[Section.0410] +Description = Microsoft .NET Framework Version 2.0 - Redistributable Package. +Size = 22.42 MB + [Section.0415] Description = Microsoft .NET Framework Wersja 2.0 - Pakiet Dystrybucyjny. diff --git a/base/applications/rapps/rapps/nirlauncher.txt b/base/applications/rapps/rapps/nirlauncher.txt index f144d19cc2d..2aa959aed16 100644 --- a/base/applications/rapps/rapps/nirlauncher.txt +++ b/base/applications/rapps/rapps/nirlauncher.txt @@ -11,3 +11,7 @@ CDPath = none [Section.0407] Description = Ein Paket von mehr als 180 Utilities für Windows. + +[Section.041f] +Licence = Ücretsiz +Description = Windows için 180 araçtan daha çoğunun bir paketi. diff --git a/base/applications/rapps/rapps/qmmp.txt b/base/applications/rapps/rapps/qmmp.txt index dcee228f144..e0eddbf0da0 100644 --- a/base/applications/rapps/rapps/qmmp.txt +++ b/base/applications/rapps/rapps/qmmp.txt @@ -9,7 +9,7 @@ Licence = GPL Description = Qmmp is an audio-player, written with the help of the Qt library. The user interface is similar to WinAMP or XMMS. Alternative user interfaces also are available. Size = 12.49 MB Category = 1 -URLSite = http://qmmp.ylsoftware.com/index.php +URLSite = http://qmmp.ylsoftware.com/ URLDownload = http://qmmp.ylsoftware.com/files/windows/qmmp-0.8.0-win32.exe CDPath = none diff --git a/base/applications/rapps/rapps/smplayer.txt b/base/applications/rapps/rapps/smplayer.txt index 326e3bf8ac3..a4d68c1d668 100644 --- a/base/applications/rapps/rapps/smplayer.txt +++ b/base/applications/rapps/rapps/smplayer.txt @@ -39,7 +39,7 @@ Description = Lector multimedia (interfață pentru MPlayer). Size = 20,7 Mo [Section.041f] -Description = MPlayer için çizgelik ön yüz. +Description = MPlayer için çizgelik arayüz. Size = 20,7 MB URLSite = http://smplayer.sourceforge.net/tr/ diff --git a/base/applications/regedit/lang/tr-TR.rc b/base/applications/regedit/lang/tr-TR.rc index 03cfb35bb51..d7f12761ab4 100644 --- a/base/applications/regedit/lang/tr-TR.rc +++ b/base/applications/regedit/lang/tr-TR.rc @@ -43,7 +43,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çıkış", ID_REGISTRY_EXIT END - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Değiştir...", ID_EDIT_MODIFY MENUITEM SEPARATOR @@ -320,11 +320,11 @@ BEGIN IDS_UNSUPPORTED_TYPE "Bu türdeki dizinler değiştirilemiyor: %ld" IDS_TOO_BIG_VALUE "Değer çok büyük: %ld" IDS_MULTI_SZ_EMPTY_STRING "REG_MULTI_SZ veri türü boş dizgi içeremez.\nBoş dizgiler dizelgeden silinmiştir." - IDS_QUERY_DELETE_KEY_ONE "Bu dizini silmek istemeyi doğruluyor musunuz?" - IDS_QUERY_DELETE_KEY_MORE "Bu dizinleri silmek istemeyi doğruluyor musunuz?" + IDS_QUERY_DELETE_KEY_ONE "Bu dizini silmek istediğinizden emin misiniz?" + IDS_QUERY_DELETE_KEY_MORE "Bu dizinleri silmek istediğinizden emin misiniz?" IDS_QUERY_DELETE_KEY_CONFIRM "Dizin Silme Doğrulaması" - IDS_QUERY_DELETE_ONE "Bu değeri silmek istemeyi doğruluyor musunuz?" - IDS_QUERY_DELETE_MORE "Bu değerleri silmek istemeyi doğruluyor musunuz?" + IDS_QUERY_DELETE_ONE "Bu değeri silmek istediğinizden emin misiniz?" + IDS_QUERY_DELETE_MORE "Bu değerleri silmek istediğinizden emin misiniz?" IDS_QUERY_DELETE_CONFIRM "Değer Silme Doğrulaması" IDS_ERR_DELVAL_CAPTION "Değerler Silinmesi Yanlışlığı" IDS_ERR_DELETEVALUE "Tüm belirtilmiş değerler silinemiyor." @@ -396,7 +396,7 @@ END STRINGTABLE BEGIN - IDS_IMPORT_PROMPT "Bilgi ekleme, yanlışlıkla değerleri değiştirebilir ya da silebilir ve bileşenlerin doğru çalışmasını engelleyebilir.\nEğer ""%s"" içindeki bilginin kaynağına güvenmiyorsanız onu Değer Defteri'ne eklemeyiniz.\n\nSürdürmek istediğinizi doğruluyor musunuz?" + IDS_IMPORT_PROMPT "Bilgi ekleme, yanlışlıkla değerleri değiştirebilir ya da silebilir ve bileşenlerin doğru çalışmasını engelleyebilir.\nEğer ""%s"" içindeki bilginin kaynağına güvenmiyorsanız onu Değer Defteri'ne eklemeyiniz.\n\nSürdürmek istediğinizden emin misiniz?" IDS_IMPORT_OK """%s"" içinde bulunan dizinler ve değerler Değer Defteri'ne başarıyla eklendi." IDS_IMPORT_ERROR """%s"" alınamıyor: Kütüğü açmada yanlışlık. Bir disk yanlışlığı, bir kütük dizgesi yanlışlığı ya da kütüğün olmaması olabilir." IDS_EXPORT_ERROR """%s"" verilemiyor: Kütüğü oluşturmada ya da kütüğe yazmada yanlışlık. Bir disk yanlışlığı ya da bir kütük dizgesi yanlışlığı olabilir." diff --git a/base/applications/screensavers/logon/lang/tr-TR.rc b/base/applications/screensavers/logon/lang/tr-TR.rc index 23dc509993a..a0a6c7aa171 100644 --- a/base/applications/screensavers/logon/lang/tr-TR.rc +++ b/base/applications/screensavers/logon/lang/tr-TR.rc @@ -5,5 +5,5 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE BEGIN IDS_DESCRIPTION "Oturum Açma Görüntülük Koruyucusu" - IDS_TEXT "Ayarlanması gereken hiçbir seçenek yok." + IDS_TEXT "Ayarlanması gereken seçenek yok." END diff --git a/base/applications/sndrec32/lang/tr-TR.rc b/base/applications/sndrec32/lang/tr-TR.rc index b4cf3226b94..6d701a28d0a 100644 --- a/base/applications/sndrec32/lang/tr-TR.rc +++ b/base/applications/sndrec32/lang/tr-TR.rc @@ -32,7 +32,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çıkış", ID_FILE_EXIT END - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Çoğalt", ID_EDIT_COPY MENUITEM "&Ekleyerek Yapıştır", ID_EDIT_PASTE, GRAYED diff --git a/base/applications/taskmgr/lang/tr-TR.rc b/base/applications/taskmgr/lang/tr-TR.rc index 101d781baff..e83d6990362 100644 --- a/base/applications/taskmgr/lang/tr-TR.rc +++ b/base/applications/taskmgr/lang/tr-TR.rc @@ -414,12 +414,12 @@ BEGIN IDS_MSG_PROCESSONEPRO "İşlem en azından bir işlemciyle ilişkisi olmalıdır." IDS_MSG_INVALIDOPTION "Geçersiz Seçenek" IDS_MSG_UNABLEDEBUGPROCESS "Yanlışlık Ayıklama İşleminin Yapılamaması" - IDS_MSG_WARNINGDEBUG "UYARI: Bu işlemde yanlışlık ayıklama veri yitimiyle sonuçlanabilir.\nYanlışlık ayıklayıcı bağlamak istediğinizi doğruluyor musunuz?" + IDS_MSG_WARNINGDEBUG "UYARI: Bu işlemde yanlışlık ayıklama veri yitimiyle sonuçlanabilir.\nYanlışlık ayıklayıcı bağlamak istediğinizden emin misiniz?" IDS_MSG_TASKMGRWARNING "Görev Yöneticisi Uyarısı" - IDS_MSG_WARNINGTERMINATING "UYARI: Bir işlemin sonlandırılması, veri\nyitimi ve dizge kararsızlığını içeren istenmeyen sonuçlara neden\nolabilir. İşlem sonlandırılmadan önce durumunu veyâ verisini\nkaydetme fırsatı verilmeyecektir. İşlemi\nsonlandırmak istediğinizi doğruluyor musunuz?" + IDS_MSG_WARNINGTERMINATING "UYARI: Bir işlemin sonlandırılması, veri\nyitimi ve dizge kararsızlığını içeren istenmeyen sonuçlara neden\nolabilir. İşlem sonlandırılmadan önce durumunu veyâ verisini\nkaydetme fırsatı verilmeyecektir. İşlemi\nsonlandırmak istediğinizden emin misiniz?" IDS_MSG_UNABLETERMINATEPRO "İşlem Sonlandırmanın Yapılamaması" IDS_MSG_UNABLECHANGEPRIORITY "Önceliğin Değiştirilememesi" - IDS_MSG_WARNINGCHANGEPRIORITY "UYARI: Bu işlemin öncelik sınıfının değiştirilmesi, dizge\nkararsızlığını içeren istenmeyen sonuçlara neden olabilir. Öncelik \nsınıfını değiştirmek istediğinizi doğruluyor musunuz?" + IDS_MSG_WARNINGCHANGEPRIORITY "UYARI: Bu işlemin öncelik sınıfının değiştirilmesi, dizge\nkararsızlığını içeren istenmeyen sonuçlara neden olabilir. Öncelik \nsınıfını değiştirmek istediğinizden emin misiniz?" IDS_MSG_TRAYICONCPUUSAGE "CPU Kullanımı: %%%d" IDS_STATUS_MEMUSAGE "Bellek Kullanımı: %d KB / %d KB" IDS_STATUS_CPUUSAGE "CPU Kullanımı: %%%3d" diff --git a/base/applications/winhlp32/lang/Tr.rc b/base/applications/winhlp32/lang/Tr.rc index 3e736bed6fe..04bcaf63265 100644 --- a/base/applications/winhlp32/lang/Tr.rc +++ b/base/applications/winhlp32/lang/Tr.rc @@ -32,7 +32,7 @@ MAIN_MENU MENU MENUITEM SEPARATOR MENUITEM "&Çıkış", MNID_FILE_EXIT } - POPUP "&Düzenleme" { + POPUP "&Düzen" { MENUITEM "&Çoğalt", MNID_EDIT_COPYDLG MENUITEM SEPARATOR MENUITEM "&Hâşiye Ekle...", MNID_EDIT_ANNOTATE @@ -83,7 +83,7 @@ CAPTION "Bul" /* Strings */ STRINGTABLE { -STID_WINE_HELP, "Yardım Kütüğü Görüntüleyicisi" +STID_WINE_HELP, "Yardım" STID_WHERROR, "YANLIŞLIK" STID_WARNING, "UYARI" STID_INFO, "Bilgi" diff --git a/base/applications/wordpad/lang/Tr.rc b/base/applications/wordpad/lang/Tr.rc index e30d8658f53..c8018961ac4 100644 --- a/base/applications/wordpad/lang/Tr.rc +++ b/base/applications/wordpad/lang/Tr.rc @@ -37,7 +37,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Çıkış", ID_FILE_EXIT END - POPUP "&Düzenleme" + POPUP "&Düzen" BEGIN MENUITEM "&Geri Al\tCtrl+Z", ID_EDIT_UNDO MENUITEM "&Yinele\tCtrl+Y", ID_EDIT_REDO @@ -253,7 +253,7 @@ BEGIN STRING_PROMPT_SAVE_CHANGES, "%s için değişiklikler kaydedilsin mi?" STRING_SEARCH_FINISHED, "Belge araması bitti." STRING_LOAD_RICHED_FAILED, "Zengin metin kitaplığının yüklenmesi başarısız oldu." - STRING_SAVE_LOSEFORMATTING, "Tüm biçimlendirmelerin yitirilmesine neden olacağı düz metin biçimiyle kaydetmeyi seçtiniz. Bunu yapmak istediğinizi doğruluyor musunuz?" + STRING_SAVE_LOSEFORMATTING, "Tüm biçimlendirmelerin yitirilmesine neden olacağı düz metin biçimiyle kaydetmeyi seçtiniz. Bunu yapmak istediğinizden emin misiniz?" STRING_INVALID_NUMBER, "Geçersiz sayı biçimi." STRING_OLE_STORAGE_NOT_SUPPORTED, "OLE içeren belgeler desteklenmiyor." STRING_WRITE_FAILED, "Kütük kaydedilemedi." diff --git a/base/setup/usetup/lang/tr-TR.h b/base/setup/usetup/lang/tr-TR.h index 47b4d812869..ecd2d9344da 100644 --- a/base/setup/usetup/lang/tr-TR.h +++ b/base/setup/usetup/lang/tr-TR.h @@ -1,4 +1,4 @@ -/* TRANSLATOR: 2013 - Erdem Ersoy (eersoy93) (erdemersoy@live.com) */ +/* TRANSLATOR: 2013 Erdem Ersoy (eersoy93) (erdemersoy@live.com) */ #pragma once @@ -27,25 +27,25 @@ static MUI_ENTRY trTRLanguagePageEntries[] = { 8, 10, - "\x07 Kurulum srasnda kullanlacak dili seiniz.", + "\x07 Ltfen kurulum sreci iin kullanlacak dili seiniz.", TEXT_STYLE_NORMAL }, { 8, 11, - " Ardndan giri dmesine basnz.", + " Ardndan Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Bu dil, kurulacak dizgenin ntanml dili olacaktr.", + "\x07 Bu dil, kurulacak dizgenin n tanml dili olacaktr.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -67,49 +67,49 @@ static MUI_ENTRY trTRWelcomePageEntries[] = { 6, 8, - "ReactOS Kur'a hogeldiniz.", + "ReactOS Kur'a ho geldiniz.", TEXT_STYLE_HIGHLIGHT }, { 6, 11, - "Kurulumun bu aamas, ReactOS ktklerini bilgisayara oaltr", + "Kurulumun bu blm, ReactOS letim Dizgesi'ni bilgisayarnza", TEXT_STYLE_NORMAL }, { 6, 12, - "ve kurulumun ikinci aamasn anklar.", + "oaltr ve kurulumun ikinci blmn anklar.", TEXT_STYLE_NORMAL }, { 8, 15, - "\x07 ReactOS'u kurmak iin giri dmesine basnz.", + "\x07 ReactOS'u kurmak iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 17, - "\x07 ReactOS'u onarmak vey ykseltmek iin R dmesine basnz.", + "\x07 ReactOS'u onarmak vey ykseltmek iin R'ye basnz.", TEXT_STYLE_NORMAL }, { 8, 19, - "\x07 ReactOS Ruhsat Koullar'n grntlemek iin L dmesine basnz.", + "\x07 ReactOS Ruhsatlama Istlahlar ve Koullar'n grntlemek iin L'ye basnz.", TEXT_STYLE_NORMAL }, { 8, 21, - "\x07 ReactOS'u kurmadan kmak iin F3 dmesine basnz.", + "\x07 ReactOS'u kurmadan kmak iin F3'e basnz.", TEXT_STYLE_NORMAL }, { 6, 23, - "Daha ok bilgi iin buraya gidiniz:", + "Daha ok bilgi iin ltfen uraynz:", TEXT_STYLE_NORMAL }, { @@ -121,7 +121,7 @@ static MUI_ENTRY trTRWelcomePageEntries[] = { 0, 0, - "Giri = Srdr R = Onar vey Ykselt L = Ruhsat Koullar F3 = k", + "Giri = Srdr R = Onar vey Ykselt L = Ruhsat F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -143,49 +143,49 @@ static MUI_ENTRY trTRIntroPageEntries[] = { 6, 8, - "ReactOS Kur, n gelime evresinde olduundan daha", + "ReactOS Kur, bir n gelime evresindedir. Daha tmyle kullanl", TEXT_STYLE_NORMAL }, { 6, 9, - "her trl ilevi desteklemez.", + "bir kurulum uygulamasnn tm ilevlerini desteklemez.", TEXT_STYLE_NORMAL }, { 6, 12, - "Desteklenmeyen ilevler unlardr:", + "Aadaki kstlamalar uygulanr:", TEXT_STYLE_NORMAL }, { 8, 13, - "- Kur, bir diskte birden fazla birincil blm ynetemez.", + "- Kur, bir diskte birden ok ana blm ynetemez.", TEXT_STYLE_NORMAL }, { 8, 14, - "- Kur, bir diskte, geniletilmi bir blm olduu srece", + "- Kur, bir diskte geniletilmi blmler olduu srece", TEXT_STYLE_NORMAL }, { 8, 15, - " o diskteki birincil blm silemez.", + " o diskten bir ana blm silemez.", TEXT_STYLE_NORMAL }, { 8, 16, - "- Kur, bir diskte, dier geniletilmi blmlerin olduu srece", + "- Kur, bir diskte baka geniletilmi blmlerin olduu srece", TEXT_STYLE_NORMAL }, { 8, 17, - " o diskteki ilk geniletilmi blm silemez.", + " o diskten ilk geniletilmi blm silemez.", TEXT_STYLE_NORMAL }, { @@ -203,19 +203,19 @@ static MUI_ENTRY trTRIntroPageEntries[] = { 8, 23, - "\x07 ReactOS'u kurmak iin giri dmesine basnz.", + "\x07 ReactOS'u kurmak iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 25, - "\x07 ReactOS'u kurmadan kmak iin F3 dmesine basnz.", + "\x07 ReactOS'u kurmadan kmak iin F3'e basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -237,67 +237,67 @@ static MUI_ENTRY trTRLicensePageEntries[] = { 6, 6, - "Ruhsat Koullar:", + "Ruhsatlama:", TEXT_STYLE_HIGHLIGHT }, { 8, 8, - "ReactOS, GNU GPL'nin yansra X11, BSD ve", + "ReactOS Dizgesi, GNU GPL'yle X11, BSD ve GNU LPGL", TEXT_STYLE_NORMAL }, { 8, 9, - "GNU LPGL gibi dier uygun ruhsatlardan alnan", + "ruhsatlar gibi baka uygun ruhsatlardan kod ieren", TEXT_STYLE_NORMAL }, { 8, 10, - "dzgleri ieren blmlerin koullaryla ruhsatlanmtr.", + "ksmlarn koullar altnda ruhsatlanmtr.", TEXT_STYLE_NORMAL }, { 8, 11, - "Bu yzden ReactOS'un tm paralar, GNU GPL ile birlikte", + "Bu yzden ReactOS dizgesinin ksm olan tm yazlmlar, korunan", TEXT_STYLE_NORMAL }, { 8, 12, - "dier zgn ruhsatlarla yaynlanr.", + "zgn ruhsatyla birlikte GNU GPL altnda yaynlanr.", TEXT_STYLE_NORMAL }, { 8, 14, - "Bu yazlm, mahall ve uluslararas yasalarn uygunluu asndan", + "Bu yazlm, yerli ve uluslararas yasa uygulanabilir kullanm", TEXT_STYLE_NORMAL }, { 8, 15, - "hibir gvenceyle ve hibir kstlamayla gelmez.", + "zerine hibir gvence ve kstlamayla gelmez. ReactOS'un", TEXT_STYLE_NORMAL }, { 8, 16, - "ReactOS'un ruhsatlanmas, yalnzca nc kiilere datmay kapsar.", + " ruhsatlanmas yalnzca nc yanlara datmay kapsar.", TEXT_STYLE_NORMAL }, { 8, 17, - "Eer birtakm nedenlerle ReactOS ile birlikte GNU Umm", + "Eer birtakm nedenlerden dolay ReactOS ile GNU Umm", TEXT_STYLE_NORMAL }, { 8, 18, - "Kamu Ruhsat'n elde edememiseniz buraya gidiniz:", + "Kamu Ruhsat'nn bir kopyasn almadysanz ltfen uraynz:", TEXT_STYLE_NORMAL }, { @@ -315,19 +315,19 @@ static MUI_ENTRY trTRLicensePageEntries[] = { 8, 23, - "Bu bir cretsiz yazlmdr, oaltma koullar iin kaynaa baknz.", + "Bu zgr yazlmdr, oaltma koullar iin kaynaa baknz.", TEXT_STYLE_NORMAL }, { 8, 24, - "Burada hibir gvence YOKTUR, hele hele SATILABLRLK vey", + "Burada hibir gvence YOKTUR, SATILABLRLK vey", TEXT_STYLE_NORMAL }, { 8, 25, - "BELRL BR AMACA UYGUNLUK asndan.", + "BELRL BR AMACA UYGUNLUK iin bile.", TEXT_STYLE_NORMAL }, { @@ -355,25 +355,25 @@ static MUI_ENTRY trTRDevicePageEntries[] = { 6, 8, - "Aadaki dizelge, imdiki aygt ayarlarn gsterir.", + "Aadaki dizelge imdiki aygt ayarlarn gsterir.", TEXT_STYLE_NORMAL }, { 24, 11, - "Bilgisayar Tr:", + "Bilgisayar:", TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT }, { 24, 12, - "Grnt Ayarlar:", + "Grnt:", TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT }, { 24, 13, - "Dme Takm Tr:", + "Dme Takm:", TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT }, { @@ -385,43 +385,49 @@ static MUI_ENTRY trTRDevicePageEntries[] = { 24, 16, - "Onayla:", + "Dorula:", TEXT_STYLE_NORMAL | TEXT_ALIGN_RIGHT }, { 25, 16, - "Bu aygt ayarlarn onayla.", + "Bu aygt ayarlarn dorula.", TEXT_STYLE_NORMAL }, { 6, 19, - "Aygt ayarlarn, bir seenei semek iin yukar vey aa dmelerine", + "Aygt ayarlarn, bir seenek semek iin Yukar vey Aa dmelerine", TEXT_STYLE_NORMAL }, { 6, 20, - "basarak deitirebilirsiniz. Setikten sonra giri dmesine basnz.", + "basarak deitirebilirsiniz. Sonra baka ayarlar semek iin Giri", TEXT_STYLE_NORMAL }, - { + { 6, - 22, - "Deitirme ileminden sonra \"Bu aygt ayarlarn onayla.\"", + 21, + "dmesine basnz.", TEXT_STYLE_NORMAL }, { 6, 23, - "seeneini seiniz, ardndan giri dmesine basnz.", + "Tm ayarlar uygun olduunda ""Bu aygt ayarlarn dorula.""y", + TEXT_STYLE_NORMAL + }, + { + 6, + 24, + "seiniz ve Giri dmesine basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -443,49 +449,49 @@ static MUI_ENTRY trTRRepairPageEntries[] = { 6, 8, - "ReactOS Kur, n gelime evresinde olduundan daha", + "ReactOS Kur, bir n gelime evresindedir. Daha tmyle kullanl", TEXT_STYLE_NORMAL }, { 6, 9, - "her trl ilevi desteklemez.", + "bir kurulum uygulamasnn tm ilevlerini desteklemez.", TEXT_STYLE_NORMAL }, { 6, 12, - "Onarma ilevi daha bitirilmemitir.", + "Onarma ilevleri daha bitirilmemitir.", TEXT_STYLE_NORMAL }, { 8, 15, - "\x07 letim dizgesini ykseltmek iin U dmesine basnz.", + "\x07 letim dizgesini ykseltmek iin U'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 17, - "\x07 Kurtarma Konsolu iin R dmesine basnz.", + "\x07 Kurtarma Konsolu iin R'ye basnz.", TEXT_STYLE_NORMAL }, { 8, 19, - "\x07 Bir nceki sayfaya geri dnmek iin k dmesine basnz.", + "\x07 Ana sayfaya geri dnmek iin k'a basnz.", TEXT_STYLE_NORMAL }, { 8, 21, - "\x07 Bilgisayar yeniden balatmak iin giri dmesine basnz.", + "\x07 Bilgisayarnz yeniden balatmak iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "k = Geri Dn U = Ykselt R = Kurtar Giri = Bilgisayar Yeniden Balat", + "k = Ana Sayfa U = Ykselt R = Kurtarma Giri = Yeniden Balat", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -507,37 +513,37 @@ static MUI_ENTRY trTRComputerPageEntries[] = { 6, 8, - "Kurulum yaplacak bilgisayarn trn seiniz.", + "Kurulum yaplacak bilgisayarn trn semek isteyebilirsiniz.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Semek istediiniz bilgisyar trn yukar ve aa dmeleriyle", + "\x07 stenen bilgisyar trn semek iin Yukar'ya vey Aa'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 11, - " seiniz, ardndan giri dmesine basnz.", + " Ardndan Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Bilgisayar trnde hibir deiiklik yaplmadan bir nceki sayfaya", + "\x07 Bilgisayar trn deitirmeden bir nceki sayfaya", TEXT_STYLE_NORMAL }, { 8, 14, - " geri dnmek iin k dmesine basnz.", + " dnmek iin k dmesine basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr k = ptal F3 = k", + "Giri = Srdr k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -559,25 +565,25 @@ static MUI_ENTRY trTRFlushPageEntries[] = { 10, 6, - "Dizge, imdi diskteki tm verileri onaylyor.", + "Dizge, imdi diskinize saklanm tm veriyi doruluyor.", TEXT_STYLE_NORMAL }, { 10, 8, - "Bu ilem bir dakka srebilir.", + "Bu bir dakka srebilir.", TEXT_STYLE_NORMAL }, { 10, 9, - "?lem bittiinde bilgisayar yeniden balayacaktr.", + "Bittiinde bilgisayarnz kendiliinden yeniden balayacaktr.", TEXT_STYLE_NORMAL }, { 0, 0, - "nbellek temizleniyor...", + "n bellek arnyor...", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -599,25 +605,25 @@ static MUI_ENTRY trTRQuitPageEntries[] = { 10, 6, - "ReactOS, btnyle kurulmad.", + "ReactOS, tmyle kurulmad.", TEXT_STYLE_NORMAL }, { 10, 8, - "A: srcsndeki disketi ve", + "A: srcsnden disketi ve tm CD srclerinden", TEXT_STYLE_NORMAL }, { 10, 9, - "tm CD srclerindeki CD-ROM'lar kartnz.", + "CD-ROM'lar karnz.", TEXT_STYLE_NORMAL }, { 10, 11, - "Bilgisayar yeniden balatmak iin giri dmesine basnz.", + "Bilgisayarnz yeniden balatmak iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { @@ -645,36 +651,36 @@ static MUI_ENTRY trTRDisplayPageEntries[] = { 6, 8, - "Kurulum yaplacak bilgisayarn grnt ayarlarn seiniz.", + "Kurulum yaplacak grntnn trn semek isteyebilirsiniz.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Semek istediiniz grnt ayarlarn yukar ve aa dmeleriyle", + "\x07 stenen grnt trn semek iin Yukar'ya vey Aa'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 11, - " seiniz, ardndan giri dmesine basnz.", + " Ardndan Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Grnt ayarlarnda hibir deiiklik yaplmadan bir nceki sayfaya", + "\x07 Grnt trn deitirmeden bir nceki sayfaya", TEXT_STYLE_NORMAL }, { 8, 14, - " geri dnmek iin k dmesine basnz.", + " dnmek iin k dmesine basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr k = ptal F3 = k", + "Giri = Srdr k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -696,25 +702,25 @@ static MUI_ENTRY trTRSuccessPageEntries[] = { 10, 6, - "ReactOS'un ana bileenleri baarl bir ekilde kuruldu.", + "ReactOS'un ana bileenleri baarl olarak kuruldu.", TEXT_STYLE_NORMAL }, { 10, 8, - "A: srcsndeki disketi ve", + "A: srcsnden disketi ve tm CD srclerinden", TEXT_STYLE_NORMAL }, { 10, 9, - "tm CD srclerindeki CD-ROM'lar kartnz.", + "CD-ROM'lar karnz.", TEXT_STYLE_NORMAL }, { 10, 11, - "Bilgisayar yeniden balatmak iin giri dmesine basnz.", + "Bilgisayarnz yeniden balatmak iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { @@ -742,25 +748,25 @@ static MUI_ENTRY trTRBootPageEntries[] = { 6, 8, - "Kur, diske nykleyiciyi kuramad.", + "Kur, bilgisayarnzn sbit diskine n ykleyiciyi kuramad.", + TEXT_STYLE_NORMAL + }, + { + 6, + 12, + "Ltfen A: srcsne biimlendirilmi bir disket taknz", TEXT_STYLE_NORMAL }, { 6, 13, - "A: srcsne biimlendirilmi bir disk taknz, ardndan", - TEXT_STYLE_NORMAL - }, - { - 6, - 14, - "giri dmesine basnz.", + "ve Giri'e basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -783,44 +789,43 @@ static MUI_ENTRY trTRSelectPartitionEntries[] = { 6, 8, - "Aadaki dizelge, var olan blmlerle yeni blmler oluturmak iin", + "Aadaki dizelge, var olan blmleri ve yeni blmler iin", TEXT_STYLE_NORMAL }, { 6, 9, - "kullanlmayan boluu gsterir.", + "kullanlmayan disk boluunu gsterir.", TEXT_STYLE_NORMAL }, { 8, 11, - "\x07 Bir eyi semek iin yukar vey aa dmelerine basnz.", + "\x07 Bir dizelge girdisini semek iin Yukar'ya vey Aa'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 ReactOS'u seili blme yklemek iin giri dmesine basnz.", + "\x07 Seili blme ReactOS'u yklemek iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 15, - "\x07 Press P to create a primary partition.", -// "\x07 Seili boluktan yeni bir blm oluturmak iin C dmesine basnz.", + "\x07 Bir ana blm oluturmak iin P'ye basnz.", TEXT_STYLE_NORMAL }, { 8, 17, - "\x07 Press E to create an extended partition.", + "\x07 Bir geniletilmi blm oluturmak iin E'ye basnz.", TEXT_STYLE_NORMAL }, { 8, 19, - "\x07 Seili blm silmek iin D dmesine basnz.", + "\x07 Var olan bir blm silmek iin D'ye basnz.", TEXT_STYLE_NORMAL }, { @@ -848,19 +853,19 @@ static MUI_ENTRY trTRFormatPartitionEntries[] = { 6, 8, - "Kur, imdi setiiniz blm biimlendirecek.", + "Blm Biimlendirme", TEXT_STYLE_NORMAL }, { 6, 10, - "Srdrmek iin giri dmesine basnz.", + "Kur, imdi blm biimlendirecek. Srdrmek iin Giri'e basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -882,31 +887,31 @@ static MUI_ENTRY trTRInstallDirectoryEntries[] = { 6, 8, - "Kur, seili blme ReactOS ktklerini ykleyecek. ReactOS'un yklenecei", + "Kur, seili blme ReactOS ktklerini ykler. ReactOS'un", TEXT_STYLE_NORMAL }, { 6, 9, - "dizini seiniz.", + "yklenmesini istediiniz bir dizin seiniz.", TEXT_STYLE_NORMAL }, { 6, 14, - "nerilen dizini deitirmek iin geri dmesi ile damgalar siliniz,", + "nerilen dizini deitirmek iin, damgalar silmek iin Silme'ye basnz", TEXT_STYLE_NORMAL }, { 6, 15, - "ardndan ReactOS'un kurulaca yeni dizini yaznz.", + "ve ardndan ReactOS'un yklenmesini istediiniz dizini yaznz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -928,13 +933,19 @@ static MUI_ENTRY trTRFileCopyEntries[] = { 0, 12, - "Kur, ReactOS'un kurulaca dizine ktkleri oaltrken ltfen bekleyiniz.", + "ReactOS Kur, ReactOS kurulum dizininize ktkleri oaltrken", + TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER + }, + { + 0, + 13, + " ltfen bekleyiniz.", TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER }, { 0, 14, - "Bu ilem birka dakka srebilir.", + "Bu, bitirmek iin birka dakka srebilir.", TEXT_STYLE_NORMAL | TEXT_ALIGN_CENTER }, { @@ -962,37 +973,37 @@ static MUI_ENTRY trTRBootLoaderEntries[] = { 6, 8, - "Kur, imdi nykleyiciyi kuracak.", + "Kur, n ykleyiciyi kuruyor.", TEXT_STYLE_NORMAL }, { 8, 12, - "nykleyiciyi diskin MBR'sine ve VBR'sine kur.", + "n ykleyiciyi sbit diskin zerine kur. (MBR ve VBR)", TEXT_STYLE_NORMAL }, { 8, 13, - "nykleyiciyi diskin yalnzca VBR'sine kur.", + "n ykleyiciyi sbit diskin zerine kur. (Yalnzca VBR)", TEXT_STYLE_NORMAL }, { 8, 14, - "nykleyiciyi bir diskete kur.", + "n ykleyiciyi bir diskete kur.", TEXT_STYLE_NORMAL }, { 8, 15, - "nykleyiciyi kurma.", + "n ykleyici kurulumunu ge.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr F3 = k", + "Giri = Srdr F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1014,37 +1025,37 @@ static MUI_ENTRY trTRKeyboardSettingsEntries[] = { 6, 8, - "Kurulum yaplacak bilgisayarn dme takm trn seiniz.", + "Kurulum yaplacak dme takmnn trn semek isteyebilirsiniz.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Semek istediiniz dme takm trn yukar ve aa dmeleriyle", + "\x07 stenen dme takm trn semek iin Yukar'ya vey Aa'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 11, - " seiniz, ardndan giri dmesine basnz.", + " Ardndan Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Dme takm trnde hibir deiiklik yaplmadan bir nceki sayfaya", + "\x07 Dme takm trn deitirmeden bir nceki sayfaya", TEXT_STYLE_NORMAL }, { 8, 14, - " geri dnmek iin k dmesine basnz.", + " dnmek iin k dmesine basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr k = ptal F3 = k", + "Giri = Srdr k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1066,37 +1077,37 @@ static MUI_ENTRY trTRLayoutSettingsEntries[] = { 6, 8, - "Kurulum yaplacak bilgisayarn dme takm dzenini seiniz.", + "Ltfen n tanml olarak kurulacak bir dzen seiniz.", TEXT_STYLE_NORMAL }, { 8, 10, - "\x07 Semek istediiniz dme takm dzenini yukar ve aa", + "\x07 stenen dme takm dzenini semek iin Yukar'ya vey Aa'ya basnz.", TEXT_STYLE_NORMAL }, { 8, 11, - " dmeleriyle seiniz, ardndan giri dmesine basnz.", + " Ardndan Giri'e basnz.", TEXT_STYLE_NORMAL }, { 8, 13, - "\x07 Dme takm dzeninde hibir deiiklik yaplmadan bir nceki", + "\x07 Grnt trn deitirmeden bir nceki sayfaya", TEXT_STYLE_NORMAL }, { 8, 14, - " sayfaya geri dnmek iin k dmesine basnz.", + " dnmek iin k dmesine basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "Giri = Srdr k = ptal F3 = k", + "Giri = Srdr k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1119,13 +1130,13 @@ static MUI_ENTRY trTRPrepareCopyEntries[] = { 6, 8, - "Kur, bilgisayar ReactOS ktklerinin oaltlmasna anklyor.", + "Kur, ReactOS ktklerini oaltmak iin bilgisayarnz anklyor.", TEXT_STYLE_NORMAL }, { 0, 0, - "oaltma dizelgesi oluturuluyor...", + "Ktk oaltma dizelgesi oluturuluyor...", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1148,31 +1159,31 @@ static MUI_ENTRY trTRSelectFSEntries[] = { 6, 17, - "Aadaki ktk dizgelerinden birini seiniz.", + "Aadaki dizelgeden bir ktk dizgesi seiniz.", 0 }, { 8, 19, - "\x07 Bir eyi semek iin yukar vey aa dmelerine basnz.", + "\x07 Bir ktk dizgesi semek iin Yukar'ya vey Aa'ya basnz.", 0 }, { 8, 21, - "\x07 Blm biimlendirmek iin giri dmesine basnz.", + "\x07 Blm biimlendirmek iin Giri'e basnz.", 0 }, { 8, 23, - "\x07 Baka bir blm semek iin k dmesine basnz.", + "\x07 Baka bir blm semek iin k'a basnz.", 0 }, { 0, 0, - "Giri = Srdr k = ptal F3 = k", + "Giri = Srdr k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, @@ -1195,31 +1206,31 @@ static MUI_ENTRY trTRDeletePartitionEntries[] = { 6, 8, - "Blm silmeye karar verdiniz.", + "Blm silmeyi setiniz.", TEXT_STYLE_NORMAL }, { 8, 18, - "\x07 Blm silmek iin D dmesine basnz.", + "\x07 Blm silmek iin D'ye basnz.", TEXT_STYLE_NORMAL }, { 11, 19, - "UYARI: Bu blmdeki tm bilgiler silinecektir!", + "UYARI: Bu blmdeki tm veriler yitirilecektir!", TEXT_STYLE_NORMAL }, { 8, 21, - "\x07 Silme ileminden vazgemek iin k dmesine basnz.", + "\x07 ptal etmek iin k'a basnz.", TEXT_STYLE_NORMAL }, { 0, 0, - "D = Blm Sil k = ptal F3 = k", + "D = Blm Sil k = ptal F3 = k", TEXT_TYPE_STATUS | TEXT_PADDING_BIG }, { @@ -1263,101 +1274,102 @@ MUI_ERROR trTRErrorEntries[] = { { // NOT_AN_ERROR - "Success\n" + "Baarl\n" }, { //ERROR_NOT_INSTALLED - "ReactOS, bilgisayara btnyle kurulmad.\n" - "Eer Kur'dan karsanz ReactOS'u kurmak\n" - "iin Kur'u yeniden altrmalsnz.\n" + "ReactOS, bilgisayara tmyle kurulmad. Eer imdi\n" + "Kur'dan karsanz ReactOS'u kurmak iin Kur'u\n" + "yeniden altrmaya gereksinim duyacaksnz.\n" "\n" - " \x07 Kurulumu srdrmek iin giri dmesine basnz.\n" - " \x07 Kur'dan kmak iin F3 dmesine basnz.", - "F3 = k Giri = Srdr" + " \x07 Kur'u srdrmek iin Giri'e basnz.\n" + " \x07 Kur'dan kmak iin F3'e basnz.", + "F3 = k Giri = Srdr" }, { //ERROR_NO_HDD - "Kur, bir disk alglayamad.\n", + "Kur, bir sbit disk bulamad.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_NO_SOURCE_DRIVE - "Kur, kaynak srcy alglayamad.\n", + "Kur, kaynak srcy bulamad.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_LOAD_TXTSETUPSIF - "Kur, TXTSETUP.SIF ktn ykleyemedi.\n", + "Kur, TXTSETUP.SIF ktn yklemede baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_CORRUPT_TXTSETUPSIF - "Kur, bozuk bir TXTSETUP.SIF kt buldu.\n", + "Kur, bozuk bir TXTSETUP.SIF buldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_SIGNATURE_TXTSETUPSIF, - "Kur, TXTSETUP.SIF ktnde geersiz bir imz buldu.\n", + "Kur, TXTSETUP.SIF'ta geersiz bir im buldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_DRIVE_INFORMATION - "Kur, dizge srcs bilgisini ykleyemedi.\n", + "Kur, dizge src bilgisini alamad.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_WRITE_BOOT, - "Kur, dizge srcsne FAT nykleme dzgsn kuramad.", + "Kur, dizge blmne FAT n ykleme kodunu kuramad.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_LOAD_COMPUTER, - "Kur, bilgisayar tr dizelgesini ykleyemedi.\n", + "Kur, bilgisayar tr dizelgesini yklemede baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_LOAD_DISPLAY, - "Kur, grnt ayarlar dizelgesini ykleyemedi.\n", + "Kur, grnt ayarlar dizelgesini yklemede baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_LOAD_KEYBOARD, - "Kur, dme takm tr dizelgesini ykleyemedi.\n", + "Kur, dme takm tr dizelgesini yklemede baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_LOAD_KBLAYOUT, - "Kur, dme takm dzeni dizelgesini ykleyemedi.\n", + "Kur, dme takm dzeni dizelgesini yklemede baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_WARN_PARTITION, - "Kur, en az bir diskte, uyumsuz bir blm buldu.\n" + "Kur, dzgn ynetilemeyen bir uyumsuz blm tablosu ieren en az\n" + "bir sbit disk buldu!\n" "\n" - "Bir blm silmek vey bir blm oluturmak byle bir blm yok edebilir.\n" + "Blmleri oluturmak vey silmek blm tablosunu yok edebilir.\n" "\n" - " \x07 Kur'dan kmak iin F3 dmesine basnz.\n" - " \x07 Srdrmek iin giri dmesine basnz.", - "F3 = k Giri = Srdr" + " \x07 Kur'dan kmak iin F3'e basnz.\n" + " \x07 Srdrmek iin Giri'e basnz.", + "F3 = k Giri = Srdr" }, { //ERROR_NEW_PARTITION, - "Var olan bir blmn iine yeni\n" - "bir blm oluturulamaz!\n" + "neden var olan bir blmn iine yeni\n" + "bir blm oluturamazsnz!\n" "\n" " * Srdrmek iin bir dmeye basnz.", NULL }, { //ERROR_DELETE_SPACE, - "Kullanlmayan disk boluu silinemez!\n" + "Blmlenmemi disk boluunu silemezsiniz!\n" "\n" " * Srdrmek iin bir dmeye basnz.", NULL }, { //ERROR_INSTALL_BOOTCODE, - "Kur, dizge srcsne FAT nykleme dzgsn kuramad.", + "Kur, dizge blm zerinde FAT n ykleme kodunu kurmada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { @@ -1367,37 +1379,37 @@ MUI_ERROR trTRErrorEntries[] = }, { //ERROR_UPDATE_KBSETTINGS, - "Kur, dme takm dzeni ayarlarn imdikiletiremedi.", + "Kur, dme takm dzeni ayarlarn imdikiletirmede baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_UPDATE_DISPLAY_SETTINGS, - "Kur, grnt ayarlarn imdikiletiremedi.", + "Kur, grnt deer ayarlarn imdikiletirmede baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_IMPORT_HIVE, - "Kur, bir yn dosyasndan bir ey alamad.", + "Kur, bir yn kt almada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_FIND_REGISTRY - "Kur, deer ktklerini bulamad.", + "Kur, deer veri ktklerini bulmada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_CREATE_HIVE, - "Kur, deer ynlarn oluturamad.", + "Kur, deer ynlarn oluturmada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_INITIALIZE_REGISTRY, - "Kur, Deer Defteri'ni balatamad.", + "Kur, Deer Defteri'ni balatmada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_INVALID_CABINET_INF, - "Dolabn geerli bir yaplandrma kt yok.\n", + "Dolabn geerli yaplandrma kt yok.\n", "Giri = Bilgisayar Yeniden Balat" }, { @@ -1412,24 +1424,24 @@ MUI_ERROR trTRErrorEntries[] = }, { //ERROR_COPY_QUEUE, - "Kur, ktk oaltma srasn aamad.\n", + "Kur, ktk oaltma kuyruunu amada baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_CREATE_DIR, - "Kur, kurulum dizinlerini oluturamad.", + "Kur, kurulum dizinlerini oluturmada baarsz oldu.", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_TXTSETUP_SECTION, - "Kur, TXTSETUP.SIF ktnde \"Directories\"\n" - "blmn bulamad.\n", + "Kur, TXTSETUP.SIF'de ""Directories"" blmn\n" + "bulmada baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_CABINET_SECTION, - "Kur, dolapta \"Directories\"\n" - "blmn bulamad.\n", + "Kur, dolapta ""Directories"" blmn\n" + "bulmada baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { @@ -1439,66 +1451,66 @@ MUI_ERROR trTRErrorEntries[] = }, { //ERROR_FIND_SETUPDATA, - "Kur, TXTSETUP.SIF ktnde \"SetupData\"\n" - "blmn bulamad.\n", + "Kur, TXTSETUP.SIF'de ""SetupData"" blmn\n" + "bulmada baarsz oldu.\n", "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_WRITE_PTABLE, - "Kur, blm bilgilerini yazamad.\n" + "Kur, blm tablolar yazmada baarsz oldu.\n" "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_ADDING_CODEPAGE, - "Kur, Deer Defteri'ne dzg sayfas bilgisini ekleyemedi.\n" + "Kur, Deer Defteri'ne kod sayfas eklemede baarsz oldu.\n" "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_UPDATE_LOCALESETTINGS, - "Kur, dizge mahall ayrn yapamad.\n" + "Kur, dizge yerli ayrn yapamad.\n" "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_ADDING_KBLAYOUTS, - "Kur, Deer Defteri'ne dme takm dzenlerini ekleyemedi.\n" + "Kur, Deer Defteri'ne dme takm dzenleri eklemede baarsz oldu.\n" "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_UPDATE_GEOID, - "Kur, corf konumu ayarlayamad.\n" + "Kur, corf kimlii ayarlayamad.\n" "Giri = Bilgisayar Yeniden Balat" }, { //ERROR_INSUFFICIENT_DISKSPACE, - "Seili blmde yeteri kadar bo alan yok.\n" + "Seili blmde yeterli bo alan yok.\n" " * Srdrmek iin bir dmeye basnz.", NULL }, { //ERROR_PARTITION_TABLE_FULL, - "You can not create a new primary or extended partition in the\n" - "partition table of this disk because the partition table is full.\n" + "Blm tablosu dolu olduundan dolay bu diskin blm tablosunda\n" + "yeni bir ana blm ya da geniletilmi blm oluturamazsnz.\n" "\n" - " * Press any key to continue." + " * Srdrmek iin bir dmeye basnz." }, { //ERROR_ONLY_ONE_EXTENDED, - "You can not create more than one extended partition per disk.\n" + "Bir diskte birden ok geniletilmi blm oluturamazsnz.\n" "\n" - " * Press any key to continue." + " * Srdrmek iin bir dmeye basnz." }, { //ERROR_NOT_BEHIND_EXTENDED, - "You can not create a partition behind an extended partition.\n" + "Bir geniletilmi blm arkasnda bir blm oluturamazsnz.\n" "\n" - " * Press any key to continue." + " * Srdrmek iin bir dmeye basnz." }, { //ERROR_EXTENDED_NOT_LAST, - "An extended partition must always be the last\n" - "partition in a partition table.\n" + "Bir geniletilmi blm, her zaman bir blm\n" + "tablosunda son blm olmaldr.\n" "\n" - " * Press any key to continue." + " * Srdrmek iin bir dmeye basnz." }, { NULL, @@ -1611,41 +1623,39 @@ MUI_STRING trTRStrings[] = {STRING_PLEASEWAIT, " Ltfen bekleyiniz..."}, {STRING_INSTALLCREATEPARTITION, - " ENTER = Install P = Create Primary E = Create Extended F3 = Quit"}, -// " Giri = Kur C = Blm Olutur F3 = k"}, + " Giri = Kur P = Ana Blm Olutur E = Geniletilmi Blm Olutur F3 = k"}, {STRING_INSTALLCREATELOGICAL, - " ENTER = Install L = Create Logical Partition F3 = Quit"}, + " ENTER = Kur L = Mantklk Blm Olutur F3 = k"}, {STRING_INSTALLDELETEPARTITION, - " Giri = Kur D = Blm Sil F3 = k"}, + " Giri = Kur D = Blm Sil F3 = k"}, {STRING_DELETEPARTITION, - " D = Delete Partition F3 = Quit"}, + " D = Blm Sil F3 = k"}, {STRING_PARTITIONSIZE, - "Bykl giriniz:"}, + "Yeni blmn bykln giriniz:"}, {STRING_CHOOSENEWPARTITION, - "You have chosen to create a primary partition on"}, -// "Yeni bir blm oluturmay setiniz."}, + "zerinde bir ana blm oluturmay setiniz:"}, {STRING_CHOOSE_NEW_EXTENDED_PARTITION, - "You have chosen to create an extended partition on"}, + "zerinde bir geniletilmi blm oluturmay setiniz:"}, {STRING_CHOOSE_NEW_LOGICAL_PARTITION, - "You have chosen to create a logical partition on"}, + "zerinde bir mantklk blm oluturmay setiniz:"}, {STRING_HDDSIZE, - "Oluturulacak blmn bykln megaoklu olarak giriniz."}, + "Ltfen yeni blmn bykln megabayt olarak giriniz."}, {STRING_CREATEPARTITION, - " Giri = Blm Olutur k = ptal F3 = k"}, + " Giri = Blm Olutur k = ptal F3 = k"}, {STRING_PARTFORMAT, "Bu blm ileride biimlendirilecektir."}, {STRING_NONFORMATTEDPART, - "ReactOS'u yeni ve biimlendirilmemi bir blme kurmay setiniz."}, + "ReactOS'u yeni ya da biimlendirilmemi bir blme kurmay setiniz."}, {STRING_INSTALLONPART, - "Kur, ReactOS'u bir blme kurar."}, + "Kur, ReactOS'u blm zerine kurar."}, {STRING_CHECKINGPART, "Kur, imdi seili blm gzden geiriyor."}, {STRING_QUITCONTINUE, - "F3 = k Giri = Srdr"}, + "F3 = k Giri = Srdr"}, {STRING_REBOOTCOMPUTER, "Giri = Bilgisayar Yeniden Balat"}, {STRING_TXTSETUPFAILED, - "Kur, TXTSETUP.SIF ktndeki \"%S\" blmn\nbulamad.\n"}, + "Kur, TXTSETUP.SIF'de ""%S"" blmn\nbulmada baarsz oldu.\n"}, {STRING_COPYING, " Ktk oaltlyor: %S..."}, {STRING_SETUPCOPYINGFILES, @@ -1653,65 +1663,65 @@ MUI_STRING trTRStrings[] = {STRING_REGHIVEUPDATE, " Deer ynlar imdikiletiriliyor..."}, {STRING_IMPORTFILE, - " Ktkten alnyor: %S..."}, + " Alnyor: %S..."}, {STRING_DISPLAYETTINGSUPDATE, - " Grnt ayarlarnn deerleri imdikiletiriliyor..."}, + " Grnt ayarlar deerleri imdikiletiriliyor..."}, {STRING_LOCALESETTINGSUPDATE, - " Mahall ayarlar imdikiletiriliyor..."}, + " Yerli ayarlar imdikiletiriliyor..."}, {STRING_KEYBOARDSETTINGSUPDATE, - " Dme takm dzeni ayarlarnn deerleri imdikiletiriliyor..."}, + " Dme takm dzeni ayarlar imdikiletiriliyor..."}, {STRING_CODEPAGEINFOUPDATE, - " Deer Defteri'ne dzg sayfas bilgisi ekleniyor..."}, + " Deer Defteri'ne kod sayfas bilgisi ekleniyor..."}, {STRING_DONE, - " Bitti!"}, + " Bitti..."}, {STRING_REBOOTCOMPUTER2, " Giri = Bilgisayar Yeniden Balat"}, {STRING_CONSOLEFAIL1, - "Konsol alamad.\r\n\r\n"}, + "Konsol alamyor.\r\n\r\n"}, {STRING_CONSOLEFAIL2, "Bunun en bilinen nedeni, bir USB dme takm kullanlmasdr.\r\n"}, {STRING_CONSOLEFAIL3, - "USB dme takm, daha tmyle desteklenmemektedir.\r\n"}, + "USB dme takmlar daha tmyle desteklenmemektedir.\r\n"}, {STRING_FORMATTINGDISK, - "Kur, diski biimlendiriyor."}, + "Kur, diskinizi biimlendiriyor."}, {STRING_CHECKINGDISK, - "Kur, diski gzden geiriyor."}, + "Kur, diskinizi gzden geiriyor."}, {STRING_FORMATDISK1, " Blm %S ktk dizgesiyle hzl biimlendir. "}, {STRING_FORMATDISK2, " Blm %S ktk dizgesiyle biimlendir. "}, {STRING_KEEPFORMAT, - " Blm biimlendirme. Hibir deiiklik olmayacak. "}, + " imdiki ktk dizgesini koru. (Deiiklik yok.) "}, {STRING_HDINFOPARTCREATE, - "%I64u %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %wZ zerinde."}, + "%I64u %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %wZ zerinde."}, {STRING_HDDINFOUNK1, - "%I64u %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)."}, + "%I64u %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)."}, {STRING_HDDINFOUNK2, " %c%c Tr %lu %I64u %s"}, {STRING_HDINFOPARTDELETE, - "zerinde: %I64u %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %wZ zerinde."}, + "zerinde: %I64u %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %wZ zerinde."}, {STRING_HDDINFOUNK3, - "zerinde: %I64u %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)."}, + "zerinde: %I64u %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)."}, {STRING_HDINFOPARTZEROED, - "Disk %lu (%I64u %s), Giri=%hu, Veri Yolu=%hu, Kimlik=%hu, %wZ zerinde."}, + "Sbit Disk %lu (%I64u %s), Giri=%hu, Veri Yolu=%hu, Kimlik=%hu (%wZ)."}, {STRING_HDDINFOUNK4, "%c%c Tr %lu %I64u %s"}, {STRING_HDINFOPARTEXISTS, - "zerinde: Disk %lu (%I64u %s), Giri=%hu, Veri Yolu=%hu, Kimlik=%hu, %wZ zerinde."}, + "zerinde: Sbit Disk %lu (%I64u %s), Giri=%hu, Veri Yolu=%hu, Kimlik=%hu (%wZ)."}, {STRING_HDDINFOUNK5, "%c%c %sTr %-3u%s %6lu %s"}, {STRING_HDINFOPARTSELECT, - "%6lu %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %S zerinde"}, + "%6lu %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu), %S zerinde"}, {STRING_HDDINFOUNK6, - "%6lu %s Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)"}, + "%6lu %s Sbit Disk %lu (Giri=%hu, Veri Yolu=%hu, Kimlik=%hu)"}, {STRING_NEWPARTITION, - "Kur, u blm oluturdu:"}, + "Kur, zerinde bir yeni blm oluturdu:"}, {STRING_UNPSPACE, " %sKullanlmayan Boluk%s %6lu %s"}, {STRING_MAXSIZE, "MB (En ok %lu MB)"}, {STRING_EXTENDED_PARTITION, - "Extended Partition"}, + "Geniletilmi Blm"}, {STRING_UNFORMATTED, "Yeni (Biimlendirilmemi)"}, {STRING_FORMATUNUSED, diff --git a/base/shell/explorer/CMakeLists.txt b/base/shell/explorer/CMakeLists.txt index f212782094a..5b2a3394f5f 100644 --- a/base/shell/explorer/CMakeLists.txt +++ b/base/shell/explorer/CMakeLists.txt @@ -63,4 +63,9 @@ add_cd_file(FILE ${CMAKE_CURRENT_SOURCE_DIR}/explorer-cfg-template.xml DESTINATI if(NOT MSVC) add_compile_flags("-Wno-error=narrowing") + + # GCC bug #59472 + if(LTCG) + add_target_link_flags(explorer "-Wno-error") + endif() endif() diff --git a/boot/bootdata/CMakeLists.txt b/boot/bootdata/CMakeLists.txt index a6842d2802c..97894208dc7 100644 --- a/boot/bootdata/CMakeLists.txt +++ b/boot/bootdata/CMakeLists.txt @@ -18,10 +18,14 @@ foreach(_hive ${_common_hives}) COMMAND native-utf16le ${_hive} ${_converted_hive} DEPENDS native-utf16le ${_hive}) list(APPEND _converted_common_hives ${_converted_hive}) - add_cd_file(FILE ${_converted_hive} DESTINATION reactos NO_CAB FOR bootcd regtest) endforeach() add_custom_target(converted_hives DEPENDS ${_converted_common_hives}) +add_cd_file(TARGET converted_hives + FILE ${_converted_common_hives} + DESTINATION reactos + NO_CAB + FOR bootcd regtest) # livecd hives list(APPEND _livecd_hives @@ -84,7 +88,7 @@ macro(add_livecd_shortcut name app dest) add_link(NAME ${name} CMD_LINE_ARGS ${app} ICON ${app} PATH livecd_start.cmd GUID "{450D8FBA-AD25-11D0-98A8-0800361B1103}" MINIMIZE) list(APPEND LIVECD_SHORTCUTS "${CMAKE_CURRENT_BINARY_DIR}/${name}.lnk") add_cd_file(FILE "${CMAKE_CURRENT_BINARY_DIR}/${name}.lnk" - TARGET livecd_links + TARGET livecd_links DESTINATION ${dest} FOR livecd) endmacro(add_livecd_shortcut) diff --git a/boot/bootdata/packages/CMakeLists.txt b/boot/bootdata/packages/CMakeLists.txt index 24b6ba2e4f1..3344a23d95f 100644 --- a/boot/bootdata/packages/CMakeLists.txt +++ b/boot/bootdata/packages/CMakeLists.txt @@ -15,12 +15,18 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/concat.cmake " file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.dyn "") +# This finalizes reactos.dff by concat-ing the two files: one generated and one static containing the optional file. +# please keep it this way as it permits to add files to reactos.dff.in without having to run cmake again +# and also avoids rebuilding reactos.cab in case nothing changes after a cmake run add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff COMMAND ${CMAKE_COMMAND} -D SRC1=${CMAKE_CURRENT_SOURCE_DIR}/reactos.dff.in -D SRC2=${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.dyn - -D DST=${CMAKE_CURRENT_BINARY_DIR}/reactos.dff + -D DST=${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.maydiff -P ${CMAKE_CURRENT_BINARY_DIR}/concat.cmake + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.maydiff + ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/reactos.dff.in DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff.dyn ) @@ -34,10 +40,15 @@ add_custom_command( DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.dff native-cabman) # Then we create the actual cab file using a custom target -# Please do not change this into custom command + custom target. This breaks reactos.cab dependencies on modules -# and you can't do something like "make gdi32/fast reactos_cab/fast bootcd/fast" -add_custom_target(reactos_cab +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_cd_file(TARGET reactos_cab FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf DESTINATION reactos NO_CAB FOR bootcd regtest) +add_custom_target(reactos_cab DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab) + +add_cd_file( + TARGET reactos_cab + FILE ${CMAKE_CURRENT_BINARY_DIR}/reactos.cab ${CMAKE_CURRENT_BINARY_DIR}/reactos.inf + DESTINATION reactos + NO_CAB FOR bootcd regtest) diff --git a/cmake/CMakeMacros.cmake b/cmake/CMakeMacros.cmake index 54e918bdc08..716ac07c75d 100644 --- a/cmake/CMakeMacros.cmake +++ b/cmake/CMakeMacros.cmake @@ -318,6 +318,12 @@ function(add_cd_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() endif() endif() endif() #end bootcd diff --git a/dll/cpl/access/lang/tr-TR.rc b/dll/cpl/access/lang/tr-TR.rc index c9f50a8f1cd..12488327328 100644 --- a/dll/cpl/access/lang/tr-TR.rc +++ b/dll/cpl/access/lang/tr-TR.rc @@ -87,7 +87,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Umûmî" FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN - GROUPBOX "Kendiliğinden Yeniden Ayarla", -1, PROPSHEETPADDING(1), LABELLINE(1), PROPSHEETWIDTH - PROPSHEETPADDING(2), LABELLINE(5) + GROUPBOX "Kendiliğinden Sıfırla", -1, PROPSHEETPADDING(1), LABELLINE(1), PROPSHEETWIDTH - PROPSHEETPADDING(2), LABELLINE(5) AUTOCHECKBOX "&Şu Denli Boşta Kaldıktan Sonra Erişilebilirlik Husûsiyetlerini Kapat:", IDC_RESET_BOX, PROPSHEETPADDING(2), LABELLINE(2) - 2, PROPSHEETWIDTH - PROPSHEETPADDING(4), 14 COMBOBOX IDC_RESET_COMBO, PROPSHEETPADDING(4), LABELLINE(4), PROPSHEETPADDING(10), LABELLINE(5), @@ -178,7 +178,7 @@ CAPTION "Yüksek Karşıtlık Ayarları" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Düğme Takımı Kısayolu", -1, PROPSHEETPADDING(1), LABELLINE(1), PROPSHEETWIDTH - PROPSHEETPADDING(2), LABELLINE(6) + PROPSHEETPADDING(1) - LTEXT "Yüksek Karşıtlık İçin Kısayol: \nSol Seçenek, Sol Üst Damga ve Görüntülüğü Yazdır'a basınız.", + LTEXT "Yüksek Karşıtlık İçin Kısayol: \nSol Seçenek, Sol Üst Damga ve Görüntülüğü Yazdır'a birlikte basınız.", -1, PROPSHEETPADDING(2), LABELLINE(2), PROPSHEETWIDTH - PROPSHEETPADDING(4), LABELLINE(3) AUTOCHECKBOX "&Kısayol Kullan", IDC_CONTRAST_ACTIVATE_CHECK, PROPSHEETPADDING(2), LABELLINE(5) + 2, PROPSHEETWIDTH - PROPSHEETPADDING(4), 14 GROUPBOX "Yüksek Karşıtlık Renk Düzeni", -1, PROPSHEETPADDING(1), LABELLINE(9), PROPSHEETWIDTH - PROPSHEETPADDING(2), LABELLINE(4) + PROPSHEETPADDING(1) @@ -195,7 +195,7 @@ CAPTION "Fâre Düğmeleri Ayarları" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Düğme Takımı Kısayolu", -1, PROPSHEETPADDING(1), LABELLINE(1), PROPSHEETWIDTH - PROPSHEETPADDING(2), LABELLINE(6) + PROPSHEETPADDING(1) - LTEXT "Fâre Düğmeleri İçin Kısayol: \nSol Seçenek, Sol Üst Damga ve Sayılık Kilit'e basınız.", + LTEXT "Fâre Düğmeleri İçin Kısayol: \nSol Seçenek, Sol Üst Damga ve Sayılık Kilit'e birlikte basınız.", -1, PROPSHEETPADDING(2), LABELLINE(2), PROPSHEETWIDTH - PROPSHEETPADDING(4), LABELLINE(3) AUTOCHECKBOX "&Kısayol Kullan", IDC_MOUSEKEYS_ACTIVATE_CHECK, PROPSHEETPADDING(2), LABELLINE(5) + 2, PROPSHEETWIDTH - PROPSHEETPADDING(4), 14 diff --git a/dll/cpl/console/console.c b/dll/cpl/console/console.c index e0c4978ca7d..d26c23b21e2 100644 --- a/dll/cpl/console/console.c +++ b/dll/cpl/console/console.c @@ -115,7 +115,8 @@ InitConsoleDefaults(PCONSOLE_PROPS pConInfo) wcsncpy(GuiInfo->FaceName, L"VGA", LF_FACESIZE); // HACK: !! // GuiInfo->FaceName[0] = L'\0'; GuiInfo->FontFamily = FF_DONTCARE; - GuiInfo->FontSize = 0; + GuiInfo->FontSize.X = 0; + GuiInfo->FontSize.Y = 0; GuiInfo->FontWeight = FW_DONTCARE; GuiInfo->UseRasterFonts = TRUE; diff --git a/dll/cpl/console/layout.c b/dll/cpl/console/layout.c index 6651bb43911..41ebc3146e5 100644 --- a/dll/cpl/console/layout.c +++ b/dll/cpl/console/layout.c @@ -120,8 +120,8 @@ PaintText(LPDRAWITEMSTRUCT drawItem, hBrush = CreateSolidBrush(nbkColor); if (!hBrush) return FALSE; - Font = CreateFontW(LOWORD(GuiInfo->FontSize), - 0, // HIWORD(GuiInfo->FontSize), + Font = CreateFontW(GuiInfo->FontSize.X, + 0, // GuiInfo->FontSize.Y, 0, TA_BASELINE, GuiInfo->FontWeight, diff --git a/dll/cpl/desk/lang/tr-TR.rc b/dll/cpl/desk/lang/tr-TR.rc index 6e4969a3f95..b18abe4ec58 100644 --- a/dll/cpl/desk/lang/tr-TR.rc +++ b/dll/cpl/desk/lang/tr-TR.rc @@ -34,7 +34,7 @@ BEGIN LTEXT "Dakîka", IDC_MINTEXT, 70, 125, 26, 9 CONTROL "&Çıkışta Şifre Sor", IDC_SCREENS_USEPASSCHK, "button", BS_AUTOCHECKBOX | WS_TABSTOP, 108, 120, 117, 19 - GROUPBOX "Göstergecin Güç Tutumu Husûsiyetleri", IDC_SCREENS_DUMMY2, 6, 155, 232, 41 + GROUPBOX "Göstergecin Erke Tutumu Husûsiyetleri", IDC_SCREENS_DUMMY2, 6, 155, 232, 41 LTEXT "Göstergeciniz için güç ayarlarını düzenlemek için ""Güç""e tıklayınız.", IDC_STATIC, 14, 166, 146, 27 PUSHBUTTON "G&üç...", IDC_SCREENS_POWER_BUTTON, 165, 171, 61, 13 END diff --git a/dll/cpl/input/lang/tr-TR.rc b/dll/cpl/input/lang/tr-TR.rc index b9ec142da21..f6900f2508b 100644 --- a/dll/cpl/input/lang/tr-TR.rc +++ b/dll/cpl/input/lang/tr-TR.rc @@ -202,7 +202,7 @@ BEGIN IDS_LATVIAN_QWERTY_LAYOUT "Letonca (QWERTY)" IDS_LITHUANIAN_LAYOUT "Litovca" IDS_LITHUANIAN_IBM_LAYOUT "Litovca IBM" - IDS_FYRO_MACEDONIAN_LAYOUT "Makedonca" + IDS_FYRO_MACEDONIAN_LAYOUT "Makedonca (MEYC)" IDS_MALAYALAM_LAYOUT "Malayalam Dili" IDS_MARATHI_LAYOUT "Marathi Dili" IDS_MONGOLIAN_CYRILLIC_LAYOUT "Moğolca (Kiril)" @@ -240,7 +240,7 @@ BEGIN IDS_TURKISH_Q_LAYOUT "Türkçe Q" IDS_UKRAINIAN_LAYOUT "Ukraynaca" IDS_UKRAINIAN_STUDENT_LAYOUT "Ukraynaca (Öğrenci)" - IDS_UNITED_KINGDOM_LAYOUT "Büyük Britanya" + IDS_UNITED_KINGDOM_LAYOUT "Birleşik Krallık" IDS_UNITED_STATES_DVIRAK_LAYOUT "ABD (Dvorak)" IDS_UNITED_STATES_DVORAK_FOR_LEFT_HAND_LAYOUT "ABD (Dvorak - Sol el için.)" IDS_UNITED_STATES_DVORAK_FOR_RIGHT_HAND_LAYOUT "ABD (Dvorak - Sağ el için.)" diff --git a/dll/cpl/main/lang/tr-TR.rc b/dll/cpl/main/lang/tr-TR.rc index 59fd9d75a84..a7bf412461d 100644 --- a/dll/cpl/main/lang/tr-TR.rc +++ b/dll/cpl/main/lang/tr-TR.rc @@ -166,7 +166,7 @@ BEGIN IDS_BROWSE_FILTER "İmleçler (*.ani, *.cur)\0*.ani;*.cur\0Devingen İmleçler (*.ani)\0*.ani\0Durgun İmleçler (*.cur)\0*.cur\0Tüm Kütükler\0*.*\0\0" IDS_BROWSE_TITLE "Göz At" IDS_REMOVE_TITLE "İmleç Düzeni Silmeyi Doğrula" - IDS_REMOVE_TEXT """%s"" imleç düzenini silmek istediğinizi doğrula musunuz?" + IDS_REMOVE_TEXT """%s"" imleç düzenini silmek istediğinizden emin misiniz?" IDS_OVERWRITE_TITLE "İmleç Düzeninin Üzerine Yazmayı Doğrula" IDS_OVERWRITE_TEXT "Seçtiğiniz imleç düzeni adı önceden kullanımda. Var olan imleç düzeninin üzerine yazmayı istiyor musunuz?" IDS_ANIMATE_CURSOR "Devingen İmleç" diff --git a/dll/cpl/mmsys/lang/tr-TR.rc b/dll/cpl/mmsys/lang/tr-TR.rc index 993bcd9aeed..65a41003337 100644 --- a/dll/cpl/mmsys/lang/tr-TR.rc +++ b/dll/cpl/mmsys/lang/tr-TR.rc @@ -125,7 +125,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Başarım" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Bu ayarlar, ReactOS'un sesi nasıl çalacağını denetler. Sesle ilgili sorunları çözmenize yardımcı olabilir.", 8492, 34, 7, 218, 23 + LTEXT "Bu ayarlar, ReactOS'un sesi ne biçimde çalacağını denetler. Sesle ilgili sorunları çözmenize yardımcı olabilir.", 8492, 34, 7, 218, 23 GROUPBOX "Ses Çalma", 8494, 7, 32, 243, 152 ICON 4379, 8512, 8, 8, 20, 20 LTEXT "&Donanım İvmesi:", 8495, 13, 56, 111, 14 @@ -146,7 +146,7 @@ STYLE DS_SHELLFONT | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Başarım" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Bu ayarlar, ReactOS'un sesi nasıl çalacağını denetler. Sesle ilgili sorunları çözmenize yardımcı olabilir.", 8492, 34, 7, 217, 20 + LTEXT "Bu ayarlar, ReactOS'un sesi ne biçimde çalacağını denetler. Sesle ilgili sorunları çözmenize yardımcı olabilir.", 8492, 34, 7, 217, 20 GROUPBOX "Ses Çalma", 8494, 7, 29, 242, 122 ICON 4380, 8512, 8, 7, 20, 20 LTEXT "&Donanım İvmesi:", 8495, 13, 46, 103, 9 diff --git a/dll/cpl/powercfg/lang/tr-TR.rc b/dll/cpl/powercfg/lang/tr-TR.rc index 5118719cd65..2ec82ff1164 100644 --- a/dll/cpl/powercfg/lang/tr-TR.rc +++ b/dll/cpl/powercfg/lang/tr-TR.rc @@ -114,7 +114,7 @@ BEGIN IDS_CONFIG2 "%1 İçin Gelişmiş Ayarlar" IDS_SIZEBYTS "%i Çoklu" IDS_SIZEMB "%i MB" - IDS_NOACTION "Hiçbir Şey Yapma" + IDS_NOACTION "Bir Şey Yapma" IDS_PowerActionNone1 "Eylem Yok" IDS_PowerActionUnknown "Bilinmiyor" IDS_PowerActionSleep "Uykuya Geçir" @@ -140,6 +140,6 @@ BEGIN IDS_TIMEOUT14 "4 Saat Sonra" IDS_TIMEOUT15 "5 Saat Sonra" IDS_TIMEOUT16 "Hiçbir Zaman" - IDS_DEL_SCHEME "Güç düzenini silmek istediğinizi doğruluyor musunuz?" + IDS_DEL_SCHEME "Güç düzenini silmek istediğinizden emin misiniz?" IDS_DEL_SCHEME_TITLE "Düzeni Sil" END diff --git a/dll/cpl/sysdm/lang/tr-TR.rc b/dll/cpl/sysdm/lang/tr-TR.rc index b97edc115ce..3ed06f49a1d 100644 --- a/dll/cpl/sysdm/lang/tr-TR.rc +++ b/dll/cpl/sysdm/lang/tr-TR.rc @@ -49,13 +49,13 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 BEGIN LTEXT "Bu ayarların çoğu için yönetici ayrıcalıkları gereklidir.", IDC_STATIC, 12, 5, 236, 8 GROUPBOX "Başarım", IDC_STATIC, 6, 18, 244, 50 - LTEXT "Bilgisayarınızın hızını etkileyen başarım seçenekleri, uygulamaların belleği nasıl kullanacağını denetler.", IDC_STATIC, 16, 29, 228, 17 + LTEXT "Bilgisayarınızın hızını etkileyen başarım seçenekleri, uygulamaların belleği ne biçimde kullanacağını denetler.", IDC_STATIC, 16, 29, 228, 17 PUSHBUTTON "&Ayarlar", IDC_PERFOR, 194, 48, 50, 15 GROUPBOX "Kullanıcı Profilleri", IDC_STATIC, 6, 75, 244, 48 LTEXT "Oturum açmanızla ilgili masaüstü ayarları.", IDC_STATIC, 16, 88, 228, 20 PUSHBUTTON "A&yarlar", IDC_USERPROFILE, 194, 103, 50, 15 GROUPBOX "Başlangıç ve Kurtarma", IDC_STATIC, 6, 131, 244, 52 - LTEXT "Başlangıç ve kurtarma seçenekleri, bilgisayarınıza, nasıl açılacağını ve bir yanlışlık bilgisayarınızın durmasına neden olduğunda ne yapacağını bildirir.", IDC_STATIC, 16, 144, 228, 19 + LTEXT "Başlangıç ve kurtarma seçenekleri, bilgisayarınıza, ne biçimde açılacağını ve bir yanlışlık bilgisayarınızın durmasına neden olduğunda ne yapacağını bildirir.", IDC_STATIC, 16, 144, 228, 19 PUSHBUTTON "Aya&rlar", IDC_STAREC, 194, 162, 50, 15 PUSHBUTTON "&Dizge Ayarları", IDC_SYSSETTINGS, 2, 192, 80, 15 PUSHBUTTON "&Ortam Değişkenleri", IDC_ENVVAR, 85, 192, 80, 15 diff --git a/dll/cpl/wined3dcfg/lang/cs-CZ.rc b/dll/cpl/wined3dcfg/lang/cs-CZ.rc index 547063e5f35..00131743689 100644 --- a/dll/cpl/wined3dcfg/lang/cs-CZ.rc +++ b/dll/cpl/wined3dcfg/lang/cs-CZ.rc @@ -12,27 +12,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Shaders", -1, 5, 25, 230, 80 - LTEXT "Enable GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum GS Level:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum PS Level:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum VS Level:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Enable GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum GS Level:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum PS Level:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum VS Level:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Rendering", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Strict draw ordering:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Offscreen rendering:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Always offscreen:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Video memory size:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "DirectDraw Renderer:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multisampling:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Strict draw ordering:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Offscreen rendering:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Always offscreen:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Video memory size:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "DirectDraw Renderer:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/de-DE.rc b/dll/cpl/wined3dcfg/lang/de-DE.rc index c6efbbb3684..97501a03508 100644 --- a/dll/cpl/wined3dcfg/lang/de-DE.rc +++ b/dll/cpl/wined3dcfg/lang/de-DE.rc @@ -7,27 +7,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Shader", -1, 5, 25, 230, 80 - LTEXT "GLSL aktivieren:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximaler GS Level:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximaler PS Level:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximaler VS Level:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "GLSL aktivieren:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximaler GS Level:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximaler PS Level:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximaler VS Level:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Darstellung", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Strikte Zeichenfolge:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Offscreen Rendering:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Immer Offscreen:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Videospeicher-Größe:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "DirectDraw Renderer:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multisampling:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Strikte Zeichenfolge:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Offscreen Rendering:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Immer Offscreen:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Videospeicher-Größe:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "DirectDraw Renderer:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/en-US.rc b/dll/cpl/wined3dcfg/lang/en-US.rc index ba1ea497b00..20f066f3485 100644 --- a/dll/cpl/wined3dcfg/lang/en-US.rc +++ b/dll/cpl/wined3dcfg/lang/en-US.rc @@ -7,27 +7,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Shaders", -1, 5, 25, 230, 80 - LTEXT "Enable GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum GS Level:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum PS Level:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum VS Level:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Enable GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum GS Level:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum PS Level:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum VS Level:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Rendering", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Strict draw ordering:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Offscreen rendering:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Always offscreen:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Video memory size:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "DirectDraw Renderer:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multisampling:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Strict draw ordering:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Offscreen rendering:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Always offscreen:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Video memory size:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "DirectDraw Renderer:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/he-IL.rc b/dll/cpl/wined3dcfg/lang/he-IL.rc index 2b80ded98fc..a75ce09ed8d 100644 --- a/dll/cpl/wined3dcfg/lang/he-IL.rc +++ b/dll/cpl/wined3dcfg/lang/he-IL.rc @@ -7,27 +7,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Shaders", -1, 5, 25, 230, 80 - LTEXT "Enable GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum GS Level:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum PS Level:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum VS Level:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Enable GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum GS Level:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum PS Level:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum VS Level:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Rendering", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Strict draw ordering:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Offscreen rendering:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Always offscreen:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Video memory size:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "DirectDraw Renderer:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multisampling:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Strict draw ordering:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Offscreen rendering:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Always offscreen:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Video memory size:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "DirectDraw Renderer:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/pl-PL.rc b/dll/cpl/wined3dcfg/lang/pl-PL.rc index 385de573c96..d4804119085 100644 --- a/dll/cpl/wined3dcfg/lang/pl-PL.rc +++ b/dll/cpl/wined3dcfg/lang/pl-PL.rc @@ -14,27 +14,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Cieniowanie", -1, 5, 25, 230, 80 - LTEXT "Włącz GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maksymalny poziom GS:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maksymalny poziom PS:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maksymalny poziom VS:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Włącz GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maksymalny poziom GS:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maksymalny poziom PS:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maksymalny poziom VS:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Renderowanie", -1, 5, 110, 230, 110 - LTEXT "Multipróbkowanie:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Ścisła kolejność rysowania:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Renderowanie pozaekranowe:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Zawsze pozaekranowo:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Rozmiar pamięci video:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Urządzenie renderujące DirectDraw:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multipróbkowanie:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Ścisła kolejność rysowania:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Renderowanie pozaekranowe:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Zawsze pozaekranowo:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Rozmiar pamięci video:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Urządzenie renderujące DirectDraw:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/ro-RO.rc b/dll/cpl/wined3dcfg/lang/ro-RO.rc index f154fecc172..208cc6c53ee 100644 --- a/dll/cpl/wined3dcfg/lang/ro-RO.rc +++ b/dll/cpl/wined3dcfg/lang/ro-RO.rc @@ -9,27 +9,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Efecte de umbrire", -1, 5, 25, 230, 80 - LTEXT "Activează GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul GS maxim:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul PS maxim:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Nivelul VS maxim:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Activează GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Nivelul GS maxim:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Nivelul PS maxim:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Nivelul VS maxim:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Randare", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Ordinea strictă de desenare:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Randarea extra-ecran:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Întotdeauna extra-ecran:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Dimensiunea memoriei video:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Randator DirectDraw:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multieșantionare:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Ordinea strictă de desenare:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Randarea extra-ecran:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Întotdeauna extra-ecran:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Dimensiunea memoriei video:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Randator DirectDraw:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/sq-AL.rc b/dll/cpl/wined3dcfg/lang/sq-AL.rc index 3b77ad0faa8..50c3fc6611e 100644 --- a/dll/cpl/wined3dcfg/lang/sq-AL.rc +++ b/dll/cpl/wined3dcfg/lang/sq-AL.rc @@ -11,27 +11,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Shaders", -1, 5, 25, 230, 80 - LTEXT "Enable GLSL:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum GS Level:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum PS Level:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Maximum VS Level:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Enable GLSL:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum GS Level:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum PS Level:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Maximum VS Level:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "Rendering", -1, 5, 110, 230, 110 - LTEXT "Multisampling:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Strict draw ordering:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Offscreen rendering:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Always offscreen:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "Video memory size:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "DirectDraw Renderer:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Multisampling:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Strict draw ordering:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Offscreen rendering:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Always offscreen:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "Video memory size:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "DirectDraw Renderer:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/cpl/wined3dcfg/lang/tr-TR.rc b/dll/cpl/wined3dcfg/lang/tr-TR.rc index d6620c13566..0e2fc1dc56a 100644 --- a/dll/cpl/wined3dcfg/lang/tr-TR.rc +++ b/dll/cpl/wined3dcfg/lang/tr-TR.rc @@ -9,27 +9,27 @@ FONT 8, "MS Shell Dlg" BEGIN ICON IDI_CPLICON, IDI_CPLICON, 8, 0, 21, 20 GROUPBOX "Gölgelendiriciler", -1, 5, 25, 230, 80 - LTEXT "G&LSL'yi Etkinleştir:", -1, 15, 42, 80, 10 - COMBOBOX IDC_GLSL, 95, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&GS Düzeyi En Çok:", -1, 15, 57, 80, 10 - COMBOBOX IDC_GSLEVEL, 95, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&PS Düzeyi En Çok:", -1, 15, 72, 80, 10 - COMBOBOX IDC_PSLEVEL, 95, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&VS Düzeyi En Çok:", -1, 15, 87, 80, 10 - COMBOBOX IDC_VSLEVEL, 95, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "G&LSL'yi Etkinleştir:", -1, 15, 42, 120, 10 + COMBOBOX IDC_GLSL, 135, 40, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&GS Düzeyi En Çok:", -1, 15, 57, 120, 10 + COMBOBOX IDC_GSLEVEL, 135, 55, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&PS Düzeyi En Çok:", -1, 15, 72, 120, 10 + COMBOBOX IDC_PSLEVEL, 135, 70, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&VS Düzeyi En Çok:", -1, 15, 87, 120, 10 + COMBOBOX IDC_VSLEVEL, 135, 85, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST GROUPBOX "İşleme", -1, 5, 110, 230, 110 - LTEXT "&Çoklu Örnekleme:", -1, 15, 127, 80, 10 - COMBOBOX IDC_MULTISAMPLING, 95, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&Sıkı Çizim Düzenlemesi:", -1, 15, 142, 80, 10 - COMBOBOX IDC_STRICTDRAWORDERING, 95, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&Görüntülük Dışı İşleme:", -1, 15, 157, 80, 10 - COMBOBOX IDC_OFFSCREEN, 95, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "S&ürekli Görüntülük Dışı:", -1, 15, 172, 72, 10, SS_LEFT - COMBOBOX IDC_ALWAYSOFFSCREEN, 95, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "V&idyo Belleği Boyutu:", -1, 15, 187, 72, 10, SS_LEFT - COMBOBOX IDC_VIDMEMSIZE, 95, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST - LTEXT "&DirectDraw İşleyicisi:", -1, 15, 202, 72, 10, SS_LEFT - COMBOBOX IDC_DDRENDERER, 95, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&Çoklu Örnekleme:", -1, 15, 127, 120, 10 + COMBOBOX IDC_MULTISAMPLING, 135, 125, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&Sıkı Çizim Düzenlemesi:", -1, 15, 142, 120, 10 + COMBOBOX IDC_STRICTDRAWORDERING, 135, 140, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&Görüntülük Dışı İşleme:", -1, 15, 157, 120, 10 + COMBOBOX IDC_OFFSCREEN, 135, 155, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "S&ürekli Görüntülük Dışı:", -1, 15, 172, 120, 10, SS_LEFT + COMBOBOX IDC_ALWAYSOFFSCREEN, 135, 170, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "V&idyo Belleği Boyutu:", -1, 15, 187, 120, 10, SS_LEFT + COMBOBOX IDC_VIDMEMSIZE, 135, 185, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST + LTEXT "&DirectDraw İşleyicisi:", -1, 15, 202, 120, 10, SS_LEFT + COMBOBOX IDC_DDRENDERER, 135, 200, 90, 10, WS_TABSTOP | WS_VSCROLL | CBS_DROPDOWNLIST END STRINGTABLE diff --git a/dll/ntdll/csr/capture.c b/dll/ntdll/csr/capture.c index 0a779eca9f9..ad266250c9b 100644 --- a/dll/ntdll/csr/capture.c +++ b/dll/ntdll/csr/capture.c @@ -3,7 +3,8 @@ * PROJECT: ReactOS kernel * FILE: dll/ntdll/csr/capture.c * PURPOSE: Routines for probing and capturing CSR API Messages - * PROGRAMMER: Alex Ionescu (alex@relsoft.net) + * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) */ /* INCLUDES *******************************************************************/ @@ -131,7 +132,7 @@ ULONG NTAPI CsrAllocateMessagePointer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, IN ULONG MessageLength, - OUT PVOID *CapturedData) + OUT PVOID* CapturedData) { if (MessageLength == 0) { @@ -168,7 +169,7 @@ NTAPI CsrCaptureMessageBuffer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, IN PVOID MessageBuffer OPTIONAL, IN ULONG MessageLength, - OUT PVOID *CapturedData) + OUT PVOID* CapturedData) { /* Simply allocate a message pointer in the buffer */ CsrAllocateMessagePointer(CaptureBuffer, MessageLength, CapturedData); @@ -191,35 +192,23 @@ CsrFreeCaptureBuffer(IN PCSR_CAPTURE_BUFFER CaptureBuffer) RtlFreeHeap(CsrPortHeap, 0, CaptureBuffer); } -/* - * @unimplemented - */ -NTSTATUS -NTAPI -CsrCaptureMessageMultiUnicodeStringsInPlace(IN PCSR_CAPTURE_BUFFER *CaptureBuffer, - IN ULONG MessageCount, - IN PVOID MessageStrings) -{ - /* FIXME: allocate a buffer if we don't have one, and return it */ - /* FIXME: call CsrCaptureMessageUnicodeStringInPlace for each string */ - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} - /* * @implemented */ VOID NTAPI CsrCaptureMessageString(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, - IN LPSTR String OPTIONAL, + IN PCSTR String OPTIONAL, IN ULONG StringLength, IN ULONG MaximumLength, - OUT PANSI_STRING CapturedString) + OUT PSTRING CapturedString) { - ULONG ReturnedLength; + ASSERT(CapturedString != NULL); - /* If we don't have a string, initialize an empty one */ + /* + * If we don't have a string, initialize an empty one, + * otherwise capture the given string. + */ if (!String) { CapturedString->Length = 0; @@ -229,31 +218,95 @@ CsrCaptureMessageString(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, CsrAllocateMessagePointer(CaptureBuffer, MaximumLength, (PVOID*)&CapturedString->Buffer); - return; } - - /* Initialize this string */ - CapturedString->Length = (USHORT)StringLength; - - /* Allocate a buffer and get its size */ - ReturnedLength = CsrAllocateMessagePointer(CaptureBuffer, - MaximumLength, - (PVOID*)&CapturedString->Buffer); - CapturedString->MaximumLength = (USHORT)ReturnedLength; - - /* If the string had data */ - if (StringLength) + else { - /* Copy it into the capture buffer */ - RtlMoveMemory(CapturedString->Buffer, String, MaximumLength); + /* Cut-off the string length if needed */ + if (StringLength > MaximumLength) + StringLength = MaximumLength; - /* If we don't take up the whole space */ - if (CapturedString->Length < CapturedString->MaximumLength) - { - /* Null-terminate it */ - CapturedString->Buffer[CapturedString->Length] = '\0'; - } + CapturedString->Length = (USHORT)StringLength; + + /* Allocate a buffer and get its size */ + CapturedString->MaximumLength = + (USHORT)CsrAllocateMessagePointer(CaptureBuffer, + MaximumLength, + (PVOID*)&CapturedString->Buffer); + + /* If the string has data, copy it into the buffer */ + if (StringLength) + RtlMoveMemory(CapturedString->Buffer, String, StringLength); } + + /* Null-terminate the string if we don't take up the whole space */ + if (CapturedString->Length < CapturedString->MaximumLength) + CapturedString->Buffer[CapturedString->Length] = '\0'; +} + +static VOID +CsrCaptureMessageUnicodeStringInPlace(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, + IN PUNICODE_STRING String) +{ + ASSERT(String != NULL); + + /* This is a way to capture the UNICODE string, since (Maximum)Length are also in bytes */ + CsrCaptureMessageString(CaptureBuffer, + (PCSTR)String->Buffer, + String->Length, + String->MaximumLength, + (PSTRING)String); + + /* Null-terminate the string */ + if (String->MaximumLength >= String->Length + sizeof(WCHAR)) + { + String->Buffer[String->Length / sizeof(WCHAR)] = L'\0'; + } +} + +/* + * @implemented + */ +NTSTATUS +NTAPI +CsrCaptureMessageMultiUnicodeStringsInPlace(OUT PCSR_CAPTURE_BUFFER* CaptureBuffer, + IN ULONG StringsCount, + IN PUNICODE_STRING* MessageStrings) +{ + ULONG Count; + + if (!CaptureBuffer) return STATUS_INVALID_PARAMETER; + + /* Allocate a new capture buffer if we don't have one already */ + if (!*CaptureBuffer) + { + /* Compute the required size for the capture buffer */ + ULONG Size = 0; + + Count = 0; + while (Count < StringsCount) + { + if (MessageStrings[Count]) + Size += MessageStrings[Count]->MaximumLength; + + ++Count; + } + + /* Allocate the capture buffer */ + *CaptureBuffer = CsrAllocateCaptureBuffer(StringsCount, Size); + if (!*CaptureBuffer) return STATUS_NO_MEMORY; + } + + /* Now capture each UNICODE string */ + Count = 0; + while (Count < StringsCount) + { + if (MessageStrings[Count]) + CsrCaptureMessageUnicodeStringInPlace(*CaptureBuffer, MessageStrings[Count]); + + ++Count; + } + + return STATUS_SUCCESS; } /* diff --git a/dll/win32/avifil32/lang/avifile_Tr.rc b/dll/win32/avifil32/lang/avifile_Tr.rc index 09ecd87da99..6575661cd21 100644 --- a/dll/win32/avifil32/lang/avifile_Tr.rc +++ b/dll/win32/avifil32/lang/avifile_Tr.rc @@ -1,9 +1,7 @@ /* * Top level resource file for avifil32.dll * - * Copyright 2002 Michael Günnewig - * - * Translated to Turkish by Fatih Aşıcı in 2006 and Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2013. + * Copyrights: 2006 Fatih Aşıcı; 2013, 2014 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,11 +24,11 @@ STRINGTABLE { IDS_WAVESTREAMFORMAT "Dalga Biçimi: %s" IDS_WAVEFILETYPE "Dalga Biçimi" - IDS_ALLMULTIMEDIA "Tüm Çokluortam Kütükleri" + IDS_ALLMULTIMEDIA "Tüm Çoklu Ortam Kütükleri" IDS_ALLFILES "Tüm Kütükler (*.*)" IDS_VIDEO "Vidyo" IDS_AUDIO "Ses" - IDS_AVIFILETYPE "Wine AVI-default-filehandler" + IDS_AVIFILETYPE "Wine AVI Ön Tanımlı Kütük İşleyicisi" IDS_UNCOMPRESSED "Sıkıştırılmamış" } @@ -43,7 +41,7 @@ BEGIN COMBOBOX IDC_STREAM,5,18,154,61,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "&Seçenekler...",IDC_OPTIONS,170,17,50,14 - AUTOCHECKBOX "&Her Ara Kare",IDC_INTERLEAVE,5,42,85,11,WS_TABSTOP + AUTOCHECKBOX "&Tüm Aralıklar",IDC_INTERLEAVE,5,42,85,11,WS_TABSTOP EDITTEXT IDC_INTERLEAVEEVERY,91,41,32,12,ES_AUTOHSCROLL LTEXT "kare",-1,129,43,36,9 LTEXT "Şimdiki Biçim:",-1,5,56,73,9 diff --git a/dll/win32/browseui/CMakeLists.txt b/dll/win32/browseui/CMakeLists.txt index 808dcfb8048..73272ffca89 100644 --- a/dll/win32/browseui/CMakeLists.txt +++ b/dll/win32/browseui/CMakeLists.txt @@ -62,6 +62,11 @@ add_cd_file(TARGET browseui DESTINATION reactos/system32 FOR all) if(NOT MSVC) add_target_compile_flags(browseui "-Wno-unused-but-set-variable") + + # Binutils linker bug + if(LTCG) + add_target_link_flags(browseui "-Wl,--allow-multiple-definition") + endif() endif() add_custom_command(TARGET browseui POST_BUILD diff --git a/dll/win32/browseui/precomp.h b/dll/win32/browseui/precomp.h index 323deb65e53..21ce5e310f8 100644 --- a/dll/win32/browseui/precomp.h +++ b/dll/win32/browseui/precomp.h @@ -76,6 +76,47 @@ Win32DbgPrint(const char *filename, int line, const char *lpFormat, ...) #define DbgPrint(fmt, ...) \ Win32DbgPrint(__FILE__, __LINE__, fmt, ##__VA_ARGS__) +static void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel) +{ + WCHAR label[128]; + + padding[padlevel] = '.'; + padding[padlevel + 1] = '.'; + padding[padlevel + 2] = 0; + + int count = GetMenuItemCount(hmenu); + for (int i = 0; i < count; i++) + { + MENUITEMINFOW mii = { 0 }; + + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | MIIM_ID; + mii.dwTypeData = label; + mii.cch = _countof(label); + + GetMenuItemInfo(hmenu, i, TRUE, &mii); + + if (mii.fType & MFT_BITMAP) + DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); + else if (mii.fType & MFT_SEPARATOR) + DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID); + else + DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); + + if (mii.hSubMenu) + DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2); + + } + + padding[padlevel] = 0; +} + +static __inline void DbgDumpMenu(HMENU hmenu) +{ + char padding[128]; + DbgDumpMenuInternal(hmenu, padding, 0); +} + #if 1 #define FAILED_UNEXPECTEDLY(hr) (FAILED(hr) && (DbgPrint("Unexpected failure %08x.\n", hr), TRUE)) #else diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index 89a99595a55..5de7aaf06ef 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -33,46 +33,6 @@ extern HRESULT IUnknown_ShowDW(IUnknown * punk, BOOL fShow); #include "newatlinterfaces.h" -static void DbgDumpMenuInternal(HMENU hmenu, char* padding, int padlevel) -{ - WCHAR label[128]; - - padding[padlevel] = '.'; - padding[padlevel + 1] = '.'; - padding[padlevel + 2] = 0; - - int count = GetMenuItemCount(hmenu); - for (int i = 0; i < count; i++) - { - MENUITEMINFOW mii = { 0 }; - - mii.cbSize = sizeof(mii); - mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_SUBMENU | MIIM_STATE | MIIM_ID; - mii.dwTypeData = label; - mii.cch = _countof(label); - - GetMenuItemInfo(hmenu, i, TRUE, &mii); - - if (mii.fType & MFT_BITMAP) - DbgPrint("%s%2d - %08x: BITMAP %08p (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.hbmpItem, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); - else if (mii.fType & MFT_SEPARATOR) - DbgPrint("%s%2d - %08x ---SEPARATOR---\n", padding, i, mii.wID); - else - DbgPrint("%s%2d - %08x: %S (state=%d, has submenu=%s)\n", padding, i, mii.wID, mii.dwTypeData, mii.fState, mii.hSubMenu ? "TRUE" : "FALSE"); - - if (mii.hSubMenu) - DbgDumpMenuInternal(mii.hSubMenu, padding, padlevel + 2); - - } - - padding[padlevel] = 0; -} - -static void DbgDumpMenu(HMENU hmenu) -{ - char padding[128]; - DbgDumpMenuInternal(hmenu, padding, 0); -} /* TODO: diff --git a/dll/win32/cards/COPYING b/dll/win32/cards/COPYING new file mode 100644 index 00000000000..228093ffbc7 --- /dev/null +++ b/dll/win32/cards/COPYING @@ -0,0 +1,51 @@ +French front sides: + +Source: +http://www.united3dartists.com/forum/viewtopic.php?f=31&t=954 + +License: +After contacting DesignDevil by Forum PM, he answered: +"There are no restrictions from my side in the use and exploitation of the +graphics, private and / or commercial. Naming me is also not necessary." + +The completely redefined 52 cards are based on a scanned original card game +which is based on the original illustration made in 1776 in Strabourg in object +placement matters. + +French back sides: + +Background_1: Our own logo. +Background_2: Based on a French Tournament illustration. +Background_3: +Background_4: +Background_5: +Background_6: Illustration by DesignDevil. Source see above. +Background_7: +Background_8: +Background_9: +Background_10: Based on one of the more common french Romme card game backgrounds. +Background_11: +Background_12: + +------------------------------------------------------------------------------- + +Bavarian front sides: + +Based on the typical modern bavarian 36 card illustration from 1810. The non +existent 16 cards number 2-5 in all four colours were scrapped in the 17. +century and thus were hand made by me. (Daniel Reimer). + +Bavarian back sides: + +Ruecken1: Our own logo. +Ruecken2: Based on the historical "Altenburger Bild" mainly found in Thuringia, Saxony and Saxony-Anhalt. +Ruecken3: Based on the historical "Tarock Bild" mainly found in Bavaria. +Ruecken4: Based on the historical "Gaigel Binokel Bild" mainly found in Baden-Wrttemberg. +Ruecken5: Based on one of the more common french Skat card game backgrounds. +Ruecken6: Based on the bavarian flag. Can be found that way around Munich. +Ruecken7: Typical diamond pattern found on many old and new Skat and "Kurze Scharfe" cards. +Ruecken8: Based on the historical "Gaigel Binokel Bild" mainly found in Bavaria. +Ruecken9: Typical diamond pattern found on many old and new Skat and "Kurze Scharfe" cards. +Ruecken10: Typical diamond pattern found on many old and new Skat and "Kurze Scharfe" cards. +Ruecken11: Based on one of the more common french Skat card game backgrounds. +Ruecken12: Based on the historical "Schafkopf Bild" mainly found in Bavaria. \ No newline at end of file diff --git a/dll/win32/cards/res/bavarian/Ruecken1.bmp b/dll/win32/cards/res/bavarian/Ruecken1.bmp index 3bc6caf5329..be4f63eb4fa 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken1.bmp and b/dll/win32/cards/res/bavarian/Ruecken1.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken11.bmp b/dll/win32/cards/res/bavarian/Ruecken11.bmp index 60270db644c..efeb9172f93 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken11.bmp and b/dll/win32/cards/res/bavarian/Ruecken11.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken12.bmp b/dll/win32/cards/res/bavarian/Ruecken12.bmp index c0ea235f0e6..c608c728c73 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken12.bmp and b/dll/win32/cards/res/bavarian/Ruecken12.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken3.bmp b/dll/win32/cards/res/bavarian/Ruecken3.bmp index 654147f5bef..326acb4ee2c 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken3.bmp and b/dll/win32/cards/res/bavarian/Ruecken3.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken4.bmp b/dll/win32/cards/res/bavarian/Ruecken4.bmp index 861414860d4..982babd252b 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken4.bmp and b/dll/win32/cards/res/bavarian/Ruecken4.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken6.bmp b/dll/win32/cards/res/bavarian/Ruecken6.bmp index efeb9172f93..d04cc5e9e86 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken6.bmp and b/dll/win32/cards/res/bavarian/Ruecken6.bmp differ diff --git a/dll/win32/cards/res/bavarian/Ruecken8.bmp b/dll/win32/cards/res/bavarian/Ruecken8.bmp index 29083ba89ff..1122201e1b6 100644 Binary files a/dll/win32/cards/res/bavarian/Ruecken8.bmp and b/dll/win32/cards/res/bavarian/Ruecken8.bmp differ diff --git a/dll/win32/cards/res/default/Background_6.bmp b/dll/win32/cards/res/default/Background_6.bmp index 694b5c31786..aaecd0e1d1d 100644 Binary files a/dll/win32/cards/res/default/Background_6.bmp and b/dll/win32/cards/res/default/Background_6.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Ace.bmp b/dll/win32/cards/res/default/Clubs_Ace.bmp index 796bfc35bd4..2e446ead761 100644 Binary files a/dll/win32/cards/res/default/Clubs_Ace.bmp and b/dll/win32/cards/res/default/Clubs_Ace.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Eight.bmp b/dll/win32/cards/res/default/Clubs_Eight.bmp index b229e5422a0..c6de5e185b4 100644 Binary files a/dll/win32/cards/res/default/Clubs_Eight.bmp and b/dll/win32/cards/res/default/Clubs_Eight.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Five.bmp b/dll/win32/cards/res/default/Clubs_Five.bmp index 24e06a68143..b5c344063f2 100644 Binary files a/dll/win32/cards/res/default/Clubs_Five.bmp and b/dll/win32/cards/res/default/Clubs_Five.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Four.bmp b/dll/win32/cards/res/default/Clubs_Four.bmp index 80a90555dfe..106ee53339f 100644 Binary files a/dll/win32/cards/res/default/Clubs_Four.bmp and b/dll/win32/cards/res/default/Clubs_Four.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Jack.bmp b/dll/win32/cards/res/default/Clubs_Jack.bmp index 5bf64eec8c1..5e026e9179c 100644 Binary files a/dll/win32/cards/res/default/Clubs_Jack.bmp and b/dll/win32/cards/res/default/Clubs_Jack.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_King.bmp b/dll/win32/cards/res/default/Clubs_King.bmp index 4873f868ee1..4de111816c4 100644 Binary files a/dll/win32/cards/res/default/Clubs_King.bmp and b/dll/win32/cards/res/default/Clubs_King.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Nine.bmp b/dll/win32/cards/res/default/Clubs_Nine.bmp index ee440b0643d..fc0195553b1 100644 Binary files a/dll/win32/cards/res/default/Clubs_Nine.bmp and b/dll/win32/cards/res/default/Clubs_Nine.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Queen.bmp b/dll/win32/cards/res/default/Clubs_Queen.bmp index 00c6c5adc1d..045f4acf113 100644 Binary files a/dll/win32/cards/res/default/Clubs_Queen.bmp and b/dll/win32/cards/res/default/Clubs_Queen.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Seven.bmp b/dll/win32/cards/res/default/Clubs_Seven.bmp index 20cc1cc3bf7..e306373394f 100644 Binary files a/dll/win32/cards/res/default/Clubs_Seven.bmp and b/dll/win32/cards/res/default/Clubs_Seven.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Six.bmp b/dll/win32/cards/res/default/Clubs_Six.bmp index 0a49309b4bb..e02cfeedc07 100644 Binary files a/dll/win32/cards/res/default/Clubs_Six.bmp and b/dll/win32/cards/res/default/Clubs_Six.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Ten.bmp b/dll/win32/cards/res/default/Clubs_Ten.bmp index 1c68ad07b81..5d8d9e8df3f 100644 Binary files a/dll/win32/cards/res/default/Clubs_Ten.bmp and b/dll/win32/cards/res/default/Clubs_Ten.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Three.bmp b/dll/win32/cards/res/default/Clubs_Three.bmp index 04e1af069e4..ce54620afc0 100644 Binary files a/dll/win32/cards/res/default/Clubs_Three.bmp and b/dll/win32/cards/res/default/Clubs_Three.bmp differ diff --git a/dll/win32/cards/res/default/Clubs_Two.bmp b/dll/win32/cards/res/default/Clubs_Two.bmp index d5ea09d88d0..9cc351d88bc 100644 Binary files a/dll/win32/cards/res/default/Clubs_Two.bmp and b/dll/win32/cards/res/default/Clubs_Two.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Ace.bmp b/dll/win32/cards/res/default/Diamonds_Ace.bmp index b6ddd1f62bf..75585c52786 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Ace.bmp and b/dll/win32/cards/res/default/Diamonds_Ace.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Eight.bmp b/dll/win32/cards/res/default/Diamonds_Eight.bmp index 4ef1c57f89a..f56fe1caeef 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Eight.bmp and b/dll/win32/cards/res/default/Diamonds_Eight.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Five.bmp b/dll/win32/cards/res/default/Diamonds_Five.bmp index 50ed7940ed9..5d330f313f0 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Five.bmp and b/dll/win32/cards/res/default/Diamonds_Five.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Four.bmp b/dll/win32/cards/res/default/Diamonds_Four.bmp index 071b2cd02ce..aaf4a05c0d5 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Four.bmp and b/dll/win32/cards/res/default/Diamonds_Four.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Jack.bmp b/dll/win32/cards/res/default/Diamonds_Jack.bmp index c4295e44482..9c6b63d8073 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Jack.bmp and b/dll/win32/cards/res/default/Diamonds_Jack.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_King.bmp b/dll/win32/cards/res/default/Diamonds_King.bmp index 324b9fc3b4c..bb57f2745a8 100644 Binary files a/dll/win32/cards/res/default/Diamonds_King.bmp and b/dll/win32/cards/res/default/Diamonds_King.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Nine.bmp b/dll/win32/cards/res/default/Diamonds_Nine.bmp index a3e0970c979..ecdd7a9e80b 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Nine.bmp and b/dll/win32/cards/res/default/Diamonds_Nine.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Queen.bmp b/dll/win32/cards/res/default/Diamonds_Queen.bmp index c4b9a1ac520..dcfb6869379 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Queen.bmp and b/dll/win32/cards/res/default/Diamonds_Queen.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Seven.bmp b/dll/win32/cards/res/default/Diamonds_Seven.bmp index 2efe38859e2..3d069de9709 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Seven.bmp and b/dll/win32/cards/res/default/Diamonds_Seven.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Six.bmp b/dll/win32/cards/res/default/Diamonds_Six.bmp index 19aded5ecbf..32c0a1fa71d 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Six.bmp and b/dll/win32/cards/res/default/Diamonds_Six.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Ten.bmp b/dll/win32/cards/res/default/Diamonds_Ten.bmp index d50af0e6d1d..8efb0e6a71b 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Ten.bmp and b/dll/win32/cards/res/default/Diamonds_Ten.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Three.bmp b/dll/win32/cards/res/default/Diamonds_Three.bmp index 4dfc65bcdcd..7ef5b12a74f 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Three.bmp and b/dll/win32/cards/res/default/Diamonds_Three.bmp differ diff --git a/dll/win32/cards/res/default/Diamonds_Two.bmp b/dll/win32/cards/res/default/Diamonds_Two.bmp index 38b3f326025..f306252f667 100644 Binary files a/dll/win32/cards/res/default/Diamonds_Two.bmp and b/dll/win32/cards/res/default/Diamonds_Two.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Ace.bmp b/dll/win32/cards/res/default/Hearts_Ace.bmp index ea01402bf6d..16636016394 100644 Binary files a/dll/win32/cards/res/default/Hearts_Ace.bmp and b/dll/win32/cards/res/default/Hearts_Ace.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Eight.bmp b/dll/win32/cards/res/default/Hearts_Eight.bmp index d1df40c02d9..531cbd03e74 100644 Binary files a/dll/win32/cards/res/default/Hearts_Eight.bmp and b/dll/win32/cards/res/default/Hearts_Eight.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Five.bmp b/dll/win32/cards/res/default/Hearts_Five.bmp index 637511caa1b..610626717d7 100644 Binary files a/dll/win32/cards/res/default/Hearts_Five.bmp and b/dll/win32/cards/res/default/Hearts_Five.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Four.bmp b/dll/win32/cards/res/default/Hearts_Four.bmp index 4744ad57b1a..fe1b4ddcd3e 100644 Binary files a/dll/win32/cards/res/default/Hearts_Four.bmp and b/dll/win32/cards/res/default/Hearts_Four.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Jack.bmp b/dll/win32/cards/res/default/Hearts_Jack.bmp index abba288ec0e..325a5f8affa 100644 Binary files a/dll/win32/cards/res/default/Hearts_Jack.bmp and b/dll/win32/cards/res/default/Hearts_Jack.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_King.bmp b/dll/win32/cards/res/default/Hearts_King.bmp index 36f16979f8d..a66689b8b82 100644 Binary files a/dll/win32/cards/res/default/Hearts_King.bmp and b/dll/win32/cards/res/default/Hearts_King.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Nine.bmp b/dll/win32/cards/res/default/Hearts_Nine.bmp index 6012df423bb..27e6d989c50 100644 Binary files a/dll/win32/cards/res/default/Hearts_Nine.bmp and b/dll/win32/cards/res/default/Hearts_Nine.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Queen.bmp b/dll/win32/cards/res/default/Hearts_Queen.bmp index 2388e132c65..2aee961f600 100644 Binary files a/dll/win32/cards/res/default/Hearts_Queen.bmp and b/dll/win32/cards/res/default/Hearts_Queen.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Seven.bmp b/dll/win32/cards/res/default/Hearts_Seven.bmp index c003b0070a8..341fa85655e 100644 Binary files a/dll/win32/cards/res/default/Hearts_Seven.bmp and b/dll/win32/cards/res/default/Hearts_Seven.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Six.bmp b/dll/win32/cards/res/default/Hearts_Six.bmp index 9191f4e9c46..0c4b90aafba 100644 Binary files a/dll/win32/cards/res/default/Hearts_Six.bmp and b/dll/win32/cards/res/default/Hearts_Six.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Ten.bmp b/dll/win32/cards/res/default/Hearts_Ten.bmp index fecefaea352..93d90e6125f 100644 Binary files a/dll/win32/cards/res/default/Hearts_Ten.bmp and b/dll/win32/cards/res/default/Hearts_Ten.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Three.bmp b/dll/win32/cards/res/default/Hearts_Three.bmp index 6e0db7d73a6..a950d13de31 100644 Binary files a/dll/win32/cards/res/default/Hearts_Three.bmp and b/dll/win32/cards/res/default/Hearts_Three.bmp differ diff --git a/dll/win32/cards/res/default/Hearts_Two.bmp b/dll/win32/cards/res/default/Hearts_Two.bmp index 384c87ddf36..c3bc2108884 100644 Binary files a/dll/win32/cards/res/default/Hearts_Two.bmp and b/dll/win32/cards/res/default/Hearts_Two.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Ace.bmp b/dll/win32/cards/res/default/Spades_Ace.bmp index 3050eb6b9e2..f983c73f7ab 100644 Binary files a/dll/win32/cards/res/default/Spades_Ace.bmp and b/dll/win32/cards/res/default/Spades_Ace.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Eight.bmp b/dll/win32/cards/res/default/Spades_Eight.bmp index 2ac0134e04b..76acd97d046 100644 Binary files a/dll/win32/cards/res/default/Spades_Eight.bmp and b/dll/win32/cards/res/default/Spades_Eight.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Five.bmp b/dll/win32/cards/res/default/Spades_Five.bmp index ded2b1b7a85..096988d7e37 100644 Binary files a/dll/win32/cards/res/default/Spades_Five.bmp and b/dll/win32/cards/res/default/Spades_Five.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Four.bmp b/dll/win32/cards/res/default/Spades_Four.bmp index bd053291a3f..20e447cf465 100644 Binary files a/dll/win32/cards/res/default/Spades_Four.bmp and b/dll/win32/cards/res/default/Spades_Four.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Jack.bmp b/dll/win32/cards/res/default/Spades_Jack.bmp index ef75244e125..69000acdb59 100644 Binary files a/dll/win32/cards/res/default/Spades_Jack.bmp and b/dll/win32/cards/res/default/Spades_Jack.bmp differ diff --git a/dll/win32/cards/res/default/Spades_King.bmp b/dll/win32/cards/res/default/Spades_King.bmp index 6787367f948..a1e85196044 100644 Binary files a/dll/win32/cards/res/default/Spades_King.bmp and b/dll/win32/cards/res/default/Spades_King.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Nine.bmp b/dll/win32/cards/res/default/Spades_Nine.bmp index b47fdcd2012..dd9a0498cb9 100644 Binary files a/dll/win32/cards/res/default/Spades_Nine.bmp and b/dll/win32/cards/res/default/Spades_Nine.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Queen.bmp b/dll/win32/cards/res/default/Spades_Queen.bmp index 906e53ae0ec..735c15cb185 100644 Binary files a/dll/win32/cards/res/default/Spades_Queen.bmp and b/dll/win32/cards/res/default/Spades_Queen.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Seven.bmp b/dll/win32/cards/res/default/Spades_Seven.bmp index 74d2f9a064c..c1a184e3d23 100644 Binary files a/dll/win32/cards/res/default/Spades_Seven.bmp and b/dll/win32/cards/res/default/Spades_Seven.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Six.bmp b/dll/win32/cards/res/default/Spades_Six.bmp index f97061a7109..cdef71ac83b 100644 Binary files a/dll/win32/cards/res/default/Spades_Six.bmp and b/dll/win32/cards/res/default/Spades_Six.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Ten.bmp b/dll/win32/cards/res/default/Spades_Ten.bmp index 401adfb89b5..4a3cf4a2692 100644 Binary files a/dll/win32/cards/res/default/Spades_Ten.bmp and b/dll/win32/cards/res/default/Spades_Ten.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Three.bmp b/dll/win32/cards/res/default/Spades_Three.bmp index 690de8a9ed5..b72e21eacd8 100644 Binary files a/dll/win32/cards/res/default/Spades_Three.bmp and b/dll/win32/cards/res/default/Spades_Three.bmp differ diff --git a/dll/win32/cards/res/default/Spades_Two.bmp b/dll/win32/cards/res/default/Spades_Two.bmp index 5938cd05534..30c71d70463 100644 Binary files a/dll/win32/cards/res/default/Spades_Two.bmp and b/dll/win32/cards/res/default/Spades_Two.bmp differ diff --git a/dll/win32/comctl32/lang/comctl_Tr.rc b/dll/win32/comctl32/lang/comctl_Tr.rc index f5768361b81..4b90ca605bf 100644 --- a/dll/win32/comctl32/lang/comctl_Tr.rc +++ b/dll/win32/comctl32/lang/comctl_Tr.rc @@ -1,10 +1,7 @@ /* * Top level resource file for Common Controls * - * Copyright 1999 Bertho Stultiens - * Copyright 1999 Eric Kohl - * - * Translated to Turkish by Fatih Aşıcı in 2006 and Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2013. + * Copyrights: 2006 Fatih Aşıcı; 2013 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -36,12 +33,12 @@ STRINGTABLE STRINGTABLE { - IDS_SEPARATOR "Ayraç" + IDS_SEPARATOR "Ayırıcı" } STRINGTABLE { - HKY_NONE "Hiçbiri" + HKY_NONE "Yok" } IDD_PROPSHEET DIALOG 0, 0, 220, 140 @@ -64,7 +61,7 @@ FONT 8, "MS Shell Dlg" BEGIN PUSHBUTTON "< &Geri", IDC_BACK_BUTTON,56,138,55,14 DEFPUSHBUTTON "&İleri >", IDC_NEXT_BUTTON,111,138,55,14 - DEFPUSHBUTTON "Son", IDC_FINISH_BUTTON,111,138,55,14 + DEFPUSHBUTTON "&Son", IDC_FINISH_BUTTON,111,138,55,14 PUSHBUTTON "İptal", IDCANCEL,173,138,55,14 PUSHBUTTON "Yardım", IDHELP,235,138,55,14,WS_GROUP LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN @@ -80,10 +77,10 @@ FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "Ka&pat", IDCANCEL,320,6,70,14 PUSHBUTTON "&Sıfırla", IDC_RESET_BTN,320,23,70,14 - PUSHBUTTON "Yar&dım", IDC_HELP_BTN,320,40,70,14 - PUSHBUTTON "&Yukarı Taşı", IDC_MOVEUP_BTN,320,74,70,14 + PUSHBUTTON "&Yardım", IDC_HELP_BTN,320,40,70,14 + PUSHBUTTON "Y&ukarı Taşı", IDC_MOVEUP_BTN,320,74,70,14 PUSHBUTTON "&Aşağı Taşı", IDC_MOVEDN_BTN,320,91,70,14 - LTEXT "K&ullanılabilir Düğmeler:", -1,4,5,120,10 + LTEXT "Ku&llanılabilir Düğmeler:", -1,4,5,120,10 LISTBOX IDC_AVAILBTN_LBOX,5,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP PUSHBUTTON "&Ekle ->", IDOK, 132, 42, 55, 14 PUSHBUTTON "<- &Kaldır", IDC_REMOVE_BTN,132,62,55,14 diff --git a/dll/win32/comctl32/rsrc.rc b/dll/win32/comctl32/rsrc.rc index 273fb7acccf..e6c62a99a3b 100644 --- a/dll/win32/comctl32/rsrc.rc +++ b/dll/win32/comctl32/rsrc.rc @@ -162,12 +162,12 @@ IDI_TT_ERROR_SM ICON idi_tt_error_sm.ico #ifdef LANGUAGE_SK_SK #include "lang/comctl_Sk.rc" #endif -#ifdef LANGUAGE_SQ_AL - #include "lang/comctl_Sq.rc" -#endif #ifdef LANGUAGE_SL_SI #include "lang/comctl_Si.rc" #endif +#ifdef LANGUAGE_SQ_AL + #include "lang/comctl_Sq.rc" +#endif #ifdef LANGUAGE_SR_SP #include "lang/comctl_Sr.rc" #endif diff --git a/dll/win32/comdlg32/lang/cdlg_Tr.rc b/dll/win32/comdlg32/lang/cdlg_Tr.rc index b360eb6f9fe..70568b8a69d 100644 --- a/dll/win32/comdlg32/lang/cdlg_Tr.rc +++ b/dll/win32/comdlg32/lang/cdlg_Tr.rc @@ -1,10 +1,7 @@ /* * Resources for Common Dialogs * - * Copyright 1999 Bertho Stultiens - * Copyright 1999 Klaas van Gend - * - * Translated to Turkish by Fatih Aşıcı in 2006 and Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2013. + * Copyrights: 2006 Fatih Aşıcı; 2013 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -26,22 +23,22 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE { IDS_FILENOTFOUND "Kütük bulunamadı." - IDS_VERIFYFILE "Doğru kütük adı verildiğini doğrulayınız." - IDS_CREATEFILE "Kütük bulunamadı.\n\ -Yeni bir kütük oluşturmak ister misiniz?" + IDS_VERIFYFILE "Lütfen doğru kütük adı verilmiş olduğunu doğrulayınız." + IDS_CREATEFILE "Kütük yok.\n\ +Kütük oluşturmak ister misiniz?" IDS_OVERWRITEFILE "Kütük önceden var.\n\ -Kütüğü değiştirmek ister misiniz?" +Onu değiştirmek ister misiniz?" IDS_INVALID_FILENAME_TITLE "Yolda geçersiz damga ya da damgalar var." - IDS_INVALID_FILENAME "Bir kütük adı aşağıdaki damgaları içeremez:\n\ + IDS_INVALID_FILENAME "Bir kütük adı aşağıdaki damgaların rastgele birini içeremez:\n\ / : < > |" - IDS_PATHNOTEXISTING "Kütük yolu bulunamadı." - IDS_FILENOTEXISTING "Kütük bulunamadı." + IDS_PATHNOTEXISTING "Kütük yolu yok." + IDS_FILENOTEXISTING "Kütük yok." } STRINGTABLE { IDS_UPFOLDER "Bir Düzey Yukarı" - IDS_NEWFOLDER "Yeni Bir Dizin Oluştur" + IDS_NEWFOLDER "Yeni Dizin Oluştur" IDS_LISTVIEW "Dizelge" IDS_REPORTVIEW "Ayrıntılar" IDS_TODESKTOP "Masaüstünü Araştır" @@ -51,55 +48,55 @@ STRINGTABLE { PD32_PRINT_TITLE "Yazdır" - PD32_VALUE_UREADABLE "Okunamayan Değer" - PD32_INVALID_PAGE_RANGE "Bu değer sayfa aralığında değil.\n\ -%1!d! ile %2!d! arasında bir değer giriniz." - PD32_FROM_NOT_ABOVE_TO "'Şuradan' değeri 'Şuraya' değerini geçemez." - PD32_MARGINS_OVERLAP "Kenarlıklar örtüşüyor ya da kâğıt hudutlarının dışına çıkıyor.\n\ -Kenarlıkları yeniden giriniz." - PD32_NR_OF_COPIES_EMPTY "'Kopya Sayısı' girişi boş olamaz." - PD32_TOO_LARGE_COPIES "Bu denli çok kopya yazıcı eliyle desteklenmiyor.\n\ -1 ile %d arasında bir değer giriniz." + PD32_VALUE_UREADABLE "Okunamayan Giriş" + PD32_INVALID_PAGE_RANGE "Bu değer sayfa aralığı içinde yer almıyor.\n\ +Lütfen %1!d! ile %2!d! arasında bir değer giriniz." + PD32_FROM_NOT_ABOVE_TO """Şuradan"" girişi ""Şuraya"" girişini geçemez." + PD32_MARGINS_OVERLAP "Kıyılar, örtüşüyor ya da kâğıt hudutlarının dışına çıkıyor.\n\ +Lütfen kıyıları yeniden giriniz." + PD32_NR_OF_COPIES_EMPTY """Kopya Sayısı"" alanı boş olamaz." + PD32_TOO_LARGE_COPIES "Bu denli çok sayıda kopya yazıcınız eliyle desteklenmiyor.\n\ +Lütfen 1 ile %d arasında bir değer giriniz." PD32_PRINT_ERROR "Bir yazıcı yanlışlığı oluştu." - PD32_NO_DEFAULT_PRINTER "Ön tanımlı yazıcı tanımlanmamış." + PD32_NO_DEFAULT_PRINTER "Ön tanımlı yazıcı tanımlanmadı." PD32_CANT_FIND_PRINTER "Yazıcı bulunamıyor." PD32_OUT_OF_MEMORY "Bellek dolu." PD32_GENERIC_ERROR "Bir yanlışlık oluştu." PD32_DRIVER_UNKNOWN "Bilinmeyen yazıcı sürücüsü." - PD32_NO_DEVICES "Sayfa ayarlamak veyâ belge yazdırmak gibi yazıcıyla ilgili işlemleri yapmadan önce bir yazıcı kurmalısınız. Önce bir yazıcı kurunuz, ardından yeniden deneyiniz." + PD32_NO_DEVICES "Sayfa ayarlamak veyâ bir belge yazdırmak gibi yazıcıyla ilgili görevleri yapabilmenizden önce bir yazıcı kurmanız gerekir. Lütfen bir yazıcı kurunuz ve yeniden deneyiniz." PD32_DEFAULT_PRINTER "Ön tanımlı yazıcı; " PD32_NR_OF_DOCUMENTS_IN_QUEUE "Kuyrukta %d belge var." - PD32_MARGINS_IN_INCHES "Kıyılıklar (inç olarak)" - PD32_MARGINS_IN_MILLIMETERS "Kıyılıklar (mm olarak)" + PD32_MARGINS_IN_INCHES "Kıyılar (inç)" + PD32_MARGINS_IN_MILLIMETERS "Kıyılar (mm)" PD32_MILLIMETERS "mm" PD32_PRINTER_STATUS_READY "Anık" PD32_PRINTER_STATUS_PAUSED "Durakladı; " PD32_PRINTER_STATUS_ERROR "Yanlışlık; " - PD32_PRINTER_STATUS_PENDING_DELETION "Silme işlemi bekleniyor; " + PD32_PRINTER_STATUS_PENDING_DELETION "Silme bekleniyor; " PD32_PRINTER_STATUS_PAPER_JAM "Kâğıt sıkıştı; " PD32_PRINTER_STATUS_PAPER_OUT "Kâğıt yok; " - PD32_PRINTER_STATUS_MANUAL_FEED "Elle kâğıt besleme; " - PD32_PRINTER_STATUS_PAPER_PROBLEM "Kâğıt sorunu var; " - PD32_PRINTER_STATUS_OFFLINE "Çevrim Dışı; " + PD32_PRINTER_STATUS_MANUAL_FEED "Elle kâğıt koyma; " + PD32_PRINTER_STATUS_PAPER_PROBLEM "Kâğıt sorunu; " + PD32_PRINTER_STATUS_OFFLINE "Yazıcı çevrim dışı; " PD32_PRINTER_STATUS_IO_ACTIVE "G/Ç Etkin; " - PD32_PRINTER_STATUS_BUSY "Kullanımda; " - PD32_PRINTER_STATUS_PRINTING "Yazdırılıyor; " + PD32_PRINTER_STATUS_BUSY "Dolu; " + PD32_PRINTER_STATUS_PRINTING "Yazdırıyor; " PD32_PRINTER_STATUS_OUTPUT_BIN_FULL "Çıkış tepsisi dolu; " - PD32_PRINTER_STATUS_NOT_AVAILABLE "Kullanılabilir değil; " + PD32_PRINTER_STATUS_NOT_AVAILABLE "Kullanılamaz; " PD32_PRINTER_STATUS_WAITING "Bekliyor; " - PD32_PRINTER_STATUS_PROCESSING "İlerliyor; " - PD32_PRINTER_STATUS_INITIALIZING "Anıklanıyor; " + PD32_PRINTER_STATUS_PROCESSING "İşliyor; " + PD32_PRINTER_STATUS_INITIALIZING "Başlatılıyor; " PD32_PRINTER_STATUS_WARMING_UP "Isınıyor; " PD32_PRINTER_STATUS_TONER_LOW "Toner az; " PD32_PRINTER_STATUS_NO_TONER "Toner yok; " PD32_PRINTER_STATUS_PAGE_PUNT "Sayfa atışı; " PD32_PRINTER_STATUS_USER_INTERVENTION "Kullanıcı eliyle iptal edildi; " - PD32_PRINTER_STATUS_OUT_OF_MEMORY "Yazıcının belleği dolu; " - PD32_PRINTER_STATUS_DOOR_OPEN "Yazıcının kapağı açık; " + PD32_PRINTER_STATUS_OUT_OF_MEMORY "Bellek dolu; " + PD32_PRINTER_STATUS_DOOR_OPEN "Yazıcı kapağı açık; " PD32_PRINTER_STATUS_SERVER_UNKNOWN "Yazıcı sunucusu bilinmiyor; " - PD32_PRINTER_STATUS_POWER_SAVE "Güç koruma kipinde; " + PD32_PRINTER_STATUS_POWER_SAVE "Güç tutum kipinde; " } STRINGTABLE /* Font styles */ @@ -132,9 +129,9 @@ STRINGTABLE /* Color names */ STRINGTABLE { - IDS_FONT_SIZE "%1!d! ile %2!d! arasında bir yazı tipi büyüklüğü seçiniz." + IDS_FONT_SIZE "%1!d! ile %2!d! punto arasında bir yazı tipi büyüklüğü seçiniz." IDS_SAVE_BUTTON "&Kaydet" - IDS_SAVE_IN "K&ayıt Yeri:" + IDS_SAVE_IN "K&aydetme Yeri:" IDS_SAVE "Kaydet" IDS_SAVE_AS "Ayrı Kaydet" IDS_OPEN_FILE "Kütük Aç" @@ -155,14 +152,14 @@ FONT 8, "MS Shell Dlg" LTEXT "&Dizinler:", -1, 110, 6, 92, 9 LTEXT "", stc1, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX lst2, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "D&izelgelenecek Kütük Türleri:", stc2, 6, 104, 90, 9 + LTEXT "K&ütük Türü Dizelgesi:", stc2, 6, 104, 90, 9 COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "&Sürücüler:", stc4, 110, 104, 92, 9 COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "Aç", IDOK, 208, 6, 60, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "İptal", IDCANCEL, 208, 24, 60, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Yardım", pshHelp, 208, 46, 60, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "S&alt Okunur", chx1, 208, 68, 65, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Y&alnızca Okunur", chx1, 208, 68, 65, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -177,14 +174,14 @@ FONT 8, "MS Shell Dlg" LTEXT "&Dizinler:", -1, 110, 6, 92, 9 LTEXT "", stc1, 110, 18, 92, 9, SS_NOPREFIX | WS_GROUP LISTBOX lst2, 110, 32, 92, 68, LBS_STANDARD | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_DISABLENOSCROLL | WS_TABSTOP - LTEXT "D&izelgelenecek Kütük Türleri:", stc2, 6, 104, 90, 9 + LTEXT "K&ütük Türü Dizelgesi:", stc2, 6, 104, 90, 9 COMBOBOX cmb1, 6, 114, 90, 36, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_BORDER | WS_VSCROLL | WS_TABSTOP LTEXT "&Sürücüler:", stc4, 110, 104, 92, 9 COMBOBOX cmb2, 110, 114, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "Ayrı Kaydet", IDOK, 208, 6, 60, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "İptal", IDCANCEL, 208, 24, 60, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Yardım", pshHelp, 208, 46, 60, 14, WS_GROUP | WS_TABSTOP - CHECKBOX "S&alt Okunur", chx1, 208, 68, 65, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "Y&alnızca Okunur", chx1, 208, 68, 65, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP } @@ -204,7 +201,7 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Ayarla", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP LTEXT "&Şuradan:", stc3, 60, 80, 30, 9 LTEXT "Ş&uraya:", stc4, 120, 80, 30, 9 - LTEXT "&Baskı Niteliği:", stc5, 6, 100, 76, 9 + LTEXT "Ya&zdırma Niteliği:", stc5, 6, 100, 76, 9 COMBOBOX cmb1, 80, 100, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP CHECKBOX "&Kütüğe Yaz", chx1, 20, 120, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP CHECKBOX "Y&oğun", chx2, 160, 120, 50, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP @@ -213,25 +210,25 @@ FONT 8, "MS Shell Dlg" PRINT_SETUP DIALOG 36, 24, 264, 134 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Yazdırma Ayarları" +CAPTION "Yazıcı Ayarla" FONT 8, "MS Shell Dlg" { GROUPBOX "Yazıcı", grp1, 6, 6, 180, 72, BS_GROUPBOX RADIOBUTTON "&Ön Tanımlı Yazıcı", rad1, 16, 16, 150, 12 LTEXT "[Yok]", stc1, 35, 30, 120, 9 - RADIOBUTTON "&Husûsî Yazıcı", rad2, 16, 44, 150, 12 + RADIOBUTTON "&Belirli Yazıcı", rad2, 16, 44, 150, 12 COMBOBOX cmb1, 35, 58, 145, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP DEFPUSHBUTTON "Tamam", IDOK, 206, 6, 56, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP PUSHBUTTON "İptal", IDCANCEL, 206, 24, 56, 14, WS_GROUP | WS_TABSTOP PUSHBUTTON "&Ayarla", psh1, 206, 46, 56, 14, WS_GROUP | WS_TABSTOP - GROUPBOX "Hizâlama", grp2, 6, 82, 100, 50, BS_GROUPBOX + GROUPBOX "Yön", grp2, 6, 82, 100, 50, BS_GROUPBOX RADIOBUTTON "&Portre", rad3, 50, 95, 50, 12 - RADIOBUTTON "P&eyzaj", rad4, 50, 110, 50, 12 + RADIOBUTTON "&Kır Resmi", rad4, 50, 110, 50, 12 ICON "LANDSCAP", stc10, 10, 95, 32, 32 ICON "PORTRAIT", stc11, 10, 95, 32, 32 GROUPBOX "Kâğıt", grp3, 116, 82, 178, 50, BS_GROUPBOX - LTEXT "&Boyutlar", stc2, 126, 95, 35, 9 - LTEXT "&Kaynak", stc3, 126, 110, 35, 9 + LTEXT "B&oyutlar", stc2, 126, 95, 35, 9 + LTEXT "Ka&ynak", stc3, 126, 110, 35, 9 COMBOBOX cmb2, 155, 95, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP COMBOBOX cmb3, 155, 110, 92, 68, CBS_DROPDOWNLIST | CBS_OWNERDRAWFIXED | CBS_AUTOHSCROLL | CBS_SORT | CBS_HASSTRINGS | WS_BORDER | WS_VSCROLL | WS_TABSTOP } @@ -283,7 +280,7 @@ FONT 8, "MS Shell Dlg" EDITTEXT IDC_COLOR_EDIT_G, 275,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Mâvi:", IDC_COLOR_BL /*1096*/,247,154,27,10 EDITTEXT IDC_COLOR_EDIT_B, 275,152,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "&Tür:" , IDC_COLOR_HL /*1091*/,200,126,24,10 + LTEXT "&Renk:" , IDC_COLOR_HL /*1091*/,200,126,24,10 EDITTEXT IDC_COLOR_EDIT_H, 224,124,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP LTEXT "&Doygunluk:", IDC_COLOR_SL /*1092*/,200,140,24,10 EDITTEXT IDC_COLOR_EDIT_S, 224,138,21,12, WS_BORDER | WS_GROUP | WS_TABSTOP @@ -308,10 +305,10 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Ara" FONT 8, "MS Shell Dlg" { - LTEXT "A&ranacak:", -1, 4, 8, 52, 8 + LTEXT "A&ranan:", -1, 4, 8, 52, 8 EDITTEXT edt1, 57, 7, 148, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "Ya&lnızca Dizginin Tümünü Ara", chx1, 4, 26, 140, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Büyük ya da Küçük Harf Duyarlılığı", chx2, 4, 42, 140, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Ya&lnızca Tüm Dizgiyi Karşılaştır", chx1, 4, 26, 140, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Büyük-Küçük Harfliği Karşılaştır", chx2, 4, 42, 140, 12, BS_AUTOCHECKBOX | WS_TABSTOP GROUPBOX "Yön", grp1, 147, 21, 58, 38 CONTROL "Y&ukarı", rad1, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 151, 30, 48, 12 CONTROL "&Aşağı", rad2, "BUTTON", BS_AUTORADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, 151, 44, 48, 12 @@ -327,12 +324,12 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Değiştir" FONT 8, "MS Shell Dlg" { - LTEXT "A&ranacak:", -1, 4, 8, 52, 8 + LTEXT "A&ranan:", -1, 4, 8, 52, 8 EDITTEXT edt1, 57, 7, 148, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - LTEXT "Y&eni Dizgi:", -1, 4, 26, 52, 8 + LTEXT "&Şununla Değiştir:", -1, 4, 26, 52, 8 EDITTEXT edt2, 57, 24, 148, 12, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP - CHECKBOX "Ya&lnızca Dizginin Tümünü Ara", chx1, 5, 46, 120, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP - CHECKBOX "&Büyük ya da Küçük Harf Duyarlılığı", chx2, 5, 62, 120, 12, BS_AUTOCHECKBOX | WS_TABSTOP + CHECKBOX "Ya&lnızca Tüm Dizgiyi Karşılaştır", chx1, 5, 46, 120, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP + CHECKBOX "&Büyük-Küçük Harfliği Karşılaştır", chx2, 5, 62, 120, 12, BS_AUTOCHECKBOX | WS_TABSTOP DEFPUSHBUTTON "Sonrakini Ara", IDOK, 212, 6, 60, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON PUSHBUTTON "&Değiştir", psh1 , 212, 24, 60, 14, WS_GROUP | WS_TABSTOP @@ -355,7 +352,7 @@ FONT 8, "MS Shell Dlg" GROUPBOX "Yazıcı", grp4, 8, 4, 272,84, WS_GROUP CONTROL "&Kütüğe Yaz", chx1, "Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,185,36,90,16 PUSHBUTTON "&Husûsiyetler", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "Ya&zıcı Adı:", stc6, 16, 20, 36,8 + LTEXT "&Ad:", stc6, 16, 20, 36,8 COMBOBOX cmb4, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP LTEXT "Durum:", stc8, 16, 36, 47,10, SS_NOPREFIX LTEXT "", stc12, 65, 36, 120,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP @@ -367,9 +364,9 @@ FONT 8, "MS Shell Dlg" LTEXT "", stc13, 65, 72, 212,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP GROUPBOX "Kopyalar", grp2, 160, 92, 120,64, WS_GROUP - LTEXT "&Kopya Sayısı:",stc5,168,105,68,8 + LTEXT "K&opya Sayısı:",stc5,168,105,68,8 ICON "", ico3, 170,131, 76,24, WS_GROUP | SS_CENTERIMAGE - CONTROL "H&armanla", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,168,118,100,12 + CONTROL "Ha&rmanla", chx2,"Button",BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP,168,118,100,12 EDITTEXT edt3, 240,103, 32,12, WS_GROUP | ES_NUMBER GROUPBOX "Aralığı Yazdır", grp1, 8,92, 144,64, WS_GROUP @@ -384,7 +381,7 @@ FONT 8, "MS Shell Dlg" PRINT32_SETUP DIALOG 32, 32, 288, 178 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | DS_CONTEXTHELP | DS_3DLOOK -CAPTION "Yazdırma Ayarları" +CAPTION "Yazıcı Ayarla" FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "Tamam",IDOK,176,156,50,14,WS_GROUP @@ -393,47 +390,47 @@ BEGIN GROUPBOX "Yazıcı", grp4, 8, 4, 272,84, WS_GROUP PUSHBUTTON "&Husûsiyetler", psh2, 212, 17, 60,14, WS_GROUP - LTEXT "&Adı:", stc6, 16, 20, 36,8 + LTEXT "&Ad:", stc6, 16, 20, 36,8 COMBOBOX cmb1, 52, 18, 152,152,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "Durumu:", stc8, 16, 36, 47,10, SS_NOPREFIX + LTEXT "Durum:", stc8, 16, 36, 47,10, SS_NOPREFIX LTEXT "", stc12, 65, 36, 212,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "Türü:", stc7, 16, 48, 47,10, SS_NOPREFIX + LTEXT "Tür:", stc7, 16, 48, 47,10, SS_NOPREFIX LTEXT "", stc11, 65, 48, 212,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "Konumu:", stc10, 16, 60, 47,10, SS_NOPREFIX + LTEXT "Konum:", stc10, 16, 60, 47,10, SS_NOPREFIX LTEXT "", stc14, 65, 60, 212,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP - LTEXT "Açıklaması:", stc9, 16, 72, 47,10, SS_NOPREFIX + LTEXT "Açıklama:", stc9, 16, 72, 47,10, SS_NOPREFIX LTEXT "", stc13, 65, 72, 212,10, SS_NOPREFIX | SS_LEFTNOWORDWRAP GROUPBOX "Kâğıt", grp2, 8, 92, 164,56, WS_GROUP - LTEXT "&Boyutları:", stc2, 16,108, 36, 8 + LTEXT "B&oyutlar:", stc2, 16,108, 36, 8 COMBOBOX cmb2, 52,106, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - LTEXT "&Kaynağı:", stc3, 16,128, 36, 8 + LTEXT "Ka&ynak:", stc3, 16,128, 36, 8 COMBOBOX cmb3, 52,126, 112,112,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - GROUPBOX "Hizâlama", grp1, 180, 92, 100,56, WS_GROUP + GROUPBOX "Yön", grp1, 180, 92, 100,56, WS_GROUP ICON "", ico1, 195,112, 18,20, WS_GROUP CONTROL "&Portre", rad1,"Button",BS_AUTORADIOBUTTON | WS_GROUP |WS_TABSTOP,224,106,52,12 - CONTROL "P&eyzaj", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 + CONTROL "&Kır Resmi", rad2,"Button",BS_AUTORADIOBUTTON,224,126,52,12 END PAGESETUPDLGORD DIALOG 32, 32, 240, 240 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU -CAPTION "Sayfa Ayarları" +CAPTION "Sayfa Ayarla" FONT 8, "MS Shell Dlg" BEGIN CONTROL "", rct1, "Static", SS_WHITERECT, 80, 8, 80, 80 CONTROL "", rct2, "Static", SS_GRAYRECT, 160, 12, 4, 80 CONTROL "", rct3, "Static", SS_GRAYRECT, 84, 88, 80, 4 GROUPBOX "Kâğıt", grp2, 8, 96, 224, 56, BS_GROUPBOX - LTEXT "&Boyutları:", stc2, 16, 112, 36, 8 + LTEXT "B&oyutlar:", stc2, 16, 112, 36, 8 COMBOBOX cmb2, 64, 110, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL - LTEXT "&Kaynağı:", stc3, 16, 132, 36, 8 + LTEXT "Ka&ynak:", stc3, 16, 132, 36, 8 COMBOBOX cmb3, 64, 130, 160, 160, CBS_SIMPLE|CBS_DROPDOWN|CBS_SORT|WS_GROUP|WS_TABSTOP|WS_VSCROLL - GROUPBOX "Hizâlama", grp1, 8, 156, 64, 56, BS_GROUPBOX - AUTORADIOBUTTON "&Düşey", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON - AUTORADIOBUTTON "&Yatay", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON - GROUPBOX "Kıyılıklar", grp4, 80, 156, 152, 56, BS_GROUPBOX - LTEXT "S&ol:", stc15, 88, 172, 30, 8 + GROUPBOX "Yön", grp1, 8, 156, 64, 56, BS_GROUPBOX + AUTORADIOBUTTON "&Portre", rad1, 16, 170, 52, 12, BS_AUTORADIOBUTTON + AUTORADIOBUTTON "&Kır Resmi", rad2, 16, 190, 52, 12, BS_AUTORADIOBUTTON + GROUPBOX "Kıyılar", grp4, 80, 156, 152, 56, BS_GROUPBOX + LTEXT "So&l:", stc15, 88, 172, 30, 8 EDITTEXT edt4, 119, 170, 36, 12, WS_TABSTOP|WS_GROUP|WS_BORDER LTEXT "&Sağ:", stc16, 159, 172, 30, 8 EDITTEXT edt6, 190, 170, 36, 12, WS_TABSTOP|WS_GROUP|WS_BORDER diff --git a/dll/win32/comdlg32/rsrc.rc b/dll/win32/comdlg32/rsrc.rc index 3a410b809fa..01760c79f19 100644 --- a/dll/win32/comdlg32/rsrc.rc +++ b/dll/win32/comdlg32/rsrc.rc @@ -115,12 +115,12 @@ #ifdef LANGUAGE_SK_SK #include "lang/cdlg_Sk.rc" #endif -#ifdef LANGUAGE_SQ_AL - #include "lang/cdlg_Sq.rc" -#endif #ifdef LANGUAGE_SL_SI #include "lang/cdlg_Si.rc" #endif +#ifdef LANGUAGE_SQ_AL + #include "lang/cdlg_Sq.rc" +#endif #ifdef LANGUAGE_SR_SP #include "lang/cdlg_Sr.rc" #endif diff --git a/dll/win32/credui/lang/credui_Tr.rc b/dll/win32/credui/lang/credui_Tr.rc index e2d070d33c5..f8794d8212a 100644 --- a/dll/win32/credui/lang/credui_Tr.rc +++ b/dll/win32/credui/lang/credui_Tr.rc @@ -45,8 +45,8 @@ STRINGTABLE { IDS_TITLEFORMAT "Bağlan: %s" IDS_MESSAGEFORMAT "Bağlanıyor: %s" - IDS_INCORRECTPASSWORDTITLE "Oturum açma başarısız oldu." - IDS_INCORRECTPASSWORD "Kullanıcı adınızın ve şifrenizin\ndoğrulundan emin olunuz." + IDS_INCORRECTPASSWORDTITLE "Oturum açma başarısız." + IDS_INCORRECTPASSWORD "Kullanıcı adınızın ve şifrenizin\ndoğru olduğundan emin olunuz." IDS_CAPSLOCKONTITLE "Büyük Harf Kilidi açık." - IDS_CAPSLOCKON "Büyük Harf Kilidi'nin açık olması girdiğiniz şifrenin yanlış olmasına neden olabilir.\n\nŞifrenizi girmeden önce Büyük Harf Kilidi'ni kapatmak için düğme takımınızdaki Büyük Harf Kilidi düğmesine basınız." + IDS_CAPSLOCKON "Büyük Harf Kilidi'nin açık olması şifrenizi yanlış girmenize neden olabilir.\n\nŞifrenizi girmeden önce Büyük Harf Kilidi'ni kapatmak için düğme takımınızdaki Büyük Harf Kilidi düğmesine basınız." } diff --git a/dll/win32/crypt32/lang/crypt32_Tr.rc b/dll/win32/crypt32/lang/crypt32_Tr.rc index dd8e0ecbaed..7aeb43bee74 100644 --- a/dll/win32/crypt32/lang/crypt32_Tr.rc +++ b/dll/win32/crypt32/lang/crypt32_Tr.rc @@ -1,9 +1,7 @@ /* * crypt32 dll resources * - * Copyright (C) 2006 Juan Lang - * - * Translated to Turkish by Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2013 and 2014. + * Copyright: 2013 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -25,11 +23,11 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE { IDS_AUTHORITY_KEY_ID "Yetki Anahtarı Tanımlayıcısı" - IDS_KEY_ATTRIBUTES "Anahtar Husûsiyetleri" + IDS_KEY_ATTRIBUTES "Anahtar Öz Nitelikleri" IDS_KEY_USAGE_RESTRICTION "Anahtar Kullanımı Kısıtlaması" - IDS_SUBJECT_ALT_NAME "Konu Diğer Adı" - IDS_ISSUER_ALT_NAME "Dağıtan Diğer Adı" - IDS_BASIC_CONSTRAINTS "Ana Kısıtlamalar" + IDS_SUBJECT_ALT_NAME "Konu Başka Adı" + IDS_ISSUER_ALT_NAME "Yayımlayan Başka Adı" + IDS_BASIC_CONSTRAINTS "Başlıca Kısıtlamaları" IDS_KEY_USAGE "Anahtar Kullanımı" IDS_CERT_POLICIES "Onay Belgesi İlkeleri" IDS_SUBJECT_KEY_IDENTIFIER "Konu Anahtarı Tanımlayıcısı" @@ -40,69 +38,69 @@ STRINGTABLE IDS_CERT_EXTENSIONS "Onay Belgesi Eklentileri" IDS_NEXT_UPDATE_LOCATION "Bir Sonraki Şimdikileştirme Konumu" IDS_YES_OR_NO_TRUST "Güvenmeye Evet ya da Hayır" - IDS_EMAIL_ADDRESS "E-Posta Adresi" - IDS_UNSTRUCTURED_NAME "Yapılık Olmayan Ad" + IDS_EMAIL_ADDRESS "Posta Adresi" + IDS_UNSTRUCTURED_NAME "Yapılandırılmamış Ad" IDS_CONTENT_TYPE "İçerik Türü" IDS_MESSAGE_DIGEST "İleti Özeti" IDS_SIGNING_TIME "İmzâlama Zamânı" IDS_COUNTER_SIGN "Onay İmzâsı" IDS_CHALLENGE_PASSWORD "Şifre Sorma" - IDS_UNSTRUCTURED_ADDRESS "Yapılık Olmayan Adres" + IDS_UNSTRUCTURED_ADDRESS "Yapılandırılmamış Adres" IDS_SMIME_CAPABILITIES "S/MIME Yetenekleri" IDS_PREFER_SIGNED_DATA "İmzâlı Veriyi Yeğleme" IDS_CPS "CPS" - IDS_USER_NOTICE "Kullanıcı Bildirisi" + IDS_USER_NOTICE "Kullanıcı Bildirimi" IDS_OCSP "Çevrim İçi Onay Belgesi Durum Protokolü" - IDS_CA_ISSUER "Onaylama Yetkilisi Dağıtıcısı" - IDS_CERT_TEMPLATE_NAME "Onay Belgesi Örnek Adı" + IDS_CA_ISSUER "Onay Belgesi Yetkilisi Yayımcısı" + IDS_CERT_TEMPLATE_NAME "Onay Belgesi Kalıbı Adı" IDS_CERT_TYPE "Onay Belgesi Türü" IDS_CERT_MANIFOLD "Onay Belgesi Kopyası" IDS_NETSCAPE_CERT_TYPE "Netscape Onay Belgesi Türü" - IDS_NETSCAPE_BASE_URL "Netscape Tabanlı URL" + IDS_NETSCAPE_BASE_URL "Netscape Başlıca URL'si" IDS_NETSCAPE_REVOCATION_URL "Netscape İptal URL'si" IDS_NETSCAPE_CA_REVOCATION_URL "Netscape CA İptal URL'si" IDS_NETSCAPE_CERT_RENEWAL_URL "Netscape Onay Belgesi Yenileme URL'si" IDS_NETSCAPE_CA_POLICY_URL "Netscape CA İlke URL'si" IDS_NETSCAPE_SSL_SERVER_NAME "Netscape SSL Sunucu Adı" IDS_NETSCAPE_COMMENT "Netscape Yorumu" - IDS_COUNTRY "Ülke/Bölge" - IDS_ORGANIZATION "Kuruluş" + IDS_COUNTRY "Ülkesi/Bölgesi" + IDS_ORGANIZATION "Kuruluşu" IDS_ORGANIZATIONAL_UNIT "Kuruluş Birimi" - IDS_COMMON_NAME "Bilinen Adı" - IDS_LOCALITY "Konum" - IDS_STATE_OR_PROVINCE "İl veyâ Eyâlet" - IDS_TITLE "Başlık" - IDS_GIVEN_NAME "Verilen Ad" + IDS_COMMON_NAME "Ortak Adı" + IDS_LOCALITY "Yerliliği" + IDS_STATE_OR_PROVINCE "İli veyâ Eyâleti" + IDS_TITLE "Başlığı" + IDS_GIVEN_NAME "Verilen Adı" IDS_INITIALS "Baş Harfleri" - IDS_SUR_NAME "Soyadı" + IDS_SUR_NAME "Takma Adı" IDS_DOMAIN_COMPONENT "Etki Alanı Bileşeni" IDS_STREET_ADDRESS "Sokak Adresi" IDS_SERIAL_NUMBER "Dizi Numarası" IDS_CA_VERSION "CA Sürümü" IDS_CROSS_CA_VERSION "Çapraz CA Sürümü" - IDS_SERIALIZED_SIG_SERIAL_NUMBER "Dizilendirilmiş İmzâ Dizi Numarası" - IDS_PRINCIPAL_NAME "Asıl Adı" + IDS_SERIALIZED_SIG_SERIAL_NUMBER "Dizilendirilmiş İmzâ Dizisi Numarası" + IDS_PRINCIPAL_NAME "Gerçek Adı" IDS_WINDOWS_PRODUCT_UPDATE "Windows Ürünü Şimdikileştirmesi" - IDS_ENROLLMENT_NAME_VALUE_PAIR "Kaydedilmiş Ad Değeri Çifti" + IDS_ENROLLMENT_NAME_VALUE_PAIR "Kayıt Adı Değeri Çifti" IDS_OS_VERSION "İşletim Dizgesi Sürümü" IDS_ENROLLMENT_CSP "Kayıt CSP'si" IDS_CRL_NUMBER "CRL Numarası" IDS_DELTA_CRL_INDICATOR "Delta CRL Göstergesi" IDS_ISSUING_DIST_POINT "Yayımlama Dağıtım Noktası" - IDS_FRESHEST_CRL "En Yeni CRL" + IDS_FRESHEST_CRL "En Yeni CRL'si" IDS_NAME_CONSTRAINTS "Ad Kısıtlamaları" - IDS_POLICY_MAPPINGS "İlke Plalamaları" + IDS_POLICY_MAPPINGS "İlke Tasarlamaları" IDS_POLICY_CONSTRAINTS "İlke Kısıtlamaları" - IDS_CROSS_CERT_DIST_POINTS "Çapraz Onaylama Dağıtım Noktaları" + IDS_CROSS_CERT_DIST_POINTS "Çapraz Onay Belgesi Dağıtım Noktaları" IDS_APPLICATION_POLICIES "Uygulama İlkeleri" - IDS_APPLICATION_POLICY_MAPPINGS "Uygulama İlke Planlamaları" + IDS_APPLICATION_POLICY_MAPPINGS "Uygulama İlke Tasarlamaları" IDS_APPLICATION_POLICY_CONSTRAINTS "Uygulama İlke Kısıtlamaları" IDS_CMC_DATA "CMC Verisi" IDS_CMC_RESPONSE "CMC Yanıtı" IDS_UNSIGNED_CMC_REQUEST "İmzâlanmamış CMC İsteği" IDS_CMC_STATUS_INFO "CMC Durum Bilgisi" IDS_CMC_EXTENSIONS "CMC Eklentileri" - IDS_CMC_ATTRIBUTES "CMC Öznitelikleri" + IDS_CMC_ATTRIBUTES "CMC Öz Nitelikleri" IDS_PKCS_7_DATA "PKCS 7 Verisi" IDS_PKCS_7_SIGNED "PKCS 7 İmzâlı" IDS_PKCS_7_ENVELOPED "PKCS 7 Zarflı" @@ -110,47 +108,47 @@ STRINGTABLE IDS_PKCS_7_DIGESTED "PKCS 7 Özetlenmiş" IDS_PKCS_7_ENCRYPTED "PKCS 7 Şifreli" IDS_PREVIOUS_CA_CERT_HASH "Bir Önceki CA Onay Belgesi Kodu" - IDS_CRL_VIRTUAL_BASE "Farazî Taban CRL Numarası" - IDS_CRL_NEXT_PUBLISH "Bir Sonraki CRL Yayımlaması" + IDS_CRL_VIRTUAL_BASE "Farazî Başlıca CRL Numarası" + IDS_CRL_NEXT_PUBLISH "Bir Sonraki CRL Yayımı" IDS_CA_EXCHANGE "CA Şifreleme Onay Belgesi" IDS_KEY_RECOVERY_AGENT "Anahtar Kurtarma Yardımcısı" - IDS_CERTIFICATE_TEMPLATE "Onay Belgesi Örnek Bilgisi" + IDS_CERTIFICATE_TEMPLATE "Onay Belgesi Kalıp Bilgisi" IDS_ENTERPRISE_ROOT_OID "Kuruluş Kök OID'si" IDS_RDN_DUMMY_SIGNER "Kukla İmzâlayıcısı" - IDS_ARCHIVED_KEY_ATTR "Şifrelenmiş Husûsî Anahtar" + IDS_ARCHIVED_KEY_ATTR "Şifrelenmiş Husûsî Anahtarı" IDS_CRL_SELF_CDP "Yayımlanan CRL Konumları" - IDS_REQUIRE_CERT_CHAIN_POLICY "Onay Belgesi Dizi İlkesini Zorlama" - IDS_TRANSACTION_ID "Eylem Kimliği" - IDS_SENDER_NONCE "Şimdiki Gönderici" - IDS_RECIPIENT_NONCE "Şimdiki Alıcı" + IDS_REQUIRE_CERT_CHAIN_POLICY "Onay Belgesi Dizi İlkesini Zorla" + IDS_TRANSACTION_ID "İşlem Kimliği" + IDS_SENDER_NONCE "Şimdiki Göndericisi" + IDS_RECIPIENT_NONCE "Şimdiki Alıcısı" IDS_REG_INFO "Kayıt Bilgisi" - IDS_GET_CERTIFICATE "Onay Belgesi Al" - IDS_GET_CRL "CRL Al" + IDS_GET_CERTIFICATE "Onay Belgesini Al" + IDS_GET_CRL "CRL'yi Al" IDS_REVOKE_REQUEST "İsteği İptal Et" IDS_QUERY_PENDING "Sorgu Beklemede" IDS_SORTED_CTL "Onay Belgesi Güven Dizelgesi" IDS_ARCHIVED_KEY_CERT_HASH "Belgeliklenmiş Anahtar Onaylama Kodu" IDS_PRIVATE_KEY_USAGE_PERIOD "Husûsî Anahtar Kullanım Dönemi" IDS_CLIENT_INFORMATION "İstemci Bilgisi" - IDS_SERVER_AUTHENTICATION "Sunucu Yetkilendirmesi" - IDS_CLIENT_AUTHENTICATION "İstemci Yetkilendirmesi" + IDS_SERVER_AUTHENTICATION "Sunucu Kimlik Doğrulaması" + IDS_CLIENT_AUTHENTICATION "İstemci Kimlik Doğrulaması" IDS_CODE_SIGNING "Kod İmzâlama" - IDS_SECURE_EMAIL "Güvenli E-Posta" + IDS_SECURE_EMAIL "Postayı Güvenli Kılma" IDS_TIME_STAMPING "Zaman Damgalama" - IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Güven Dizelgesi İmzâlaması" - IDS_MICROSOFT_TIME_STAMPING "Microsoft Zaman Damgalaması" - IDS_IPSEC_END_SYSTEM "IP Güvenlik Uç Dizgesi" - IDS_IPSEC_TUNNEL "IP Güvenlik Tünel Sonu" - IDS_IPSEC_USER "IP Güvenlik Kullanıcısı" - IDS_EFS "Şifreleyici Kütük Dizgesi" + IDS_MICROSOFT_TRUST_LIST_SIGNING "Microsoft Güven Dizelgesi İmzâlama" + IDS_MICROSOFT_TIME_STAMPING "Microsoft Zaman Damgalama" + IDS_IPSEC_END_SYSTEM "IP Güvenliği Uç Dizgesi" + IDS_IPSEC_TUNNEL "IP Güvenliği Tünel Sonlandırması" + IDS_IPSEC_USER "IP Güvenliği Kullanıcısı" + IDS_EFS "Şifreleme Kütük Dizgesi" IDS_WHQL_CRYPTO "Windows Donanım Sürücüsü Doğrulaması" IDS_NT5_CRYPTO "Windows Dizge Bileşeni Doğrulaması" IDS_OEM_WHQL_CRYPTO "OEM Windows Dizge Bileşeni Doğrulaması" IDS_EMBEDDED_NT_CRYPTO "Gömülü Windows Dizge Bileşeni Doğrulaması" IDS_KEY_PACK_LICENSES "Anahtar Paketi Rusatları" IDS_LICENSE_SERVER "Ruhsat Sunucusu Doğrulaması" - IDS_SMART_CARD_LOGON "Akıllı Kart ile Oturum Açma" - IDS_DIGITAL_RIGHTS "Sayılık Haklar" + IDS_SMART_CARD_LOGON "Akıllı Kartla Oturum Açma" + IDS_DIGITAL_RIGHTS "Sayılık Hakları" IDS_QUALIFIED_SUBORDINATION "Nitelikli Bağlılık" IDS_KEY_RECOVERY "Anahtar Kurtarma" IDS_DOCUMENT_SIGNING "Belge İmzâlama" @@ -158,32 +156,32 @@ STRINGTABLE IDS_FILE_RECOVERY "Kütük Kurtarma" IDS_ROOT_LIST_SIGNER "Kök Dizelgesi İmzâlayıcısı" IDS_ANY_APPLICATION_POLICIES "Tüm Uygulama İlkeleri" - IDS_DS_EMAIL_REPLICATION "Dizin Hizmeti E-Posta Kopyası" + IDS_DS_EMAIL_REPLICATION "Dizin Hizmeti Posta Çoğlatması" IDS_ENROLLMENT_AGENT "Onay Belgesi İstek Yardımcısı" IDS_LIFETIME_SIGNING "Yaşam Boyu İmzâlama" - IDS_ANY_CERT_POLICY "Tüm Yayımlama İlkeleri" + IDS_ANY_CERT_POLICY "Tüm Verme İlkeleri" } STRINGTABLE { - IDS_LOCALIZEDNAME_ROOT "Güvenilir Kök Onaylama Yetkilileri" + IDS_LOCALIZEDNAME_ROOT "Güvenilen Kök Onay Belgesi Yetkilileri" IDS_LOCALIZEDNAME_MY "Şahsî" - IDS_LOCALIZEDNAME_CA "Ara Onaylama Yetkilileri" - IDS_LOCALIZEDNAME_ADDRESSBOOK "Diğer İnsanlar" - IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Güvenilir Yayımcılar" + IDS_LOCALIZEDNAME_CA "Ara Onay Belgesi Yetkilileri" + IDS_LOCALIZEDNAME_ADDRESSBOOK "Başka Kişiler" + IDS_LOCALIZEDNAME_TRUSTEDPUBLISHER "Güvenilen Yayımcılar" IDS_LOCALIZEDNAME_DISALLOWED "Güvenilmeyen Onay Belgeleri" } STRINGTABLE { IDS_KEY_ID "Anahtar Kimliği=" - IDS_CERT_ISSUER "Onay Belgesi Dağıtıcısı" + IDS_CERT_ISSUER "Onay Belgesi Yayımcısı" IDS_CERT_SERIAL_NUMBER "Onay Belgesi Dizi Numarası=" - IDS_ALT_NAME_OTHER_NAME "Diğer Adı=" - IDS_ALT_NAME_RFC822_NAME "E-Posta Adresi=" + IDS_ALT_NAME_OTHER_NAME "Başka Adı=" + IDS_ALT_NAME_RFC822_NAME "Posta Adresi=" IDS_ALT_NAME_DNS_NAME "DNS Adı=" IDS_ALT_NAME_DIRECTORY_NAME "Dizin Adresi" - IDS_ALT_NAME_URL "URL=" + IDS_ALT_NAME_URL "URL'si=" IDS_ALT_NAME_IP_ADDRESS "IP Adresi=" IDS_ALT_NAME_MASK "Maskesi=" IDS_ALT_NAME_REGISTERED_ID "Kayıtlı Kimliği=" @@ -197,39 +195,39 @@ STRINGTABLE IDS_AIA "Yetkili Bilgi Erişimi" IDS_ACCESS_METHOD "Erişim Yöntemi=" IDS_ACCESS_METHOD_OCSP "OCSP" - IDS_ACCESS_METHOD_CA_ISSUERS "CA Dağıtıcıları" + IDS_ACCESS_METHOD_CA_ISSUERS "CA Yayımcıları" IDS_ACCESS_METHOD_UNKNOWN "Bilinmeyen Erişim Yöntemi" - IDS_ACCESS_LOCATION "Diğer Adı" + IDS_ACCESS_LOCATION "Başka Adı" IDS_CRL_DIST_POINT "CRL Dağıtım Noktası" IDS_CRL_DIST_POINT_NAME "Dağıtım Noktası Adı" - IDS_CRL_DIST_POINT_FULL_NAME "Tam Adı" + IDS_CRL_DIST_POINT_FULL_NAME "Tüm Adı" IDS_CRL_DIST_POINT_RDN_NAME "RDN Adı" IDS_CRL_DIST_POINT_REASON "CRL Nedeni=" - IDS_CRL_DIST_POINT_ISSUER "CRL Dağıtıcısı" + IDS_CRL_DIST_POINT_ISSUER "CRL Yayımcısı" IDS_REASON_KEY_COMPROMISE "Anahtar Uyuşması" IDS_REASON_CA_COMPROMISE "CA Uyuşması" IDS_REASON_AFFILIATION_CHANGED "Üyelik Değişti" IDS_REASON_SUPERSEDED "Yerine Geçti" - IDS_REASON_CESSATION_OF_OPERATION "İşlem Sona Erdi" + IDS_REASON_CESSATION_OF_OPERATION "İşlem Durduruldu" IDS_REASON_CERTIFICATE_HOLD "Onay Belgesini Tutma" IDS_FINANCIAL_CRITERIA "Mâlî Bilgi=" IDS_FINANCIAL_CRITERIA_AVAILABLE "Var" IDS_FINANCIAL_CRITERIA_NOT_AVAILABLE "Yok" - IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Ölçütleri Karşılayan=" + IDS_FINANCIAL_CRITERIA_MEETS_CRITERIA "Ölçütleri Karşılar=" IDS_YES "Evet" IDS_NO "Hayır" IDS_DIGITAL_SIGNATURE "Sayılık İmzâ" - IDS_NON_REPUDIATION "Ret Olmayan" + IDS_NON_REPUDIATION "Geri Çevrilmiş Olmayan" IDS_KEY_ENCIPHERMENT "Anahtar Şifreleme" IDS_DATA_ENCIPHERMENT "Veri Şifreleme" - IDS_KEY_AGREEMENT "Anahtar Kabûlü" + IDS_KEY_AGREEMENT "Anahtar Onaylanması" IDS_CERT_SIGN "Onay Belgesi İmzâlama" IDS_OFFLINE_CRL_SIGN "Çevrim Dışı CRL İmzâlama" IDS_CRL_SIGN "CRL İmzâlama" IDS_ENCIPHER_ONLY "Yalnızca Şifrele" IDS_DECIPHER_ONLY "Yalnızca Şifreyi Çöz" - IDS_NETSCAPE_SSL_CLIENT "SSL İstemci Yetkilendirmesi" - IDS_NETSCAPE_SSL_SERVER "SSL Sunucu Yetkilendirmesi" + IDS_NETSCAPE_SSL_CLIENT "SSL İstemci Kimlik Doğrulaması" + IDS_NETSCAPE_SSL_SERVER "SSL Sunucu Kimlik Doğrulaması" IDS_NETSCAPE_SMIME "S/MIME" IDS_NETSCAPE_SIGN "İmzâ" IDS_NETSCAPE_SSL_CA "SSL CA" diff --git a/dll/win32/cryptdlg/lang/cryptdlg_Tr.rc b/dll/win32/cryptdlg/lang/cryptdlg_Tr.rc index 5f971238a9b..5b8ebfd3949 100644 --- a/dll/win32/cryptdlg/lang/cryptdlg_Tr.rc +++ b/dll/win32/cryptdlg/lang/cryptdlg_Tr.rc @@ -1,9 +1,7 @@ /* * cryptdlg dll resources * - * Copyright 2008 Juan Lang - * - * Translated to Turkish by Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2013. + * Copyright: 2013 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -30,8 +28,8 @@ STRINGTABLE IDS_POLICY_ID "İlke Tanımlayıcısı: " IDS_POLICY_QUALIFIER_INFO "İlke Niteleyici Bilgisi" IDS_POLICY_QUALIFIER_ID "İlke Niteleyici Kimliği=" - IDS_CPS "CPS" /* Certification Practice Statement (Onay Belgesi Uygulama Esasları) */ - IDS_USER_NOTICE "Kullanıcı Bildirisi" + IDS_CPS "CPS" /* Onay Belgesi Uygulama Esasları (Certification Practice Statement) */ + IDS_USER_NOTICE "Kullanıcı Bildirimi" IDS_QUALIFIER "Niteleyici" IDS_NOTICE_REF "Bildirim Kaynağı" IDS_ORGANIZATION "Kurum=" diff --git a/dll/win32/cryptui/lang/cryptui_Tr.rc b/dll/win32/cryptui/lang/cryptui_Tr.rc index 1ea47233de8..c079e96859d 100644 --- a/dll/win32/cryptui/lang/cryptui_Tr.rc +++ b/dll/win32/cryptui/lang/cryptui_Tr.rc @@ -1,9 +1,7 @@ /* * cryptui dll resources * - * Copyright 2008 Juan Lang - * - * Translated to Turkish by Erdem Ersoy (eersoy93) (erdemersoy@live.com) in 2014. + * Copyright: 2014 Erdem Ersoy (eersoy93) (erdemersoy@live.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,20 +27,20 @@ STRINGTABLE IDS_CERTIFICATE "Onay Belgesi" IDS_CERTIFICATEINFORMATION "Onay Belgesi Bilgisi" IDS_CERT_INFO_BAD_SIG "Bu onay belgesinde geçersiz bir imzâ vardır. Bu onay belgesi değiştirilmiş veyâ bozulmuş olabilir." - IDS_CERT_INFO_UNTRUSTED_CA "Bu kök onay belgesi güvenilir değil. Bunu güvenilir yapmak için bunu dizgenizin güvenilir kök onay belgesi deposuna ekleyiniz." - IDS_CERT_INFO_UNTRUSTED_ROOT "Bu onay belgesinin güvenilir kök onay belgesi olduğu doğrulanamadı." - IDS_CERT_INFO_PARTIAL_CHAIN "Bu onay belgesinin dağıtıcısı bulunamadı." + IDS_CERT_INFO_UNTRUSTED_CA "Bu kök onay belgesi güvenilen değil. Bunu güvenilen yapmak için, bunu dizgenizin güvenilen kök onay belgesi deposuna ekleyiniz." + IDS_CERT_INFO_UNTRUSTED_ROOT "Bu onay belgesi, bir güvenilen kök onay belgesine doğrulanamadı." + IDS_CERT_INFO_PARTIAL_CHAIN "Bu onay belgesinin yayımcısı bulunamadı." IDS_CERT_INFO_BAD_PURPOSES "Bu onay belgesinin tüm kullanım amaçları doğrulanamadı." - IDS_CERT_INFO_PURPOSES "Bu onay belgesi aşağıdaki amaçlar için anıklanmıştır:" - IDS_SUBJECT_HEADING "Şuraya Dağıtıldı: " - IDS_ISSUER_HEADING "Şu Dağıttı: " + IDS_CERT_INFO_PURPOSES "Bu onay belgesi aşağıdaki amaçlar için tasarlanmıştır:" + IDS_SUBJECT_HEADING "Şuraya Yayımlandı: " + IDS_ISSUER_HEADING "Şu Yayımladı: " IDS_VALID_FROM "Şuradan geçerlidir " IDS_VALID_TO " şuraya " IDS_CERTIFICATE_BAD_SIGNATURE "Bu onay belgesinde geçersiz bir imzâ vardır." - IDS_CERTIFICATE_BAD_TIME "Bu onay belgesinin, süresi dolmuştur ya da daha geçersizdir." - IDS_CERTIFICATE_BAD_TIMENEST "Bu onay belgesinin geçerlilik dönemi dağıtıcısınınkisini aşıyor." - IDS_CERTIFICATE_REVOKED "Bu onay belgesi, dağıtıcısı eliyle iptal edildi." - IDS_CERTIFICATE_VALID "Bu onay belgesi doğrulanmıştır." + IDS_CERTIFICATE_BAD_TIME "Bu onay belgesinin, süresi dolmuştur ya da daha geçerli değildir." + IDS_CERTIFICATE_BAD_TIMENEST "Bu onay belgesinin geçerlilik dönemi yayımcısınınkisini aşıyor." + IDS_CERTIFICATE_REVOKED "Bu onay belgesi, yayımcısı eliyle iptal edildi." + IDS_CERTIFICATE_VALID "Bu onay belgesi tamam." IDS_FIELD "Alan" IDS_VALUE "Değer" IDS_FIELDS_ALL "" @@ -52,93 +50,93 @@ STRINGTABLE IDS_FIELDS_PROPERTIES "Yalnızca Husûsiyetler" IDS_FIELD_VERSION "Sürüm" IDS_FIELD_SERIAL_NUMBER "Dizi Numarası" - IDS_FIELD_ISSUER "Dağıtıcı" + IDS_FIELD_ISSUER "Yayımcı" IDS_FIELD_VALID_FROM "Şuradan Geçerlidir" IDS_FIELD_VALID_TO "Şuraya Geçerlidir" IDS_FIELD_SUBJECT "Konu" IDS_FIELD_PUBLIC_KEY "Açık Anahtar" IDS_FIELD_PUBLIC_KEY_FORMAT "%1 (%2!d! bit)" IDS_PROP_HASH "SHA1 Kodu" - IDS_PROP_ENHKEY_USAGE "Gelişmiş anahtar kullanımı (husûsiyet)" + IDS_PROP_ENHKEY_USAGE "Gelişmiş Anahtar Kullanımı (husûsiyet)" IDS_PROP_FRIENDLY_NAME "Kolay Adı" IDS_PROP_DESCRIPTION "Tanımı" IDS_CERTIFICATE_PROPERTIES "Onay Belgesi Husûsiyetleri" - IDS_CERTIFICATE_PURPOSE_ERROR "1.2.3.4 biçiminde bir OID giriniz." + IDS_CERTIFICATE_PURPOSE_ERROR "Lütfen 1.2.3.4 biçiminde bir OID giriniz." IDS_CERTIFICATE_PURPOSE_EXISTS "Girdiğiniz OID önceden var." - IDS_SELECT_STORE_TITLE "Onay Belgesi Deposu Seçme" - IDS_SELECT_STORE "Bir onay belgesi deposu seçiniz." + IDS_SELECT_STORE_TITLE "Onay Belgesi Deposunu Seç" + IDS_SELECT_STORE "Lütfen bir onay belgesi deposu seçiniz." IDS_IMPORT_WIZARD "Onay Belgesi Alma Yardımcısı" - IDS_IMPORT_TYPE_MISMATCH "Bu kütük, verilen ölçütlerle uyuşmayan nesneler içeriyor. Başka bir kütük seçiniz." + IDS_IMPORT_TYPE_MISMATCH "Bu kütük, verilen ölçütlere uymayan nesneler içeriyor. Lütfen başka bir kütük seçiniz." IDS_IMPORT_FILE_TITLE "Alınacak Kütük" IDS_IMPORT_FILE_SUBTITLE "Almak istediğiniz kütüğü belirtiniz." IDS_IMPORT_STORE_TITLE "Onay Belgesi Deposu" - IDS_IMPORT_STORE_SUBTITLE "Onay belgesi depoları; onay belgelerinden, onay belgesi iptal dizelgelerinden ve onay belgesi güven dizelgelerinden oluşan derlemlerdir." + IDS_IMPORT_STORE_SUBTITLE "Onay belgesi depoları; onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin derlemleridir." IDS_IMPORT_FILTER_CERT "X.509 Onay Belgesi (*.cer, *.crt)" - IDS_IMPORT_FILTER_PFX "Şahsî Bilgi Değiştirmesi (*.pfx, *.p12)" + IDS_IMPORT_FILTER_PFX "Şahsî Bilgi Değişimi (*.pfx, *.p12)" IDS_IMPORT_FILTER_CRL "Onay Belgesi İptal Dizelgesi (*.crl)" IDS_IMPORT_FILTER_CTL "Onay Belgesi Güven Dizelgesi (*.stl)" IDS_IMPORT_FILTER_SERIALIZED_STORE "Microsoft Dizilendirilmiş Onay Belgesi Deposu (*.sst)" IDS_IMPORT_FILTER_CMS "CMS/PKCS #7 İletileri (*.spc, *.p7b)" IDS_IMPORT_FILTER_ALL "Tüm Kütükler (*.*)" - IDS_IMPORT_EMPTY_FILE "Bir kütük seçiniz." - IDS_IMPORT_BAD_FORMAT "Bu kütük biçimi tanınmış değil. Başka bir kütük seçiniz." - IDS_IMPORT_OPEN_FAILED "Açılmadı." - IDS_IMPORT_DEST_DETERMINED "İzlence eliyle karar verildi." - IDS_IMPORT_SELECT_STORE "Bir depo seçiniz." + IDS_IMPORT_EMPTY_FILE "Lütfen bir kütük seçiniz." + IDS_IMPORT_BAD_FORMAT "Bu kütük biçimi tanınmış değil. Lütfen başka bir kütük seçiniz." + IDS_IMPORT_OPEN_FAILED "Açılamadı." + IDS_IMPORT_DEST_DETERMINED "İzlence eliyle belirlendi." + IDS_IMPORT_SELECT_STORE "Lütfen bir depo seçiniz." IDS_IMPORT_STORE_SELECTION "Onay belgesi deposu seçildi." - IDS_IMPORT_DEST_AUTOMATIC "İzlence eliyle kendilğinden karar verildi." + IDS_IMPORT_DEST_AUTOMATIC "İzlence eliyle kendilğinden belirlendi." IDS_IMPORT_FILE "Kütük" IDS_IMPORT_CONTENT "İçerik" IDS_IMPORT_CONTENT_CERT "Onay Belgesi" IDS_IMPORT_CONTENT_CRL "Onay Belgesi İptal Dizelgesi" IDS_IMPORT_CONTENT_CTL "Onay Belgesi Güven Dizelgesi" IDS_IMPORT_CONTENT_CMS "CMS/PKCS #7 İletisi" - IDS_IMPORT_CONTENT_PFX "Şahsî Bilgi Değiştirmesi" + IDS_IMPORT_CONTENT_PFX "Şahsî Bilgi Değişimi" IDS_IMPORT_CONTENT_STORE "Onay Belgesi Deposu" - IDS_IMPORT_SUCCEEDED "Alma işlemi başarılı oldu." - IDS_IMPORT_FAILED "Alma işlemi başarısız oldu." + IDS_IMPORT_SUCCEEDED "Alma başarılı oldu." + IDS_IMPORT_FAILED "Alma başarısız oldu." IDS_WIZARD_TITLE_FONT "Arial" IDS_PURPOSE_ALL "" IDS_PURPOSE_ADVANCED "" - IDS_SUBJECT_COLUMN "Şuraya Dağıtıldı" - IDS_ISSUER_COLUMN "Eliyle Dağıtıldı" - IDS_EXPIRATION_COLUMN "Bitiş Zamânı" + IDS_SUBJECT_COLUMN "Şuraya Yayımlandı" + IDS_ISSUER_COLUMN "Eliyle Yayımlandı" + IDS_EXPIRATION_COLUMN "Son Kullanma Târihi" IDS_FRIENDLY_NAME_COLUMN "Kolay Adı" IDS_ALLOWED_PURPOSE_ALL "" IDS_ALLOWED_PURPOSE_NONE "" IDS_WARN_REMOVE_MY "Artık bu onay belgesiyle, iletileri çözemeyeceksiniz veyâ iletileri imzâlayamayacaksınız.\n\ -Bu onay belgesini silmeyi doğruluyor musunuz?" +Bu onay belgesini silmek istediğinizden emin misiniz?" IDS_WARN_REMOVE_PLURAL_MY "Artık bu onay belgeleriyle, iletileri çözemeyeceksiniz veyâ iletileri imzâlayamayacaksınız.\n\ -Bu onay belgelerini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_ADDRESSBOOK "Artık bu onay belgesiyle, iletileri şifreleyemeyeceksiniz veyâ imzâlanmış iletileri doğrulayamayacaksınız.\n\ -Bu onay belgesini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Artık bu onay belgeleriyle, iletileri şifreleyemeyeceksiniz veyâ imzâlanmış iletileri doğrulayamayacaksınız.\n\ -Bu onay belgelerini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_CA "Artık bu onaylama yetkilisiyle dağıtılan onay belgeleri güvenilir olmayacaktır.\n\ -Bu onay belgesini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_PLURAL_CA "Artık bu onaylama yetkilileriyle dağıtılan onay belgeleri güvenilir olmayacaktır.\n\ -Bu onay belgelerini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_ROOT "Artık, bu kök onaylama yetkilisiyle dağıtılan onay belgeleri ve dağıtan bu onaylama yetkilisi güvenilir olmayacaktır.\n\ -Bu güvenilir kök onay belgesini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_PLURAL_ROOT "Artık, bu kök onaylama yetkilileriyle dağıtılan onay belgeleri ve dağıtan bu onaylama yetkilileri güvenilir olmayacaktır.\n\ -Bu güvenilir kök onay belgelerini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Artık, bu yayımcının imzâladığı yazılım güvenilir olmayacaktır.\n\ -Bu onay belgesini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Artık, bu yayımcılarnın imzâladığı yazılım güvenilir olmayacaktır.\n\ -Bu onay belgelerini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_DEFAULT "Bu onay belgesini silmeyi doğruluyor musunuz?" - IDS_WARN_REMOVE_PLURAL_DEFAULT "Bu onay belgelerini silmeyi doğruluyor musunuz?" +Bu onay belgelerini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_ADDRESSBOOK "Artık bu onay belgesiyle, iletileri şifreleyemeyeceksiniz veyâ imzâlı iletileri doğrulayamayacaksınız.\n\ +Bu onay belgesini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_PLURAL_ADDRESSBOOK "Artık bu onay belgeleriyle, iletileri şifreleyemeyeceksiniz veyâ imzâlı iletileri doğrulayamayacaksınız.\n\ +Bu onay belgelerini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_CA "Artık bu onay belgesi yetkilisiyle yayımlanan onay belgeleri güvenilen olmayacaktır.\n\ +Bu onay belgesini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_PLURAL_CA "Artık bu onay belgesi yetkilileriyle yayımlanan onay belgeleri güvenilen olmayacaktır.\n\ +Bu onay belgelerini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_ROOT "Artık, bu kök onay belgesi yetkilisiyle yayımlanan onay belgeleri ve onay belgesi yetkilileri güvenilir olmayacaktır.\n\ +Bu güvenilen kök onay belgesini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_PLURAL_ROOT "Artık, bu kök onay belgesi yetkilileriyle yayımlanan onay belgeleri ve onay belgesi yetkilileri güvenilir olmayacaktır.\n\ +Bu güvenilen kök onay belgelerini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_TRUSTEDPUBLISHER "Artık, bu yayımcı eliyle imzâlanan yazılım güvenilen olmayacaktır.\n\ +Bu onay belgesini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_PLURAL_TRUSTEDPUBLISHER "Artık, bu yayımcılar eliyle imzâlanan yazılım güvenilen olmayacaktır.\n\ +Bu onay belgelerini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_DEFAULT "Bu onay belgesini silmek istediğinizden emin misiniz?" + IDS_WARN_REMOVE_PLURAL_DEFAULT "Bu onay belgelerini silmek istediğinizden emin misiniz?" IDS_CERT_MGR "Onay Belgeleri" IDS_FRIENDLY_NAME_NONE "" - IDS_PURPOSE_SERVER_AUTH "Uzaktaki bilgisayarın kimliğini sağlar." - IDS_PURPOSE_CLIENT_AUTH "Uzaktaki bilgisayara kimliğinizi tanıttırır." + IDS_PURPOSE_SERVER_AUTH "Bir uzak bilgisayarın kimliğini sağlar." + IDS_PURPOSE_CLIENT_AUTH "Bir uzak bilgisayara kimliğinizi tanıtlar." IDS_PURPOSE_CODE_SIGNING "Yazılım yayımcısından gelen yazılımı korur.\n\ Yazılımı yayımlamadan sonraki değişikliklerden korur." - IDS_PURPOSE_EMAIL_PROTECTION "E-posta iletilerini korur." + IDS_PURPOSE_EMAIL_PROTECTION "Posta iletilerini korur." IDS_PURPOSE_IPSEC "Umûmî Ağ üzerinden güvenli iletişim sağlar." - IDS_PURPOSE_TIMESTAMP_SIGNING "Verilerin şimdiki zamanla imzâlanmasını sağlar." - IDS_PURPOSE_CTL_USAGE_SIGNING "Onay belgesi güven dizelgesini sayılık olarak imzâlamanızı sağlar." - IDS_PURPOSE_EFS "Diskteki verilerin şifrelenmesini sağlar." + IDS_PURPOSE_TIMESTAMP_SIGNING "Verilerin şimdiki zamanla imzâlanmasına olanak sağlar." + IDS_PURPOSE_CTL_USAGE_SIGNING "Bir onay belgesi güven dizelgesini sayılık olarak imzâlamanıza olanak sağlar." + IDS_PURPOSE_EFS "Diskteki verilerin şifrelenmesine olanak sağlar." IDS_PURPOSE_EFS_RECOVERY "Kütük Kurtarma" IDS_PURPOSE_WHQL "Windows Donanım Sürücüsü Doğrulaması" IDS_PURPOSE_NT5 "Windows Dizge Bileşeni Doğrulaması" @@ -149,14 +147,14 @@ Yazılımı yayımlamadan sonraki değişikliklerden korur." IDS_PURPOSE_KEY_RECOVERY "Anahtar Kurtarma" IDS_PURPOSE_DOCUMENT_SIGNING "Belge İmzâlama" IDS_PURPOSE_LIFETIME_SIGNING "Yaşam Boyu İmzâlama" - IDS_PURPOSE_DRM "Sayılık Haklar" + IDS_PURPOSE_DRM "Sayılık Hakları" IDS_PURPOSE_LICENSES "Anahtar Paketi Ruhsatları" IDS_PURPOSE_LICENSE_SERVER "Ruhsat Sunucusu Doğrulaması" IDS_PURPOSE_ENROLLMENT_AGENT "Onay Belgesi İstek Yardımcısı" - IDS_PURPOSE_SMARTCARD_LOGON "Akıllı Kart ile Oturum Açma" + IDS_PURPOSE_SMARTCARD_LOGON "Akıllı Kartla Oturum Açma" IDS_PURPOSE_CA_EXCHANGE "Husûsî Anahtar Belgelikliği" IDS_PURPOSE_KEY_RECOVERY_AGENT "Anahtar Kurtarma Yardımcısı" - IDS_PURPOSE_DS_EMAIL_REPLICATION "Dizin Hizmeti E-Posta Kopyası" + IDS_PURPOSE_DS_EMAIL_REPLICATION "Dizin Hizmeti Posta Çoğlatması" IDS_EXPORT_WIZARD "Onay Belgesi Verme Yardımcısı" IDS_EXPORT_FORMAT_TITLE "Verme Biçimi" IDS_EXPORT_FORMAT_SUBTITLE "İçeriğin kaydedileceği biçimi seçiniz." @@ -168,20 +166,20 @@ Yazılımı yayımlamadan sonraki değişikliklerden korur." IDS_EXPORT_FILTER_CRL "Onay Belgesi İptal Dizelgesi (*.crl)" IDS_EXPORT_FILTER_CTL "Onay Belgesi Güven Dizelgesi (*.stl)" IDS_EXPORT_FILTER_CMS "CMS/PKCS #7 İletileri (*.p7b)" - IDS_EXPORT_FILTER_PFX "Şahsî Bilgi Değiştirmesi (*.pfx)" + IDS_EXPORT_FILTER_PFX "Şahsî Bilgi Değişimi (*.pfx)" IDS_EXPORT_FILTER_SERIALIZED_CERT_STORE "Dizilendirilmiş Onay Belgesi Deposu (*.sst)" IDS_EXPORT_FORMAT "Kütük Biçimi" - IDS_EXPORT_INCLUDE_CHAIN "Onay belgesi yolundaki tüm onay belgeleri içinde olsun." + IDS_EXPORT_INCLUDE_CHAIN "Onay Belgesi Yolunda Tüm Onay Belgelerini Ekle" IDS_EXPORT_KEYS "Verilen Anahtarlar" IDS_YES "Evet" IDS_NO "Hayır" IDS_EXPORT_SUCCEEDED "Verme işlemi başarılı oldu." IDS_EXPORT_FAILED "Verme işlemi başarısız oldu." IDS_EXPORT_PRIVATE_KEY_TITLE "Husûsî Anahtarı Verme" - IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Bu onay belgesi, kendisiyle birlikte verilebilecek bir husûsî anahtar içerir." - IDS_EXPORT_PASSWORD_TITLE "Şifreyi Girme" + IDS_EXPORT_PRIVATE_KEY_SUBTITLE "Bu onay belgesi, kendisiyle birlikte verilebilen bir husûsî anahtar içerir." + IDS_EXPORT_PASSWORD_TITLE "Şifre Girme" IDS_EXPORT_PASSWORD_SUBTITLE "Bir husûsî anahtarı şifreyle koruyabilirsiniz." - IDS_EXPORT_PASSWORD_MISMATCH "Şifreler birbiriyle uyuşmuyor." + IDS_EXPORT_PASSWORD_MISMATCH "Şifreler uyuşmuyor." IDS_EXPORT_PRIVATE_KEY_UNAVAILABLE "Önemli: Bu onay belgesinin husûsî anahtarı açılamadı." IDS_EXPORT_PRIVATE_KEY_NON_EXPORTABLE "Önemli: Bu onay belgesinin husûsî anahtarı verilebilen değil." } @@ -199,7 +197,7 @@ BEGIN CONTROL "", -1, "Static", SS_BLACKFRAME, 16,116,222,1 CONTROL "", IDC_CERTIFICATE_NAMES,"RichEdit20W", ES_READONLY|ES_MULTILINE|WS_DISABLED,8,118,238,90 PUSHBUTTON "&Onay Belgesini Kur...", IDC_ADDTOSTORE,53,216,95,14 - PUSHBUTTON "&Dağıtıcı Açıklaması", IDC_ISSUERSTATEMENT,152,216,95,14 + PUSHBUTTON "&Yayımcı Açıklaması", IDC_ISSUERSTATEMENT,152,216,95,14 END IDD_DETAIL DIALOG 0, 0, 255, 236 @@ -231,7 +229,7 @@ BEGIN END IDD_USERNOTICE DIALOG 0, 0, 255, 256 -CAPTION "Geri Çevirici" +CAPTION "Geri Çevirme" STYLE WS_VISIBLE FONT 8, "MS Shell Dlg" BEGIN @@ -251,11 +249,11 @@ BEGIN LTEXT "&Tanımı:", -1, 6,32,60,14 EDITTEXT IDC_DESCRIPTION, 70,30,181,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL GROUPBOX "Onay Belgesi Amaçları", -1,6,48,245,185, BS_GROUPBOX - AUTORADIOBUTTON "&Bu onay belgesinin tüm amaçlarını etkinleştir.", + AUTORADIOBUTTON "&Bu Onay Belgesi İçin Tüm Amaçları Etkinleştir.", IDC_ENABLE_ALL_PURPOSES, 12,58,230,14, BS_AUTORADIOBUTTON|WS_TABSTOP - AUTORADIOBUTTON "B&u onay belgesinin tüm amaçlarını edilginleştir.", + AUTORADIOBUTTON "B&u Onay Belgesi İçin Tüm Amaçları Edilginleştir.", IDC_DISABLE_ALL_PURPOSES, 12,70,230,14, BS_AUTORADIOBUTTON - AUTORADIOBUTTON "Bu &onay belgesinin yalnızca aşağıdaki amaçlarını etkinleştir:", + AUTORADIOBUTTON "Bu &Onay Belgesi İçin Yalnızca Aşağıdaki Amaçları Etkinleştir:", IDC_ENABLE_SELECTED_PURPOSES, 12,82,230,14, BS_AUTORADIOBUTTON CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", LVS_REPORT|LVS_NOCOLUMNHEADER|LVS_SINGLESEL|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, @@ -264,10 +262,10 @@ BEGIN END IDD_ADD_CERT_PURPOSE DIALOG 0,0,200,68 -CAPTION "Amaç Ekleme" +CAPTION "Amaç Ekle" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Eklemek istediğiniz onay belgesi kullanım amacının nesne tanımlayıcısını (OID'sini) giriniz:", + LTEXT "Eklemek istediğiniz onay belgesi amacı için nesne tanımlayıcısını (OID'sini) ekleyiniz:", -1, 6,6,190,28 EDITTEXT IDC_NEW_PURPOSE, 6,28,190,14, ES_AUTOVSCROLL|ES_MULTILINE|WS_TABSTOP|WS_VSCROLL PUSHBUTTON "Tamam", IDOK, 33,48,60,14 @@ -275,7 +273,7 @@ BEGIN END IDD_SELECT_STORE DIALOG 0,0,200,136 -CAPTION "Onay Belgesi Deposunu Seçme" +CAPTION "Onay Belgesi Deposunu Seç" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Kullanmak istediğiniz onay belgesi deposunu seçiniz:", IDC_STORE_TEXT, 6,6,190,28 @@ -291,11 +289,11 @@ CAPTION "Onay Belgesi Alma Yardımcısı" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Onay Belgesi Alma Yardımcısı'na Hoşgeldiniz", IDC_IMPORT_TITLE, 115,7,195,30 - LTEXT "Bu yardımcı; bir kütükten, onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin bir onay belgesi deposuna verilmesini sağlar.\n\ + LTEXT "Bu yardımcı; bir kütükten, onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin bir onay belgesi deposuna vermenize yardım eder.\n\ \n\ -Bir onay belgesi, sizi veyâ sizle iletişim kuran bilgisayarı tanımada kullanılmış olabilir. Bu onay belgesi, yetkilendirmede ve iletileri imzâlamada da kullanılmış olabilir. Onay belgesi depoları; onay belgelerinden, onay belgesi iptal dizelgelerinden ve onay belgesi güven dizelgelerinden oluşan derlemlerdir.\n\ +Bir onay belgesi, sizi veyâ iletişim kuruyor olduğunuz bilgisayarı tanılamak için kullanılabilir. Bu onay belgesi, kimlik doğrulaması için ve iletileri imzâlamak için de kullanılabilir. Onay belgesi depoları; onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin derlemleridir.\n\ \n\ -Sürdürmek için ""İleri >"" düğmesine tıklayınız.", +Sürdürmek için İleri'ye tıklayınız.", -1, 115,40,195,120 END @@ -310,7 +308,7 @@ BEGIN -1, 21,30,265,16 LTEXT "Kriptografik İleti Söz Dizimi Ölçünü/PKCS #7 İletileri (.p7b)", -1, 31,53,265,10 - LTEXT "Şahsî Bilgi Değiştirmesi/PKCS #12 (.pfx, .p12)", + LTEXT "Şahsî Bilgi Değişimi/PKCS #12 (.pfx, .p12)", -1, 31,68,265,10 LTEXT "Microsoft Dizilendirilmiş Onay Belgesi Deposu (.sst)", -1, 31,83,265,10 @@ -320,11 +318,11 @@ IDD_IMPORT_STORE DIALOG 0,0,317,143 CAPTION "Onay Belgesi Alma Yardımcısı" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "ReactOS, kendiliğinden bir onay belgesi deposu seçebilir ya da siz, onay belgeleri için bir konum belirtebilirsiniz.", + LTEXT "ReactOS, onay belgesi deposunu kendiliğinden seçebilir ya da onay belgeleri için bir konum belirleyebilirsiniz.", -1, 21,1,220,25 - AUTORADIOBUTTON "&Onay belgesi deposunu kendiliğinden seç.", + AUTORADIOBUTTON "&Onay Belgesi Deposunu Kendiliğinden Seç", IDC_IMPORT_AUTO_STORE, 31,28,220,12, BS_AUTORADIOBUTTON|WS_TABSTOP - AUTORADIOBUTTON "&Tüm onay belgelerini aşağıdaki depoya yerleştir:", + AUTORADIOBUTTON "&Tüm Onay Belgelerini Aşağıdaki Depoya Yerleştir:", IDC_IMPORT_SPECIFY_STORE, 31,42,220,12, BS_AUTORADIOBUTTON EDITTEXT IDC_IMPORT_STORE, 44,61,185,14, ES_READONLY PUSHBUTTON "&Göz At...", IDC_IMPORT_BROWSE_STORE, 236,61,60,14 @@ -336,7 +334,7 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Onay Belgesi Alma Yardımcısı'nın Bitirilmesi", IDC_IMPORT_TITLE, 115,1,195,40 - LTEXT "Onay Belgesi Alma Yardımcısı'nı başarılı bir şekilde bitirdiniz.", + LTEXT "Onay Belgesi Alma Yardımcısı'nı başarıyla bitirdiniz.", -1, 115,33,195,24 LTEXT "Aşağıdaki ayarları belirlediniz:", -1, 115,57,195,12 @@ -349,7 +347,7 @@ IDD_CERT_MGR DIALOG 0,0,335,270 CAPTION "Onay Belgeleri" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "K&ullanım Amacı:", -1, 7,9,100,12 + LTEXT "&Kullanım Amacı:", -1, 7,9,100,12 COMBOBOX IDC_MGR_PURPOSE_SELECTION, 83,7,245,14, CBS_DROPDOWNLIST|WS_BORDER|WS_VSCROLL|WS_TABSTOP CONTROL "", IDC_MGR_STORES, "SysTabControl32", WS_CLIPSIBLINGS|WS_TABSTOP, 7,25,321,140 CONTROL "", IDC_MGR_CERTS, "SysListView32", LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER, 15,46,305,111 @@ -360,7 +358,7 @@ BEGIN GROUPBOX "Onay Belgesi Kullanım Amaçları", -1,7,194,321,47, BS_GROUPBOX LTEXT "", IDC_MGR_PURPOSES, 13,206,252,32 PUSHBUTTON "&Göster", IDC_MGR_VIEW, 269,218,51,14, WS_DISABLED - PUSHBUTTON "&Kapat", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON + PUSHBUTTON "Kapat", IDCANCEL, 277,249,51,14, BS_DEFPUSHBUTTON END IDD_CERT_MGR_ADVANCED DIALOG 0,0,248,176 @@ -368,7 +366,7 @@ CAPTION "Gelişmiş Seçenekler" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Onay Belgesi Amaçları", -1, 7,7,234,141, BS_GROUPBOX - LTEXT """Gelişmiş Amaçlar"" seçilmiş olduğunda dizelgelenen bir ya da daha çok amacı seçiniz.", + LTEXT """Gelişmiş Amaçlar"" seçilmiş olduğunda dizelgelenen bir ya da daha çok amaç seçiniz.", -1, 14,18,220,16 LTEXT "&Onay Belgesi Amaçları:", -1, 14,41,90,12, WS_TABSTOP CONTROL "", IDC_CERTIFICATE_USAGES,"SysListView32", @@ -383,11 +381,11 @@ CAPTION "Onay Belgesi Verme Yardımcısı" FONT 8, "MS Shell Dlg" BEGIN LTEXT "Onay Belgesi Verme Yardımcısı'na Hoşgeldiniz", IDC_EXPORT_TITLE, 115,7,195,30 - LTEXT "Bu yardımcı; bir onay belgesi deposundan, onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin bir kütüğe verilmesini sağlar.\n\ + LTEXT "Bu yardımcı; bir onay belgesi deposundan, onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin bir kütüğe vermenize yardım eder.\n\ \n\ -Bir onay belgesi, sizi veyâ sizle iletişim kuran bilgisayarı tanımada kullanılmış olabilir. Bu onay belgesi, yetkilendirmede ve iletileri imzâlamada da kullanılmış olabilir. Onay belgesi depoları; onay belgelerinden, onay belgesi iptal dizelgelerinden ve onay belgesi güven dizelgelerinden oluşan derlemlerdir.\n\ +Bir onay belgesi, sizi veyâ iletişim kuruyor olduğunuz bilgisayarı tanılamak için kullanılabilir. Bu onay belgesi, kimlik doğrulaması için ve iletileri imzâlamak için de kullanılabilir. Onay belgesi depoları; onay belgelerinin, onay belgesi iptal dizelgelerinin ve onay belgesi güven dizelgelerinin derlemleridir.\n\ \n\ -Sürdürmek için ""İleri >"" düğmesine basınız.", +Sürdürmek için İleri'ye tıklayınız.", -1, 115,40,195,120 END @@ -395,8 +393,8 @@ IDD_EXPORT_PRIVATE_KEY DIALOG 0,0,317,143 CAPTION "Onay Belgesi Verme Yardımcısı" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Siz, husûsi anahtarın verilmesini seçtiğinizde sizden bir sonraki aşamada husûsî anahtarın korunması için bir şifre istenecektir.", -1, 21,1,195,25 - LTEXT "Bu husûsî anahtar verilsin mi?", -1, 21,27,195,10 + LTEXT "Husûsi anahtarı vermeyi seçtiyseniz bir sonraki sayfada husûsî anahtarı korumak için sizden bir şifre istenecektir.", -1, 21,1,195,25 + LTEXT "Husûsî anahtarı vermeyi istiyor musunuz?", -1, 21,27,195,10 AUTORADIOBUTTON "&Evet, husûsî anahtarı ver.", IDC_EXPORT_PRIVATE_KEY_YES, 31,36,200,12, BS_AUTORADIOBUTTON|WS_TABSTOP AUTORADIOBUTTON "&Hayır, husûsî anahtarı verme.", @@ -418,22 +416,22 @@ IDD_EXPORT_FORMAT DIALOG 0,0,317,143 CAPTION "Onay Belgesi Verme Yardımcısı" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Kullanılacak biçimi seçiniz:", -1, 21,1,195,10 + LTEXT "Kullanmak istediğiniz biçimi seçiniz:", -1, 21,1,195,10 AUTORADIOBUTTON "&DER Şifrelenmiş X.509 (.cer)", IDC_EXPORT_FORMAT_DER, 31,18,280,12, BS_AUTORADIOBUTTON|WS_TABSTOP AUTORADIOBUTTON "&Base64 Şifrelenmiş X.509 (.cer):", IDC_EXPORT_FORMAT_BASE64, 31,30,280,12, BS_AUTORADIOBUTTON AUTORADIOBUTTON "&Kriptografik İleti Söz Dizimi Ölçünü/PKCS #7 İletileri (.p7b)", IDC_EXPORT_FORMAT_CMS, 31,42,280,12, BS_AUTORADIOBUTTON - CHECKBOX "&Olabildiğince onaylama yoluna tüm onay belgelerini koy.", + CHECKBOX "&Olasıysa Onay Belgesi Yolunda Tüm Onay Belgelerini Ekle", IDC_EXPORT_CMS_INCLUDE_CHAIN, 44,57,280,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED - AUTORADIOBUTTON "&Şahsî Bilgi Değiştirmesi/PKCS #12 (.pfx)", + AUTORADIOBUTTON "&Şahsî Bilgi Değişimi/PKCS #12 (.pfx)", IDC_EXPORT_FORMAT_PFX, 31,72,280,12, BS_AUTORADIOBUTTON|WS_DISABLED - CHECKBOX "O&labildiğince onaylama yoluna tüm onay belgelerini koy.", + CHECKBOX "O&lasıysa Onay Belgesi Yolunda Tüm Onay Belgelerini Ekle", IDC_EXPORT_PFX_INCLUDE_CHAIN, 44,87,280,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED - CHECKBOX "&Güçlü şifrelemeyi etkinleştir.", + CHECKBOX "&Güçlü Şifrelemeyi Etkinleştir", IDC_EXPORT_PFX_STRONG_ENCRYPTION, 44,102,280,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED - CHECKBOX "&Verme işlemi başarılı olduğunda husûsî anahtarı sil.", + CHECKBOX "&Verme Başarılıysa Husûsî Anahtarı Sil", IDC_EXPORT_PFX_DELETE_PRIVATE_KEY, 44,117,280,8, BS_AUTOCHECKBOX|WS_TABSTOP|WS_DISABLED END @@ -452,7 +450,7 @@ FONT 8, "MS Shell Dlg" BEGIN LTEXT "Onay Belgesi Verme Yardımcısı'nın Bitirilmesi", IDC_EXPORT_TITLE, 115,1,195,40 - LTEXT "Onay Belgesi Verme Yardımcısı'nı başarılı bir şekilde bitirdiniz.", + LTEXT "Onay Belgesi Verme Yardımcısı'nı başarıyla bitirdiniz.", -1, 115,33,195,24 LTEXT "Aşağıdaki ayarları belirlediniz:", -1, 115,57,195,12 diff --git a/dll/win32/devmgr/lang/tr-TR.rc b/dll/win32/devmgr/lang/tr-TR.rc index ce943da5a0d..e8d5f4d6498 100644 --- a/dll/win32/devmgr/lang/tr-TR.rc +++ b/dll/win32/devmgr/lang/tr-TR.rc @@ -16,17 +16,17 @@ BEGIN IDS_ENABLEDEVICE "Bu Aygıtı Kullan (Etkinleştir)" IDS_DISABLEDEVICE "Bu Aygıtı Kullanma (Edilginleştir)" IDS_UNKNOWNDEVICE "Bilinmeyen Aygıt" - IDS_NODRIVERLOADED "Bu aygıt için hiçbir sürücü kurulmadı." - IDS_DEVONPARENT "%1 Üzerinde" + IDS_NODRIVERLOADED "Bu aygıt için kurulmuş sürücü yok." + IDS_DEVONPARENT "%1 üzerinde." IDS_TROUBLESHOOTDEV "&Sorun Giderme..." - IDS_ENABLEDEV "&Sürücüyü Etkinleştir" + IDS_ENABLEDEV "&Aygıtı Etkinleştir" IDS_REINSTALLDRV "&Sürücüyü Yeniden Kur" IDS_PROPERTIES "&Husûsiyetler" IDS_UPDATEDRV "&Sürücüyü Şimdikileştir..." IDS_REBOOT "&Bilgisayarı Yeniden Başlat..." IDS_NOTAVAILABLE "Yok" IDS_NOTDIGITALLYSIGNED "Sayılık olarak imzâlanmamış." - IDS_NODRIVERS "Bu aygıt için gerekli olan veyâ yüklenen sürücü kütükleri yok." + IDS_NODRIVERS "Bu aygıt için gerekli olan veyâ yüklenmiş sürücü kütükleri yok." IDS_RESOURCE_COLUMN "Kaynak Türü" IDS_SETTING_COLUMN "Ayar" IDS_RESOURCE_MEMORY_RANGE "Bellek Erimi" @@ -40,61 +40,61 @@ STRINGTABLE BEGIN IDS_DEV_NO_PROBLEM "Bu aygıt düzgün çalışıyor." IDS_DEV_NOT_CONFIGURED "Bu aygıt doğru yapılandırılmamış." - IDS_DEV_DEVLOADER_FAILED "Bilgisayar, iki tür veri yolu bildirdiğinden dolayı ReactOS bu aygıtın sürücüsünü yükleyemedi." - IDS_DEV_DEVLOADER_FAILED2 "Bu aygıtın %1 aygıt yükleyicisi/yükleyicileri aygıtın sürücüsünü yükleyemedi." - IDS_DEV_OUT_OF_MEMORY "Bu aygıtın sürücüsü kötü olabilir veyâ dizgeniz bellekte veyâ başka kaynaklarda yavaş çalışıyor olabilir." - IDS_DEV_ENTRY_IS_WRONG_TYPE "Bu aygıtın sürücülerinin kötü veyâ değer defterinizin bozuk olabilmesinden dolayı bu aygıt düzgün bir şekilde çalışmıyor." - IDS_DEV_LACKED_ARBITRATOR "Bu aygıtın sürücüsü, ReactOS'un nasıl yöneteceğini bilmediği bir kaynağa gereksinim duyuyor." - IDS_DEV_BOOT_CONFIG_CONFLICT "Bu aygıtın gereksinim duyduğu kaynakları başka bir aygıt kullanıyor." + IDS_DEV_DEVLOADER_FAILED "Bilgisayar, iki %1 veri yolu türü bildirdiğinden dolayı ReactOS bu aygıt için sürücüyü yükleyemedi." + IDS_DEV_DEVLOADER_FAILED2 "Bu aygıt için %1 aygıt yükleyicisi/yükleyicileri aygıt sürücüsünü yükleyemedi." + IDS_DEV_OUT_OF_MEMORY "Bu aygıt için sürücü kötü olabilir veyâ dizgeniz, bellekte veyâ başka kaynaklarda yavaş çalışıyor olabilir." + IDS_DEV_ENTRY_IS_WRONG_TYPE "Sürücülerinin kötü olabilmesinden veyâ değer defterinizin bozuk olabilmesinden dolayı bu aygıt düzgün çalışmıyor." + IDS_DEV_LACKED_ARBITRATOR "Bu aygıt için sürücü, ReactOS'un nasıl yöneteceğini bilmediği bir kaynağı istedi." + IDS_DEV_BOOT_CONFIG_CONFLICT "Başka bir aygıt, bu aygıtın gereksinim duyduğu kaynakları kullanıyor." IDS_DEV_FAILED_FILTER "Bu aygıtın sürücüleri yeniden kurulmaya gereksinim duyuyor." - IDS_DEV_DEVLOADER_NOT_FOUND "ReactOS'un bu aygıtın sürücülerini yükleyen %1 kütüğünü yükleyemesinden dolayı bu aygıt düzgün çalışmıyor." - IDS_DEV_DEVLOADER_NOT_FOUND2 "Bu aygıtın sürücülerini yükleyen %1 kütüğünün kötü olmasından dolayı bu aygıt düzgün çalışmıyor." - IDS_DEV_DEVLOADER_NOT_FOUND3 "Aygıt başarısızlığı: Bu aygıtın sürücüsünü değiştirmeyi deneyiniz. Eğer olmuyorsa donanımınızın belgelerine bakınız." - IDS_DEV_INVALID_DATA "Bilgisayarınızın BIOS'u bu aygıtın kaynaklarının yanlış olduğunu bildirdiğinden dolayı bu aygıt düzgün çalışmıyor." - IDS_DEV_INVALID_DATA2 "Bu aygıtın BIOS'u bu aygıtın kaynaklarının yanlış olduğunu bildirdiğinden dolayı bu aygıt düzgün çalışmıyor." - IDS_DEV_FAILED_START "Bu aygıt ya yok, ya düzgün çalışmıyor, ya da bu aygıtın kurulu tüm sürücüleri yok." - IDS_DEV_LIAR "ReactOS, bu aygıtı başlatırken yanıt vermeyi durdurdu, bu yüzden bu aygıt bir daha başlatılmayacak." - IDS_DEV_NORMAL_CONFLICT "Bu aygıt, kullanmak için hiç boş %1 kaynaklarını bulamıyor." - IDS_DEV_NOT_VERIFIED "Bu aygıt ya yok, ya düzgün çalışmıyor, ya da bu aygıtın kurulu tüm sürücüleri yok." - IDS_DEV_NEED_RESTART "Bu aygıt bilgisayarınızı yeniden başlatana dek düzgün çalışamaz." - IDS_DEV_REENUMERATION "Bu aygıt, kaynak çakışmasına neden oldu." + IDS_DEV_DEVLOADER_NOT_FOUND "ReactOS, bu aygıt için sürücüleri yükleyen %1 kütüğünü yükleyememesinden dolayı bu aygıt düzgün çalışmıyor." + IDS_DEV_DEVLOADER_NOT_FOUND2 "Bu aygıt için sürücüleri yükleyen %1 kütüğünün bozuk olmasından dolayı bu aygıt düzgün çalışmıyor." + IDS_DEV_DEVLOADER_NOT_FOUND3 "Aygıt başarısızlığı: Bu aygıt için yü değiştirmeyi deneyiniz. Eğer çalışmıyorsa donanımınızın belgelerine bakınız." + IDS_DEV_INVALID_DATA "Bilgisayarınızdaki BIOS'un bu aygıt için kaynakları yanlış bildirdiğinden dolayı bu aygıt düzgün çalışmıyor." + IDS_DEV_INVALID_DATA2 "Aygıttaki BIOS'un bu aygıt için kaynakları yanlış bildirdiğinden dolayı bu aygıt düzgün çalışmıyor." + IDS_DEV_FAILED_START "Bu aygıt; ya yok, ya düzgün çalışmıyor, ya da kurulu tüm sürücüleri yok." + IDS_DEV_LIAR "ReactOS, bu aygıtı başlatmaya kalkışırken yanıt vermeyi durdurdu, bu yüzden bu aygıtı bir daha başlatmaya kalkışmayacak." + IDS_DEV_NORMAL_CONFLICT "Bu aygıt, kullanmak için boş %1 kaynaklarını bulamıyor." + IDS_DEV_NOT_VERIFIED "Bu aygıt; ya yok, ya düzgün çalışmıyor, ya da bu aygıtın kurulu tüm sürücüleri yok." + IDS_DEV_NEED_RESTART "Bu aygıt, bilgisayarınızı yeniden başlatana dek düzgün çalışamaz." + IDS_DEV_REENUMERATION "Bu aygıt, bir kaynak çakışmasına neden oluyor." IDS_DEV_PARTIAL_LOG_CONF "ReactOS, bu aygıtın kullandığı tüm kaynakları tanılayamadı." - IDS_DEV_UNKNOWN_RESOURCE "%1 sürücü bilgi kütüğü, bu alt aygıtın, bu üst aygıtın iye olmadığı ya da tanımadığı kaynağı kullandığını gösteriyor." - IDS_DEV_REINSTALL "Bu aygıtın sürücüleri yeniden başlatılmaya gereksinim duyuyor." + IDS_DEV_UNKNOWN_RESOURCE "%1 sürücü bilgi kütüğü, bu alt aygıtın, üst aygıtın iye olmadığı veyâ tanımadığı bir kaynağı kullanması için bildiriyor." + IDS_DEV_REINSTALL "Bu aygıt için sürücüler yeniden başlatılmaya gereksinim duyuyor." IDS_DEV_REGISTRY "Değer defteriniz bozuk olabilir." IDS_DEV_WILL_BE_REMOVED "ReactOS bu aygıtı kaldırıyor." - IDS_DEV_DISABLED "Bu aygıt başlatılmamış." + IDS_DEV_DISABLED "Bu aygıt başlamamış." IDS_DEV_DISABLED2 "Bu aygıt edilgin." - IDS_DEV_DEVLOADER_NOT_READY "Bu aygıtın yükleyicileri gerekli sürücüleri yükleyemiyor." - IDS_DEV_DEVLOADER_NOT_READY2 "Bu görüntü bağdaştırıcısı düzgün çalışıyor." - IDS_DEV_DEVLOADER_NOT_READY3 "Bu aygıtın yükleyicileri gerekli sürücüleri yükleyemiyor." - IDS_DEV_DEVICE_NOT_THERE "Bu aygıt ya yok, ya düzgün çalışmıyor, ya da bu aygıtın kurulu tüm sürücüleri yok." + IDS_DEV_DEVLOADER_NOT_READY "Bu aygıt için yükleyiciler gerekli sürücüleri yükleyemiyor." + IDS_DEV_DEVLOADER_NOT_READY2 "Bu görüntü bağdaştırıcısı doğru çalışıyor." + IDS_DEV_DEVLOADER_NOT_READY3 "Bu aygıt için yükleyiciler gerekli sürücüleri yükleyemiyor." + IDS_DEV_DEVICE_NOT_THERE "Bu aygıt; ya yok, ya düzgün çalışmıyor, ya da bu aygıtın kurulu tüm sürücüleri yok." IDS_DEV_MOVED "ReactOS, bu aygıtı kurma işleminde." IDS_DEV_TOO_EARLY "ReactOS, bu aygıtı kurma işleminde." - IDS_DEV_NO_VALID_LOG_CONF "ReactOS, bu aygıtın kaynaklarını belirleyemez." - IDS_DEV_FAILED_INSTALL "Bu aygıtın sürücüleri kurulu değil." - IDS_DEV_HARDWARE_DISABLED "Bu aygıtın BIOS'u aygıta hiç kaynak vermediğinden dolayı bu aygıt edilgin." - IDS_DEV_CANT_SHARE_IRQ "Bu aygıt, başka bir aygıtın kullandığı paylaşılamayan Kesme İsteği (IRQ) kaynağı kullanıyor.\nÇakışan ayârı değiştirmeli ya da çakışmaya neden olan gerçek kip sürücüsünü kaldırmalısınız." + IDS_DEV_NO_VALID_LOG_CONF "ReactOS, bu aygıt için kaynakları belirleyemez." + IDS_DEV_FAILED_INSTALL "Bu aygıt için sürücüler kurulu değil." + IDS_DEV_HARDWARE_DISABLED "Bu aygıt için BIOS bu aygıta kaynak vermediğinden dolayı bu aygıt edilgin." + IDS_DEV_CANT_SHARE_IRQ "Bu aygıt, başka bir aygıt eliyle kullanımda olan ve paylaşılamayan bir Kesme İsteği (IRQ) kaynağı kullanıyor.\nÇakışan ayârı değiştirmeli ya da çakışmaya neden olan gerçek kip sürücüyü kaldırmalısınız." IDS_DEV_FAILED_ADD "%1 şeyinin düzgün çalışmamasından dolayı bu aygıt düzgün çalışmıyor." - IDS_DEV_DISABLED_SERVICE "ReactOS, kurulum kütüklerinin üzerinde bulunduğu, sürücüye ya da ağ konumuna erişememesinden dolayı bu aygıtın sürücülerini kuramıyor." + IDS_DEV_DISABLED_SERVICE "ReactOS, kurulum kütüklerinin üzerinde bulunduğu, sürücüye ya da ağ konumuna erişememesinden dolayı bu aygıt için sürücüleri kuramıyor." IDS_DEV_TRANSLATION_FAILED "Bu aygıt sürücüsüne yanıt vermiyor." - IDS_DEV_NO_SOFTCONFIG "ReactOS, bu aygıtın ayarlarını belirleyemiyor. Bu aygıtla gelen belgelere bakınız ve yapılandırmayı ayarlamak için ""Kaynaklar"" sekmesini kullanınız." - IDS_DEV_BIOS_TABLE "Bilgisayarınızın dizge bellenimi, bu aygıtı, düzgün olarak, yapılandırmak ve kullanmak için yeterli bilgi içermiyor.\nBu aygıtı kullanmak için, bellenim veyâ BIOS güncellemesi elde etmek için bilgisayarınızın üreticisiyle iletişime geçiniz." - IDS_DEV_IRQ_TRANSLATION_FAILED "Bu aygıt, bir PCI kesmesi istemektedir ancak bir ISA kesmesi için yapılandırılmıştır (ya da tersi).\nBu aygıtın kesmesini yapılandırmak için bilgisayarın dizge kurulum izlencesini kullanınız." - IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS, bu donanımın aygıt sürücüsünü başlatamıyor." - IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS, bellekte hâlâ aygıt sürücüsünün bir önceki tıpkısı olduğundan dolayı bu donanımın aygıt sürücüsünü yükleyemiyor." - IDS_DEV_DRIVER_FAILED_LOAD "ReactOS, bu donanımın aygıt sürücüsünü yükleyemiyor. Sürücü eksik ya da bozulmuş olabilir." - IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS, bu donanımın, değer defterinde hizmet dizini bilgisinin eksik ya da yanlış kaydedildiğinden dolayı bu donanıma erişemiyor." - IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS, bu donanımın aygıt sürücüsünü başarılı bir şekilde yükledi ancak donanım aygıtını bulamıyor." - IDS_DEV_DUPLICATE_DEVICE "ReactOS, dizgede önceden bir tıpkı aygıt çalışıyor olmasından dolayı bu donanımın aygıt sürücüsünü yükleyemiyor." + IDS_DEV_NO_SOFTCONFIG "ReactOS, bu aygıt için ayarları belirleyemiyor. Bu aygıtla gelen belgelere bakınız ve yapılandırmayı yapmak için ""Kaynaklar"" sekmesini kullanınız." + IDS_DEV_BIOS_TABLE "Bilgisayarınızın dizge bellenimi, bu aygıtı, düzgün olarak, yapılandırmak ve kullanmak için yeterli bilgi içermiyor.\nBu aygıtı kullanmak için, bir bellenim veyâ BIOS güncellemesi elde etmek için bilgisayarınızın üreticisiyle iletişime geçiniz." + IDS_DEV_IRQ_TRANSLATION_FAILED "Bu aygıt, bir PCI kesmesi istiyor ancak bir ISA kesmesi için yapılandırılmıştır (ya da tersi).\nBu aygıt için kesmeyi yeniden yapılandırmak için lütfen bilgisayarın dizge kurulum izlencesini kullanınız." + IDS_DEV_FAILED_DRIVER_ENTRY "ReactOS, bu donanım için aygıt sürücüsünü başlatamıyor." + IDS_DEV_DRIVER_FAILED_PRIOR_UNLOAD "ReactOS, bellekte şimdi bile aygıt sürücüsünün bir önceki kopyası olduğundan dolayı bu donanım için aygıt sürücüsünü yükleyemiyor." + IDS_DEV_DRIVER_FAILED_LOAD "ReactOS, bu donanım için aygıt sürücüsünü yükleyemiyor. Sürücü bozulmuş ya da eksik olabilir." + IDS_DEV_DRIVER_SERVICE_KEY_INVALID "ReactOS, bu donanımın, değer defterindeki hizmet dizini bilgisinin eksik ya da yanlış kaydedildiğinden dolayı bu donanıma erişemiyor." + IDS_DEV_LEGACY_SERVICE_NO_DEVICES "ReactOS, bu donanım için aygıt sürücüsünü başarıyla yükledi ancak donanım aygıtını bulamıyor." + IDS_DEV_DUPLICATE_DEVICE "ReactOS, dizgede bir kopya aygıtın önceden çalışıyor olmasından dolayı bu donanım için aygıt sürücüsünü yükleyemiyor." IDS_DEV_FAILED_POST_START "ReactOS, bu aygıtı, sorunlar bildirdiğinden dolayı durdurdu." - IDS_DEV_HALTED "Bir uygulama ya da bir hizmet, bu donanım aygıtını kapattı." - IDS_DEV_PHANTOM "Şu an bu donanım aygıtı bilgisayara bağlı değil." - IDS_DEV_SYSTEM_SHUTDOWN "ReactOS, işletim dizgesinin kapatma işleminde olmasından dolayı bu donanım aygıtının erişimini elde edemiyor." - IDS_DEV_HELD_FOR_EJECT "ReactOS, bu donanım aygıtının, güvenli kaldırılmaya anıklandığından ancak bilgisayardan kaldırılmadığından dolayı onu kullanamıyor." - IDS_DEV_DRIVER_BLOCKED "Bu aygıtın yazılımı, ReactOS'la sorunları olduğu bilindiğinden dolayı başlatmaktan engellendi. Yeni bir donanım için donanımın satıcısıyla iletişime geçiniz." - IDS_DEV_REGISTRY_TOO_LARGE "ReactOS, dizge yığınının çok büyük olmasından dolayı yeni donanım aygıtlarını başlatamıyor. (Değer Defteri Büyüklük Hudûdu'nu aşar.)" - IDS_DEV_SETPROPERTIES_FAILED "ReactOS, bu aygıtın ayarlarını değiştiremez." + IDS_DEV_HALTED "Bir uygulama ya da bir hizmet bu donanım aygıtını kapattı." + IDS_DEV_PHANTOM "Şimdi bu donanım aygıtı bilgisayara bağlı değil." + IDS_DEV_SYSTEM_SHUTDOWN "ReactOS, işletim dizgesinin kapatma işleminde olmasından dolayı bu donanım aygıtı için erişim elde edemiyor." + IDS_DEV_HELD_FOR_EJECT "ReactOS, bu donanım aygıtının, güvenli kaldırılmaya anıklandığından ancak bilgisayardan kaldırılmadığından dolayı bu donanım aygıtını kullanamıyor." + IDS_DEV_DRIVER_BLOCKED "Bu aygıt için yazılım, ReactOS'la sorunları olduğu biliniyor olmasından dolayı başlatılmaktan engellendi. Yeni bir donanım için donanımın satıcısıyla iletişime geçiniz." + IDS_DEV_REGISTRY_TOO_LARGE "ReactOS, dizge yığınının, çok büyük olmasından, Değer Defteri Büyüklük Hudûdu'nu aşmasından dolayı yeni donanım aygıtlarını başlatamıyor." + IDS_DEV_SETPROPERTIES_FAILED "ReactOS, bu aygıtın ayarlarını değiştiremedi." END STRINGTABLE @@ -106,7 +106,7 @@ BEGIN IDS_PROP_SERVICE "Hizmet" IDS_PROP_ENUMERATOR "Numaralandırıcı" IDS_PROP_CAPABILITIES "Yetenekler" - IDS_PROP_DEVNODEFLAGS "Aygıt Bileşeni İmleri" + IDS_PROP_DEVNODEFLAGS "Aygıt Düğümü İmleri" IDS_PROP_CONFIGFLAGS "Yapılandırma İmleri" IDS_PROP_CSCONFIGFLAGS "CSConfig İmleri" IDS_PROP_EJECTIONRELATIONS "Çıkarma İlişkileri" @@ -149,9 +149,9 @@ BEGIN LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX LTEXT "Aygıt Türü:", -1, 37, 39, 60, 8, SS_NOPREFIX EDITTEXT IDC_DEVTYPE, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY - LTEXT "Üretici:", -1, 37, 53, 60, 8, SS_NOPREFIX + LTEXT "Üreticisi:", -1, 37, 53, 60, 8, SS_NOPREFIX EDITTEXT IDC_DEVMANUFACTURER, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY - LTEXT "Konum:", -1, 37, 67, 60, 8, SS_NOPREFIX + LTEXT "Konumu:", -1, 37, 67, 60, 8, SS_NOPREFIX EDITTEXT IDC_DEVLOCATION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY GROUPBOX "Aygıt Durumu", IDC_DEVSTATUSGROUP, 7, 83, 238, 100 EDITTEXT IDC_DEVSTATUS, 14, 96, 224, 61, NOT WS_TABSTOP | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_VSCROLL @@ -169,16 +169,16 @@ BEGIN LTEXT "", IDC_DEVNAME, 37, 9, 174, 16, SS_NOPREFIX LTEXT "Sürücü Sağlayıcısı:", -1, 37, 39, 60, 8, SS_NOPREFIX EDITTEXT IDC_DRVPROVIDER, 100, 39, 146, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY - LTEXT "Sürücü Zamânı:", -1, 37, 53, 60, 8, SS_NOPREFIX + LTEXT "Sürücü Târihi:", -1, 37, 53, 60, 8, SS_NOPREFIX EDITTEXT IDC_DRVDATE, 100, 53, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY LTEXT "Sürücü Sürümü:", -1, 37, 67, 60, 8, SS_NOPREFIX EDITTEXT IDC_DRVVERSION, 100, 67, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY - LTEXT "Sürücü İmzâlayıcısı:", -1, 37, 81, 60, 8, SS_NOPREFIX + LTEXT "Sayılık İmzâlayıcısı:", -1, 37, 81, 60, 8, SS_NOPREFIX EDITTEXT IDC_DIGITALSIGNER, 100, 81, 145, 12, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY PUSHBUTTON "&Sürücü Ayrıntıları...", IDC_DRIVERDETAILS, 7, 106, 75, 15 LTEXT "Sürücü kütükleri üzerine ayrıntıları görmek için.", -1, 91, 110, 154, 17, SS_NOPREFIX PUSHBUTTON "S&ürücüyü Şimdikileştir...", IDC_UPDATEDRIVER, 7, 126, 75, 15 - LTEXT "Bu aygıtın sürücüsünü şimdikileştir.", -1, 91, 130, 154, 17, SS_NOPREFIX + LTEXT "Aygıt sürücüsünü şimdikileştir.", -1, 91, 130, 154, 17, SS_NOPREFIX END IDD_DRIVERDETAILS DIALOGEX 0, 0, 224, 230 @@ -192,13 +192,13 @@ BEGIN CONTROL "", IDC_DRIVERFILES, "SysListView32", LVS_REPORT | LVS_NOCOLUMNHEADER | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SHAREIMAGELISTS | LVS_SORTASCENDING | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP, 7, 46, 209, 80 - LTEXT "Sağlayıcı:", -1, 14, 134, 50, 8 + LTEXT "Sağlayıcısı:", -1, 14, 134, 50, 8 EDITTEXT IDC_FILEPROVIDER, 66, 134, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY LTEXT "Kütük Sürümü:", -1, 14, 150, 50, 8 EDITTEXT IDC_FILEVERSION, 66, 150, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY LTEXT "Telif Hakkı:", -1, 14, 166, 50, 8 EDITTEXT IDC_FILECOPYRIGHT, 66, 166, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY - LTEXT "Sayılık İmzâlayıcı:", -1, 14, 182, 50, 8 + LTEXT "Sayılık İmzâlayıcısı:", -1, 14, 182, 50, 8 EDITTEXT IDC_DIGITALSIGNER, 66, 182, 155, 8, NOT WS_TABSTOP | NOT WS_BORDER | ES_AUTOHSCROLL | ES_READONLY DEFPUSHBUTTON "Tamam", IDOK, 167, 208, 50, 14 END diff --git a/dll/win32/getuname/getuname.rc b/dll/win32/getuname/getuname.rc index 09e9f20538b..bbea240f65b 100644 --- a/dll/win32/getuname/getuname.rc +++ b/dll/win32/getuname/getuname.rc @@ -17,4 +17,4 @@ #endif #ifdef LANGUAGE_SQ_AL #include "lang/sq-AL.rc" -#endif \ No newline at end of file +#endif diff --git a/dll/win32/jscript/lang/jscript_Tr.rc b/dll/win32/jscript/lang/jscript_Tr.rc index 22db53e1b8e..6bc6d419589 100644 --- a/dll/win32/jscript/lang/jscript_Tr.rc +++ b/dll/win32/jscript/lang/jscript_Tr.rc @@ -20,12 +20,12 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE { - IDS_TO_PRIMITIVE "Nesneyi ilk türe dönüştürürken yanlışlık oldu." - IDS_INVALID_CALL_ARG "Geçersiz yordam çağrısı ya da geçersiz değiştirgen." - IDS_CREATE_OBJ_ERROR "Öz devinim sunucusu nesne oluşturamadı." + IDS_TO_PRIMITIVE "Nesneyi ilk türe dönüştürmede yanlışlık." + IDS_INVALID_CALL_ARG "Geçersiz yordam çağrısı ya da geçersiz yordam değiştirgeni." + IDS_CREATE_OBJ_ERROR "Öz devinim sunucusu nesne oluşturamıyor." IDS_NO_PROPERTY "Nesne bu husûsiyeti/yöntemi desteklemiyor." - IDS_ARG_NOT_OPT "Değiştirgen, isteğe bağlı değil." - IDS_SYNTAX_ERROR "Yazım yanlışlığı." + IDS_ARG_NOT_OPT "Değiştirgen seçimlik değil." + IDS_SYNTAX_ERROR "Söz dizimi yanlışlığı." IDS_SEMICOLON """;"" bekleniyordu." IDS_LBRACKET """("" bekleniyordu." IDS_RBRACKET """)"" bekleniyordu." @@ -35,11 +35,11 @@ STRINGTABLE IDS_NOT_NUM "Sayı bekleniyordu." IDS_OBJECT_EXPECTED "Nesne bekleniyordu." IDS_ILLEGAL_ASSIGN "Geçersiz atama." - IDS_UNDEFINED """|"" tanımlanmamış." + IDS_UNDEFINED """|"" tanımlı değil." IDS_NOT_BOOL "Boolean nesnesi bekleniyordu." IDS_JSCRIPT_EXPECTED "JScript nesnesi bekleniyordu." - IDS_REGEXP_SYNTAX_ERROR "Düzenli deyişte yazım yanlışlığı." - IDS_URI_INVALID_CHAR "Şifrelenmiş URI geçersiz damgalar içeriyor." - IDS_INVALID_LENGTH "Dizi büyüklüğü sonlu artı tam sayı olmalı." + IDS_REGEXP_SYNTAX_ERROR "Düzenli deyişte söz dizimi yanlışlığı." + IDS_URI_INVALID_CHAR "Kodlanacak URI geçersiz damgalar içeriyor." + IDS_INVALID_LENGTH "Dizi büyüklüğü bir sonlu artı tam sayı olmalı." IDS_ARRAY_EXPECTED "Dizi nesnesi bekleniyordu." } diff --git a/dll/win32/kernel32/client/console/alias.c b/dll/win32/kernel32/client/console/alias.c index 05f05f3e9a5..a949c75cb6b 100644 --- a/dll/win32/kernel32/client/console/alias.c +++ b/dll/win32/kernel32/client/console/alias.c @@ -18,31 +18,40 @@ /* FUNCTIONS ******************************************************************/ -/* - * @implemented - */ -BOOL -WINAPI -AddConsoleAliasW(LPCWSTR lpSource, - LPCWSTR lpTarget, - LPCWSTR lpExeName) +static BOOL +IntAddConsoleAlias(LPCVOID Source, + USHORT SourceBufferLength, + LPCVOID Target, + USHORT TargetBufferLength, + LPCVOID lpExeName, + BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; ULONG CapturedStrings; - DPRINT("AddConsoleAliasW enterd with lpSource %S lpTarget %S lpExeName %S\n", lpSource, lpTarget, lpExeName); + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); + + if (lpExeName == NULL || NumChars == 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; /* Determine the needed sizes */ - ConsoleAliasRequest->SourceLength = (wcslen(lpSource ) + 1) * sizeof(WCHAR); - ConsoleAliasRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); + ConsoleAliasRequest->SourceLength = SourceBufferLength; + ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + ConsoleAliasRequest->Unicode = + ConsoleAliasRequest->Unicode2 = bUnicode; + CapturedStrings = 2; - if (lpTarget) /* The target can be optional */ + if (Target) /* The target can be optional */ { - ConsoleAliasRequest->TargetLength = (wcslen(lpTarget) + 1) * sizeof(WCHAR); + ConsoleAliasRequest->TargetLength = TargetBufferLength; CapturedStrings++; } else @@ -64,19 +73,19 @@ AddConsoleAliasW(LPCWSTR lpSource, /* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)lpSource, + (PVOID)Source, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, ConsoleAliasRequest->ExeLength, - (PVOID*)&ConsoleAliasRequest->Exe); + (PVOID*)&ConsoleAliasRequest->ExeName); - if (lpTarget) /* The target can be optional */ + if (Target) /* The target can be optional */ { CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)lpTarget, + (PVOID)Target, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target); } @@ -85,16 +94,16 @@ AddConsoleAliasW(LPCWSTR lpSource, ConsoleAliasRequest->Target = NULL; } - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAddAlias), - sizeof(CONSOLE_ADDGETALIAS)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepAddAlias), + sizeof(*ConsoleAliasRequest)); CsrFreeCaptureBuffer(CaptureBuffer); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return FALSE; } @@ -107,64 +116,83 @@ AddConsoleAliasW(LPCWSTR lpSource, */ BOOL WINAPI -AddConsoleAliasA(LPCSTR lpSource, - LPCSTR lpTarget, - LPCSTR lpExeName) +AddConsoleAliasW(LPCWSTR lpSource, + LPCWSTR lpTarget, + LPCWSTR lpExeName) { - LPWSTR lpSourceW = NULL; - LPWSTR lpTargetW = NULL; - LPWSTR lpExeNameW = NULL; - BOOL bRetVal; + USHORT SourceBufferLength = (USHORT)wcslen(lpSource) * sizeof(WCHAR); + USHORT TargetBufferLength = (USHORT)(lpTarget ? wcslen(lpTarget) * sizeof(WCHAR) : 0); - if (lpSource) - BasepAnsiStringToHeapUnicodeString(lpSource, (LPWSTR*)&lpSourceW); - if (lpTarget) - BasepAnsiStringToHeapUnicodeString(lpTarget, (LPWSTR*)&lpTargetW); - if (lpExeName) - BasepAnsiStringToHeapUnicodeString(lpExeName, (LPWSTR*)&lpExeNameW); + DPRINT1("AddConsoleAliasW entered with lpSource '%S' lpTarget '%S' lpExeName '%S'\n", + lpSource, lpTarget, lpExeName); - bRetVal = AddConsoleAliasW(lpSourceW, lpTargetW, lpExeNameW); - - /* Clean up */ - if (lpSourceW) - RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*)lpSourceW); - if (lpTargetW) - RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*)lpTargetW); - if (lpExeNameW) - RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*)lpExeNameW); - - return bRetVal; + return IntAddConsoleAlias(lpSource, + SourceBufferLength, + lpTarget, + TargetBufferLength, + lpExeName, + TRUE); } /* * @implemented */ -DWORD +BOOL WINAPI -GetConsoleAliasW(LPWSTR lpSource, - LPWSTR lpTargetBuffer, - DWORD TargetBufferLength, - LPWSTR lpExeName) +AddConsoleAliasA(LPCSTR lpSource, + LPCSTR lpTarget, + LPCSTR lpExeName) +{ + USHORT SourceBufferLength = (USHORT)strlen(lpSource) * sizeof(CHAR); + USHORT TargetBufferLength = (USHORT)(lpTarget ? strlen(lpTarget) * sizeof(CHAR) : 0); + + DPRINT1("AddConsoleAliasA entered with lpSource '%s' lpTarget '%s' lpExeName '%s'\n", + lpSource, lpTarget, lpExeName); + + return IntAddConsoleAlias(lpSource, + SourceBufferLength, + lpTarget, + TargetBufferLength, + lpExeName, + FALSE); +} + + +static DWORD +IntGetConsoleAlias(LPVOID Source, + USHORT SourceBufferLength, + LPVOID Target, + USHORT TargetBufferLength, + LPVOID lpExeName, + BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &ApiMessage.Data.ConsoleAliasRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - DPRINT("GetConsoleAliasW entered with lpSource %S lpExeName %S\n", lpSource, lpExeName); + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); - if (lpTargetBuffer == NULL) + if (Source == NULL || Target == NULL) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } - /* Determine the needed sizes */ - ConsoleAliasRequest->SourceLength = (wcslen(lpSource ) + 1) * sizeof(WCHAR); - ConsoleAliasRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); + if (lpExeName == NULL || NumChars == 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + return 0; + } + + ConsoleAliasRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + + /* Determine the needed sizes */ + ConsoleAliasRequest->SourceLength = SourceBufferLength; + ConsoleAliasRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + ConsoleAliasRequest->Unicode = + ConsoleAliasRequest->Unicode2 = bUnicode; - ConsoleAliasRequest->Target = NULL; ConsoleAliasRequest->TargetLength = TargetBufferLength; /* Allocate a Capture Buffer */ @@ -180,36 +208,39 @@ GetConsoleAliasW(LPWSTR lpSource, /* Capture the strings */ CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)lpSource, + (PVOID)Source, ConsoleAliasRequest->SourceLength, (PVOID*)&ConsoleAliasRequest->Source); CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, ConsoleAliasRequest->ExeLength, - (PVOID*)&ConsoleAliasRequest->Exe); + (PVOID*)&ConsoleAliasRequest->ExeName); /* Allocate space for the target buffer */ CsrAllocateMessagePointer(CaptureBuffer, ConsoleAliasRequest->TargetLength, (PVOID*)&ConsoleAliasRequest->Target); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAlias), - sizeof(CONSOLE_ADDGETALIAS)); - if (!NT_SUCCESS(Status)) + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAlias), + sizeof(*ConsoleAliasRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); - BaseSetLastNTError(Status); - return 0; + BaseSetLastNTError(ApiMessage.Status); + + if (ApiMessage.Status == STATUS_BUFFER_TOO_SMALL) + return ConsoleAliasRequest->TargetLength; + else + return 0; } /* Copy the returned target string into the user buffer */ - // wcscpy(lpTargetBuffer, ConsoleAliasRequest->Target); - memcpy(lpTargetBuffer, - ConsoleAliasRequest->Target, - ConsoleAliasRequest->TargetLength); + RtlCopyMemory(Target, + ConsoleAliasRequest->Target, + ConsoleAliasRequest->TargetLength); /* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer); @@ -223,65 +254,20 @@ GetConsoleAliasW(LPWSTR lpSource, */ DWORD WINAPI -GetConsoleAliasA(LPSTR lpSource, - LPSTR lpTargetBuffer, +GetConsoleAliasW(LPWSTR lpSource, + LPWSTR lpTargetBuffer, DWORD TargetBufferLength, - LPSTR lpExeName) + LPWSTR lpExeName) { - LPWSTR lpwSource; - LPWSTR lpwExeName; - LPWSTR lpwTargetBuffer; - UINT dwSourceSize; - UINT dwExeNameSize; - UINT dwResult; + DPRINT1("GetConsoleAliasW entered with lpSource '%S' lpExeName '%S'\n", + lpSource, lpExeName); - DPRINT("GetConsoleAliasA entered\n"); - - if (lpTargetBuffer == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return 0; - } - - dwSourceSize = (strlen(lpSource)+1) * sizeof(WCHAR); - lpwSource = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSourceSize); - if (lpwSource == NULL) - { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - MultiByteToWideChar(CP_ACP, 0, lpSource, -1, lpwSource, dwSourceSize); - - dwExeNameSize = (strlen(lpExeName)+1) * sizeof(WCHAR); - lpwExeName = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwExeNameSize); - if (lpwExeName == NULL) - { - HeapFree(GetProcessHeap(), 0, lpwSource); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - MultiByteToWideChar(CP_ACP, 0, lpExeName, -1, lpwExeName, dwExeNameSize); - - lpwTargetBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, TargetBufferLength * sizeof(WCHAR)); - if (lpwTargetBuffer == NULL) - { - HeapFree(GetProcessHeap(), 0, lpwSource); - HeapFree(GetProcessHeap(), 0, lpwExeName); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - - dwResult = GetConsoleAliasW(lpwSource, lpwTargetBuffer, TargetBufferLength * sizeof(WCHAR), lpwExeName); - - HeapFree(GetProcessHeap(), 0, lpwSource); - HeapFree(GetProcessHeap(), 0, lpwExeName); - - if (dwResult) - dwResult = WideCharToMultiByte(CP_ACP, 0, lpwTargetBuffer, dwResult / sizeof(WCHAR), lpTargetBuffer, TargetBufferLength, NULL, NULL); - - HeapFree(GetProcessHeap(), 0, lpwTargetBuffer); - - return dwResult; + return IntGetConsoleAlias(lpSource, + (USHORT)wcslen(lpSource) * sizeof(WCHAR), + lpTargetBuffer, + TargetBufferLength, + lpExeName, + TRUE); } @@ -290,25 +276,48 @@ GetConsoleAliasA(LPSTR lpSource, */ DWORD WINAPI -GetConsoleAliasesW(LPWSTR AliasBuffer, - DWORD AliasBufferLength, - LPWSTR ExeName) +GetConsoleAliasA(LPSTR lpSource, + LPSTR lpTargetBuffer, + DWORD TargetBufferLength, + LPSTR lpExeName) +{ + DPRINT1("GetConsoleAliasA entered with lpSource '%s' lpExeName '%s'\n", + lpSource, lpExeName); + + return IntGetConsoleAlias(lpSource, + (USHORT)strlen(lpSource) * sizeof(CHAR), + lpTargetBuffer, + TargetBufferLength, + lpExeName, + FALSE); +} + + +static DWORD +IntGetConsoleAliases(LPVOID AliasBuffer, + DWORD AliasBufferLength, + LPVOID lpExeName, + BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASES GetAllAliasesRequest = &ApiMessage.Data.GetAllAliasesRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - DPRINT("GetConsoleAliasesW entered\n"); + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); - /* Determine the needed sizes */ - GetAllAliasesRequest->ExeLength = GetConsoleAliasesLengthW(ExeName); - if (GetAllAliasesRequest->ExeLength == 0 || - GetAllAliasesRequest->ExeLength > AliasBufferLength) + if (lpExeName == NULL || NumChars == 0) { + SetLastError(ERROR_INVALID_PARAMETER); return 0; } + GetAllAliasesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + + /* Determine the needed sizes */ + GetAllAliasesRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + GetAllAliasesRequest->Unicode = + GetAllAliasesRequest->Unicode2 = bUnicode; + GetAllAliasesRequest->AliasesBufferLength = AliasBufferLength; /* Allocate a Capture Buffer */ @@ -323,7 +332,7 @@ GetConsoleAliasesW(LPWSTR AliasBuffer, /* Capture the exe name and allocate space for the aliases buffer */ CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)ExeName, + (PVOID)lpExeName, GetAllAliasesRequest->ExeLength, (PVOID*)&GetAllAliasesRequest->ExeName); @@ -331,26 +340,45 @@ GetConsoleAliasesW(LPWSTR AliasBuffer, GetAllAliasesRequest->AliasesBufferLength, (PVOID*)&GetAllAliasesRequest->AliasesBuffer); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliases), - sizeof(CONSOLE_GETALLALIASES)); - if (!NT_SUCCESS(Status)) + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliases), + sizeof(*GetAllAliasesRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + CsrFreeCaptureBuffer(CaptureBuffer); + BaseSetLastNTError(ApiMessage.Status); return 0; } /* Copy the returned aliases string into the user buffer */ - // wcscpy(AliasBuffer, GetAllAliasesRequest->AliasesBuffer); - memcpy(AliasBuffer, - GetAllAliasesRequest->AliasesBuffer, - GetAllAliasesRequest->AliasesBufferLength); + RtlCopyMemory(AliasBuffer, + GetAllAliasesRequest->AliasesBuffer, + GetAllAliasesRequest->AliasesBufferLength); /* Release the capture buffer and exit */ CsrFreeCaptureBuffer(CaptureBuffer); - return GetAllAliasesRequest->AliasesBufferLength; // / sizeof(WCHAR); (original code) + return GetAllAliasesRequest->AliasesBufferLength; +} + + +/* + * @implemented + */ +DWORD +WINAPI +GetConsoleAliasesW(LPWSTR AliasBuffer, + DWORD AliasBufferLength, + LPWSTR ExeName) +{ + DPRINT1("GetConsoleAliasesW entered with lpExeName '%S'\n", + ExeName); + + return IntGetConsoleAliases(AliasBuffer, + AliasBufferLength, + ExeName, + TRUE); } @@ -363,54 +391,36 @@ GetConsoleAliasesA(LPSTR AliasBuffer, DWORD AliasBufferLength, LPSTR ExeName) { - DWORD dwRetVal = 0; - LPWSTR lpwExeName = NULL; - LPWSTR lpwAliasBuffer; + DPRINT1("GetConsoleAliasesA entered with lpExeName '%s'\n", + ExeName); - DPRINT("GetConsoleAliasesA entered\n"); - - if (ExeName) - BasepAnsiStringToHeapUnicodeString(ExeName, (LPWSTR*)&lpwExeName); - - lpwAliasBuffer = HeapAlloc(GetProcessHeap(), 0, AliasBufferLength * sizeof(WCHAR)); - - dwRetVal = GetConsoleAliasesW(lpwAliasBuffer, AliasBufferLength * sizeof(WCHAR), lpwExeName); - - if (lpwExeName) - RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*)lpwExeName); - - if (dwRetVal) - dwRetVal = WideCharToMultiByte(CP_ACP, 0, lpwAliasBuffer, dwRetVal /**/ / sizeof(WCHAR) /**/, AliasBuffer, AliasBufferLength, NULL, NULL); - - HeapFree(GetProcessHeap(), 0, lpwAliasBuffer); - return dwRetVal; + return IntGetConsoleAliases(AliasBuffer, + AliasBufferLength, + ExeName, + FALSE); } -/* - * @implemented - */ -DWORD -WINAPI -GetConsoleAliasesLengthW(LPWSTR lpExeName) +static DWORD +IntGetConsoleAliasesLength(LPVOID lpExeName, BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &ApiMessage.Data.GetAllAliasesLengthRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - DPRINT("GetConsoleAliasesLengthW entered\n"); + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); - if (lpExeName == NULL) + if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } - GetAllAliasesLengthRequest->ExeLength = (wcslen(lpExeName) + 1) * sizeof(WCHAR); - GetAllAliasesLengthRequest->Length = 0; + GetAllAliasesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetAllAliasesLengthRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + GetAllAliasesLengthRequest->Unicode = + GetAllAliasesLengthRequest->Unicode2 = bUnicode; - /* Allocate a Capture Buffer */ CaptureBuffer = CsrAllocateCaptureBuffer(1, GetAllAliasesLengthRequest->ExeLength); if (!CaptureBuffer) { @@ -419,22 +429,21 @@ GetConsoleAliasesLengthW(LPWSTR lpExeName) return 0; } - /* Capture the exe name */ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)lpExeName, GetAllAliasesLengthRequest->ExeLength, (PVOID)&GetAllAliasesLengthRequest->ExeName); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasesLength), - sizeof(CONSOLE_GETALLALIASESLENGTH)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasesLength), + sizeof(*GetAllAliasesLengthRequest)); CsrFreeCaptureBuffer(CaptureBuffer); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return 0; } @@ -447,26 +456,68 @@ GetConsoleAliasesLengthW(LPWSTR lpExeName) */ DWORD WINAPI -GetConsoleAliasesLengthA(LPSTR lpExeName) +GetConsoleAliasesLengthW(LPWSTR lpExeName) { - DWORD dwRetVal = 0; - LPWSTR lpExeNameW = NULL; - - if (lpExeName) - BasepAnsiStringToHeapUnicodeString(lpExeName, (LPWSTR*)&lpExeNameW); - - dwRetVal = GetConsoleAliasesLengthW(lpExeNameW); - if (dwRetVal) - dwRetVal /= sizeof(WCHAR); - - /* Clean up */ - if (lpExeNameW) - RtlFreeHeap(GetProcessHeap(), 0, (LPWSTR*)lpExeNameW); - - return dwRetVal; + return IntGetConsoleAliasesLength(lpExeName, TRUE); } +/* + * @implemented + */ +DWORD +WINAPI +GetConsoleAliasesLengthA(LPSTR lpExeName) +{ + return IntGetConsoleAliasesLength(lpExeName, FALSE); +} + + +static DWORD +IntGetConsoleAliasExes(PVOID lpExeNameBuffer, + DWORD ExeNameBufferLength, + BOOLEAN bUnicode) +{ + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &ApiMessage.Data.GetAliasesExesRequest; + PCSR_CAPTURE_BUFFER CaptureBuffer; + + GetAliasesExesRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetAliasesExesRequest->Length = ExeNameBufferLength; + GetAliasesExesRequest->Unicode = bUnicode; + + CaptureBuffer = CsrAllocateCaptureBuffer(1, ExeNameBufferLength); + if (!CaptureBuffer) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + + CsrAllocateMessagePointer(CaptureBuffer, + ExeNameBufferLength, + (PVOID*)&GetAliasesExesRequest->ExeNames); + + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExes), + sizeof(*GetAliasesExesRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) + { + CsrFreeCaptureBuffer(CaptureBuffer); + BaseSetLastNTError(ApiMessage.Status); + return 0; + } + + RtlCopyMemory(lpExeNameBuffer, + GetAliasesExesRequest->ExeNames, + GetAliasesExesRequest->Length); + + CsrFreeCaptureBuffer(CaptureBuffer); + + return GetAliasesExesRequest->Length; +} + /* * @implemented */ @@ -475,49 +526,8 @@ WINAPI GetConsoleAliasExesW(LPWSTR lpExeNameBuffer, DWORD ExeNameBufferLength) { - NTSTATUS Status; - CONSOLE_API_MESSAGE ApiMessage; - PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &ApiMessage.Data.GetAliasesExesRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - - DPRINT("GetConsoleAliasExesW entered\n"); - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, ExeNameBufferLength); - if (!CaptureBuffer) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; - } - - GetAliasesExesRequest->Length = ExeNameBufferLength; - - /* Allocate space for the exe name buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - ExeNameBufferLength, - (PVOID*)&GetAliasesExesRequest->ExeNames); - - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExes), - sizeof(CONSOLE_GETALIASESEXES)); - if (!NT_SUCCESS(Status)) - { - CsrFreeCaptureBuffer(CaptureBuffer); - BaseSetLastNTError(Status); - return 0; - } - - /* Copy the returned target string into the user buffer */ - memcpy(lpExeNameBuffer, - GetAliasesExesRequest->ExeNames, - GetAliasesExesRequest->Length); - - /* Release the capture buffer and exit */ - CsrFreeCaptureBuffer(CaptureBuffer); - - return GetAliasesExesRequest->Length; + DPRINT1("GetConsoleAliasExesW called\n"); + return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, TRUE); } @@ -529,46 +539,27 @@ WINAPI GetConsoleAliasExesA(LPSTR lpExeNameBuffer, DWORD ExeNameBufferLength) { - LPWSTR lpwExeNameBuffer; - DWORD dwResult; - - DPRINT("GetConsoleAliasExesA entered\n"); - - lpwExeNameBuffer = HeapAlloc(GetProcessHeap(), 0, ExeNameBufferLength * sizeof(WCHAR)); - - dwResult = GetConsoleAliasExesW(lpwExeNameBuffer, ExeNameBufferLength * sizeof(WCHAR)); - - if (dwResult) - dwResult = WideCharToMultiByte(CP_ACP, 0, lpwExeNameBuffer, dwResult / sizeof(WCHAR), lpExeNameBuffer, ExeNameBufferLength, NULL, NULL); - - HeapFree(GetProcessHeap(), 0, lpwExeNameBuffer); - return dwResult; + DPRINT1("GetConsoleAliasExesA called\n"); + return IntGetConsoleAliasExes(lpExeNameBuffer, ExeNameBufferLength, FALSE); } -/* - * @implemented - */ -DWORD -WINAPI -GetConsoleAliasExesLengthW(VOID) +static DWORD +IntGetConsoleAliasExesLength(BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &ApiMessage.Data.GetAliasesExesLengthRequest; - DPRINT("GetConsoleAliasExesLengthW entered\n"); + GetAliasesExesLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetAliasesExesLengthRequest->Unicode = bUnicode; - GetAliasesExesLengthRequest->Length = 0; - - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - NULL, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExesLength), - sizeof(CONSOLE_GETALIASESEXESLENGTH)); - - if (!NT_SUCCESS(Status)) + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetAliasExesLength), + sizeof(*GetAliasesExesLengthRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return 0; } @@ -576,6 +567,18 @@ GetConsoleAliasExesLengthW(VOID) } +/* + * @implemented + */ +DWORD +WINAPI +GetConsoleAliasExesLengthW(VOID) +{ + DPRINT1("GetConsoleAliasExesLengthW called\n"); + return IntGetConsoleAliasExesLength(TRUE); +} + + /* * @implemented */ @@ -583,16 +586,8 @@ DWORD WINAPI GetConsoleAliasExesLengthA(VOID) { - DWORD dwLength; - - DPRINT("GetConsoleAliasExesLengthA entered\n"); - - dwLength = GetConsoleAliasExesLengthW(); - - if (dwLength) - dwLength /= sizeof(WCHAR); - - return dwLength; + DPRINT1("GetConsoleAliasExesLengthA called\n"); + return IntGetConsoleAliasExesLength(FALSE); } /* EOF */ diff --git a/dll/win32/kernel32/client/console/console.c b/dll/win32/kernel32/client/console/console.c index 857a30a212c..fe4a08461a8 100644 --- a/dll/win32/kernel32/client/console/console.c +++ b/dll/win32/kernel32/client/console/console.c @@ -1076,24 +1076,37 @@ BOOL WINAPI FreeConsole(VOID) { - // AG: I'm not sure if this is correct (what happens to std handles?) - // but I just tried to reverse what AllocConsole() does... - - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_FREECONSOLE FreeConsoleRequest = &ApiMessage.Data.FreeConsoleRequest; + HANDLE ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - NULL, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFree), - sizeof(CONSOLE_FREECONSOLE)); - if (!NT_SUCCESS(Status)) + /* We must have a non-trivial handle to close */ + if (ConsoleHandle == NULL) // IsConsoleHandle(ConsoleHandle) { - BaseSetLastNTError(Status); + SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } + /* Set up the data to send to the Console Server */ + FreeConsoleRequest->ConsoleHandle = ConsoleHandle; + + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFree), + sizeof(*FreeConsoleRequest)); + + /* Check for success */ + if (!NT_SUCCESS(ApiMessage.Status)) + { + BaseSetLastNTError(ApiMessage.Status); + return FALSE; + } + + /* Reset the console handle */ NtCurrentPeb()->ProcessParameters->ConsoleHandle = NULL; + /* Close the associated input handle */ CloseHandle(InputWaitHandle); InputWaitHandle = INVALID_HANDLE_VALUE; @@ -1311,7 +1324,7 @@ GetLargestConsoleWindowSize(HANDLE hConsoleOutput) BaseSetLastNTError(ApiMessage.Status); } - DPRINT1("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest->Size.X, GetLargestWindowSizeRequest->Size.Y); + DPRINT("GetLargestConsoleWindowSize, X = %d, Y = %d\n", GetLargestWindowSizeRequest->Size.X, GetLargestWindowSizeRequest->Size.Y); return GetLargestWindowSizeRequest->Size; } @@ -1392,15 +1405,29 @@ SetConsoleCursorInfo(HANDLE hConsoleOutput, /*-------------------------------------------------------------- * GetNumberOfConsoleMouseButtons * - * @unimplemented + * @implemented */ BOOL WINAPI GetNumberOfConsoleMouseButtons(LPDWORD lpNumberOfMouseButtons) { - DPRINT1("GetNumberOfConsoleMouseButtons(0x%p) UNIMPLEMENTED!\n", lpNumberOfMouseButtons); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return FALSE; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_GETMOUSEINFO GetMouseInfoRequest = &ApiMessage.Data.GetMouseInfoRequest; + + GetMouseInfoRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetMouseInfo), + sizeof(*GetMouseInfoRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) + { + BaseSetLastNTError(ApiMessage.Status); + return FALSE; + } + + *lpNumberOfMouseButtons = GetMouseInfoRequest->NumButtons; + return TRUE; } @@ -1496,18 +1523,17 @@ SetConsoleScreenBufferSize(HANDLE hConsoleOutput, static BOOL IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput, - const SMALL_RECT *lpScrollRectangle, - const SMALL_RECT *lpClipRectangle, + CONST SMALL_RECT* lpScrollRectangle, + CONST SMALL_RECT* lpClipRectangle, COORD dwDestinationOrigin, - const CHAR_INFO *lpFill, + CONST CHAR_INFO* lpFill, BOOL bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_SCROLLSCREENBUFFER ScrollScreenBufferRequest = &ApiMessage.Data.ScrollScreenBufferRequest; - ScrollScreenBufferRequest->OutputHandle = hConsoleOutput; - ScrollScreenBufferRequest->Unicode = bUnicode; + ScrollScreenBufferRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + ScrollScreenBufferRequest->OutputHandle = hConsoleOutput; ScrollScreenBufferRequest->ScrollRectangle = *lpScrollRectangle; if (lpClipRectangle != NULL) @@ -1521,16 +1547,16 @@ IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput, } ScrollScreenBufferRequest->DestinationOrigin = dwDestinationOrigin; - ScrollScreenBufferRequest->Fill = *lpFill; + ScrollScreenBufferRequest->Fill = *lpFill; + ScrollScreenBufferRequest->Unicode = bUnicode; - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - NULL, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepScrollScreenBuffer), - sizeof(CONSOLE_SCROLLSCREENBUFFER)); - - if (!NT_SUCCESS(Status)) + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepScrollScreenBuffer), + sizeof(*ScrollScreenBufferRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return FALSE; } @@ -1546,16 +1572,16 @@ IntScrollConsoleScreenBuffer(HANDLE hConsoleOutput, BOOL WINAPI ScrollConsoleScreenBufferA(HANDLE hConsoleOutput, - CONST SMALL_RECT *lpScrollRectangle, - CONST SMALL_RECT *lpClipRectangle, + CONST SMALL_RECT* lpScrollRectangle, + CONST SMALL_RECT* lpClipRectangle, COORD dwDestinationOrigin, - CONST CHAR_INFO *lpFill) + CONST CHAR_INFO* lpFill) { return IntScrollConsoleScreenBuffer(hConsoleOutput, - (PSMALL_RECT)lpScrollRectangle, - (PSMALL_RECT)lpClipRectangle, + lpScrollRectangle, + lpClipRectangle, dwDestinationOrigin, - (PCHAR_INFO)lpFill, + lpFill, FALSE); } @@ -1868,14 +1894,16 @@ GetConsoleTitleA(LPSTR lpConsoleTitle, static BOOL -IntSetConsoleTitle(CONST VOID *lpConsoleTitle, DWORD dwNumChars, BOOLEAN bUnicode) +IntSetConsoleTitle(CONST VOID *lpConsoleTitle, BOOLEAN bUnicode) { CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETSETCONSOLETITLE TitleRequest = &ApiMessage.Data.TitleRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; + ULONG NumChars = (ULONG)(lpConsoleTitle ? (bUnicode ? wcslen(lpConsoleTitle) : strlen(lpConsoleTitle)) : 0); + TitleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; - TitleRequest->Length = dwNumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + TitleRequest->Length = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); TitleRequest->Unicode = bUnicode; CaptureBuffer = CsrAllocateCaptureBuffer(1, TitleRequest->Length); @@ -1916,7 +1944,7 @@ BOOL WINAPI SetConsoleTitleW(LPCWSTR lpConsoleTitle) { - return IntSetConsoleTitle(lpConsoleTitle, wcslen(lpConsoleTitle), TRUE); + return IntSetConsoleTitle(lpConsoleTitle, TRUE); } @@ -1929,7 +1957,7 @@ BOOL WINAPI SetConsoleTitleA(LPCSTR lpConsoleTitle) { - return IntSetConsoleTitle(lpConsoleTitle, strlen(lpConsoleTitle), FALSE); + return IntSetConsoleTitle(lpConsoleTitle, FALSE); } @@ -2522,14 +2550,6 @@ GetConsoleCursorMode(HANDLE hConsole, PBOOL pUnknown1, PBOOL pUnknown2) return FALSE; } -BOOL -WINAPI -GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode) -{ - STUB; - return FALSE; -} - BOOL WINAPI SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2) @@ -2540,7 +2560,7 @@ SetConsoleCursorMode(HANDLE hConsole, BOOL Unknown1, BOOL Unknown2) BOOL WINAPI -SetConsoleLocalEUDC(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4) +GetConsoleNlsMode(HANDLE hConsole, LPDWORD lpMode) { STUB; return FALSE; @@ -2554,6 +2574,14 @@ SetConsoleNlsMode(HANDLE hConsole, DWORD dwMode) return FALSE; } +BOOL +WINAPI +SetConsoleLocalEUDC(DWORD Unknown1, DWORD Unknown2, DWORD Unknown3, DWORD Unknown4) +{ + STUB; + return FALSE; +} + BOOL WINAPI RegisterConsoleIME(HWND hWnd, LPDWORD ThreadId) @@ -2587,22 +2615,67 @@ UnregisterConsoleIME(VOID) } -/* - * @unimplemented - */ -BOOL WINAPI GetConsoleKeyboardLayoutNameA(LPSTR name) +BOOL +IntGetConsoleKeyboardLayoutName(OUT PVOID pszLayoutName, + IN BOOL bAnsi) { - STUB; - return 0; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest = &ApiMessage.Data.GetKbdLayoutNameRequest; + + /* Set up the data to send to the Console Server */ + GetKbdLayoutNameRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetKbdLayoutNameRequest->Ansi = bAnsi; + + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetKeyboardLayoutName), + sizeof(*GetKbdLayoutNameRequest)); + + /* Check for success */ + if (!NT_SUCCESS(ApiMessage.Status)) + { + BaseSetLastNTError(ApiMessage.Status); + return FALSE; + } + + /* Retrieve the results */ + _SEH2_TRY + { + /* Copy only KL_NAMELENGTH == 9 characters, ANSI or UNICODE */ + if (bAnsi) + strncpy(pszLayoutName, (PCHAR)GetKbdLayoutNameRequest->LayoutBuffer, KL_NAMELENGTH); + else + wcsncpy(pszLayoutName, (PWCHAR)GetKbdLayoutNameRequest->LayoutBuffer, KL_NAMELENGTH); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; + + return TRUE; } /* - * @unimplemented + * @implemented (undocumented) */ -BOOL WINAPI GetConsoleKeyboardLayoutNameW(LPWSTR name) +BOOL +WINAPI +GetConsoleKeyboardLayoutNameA(OUT LPSTR pszLayoutName) { - STUB; - return 0; + return IntGetConsoleKeyboardLayoutName(pszLayoutName, TRUE); +} + +/* + * @implemented (undocumented) + */ +BOOL +WINAPI +GetConsoleKeyboardLayoutNameW(OUT LPWSTR pszLayoutName) +{ + return IntGetConsoleKeyboardLayoutName(pszLayoutName, FALSE); } /* diff --git a/dll/win32/kernel32/client/console/history.c b/dll/win32/kernel32/client/console/history.c index ae8e93de9a0..2fc50245fb4 100644 --- a/dll/win32/kernel32/client/console/history.c +++ b/dll/win32/kernel32/client/console/history.c @@ -16,13 +16,14 @@ /* PRIVATE FUNCTIONS **********************************************************/ +#if 0 /* Get the size needed to copy a string to a capture buffer, including alignment */ static ULONG IntStringSize(LPCVOID String, BOOL Unicode) { ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR); - return (Size + 3) & -4; + return (Size + 3) & ~3; } @@ -48,67 +49,81 @@ IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer, } RequestString->Length = RequestString->MaximumLength = (USHORT)Size; } +#endif - -static BOOL -IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOL bUnicode) +static VOID +IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &ApiMessage.Data.ExpungeCommandHistoryRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName)) + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); + + if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + return; } - CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + ExpungeCommandHistoryRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + ExpungeCommandHistoryRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + ExpungeCommandHistoryRequest->Unicode = + ExpungeCommandHistoryRequest->Unicode2 = bUnicode; + + // CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + CaptureBuffer = CsrAllocateCaptureBuffer(1, ExpungeCommandHistoryRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; + return; } - IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, - &ExpungeCommandHistoryRequest->ExeName); + // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, + // &ExpungeCommandHistoryRequest->ExeName); + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpExeName, + ExpungeCommandHistoryRequest->ExeLength, + (PVOID)&ExpungeCommandHistoryRequest->ExeName); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepExpungeCommandHistory), - sizeof(CONSOLE_EXPUNGECOMMANDHISTORY)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepExpungeCommandHistory), + sizeof(*ExpungeCommandHistoryRequest)); CsrFreeCaptureBuffer(CaptureBuffer); - if (!NT_SUCCESS(Status)) - { - BaseSetLastNTError(Status); - return FALSE; - } - - return TRUE; + if (!NT_SUCCESS(ApiMessage.Status)) + BaseSetLastNTError(ApiMessage.Status); } static DWORD -IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOL bUnicode) +IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &ApiMessage.Data.GetCommandHistoryRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - DWORD HistoryLength = cbHistory * (bUnicode ? 1 : sizeof(WCHAR)); - if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName)) + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); + + if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } - CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) + - HistoryLength); + GetCommandHistoryRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetCommandHistoryRequest->HistoryLength = cbHistory; + GetCommandHistoryRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + GetCommandHistoryRequest->Unicode = + GetCommandHistoryRequest->Unicode2 = bUnicode; + + // CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) + + // HistoryLength); + CaptureBuffer = CsrAllocateCaptureBuffer(2, GetCommandHistoryRequest->ExeLength + + GetCommandHistoryRequest->HistoryLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); @@ -116,60 +131,60 @@ IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName return 0; } - IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, - &GetCommandHistoryRequest->ExeName); - GetCommandHistoryRequest->Length = HistoryLength; - CsrAllocateMessagePointer(CaptureBuffer, HistoryLength, + // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, + // &GetCommandHistoryRequest->ExeName); + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpExeName, + GetCommandHistoryRequest->ExeLength, + (PVOID)&GetCommandHistoryRequest->ExeName); + + // CsrAllocateMessagePointer(CaptureBuffer, HistoryLength, + CsrAllocateMessagePointer(CaptureBuffer, GetCommandHistoryRequest->HistoryLength, (PVOID*)&GetCommandHistoryRequest->History); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCommandHistory), - sizeof(CONSOLE_GETCOMMANDHISTORY)); - if (!NT_SUCCESS(Status)) + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCommandHistory), + sizeof(*GetCommandHistoryRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) { CsrFreeCaptureBuffer(CaptureBuffer); - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return 0; } - if (bUnicode) - { - memcpy(lpHistory, - GetCommandHistoryRequest->History, - GetCommandHistoryRequest->Length); - } - else - { - WideCharToMultiByte(CP_ACP, 0, - GetCommandHistoryRequest->History, - GetCommandHistoryRequest->Length / sizeof(WCHAR), - lpHistory, - cbHistory, - NULL, NULL); - } + RtlCopyMemory(lpHistory, + GetCommandHistoryRequest->History, + GetCommandHistoryRequest->HistoryLength); CsrFreeCaptureBuffer(CaptureBuffer); - return GetCommandHistoryRequest->Length; + return GetCommandHistoryRequest->HistoryLength; } static DWORD IntGetConsoleCommandHistoryLength(LPCVOID lpExeName, BOOL bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &ApiMessage.Data.GetCommandHistoryLengthRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName)) + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); + + if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return 0; } - CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + GetCommandHistoryLengthRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetCommandHistoryLengthRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + GetCommandHistoryLengthRequest->Unicode = + GetCommandHistoryLengthRequest->Unicode2 = bUnicode; + + // CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + CaptureBuffer = CsrAllocateCaptureBuffer(1, GetCommandHistoryLengthRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); @@ -177,43 +192,55 @@ IntGetConsoleCommandHistoryLength(LPCVOID lpExeName, BOOL bUnicode) return 0; } - IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, - &GetCommandHistoryLengthRequest->ExeName); + // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, + // &GetCommandHistoryLengthRequest->ExeName); + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpExeName, + GetCommandHistoryLengthRequest->ExeLength, + (PVOID)&GetCommandHistoryLengthRequest->ExeName); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCommandHistoryLength), - sizeof(CONSOLE_GETCOMMANDHISTORYLENGTH)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetCommandHistoryLength), + sizeof(*GetCommandHistoryLengthRequest)); CsrFreeCaptureBuffer(CaptureBuffer); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return 0; } - return GetCommandHistoryLengthRequest->Length; + return GetCommandHistoryLengthRequest->HistoryLength; } static BOOL IntSetConsoleNumberOfCommands(DWORD dwNumCommands, LPCVOID lpExeName, - BOOL bUnicode) + BOOLEAN bUnicode) { - NTSTATUS Status; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &ApiMessage.Data.SetHistoryNumberCommandsRequest; PCSR_CAPTURE_BUFFER CaptureBuffer; - if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName)) + USHORT NumChars = (USHORT)(lpExeName ? (bUnicode ? wcslen(lpExeName) : strlen(lpExeName)) : 0); + + if (lpExeName == NULL || NumChars == 0) { SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + SetHistoryNumberCommandsRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + SetHistoryNumberCommandsRequest->NumCommands = dwNumCommands; + SetHistoryNumberCommandsRequest->ExeLength = NumChars * (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + SetHistoryNumberCommandsRequest->Unicode = + SetHistoryNumberCommandsRequest->Unicode2 = bUnicode; + + // CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode)); + CaptureBuffer = CsrAllocateCaptureBuffer(1, SetHistoryNumberCommandsRequest->ExeLength); if (!CaptureBuffer) { DPRINT1("CsrAllocateCaptureBuffer failed!\n"); @@ -221,20 +248,23 @@ IntSetConsoleNumberOfCommands(DWORD dwNumCommands, return FALSE; } - IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, - &SetHistoryNumberCommandsRequest->ExeName); - SetHistoryNumberCommandsRequest->NumCommands = dwNumCommands; + // IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode, + // &SetHistoryNumberCommandsRequest->ExeName); + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpExeName, + SetHistoryNumberCommandsRequest->ExeLength, + (PVOID)&SetHistoryNumberCommandsRequest->ExeName); - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetNumberOfCommands), - sizeof(CONSOLE_SETHISTORYNUMBERCOMMANDS)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetNumberOfCommands), + sizeof(*SetHistoryNumberCommandsRequest)); CsrFreeCaptureBuffer(CaptureBuffer); - if (!NT_SUCCESS(Status)) + if (!NT_SUCCESS(ApiMessage.Status)) { - BaseSetLastNTError(Status); + BaseSetLastNTError(ApiMessage.Status); return FALSE; } @@ -247,22 +277,22 @@ IntSetConsoleNumberOfCommands(DWORD dwNumCommands, /* * @implemented (Undocumented) */ -BOOL +VOID WINAPI ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName) { - return IntExpungeConsoleCommandHistory(lpExeName, TRUE); + IntExpungeConsoleCommandHistory(lpExeName, TRUE); } /* * @implemented (Undocumented) */ -BOOL +VOID WINAPI ExpungeConsoleCommandHistoryA(LPCSTR lpExeName) { - return IntExpungeConsoleCommandHistory(lpExeName, FALSE); + IntExpungeConsoleCommandHistory(lpExeName, FALSE); } @@ -310,7 +340,7 @@ DWORD WINAPI GetConsoleCommandHistoryLengthA(LPCSTR lpExeName) { - return IntGetConsoleCommandHistoryLength(lpExeName, FALSE) / sizeof(WCHAR); + return IntGetConsoleCommandHistoryLength(lpExeName, FALSE); } @@ -320,7 +350,7 @@ GetConsoleCommandHistoryLengthA(LPCSTR lpExeName) BOOL WINAPI SetConsoleNumberOfCommandsW(DWORD dwNumCommands, - LPCSTR lpExeName) + LPCWSTR lpExeName) { return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, TRUE); } @@ -332,21 +362,36 @@ SetConsoleNumberOfCommandsW(DWORD dwNumCommands, BOOL WINAPI SetConsoleNumberOfCommandsA(DWORD dwNumCommands, - LPCWSTR lpExeName) + LPCSTR lpExeName) { return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, FALSE); } /* - * @unimplemented + * @implemented */ BOOL WINAPI SetConsoleCommandHistoryMode(IN DWORD dwMode) { - STUB; - return FALSE; + CONSOLE_API_MESSAGE ApiMessage; + PCONSOLE_SETHISTORYMODE SetHistoryModeRequest = &ApiMessage.Data.SetHistoryModeRequest; + + SetHistoryModeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + SetHistoryModeRequest->Mode = dwMode; + + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepSetCommandHistoryMode), + sizeof(*SetHistoryModeRequest)); + if (!NT_SUCCESS(ApiMessage.Status)) + { + BaseSetLastNTError(ApiMessage.Status); + return FALSE; + } + + return TRUE; } /* EOF */ diff --git a/dll/win32/kernel32/client/console/readwrite.c b/dll/win32/kernel32/client/console/readwrite.c index d42f8d0a9cb..9db3ab5cab1 100644 --- a/dll/win32/kernel32/client/console/readwrite.c +++ b/dll/win32/kernel32/client/console/readwrite.c @@ -18,365 +18,593 @@ #include +/* See consrv/include/rect.h */ +#define ConioRectHeight(Rect) \ + (((Rect)->Top) > ((Rect)->Bottom) ? 0 : ((Rect)->Bottom) - ((Rect)->Top) + 1) +#define ConioRectWidth(Rect) \ + (((Rect)->Left) > ((Rect)->Right) ? 0 : ((Rect)->Right) - ((Rect)->Left) + 1) + + /* PRIVATE FUNCTIONS **********************************************************/ /****************** * Read functions * ******************/ +DWORD +WINAPI +GetConsoleInputExeNameW(DWORD nBufferLength, LPWSTR lpBuffer); + static BOOL -IntReadConsole(HANDLE hConsoleInput, - PVOID lpBuffer, - DWORD nNumberOfCharsToRead, - LPDWORD lpNumberOfCharsRead, - PCONSOLE_READCONSOLE_CONTROL pInputControl, - BOOL bUnicode) +IntReadConsole(IN HANDLE hConsoleInput, + OUT PVOID lpBuffer, + IN DWORD nNumberOfCharsToRead, + OUT LPDWORD lpNumberOfCharsRead, + IN PCONSOLE_READCONSOLE_CONTROL pInputControl OPTIONAL, + IN BOOLEAN bUnicode) { - NTSTATUS Status; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_READCONSOLE ReadConsoleRequest = &ApiMessage.Data.ReadConsoleRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG CharSize; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; + ULONG CharSize, SizeBytes; + + DPRINT("IntReadConsole\n"); + + /* Set up the data to send to the Console Server */ + ReadConsoleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + ReadConsoleRequest->InputHandle = hConsoleInput; + ReadConsoleRequest->Unicode = bUnicode; + + /* + * Retrieve the current console executable name string and length (always + * in UNICODE format). + * FIXME: Do not use GetConsoleInputExeNameW but use something else... + */ + // 1- Get the exe name length in characters, including NULL character. + ReadConsoleRequest->ExeLength = + (USHORT)GetConsoleInputExeNameW(0, (PWCHAR)ReadConsoleRequest->StaticBuffer); + // 2- Get the exe name (GetConsoleInputExeNameW returns 1 in case of success). + if (GetConsoleInputExeNameW(ReadConsoleRequest->ExeLength, + (PWCHAR)ReadConsoleRequest->StaticBuffer) != 1) + { + // Nothing + ReadConsoleRequest->ExeLength = 0; + } + else + { + // Remove the NULL character, and convert in number of bytes. + ReadConsoleRequest->ExeLength--; + ReadConsoleRequest->ExeLength *= sizeof(WCHAR); + } + + /*** For DEBUGGING purposes ***/ + { + UNICODE_STRING ExeName; + ExeName.Length = ExeName.MaximumLength = ReadConsoleRequest->ExeLength; + ExeName.Buffer = (PWCHAR)ReadConsoleRequest->StaticBuffer; + DPRINT1("IntReadConsole(ExeName = %wZ)\n", &ExeName); + } + /******************************/ /* Determine the needed size */ - CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); - ReadConsoleRequest->BufferSize = nNumberOfCharsToRead * CharSize; + CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + SizeBytes = nNumberOfCharsToRead * CharSize; - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, ReadConsoleRequest->BufferSize); - if (CaptureBuffer == NULL) + ReadConsoleRequest->CaptureBufferSize = + ReadConsoleRequest->NumBytes = SizeBytes; + + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are read. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (SizeBytes <= sizeof(ReadConsoleRequest->StaticBuffer)) { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - /* Allocate space in the Buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - ReadConsoleRequest->BufferSize, - (PVOID*)&ReadConsoleRequest->Buffer); - - /* Set up the data to send to the Console Server */ - ReadConsoleRequest->InputHandle = hConsoleInput; - ReadConsoleRequest->Unicode = bUnicode; - ReadConsoleRequest->NrCharactersToRead = nNumberOfCharsToRead; - ReadConsoleRequest->NrCharactersRead = 0; - ReadConsoleRequest->CtrlWakeupMask = 0; - if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL)) - { - /* - * From MSDN (ReadConsole function), the description - * for pInputControl says: - * "This parameter requires Unicode input by default. - * For ANSI mode, set this parameter to NULL." - */ - ReadConsoleRequest->NrCharactersRead = pInputControl->nInitialChars; - memcpy(ReadConsoleRequest->Buffer, - lpBuffer, - pInputControl->nInitialChars * sizeof(WCHAR)); - ReadConsoleRequest->CtrlWakeupMask = pInputControl->dwCtrlWakeupMask; - } - - /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepReadConsole), - sizeof(CONSOLE_READCONSOLE)); - - /* Check for success */ - if (NT_SUCCESS(Status)) - { - memcpy(lpBuffer, - ReadConsoleRequest->Buffer, - ReadConsoleRequest->NrCharactersRead * CharSize); - - if (lpNumberOfCharsRead != NULL) - *lpNumberOfCharsRead = ReadConsoleRequest->NrCharactersRead; - - if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL)) - pInputControl->dwControlKeyState = ReadConsoleRequest->ControlKeyState; + ReadConsoleRequest->Buffer = ReadConsoleRequest->StaticBuffer; + // CaptureBuffer = NULL; } else { - DPRINT1("CSR returned error in ReadConsole\n"); + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, SizeBytes); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } - if (lpNumberOfCharsRead != NULL) - *lpNumberOfCharsRead = 0; - - /* Error out */ - BaseSetLastNTError(Status); + /* Allocate space in the Buffer */ + CsrAllocateMessagePointer(CaptureBuffer, + SizeBytes, + (PVOID*)&ReadConsoleRequest->Buffer); } - CsrFreeCaptureBuffer(CaptureBuffer); + ReadConsoleRequest->InitialNumBytes = 0; + ReadConsoleRequest->CtrlWakeupMask = 0; + ReadConsoleRequest->ControlKeyState = 0; - /* Return TRUE or FALSE */ - // return TRUE; - return (ReadConsoleRequest->NrCharactersRead > 0); - // return NT_SUCCESS(Status); + /* + * From MSDN (ReadConsole function), the description + * for pInputControl says: + * "This parameter requires Unicode input by default. + * For ANSI mode, set this parameter to NULL." + */ + _SEH2_TRY + { + if (bUnicode && pInputControl && + pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL)) + { + /* Sanity check */ + if (pInputControl->nInitialChars <= nNumberOfCharsToRead) + { + ReadConsoleRequest->InitialNumBytes = + pInputControl->nInitialChars * sizeof(WCHAR); // CharSize + + if (pInputControl->nInitialChars != 0) + { + /* + * It is possible here to overwrite the static buffer, in case + * the number of bytes to read was smaller than the static buffer. + * In this case, this means we are continuing a pending read, + * and we do not need in fact the executable name that was + * stored in the static buffer because it was first grabbed when + * we started the first read. + */ + RtlCopyMemory(ReadConsoleRequest->Buffer, + lpBuffer, + ReadConsoleRequest->InitialNumBytes); + } + + ReadConsoleRequest->CtrlWakeupMask = pInputControl->dwCtrlWakeupMask; + } + else + { + // Status = STATUS_INVALID_PARAMETER; + } + } + else + { + /* We are in a situation where pInputControl has no meaning */ + pInputControl = NULL; + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + // HACK + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; + + /* Check for sanity */ +/* + if (!NT_SUCCESS(Status) && pInputControl) + { + // Free CaptureBuffer if needed + // Set last error to last status + // Return FALSE + } +*/ + + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepReadConsole), + sizeof(*ReadConsoleRequest)); + + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Retrieve the results */ + if (Success) + { + _SEH2_TRY + { + *lpNumberOfCharsRead = ReadConsoleRequest->NumBytes / CharSize; + + if (bUnicode && pInputControl) + pInputControl->dwControlKeyState = ReadConsoleRequest->ControlKeyState; + + RtlCopyMemory(lpBuffer, + ReadConsoleRequest->Buffer, + ReadConsoleRequest->NumBytes); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + if (Success) + { + /* Yield execution to another thread if Ctrl-C or Ctrl-Break happened */ + if (ApiMessage.Status == STATUS_ALERTED /* || ApiMessage.Status == STATUS_CANCELLED */) + { + NtYieldExecution(); + SetLastError(ERROR_OPERATION_ABORTED); // STATUS_CANCELLED + } + } + + /* Return success status */ + return Success; } static BOOL -IntGetConsoleInput(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead, - WORD wFlags, - BOOLEAN bUnicode) +IntGetConsoleInput(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead, + IN WORD wFlags, + IN BOOLEAN bUnicode) { - NTSTATUS Status; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_GETINPUT GetInputRequest = &ApiMessage.Data.GetInputRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG Size; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; - if (lpBuffer == NULL) + if (!IsConsoleHandle(hConsoleInput)) { - SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_TRY + { + *lpNumberOfEventsRead = 0; + SetLastError(ERROR_INVALID_HANDLE); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + } + _SEH2_END; + return FALSE; } - Size = nLength * sizeof(INPUT_RECORD); - - DPRINT("IntGetConsoleInput: %lx %p\n", Size, lpNumberOfEventsRead); - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - /* Allocate space in the Buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - Size, - (PVOID*)&GetInputRequest->InputRecord); + DPRINT("IntGetConsoleInput: %lx %p\n", nLength, lpNumberOfEventsRead); /* Set up the data to send to the Console Server */ - GetInputRequest->InputHandle = hConsoleInput; - GetInputRequest->InputsRead = 0; - GetInputRequest->Length = nLength; - GetInputRequest->wFlags = wFlags; - GetInputRequest->Unicode = bUnicode; + GetInputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + GetInputRequest->InputHandle = hConsoleInput; + GetInputRequest->NumRecords = nLength; + GetInputRequest->Flags = wFlags; + GetInputRequest->Unicode = bUnicode; - /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetConsoleInput), - sizeof(CONSOLE_GETINPUT)); - DPRINT("Server returned: %x\n", Status); - - /* Check for success */ - if (NT_SUCCESS(Status)) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than five + * input records are read. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (nLength <= sizeof(GetInputRequest->RecordStaticBuffer)/sizeof(INPUT_RECORD)) { - /* Return the number of events read */ - DPRINT("Events read: %lx\n", GetInputRequest->InputsRead); - - if (lpNumberOfEventsRead != NULL) - *lpNumberOfEventsRead = GetInputRequest->InputsRead; - - /* Copy into the buffer */ - DPRINT("Copying to buffer\n"); - RtlCopyMemory(lpBuffer, - GetInputRequest->InputRecord, - sizeof(INPUT_RECORD) * GetInputRequest->InputsRead); + GetInputRequest->RecordBufPtr = GetInputRequest->RecordStaticBuffer; + // CaptureBuffer = NULL; } else { - if (lpNumberOfEventsRead != NULL) - *lpNumberOfEventsRead = 0; + ULONG Size = nLength * sizeof(INPUT_RECORD); - /* Error out */ - BaseSetLastNTError(Status); + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + /* Allocate space in the Buffer */ + CsrAllocateMessagePointer(CaptureBuffer, + Size, + (PVOID*)&GetInputRequest->RecordBufPtr); } - /* Release the capture buffer */ - CsrFreeCaptureBuffer(CaptureBuffer); + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepGetConsoleInput), + sizeof(*GetInputRequest)); - /* Return TRUE or FALSE */ - return (GetInputRequest->InputsRead > 0); - // return NT_SUCCESS(Status); + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Retrieve the results */ + _SEH2_TRY + { + DPRINT("Events read: %lx\n", GetInputRequest->NumRecords); + *lpNumberOfEventsRead = GetInputRequest->NumRecords; + + if (Success) + { + RtlCopyMemory(lpBuffer, + GetInputRequest->RecordBufPtr, + GetInputRequest->NumRecords * sizeof(INPUT_RECORD)); + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Return success status */ + return Success; } static BOOL -IntReadConsoleOutput(HANDLE hConsoleOutput, - PCHAR_INFO lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpReadRegion, - BOOL bUnicode) +IntReadConsoleOutput(IN HANDLE hConsoleOutput, + OUT PCHAR_INFO lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpReadRegion, + IN BOOLEAN bUnicode) { + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_READOUTPUT ReadOutputRequest = &ApiMessage.Data.ReadOutputRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - DWORD Size, SizeX, SizeY; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; - if (lpBuffer == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - - Size = dwBufferSize.X * dwBufferSize.Y * sizeof(CHAR_INFO); - - DPRINT("IntReadConsoleOutput: %lx %p\n", Size, lpReadRegion); - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed with size 0x%x!\n", Size); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - /* Allocate space in the Buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - Size, - (PVOID*)&ReadOutputRequest->CharInfo); + SHORT SizeX, SizeY; + ULONG NumCells; /* Set up the data to send to the Console Server */ - ReadOutputRequest->OutputHandle = hConsoleOutput; - ReadOutputRequest->Unicode = bUnicode; - ReadOutputRequest->BufferSize = dwBufferSize; - ReadOutputRequest->BufferCoord = dwBufferCoord; - ReadOutputRequest->ReadRegion = *lpReadRegion; + ReadOutputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + ReadOutputRequest->OutputHandle = hConsoleOutput; + ReadOutputRequest->Unicode = bUnicode; + + /* Update lpReadRegion */ + _SEH2_TRY + { + SizeX = min(dwBufferSize.X - dwBufferCoord.X, ConioRectWidth(lpReadRegion)); + SizeY = min(dwBufferSize.Y - dwBufferCoord.Y, ConioRectHeight(lpReadRegion)); + if (SizeX <= 0 || SizeY <= 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + lpReadRegion->Right = lpReadRegion->Left + SizeX - 1; + lpReadRegion->Bottom = lpReadRegion->Top + SizeY - 1; + + ReadOutputRequest->ReadRegion = *lpReadRegion; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; + + NumCells = SizeX * SizeY; + DPRINT("IntReadConsoleOutput: (%d x %d)\n", SizeX, SizeY); + + /* + * 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 allocated. + * This behaviour is also expected in the server-side. + */ + if (NumCells <= 1) + { + ReadOutputRequest->CharInfo = &ReadOutputRequest->StaticBuffer; + // CaptureBuffer = NULL; + } + else + { + ULONG Size = NumCells * sizeof(CHAR_INFO); + + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed with size %ld!\n", Size); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + /* Allocate space in the Buffer */ + CsrAllocateMessagePointer(CaptureBuffer, + Size, + (PVOID*)&ReadOutputRequest->CharInfo); + } /* Call the server */ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepReadConsoleOutput), - sizeof(CONSOLE_READOUTPUT)); - DPRINT("Server returned: %x\n", ApiMessage.Status); + sizeof(*ReadOutputRequest)); /* Check for success */ - if (NT_SUCCESS(ApiMessage.Status)) + Success = NT_SUCCESS(ApiMessage.Status); + + /* Retrieve the results */ + _SEH2_TRY { - /* Copy into the buffer */ - DPRINT("Copying to buffer\n"); - SizeX = ReadOutputRequest->ReadRegion.Right - - ReadOutputRequest->ReadRegion.Left + 1; - SizeY = ReadOutputRequest->ReadRegion.Bottom - - ReadOutputRequest->ReadRegion.Top + 1; - RtlCopyMemory(lpBuffer, - ReadOutputRequest->CharInfo, - sizeof(CHAR_INFO) * SizeX * SizeY); + *lpReadRegion = ReadOutputRequest->ReadRegion; + + if (Success) + { +#if 0 + SHORT x, X; +#endif + SHORT y, Y; + + /* Copy into the buffer */ + + SizeX = ReadOutputRequest->ReadRegion.Right - + ReadOutputRequest->ReadRegion.Left + 1; + + for (y = 0, Y = ReadOutputRequest->ReadRegion.Top; Y <= ReadOutputRequest->ReadRegion.Bottom; ++y, ++Y) + { + RtlCopyMemory(lpBuffer + (y + dwBufferCoord.Y) * dwBufferSize.X + dwBufferCoord.X, + ReadOutputRequest->CharInfo + y * SizeX, + SizeX * sizeof(CHAR_INFO)); +#if 0 + for (x = 0, X = ReadOutputRequest->ReadRegion.Left; X <= ReadOutputRequest->ReadRegion.Right; ++x, ++X) + { + *(lpBuffer + (y + dwBufferCoord.Y) * dwBufferSize.X + (x + dwBufferCoord.X)) = + *(ReadOutputRequest->CharInfo + y * SizeX + x); + } +#endif + } + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } } - else + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Error out */ - BaseSetLastNTError(ApiMessage.Status); + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; } + _SEH2_END; - /* Return the read region */ - DPRINT("read region: %p\n", ReadOutputRequest->ReadRegion); - *lpReadRegion = ReadOutputRequest->ReadRegion; + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); - /* Release the capture buffer */ - CsrFreeCaptureBuffer(CaptureBuffer); - - /* Return TRUE or FALSE */ - return NT_SUCCESS(ApiMessage.Status); + /* Return success status */ + return Success; } static BOOL -IntReadConsoleOutputCode(HANDLE hConsoleOutput, - CODE_TYPE CodeType, - PVOID pCode, - DWORD nLength, - COORD dwReadCoord, - LPDWORD lpNumberOfCodesRead) +IntReadConsoleOutputCode(IN HANDLE hConsoleOutput, + IN CODE_TYPE CodeType, + OUT PVOID pCode, + IN DWORD nLength, + IN COORD dwReadCoord, + OUT LPDWORD lpNumberOfCodesRead) { - NTSTATUS Status; - BOOL bRet = TRUE; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_READOUTPUTCODE ReadOutputCodeRequest = &ApiMessage.Data.ReadOutputCodeRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG SizeBytes, CodeSize; - DWORD CodesRead; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; + ULONG CodeSize, SizeBytes; - /* Determine the needed size */ - switch (CodeType) + DPRINT("IntReadConsoleOutputCode\n"); + + if ( (CodeType != CODE_ASCII ) && + (CodeType != CODE_UNICODE ) && + (CodeType != CODE_ATTRIBUTE) ) { - case CODE_ASCII: - CodeSize = sizeof(CHAR); - break; - - case CODE_UNICODE: - CodeSize = sizeof(WCHAR); - break; - - case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); - break; - - default: - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - SizeBytes = nLength * CodeSize; - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, SizeBytes); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - /* Allocate space in the Buffer */ - CsrAllocateMessagePointer(CaptureBuffer, - SizeBytes, - (PVOID*)&ReadOutputCodeRequest->pCode.pCode); + /* Set up the data to send to the Console Server */ + ReadOutputCodeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + ReadOutputCodeRequest->OutputHandle = hConsoleOutput; + ReadOutputCodeRequest->Coord = dwReadCoord; + ReadOutputCodeRequest->NumCodes = nLength; - /* Start reading */ - ReadOutputCodeRequest->OutputHandle = hConsoleOutput; + /* Determine the needed size */ ReadOutputCodeRequest->CodeType = CodeType; - ReadOutputCodeRequest->ReadCoord = dwReadCoord; - - ReadOutputCodeRequest->NumCodesToRead = nLength; - - /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepReadConsoleOutputString), - sizeof(CONSOLE_READOUTPUTCODE)); - - /* Check for success */ - if (NT_SUCCESS(Status)) + switch (CodeType) { - CodesRead = ReadOutputCodeRequest->CodesRead; - memcpy(pCode, ReadOutputCodeRequest->pCode.pCode, CodesRead * CodeSize); + case CODE_ASCII: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); + break; - // ReadOutputCodeRequest->ReadCoord = ReadOutputCodeRequest->EndCoord; + case CODE_UNICODE: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); + break; - if (lpNumberOfCodesRead != NULL) - *lpNumberOfCodesRead = CodesRead; + case CODE_ATTRIBUTE: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); + break; + } + SizeBytes = nLength * CodeSize; - bRet = TRUE; + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are read. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (SizeBytes <= sizeof(ReadOutputCodeRequest->CodeStaticBuffer)) + { + ReadOutputCodeRequest->pCode = ReadOutputCodeRequest->CodeStaticBuffer; + // CaptureBuffer = NULL; } else { - if (lpNumberOfCodesRead != NULL) - *lpNumberOfCodesRead = 0; + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, SizeBytes); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } - /* Error out */ - BaseSetLastNTError(Status); - bRet = FALSE; + /* Allocate space in the Buffer */ + CsrAllocateMessagePointer(CaptureBuffer, + SizeBytes, + (PVOID*)&ReadOutputCodeRequest->pCode); } - CsrFreeCaptureBuffer(CaptureBuffer); + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepReadConsoleOutputString), + sizeof(*ReadOutputCodeRequest)); - return bRet; + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Retrieve the results */ + _SEH2_TRY + { + *lpNumberOfCodesRead = ReadOutputCodeRequest->NumCodes; + + if (Success) + { + RtlCopyMemory(pCode, + ReadOutputCodeRequest->pCode, + ReadOutputCodeRequest->NumCodes * CodeSize); + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Return success status */ + return Success; } @@ -386,379 +614,539 @@ IntReadConsoleOutputCode(HANDLE hConsoleOutput, static BOOL -IntWriteConsole(HANDLE hConsoleOutput, - PVOID lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCharsWritten, +IntWriteConsole(IN HANDLE hConsoleOutput, + IN PVOID lpBuffer, + IN DWORD nNumberOfCharsToWrite, + OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved, - BOOL bUnicode) + IN BOOLEAN bUnicode) { - NTSTATUS Status; - BOOL bRet = TRUE; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_WRITECONSOLE WriteConsoleRequest = &ApiMessage.Data.WriteConsoleRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG CharSize; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; + ULONG CharSize, SizeBytes; + + DPRINT("IntWriteConsole\n"); + + /* Set up the data to send to the Console Server */ + WriteConsoleRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + WriteConsoleRequest->OutputHandle = hConsoleOutput; + WriteConsoleRequest->Unicode = bUnicode; + + /* Those members are unused by the client, on Windows */ + WriteConsoleRequest->Reserved1 = 0; + // WriteConsoleRequest->Reserved2 = {0}; /* Determine the needed size */ - CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); - WriteConsoleRequest->BufferSize = nNumberOfCharsToWrite * CharSize; + CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR)); + SizeBytes = nNumberOfCharsToWrite * CharSize; - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, WriteConsoleRequest->BufferSize); - if (CaptureBuffer == NULL) + WriteConsoleRequest->NumBytes = SizeBytes; + + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are written. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (SizeBytes <= sizeof(WriteConsoleRequest->StaticBuffer)) { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } + WriteConsoleRequest->Buffer = WriteConsoleRequest->StaticBuffer; + // CaptureBuffer = NULL; + WriteConsoleRequest->UsingStaticBuffer = TRUE; - /* Capture the buffer to write */ - CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)lpBuffer, - WriteConsoleRequest->BufferSize, - (PVOID*)&WriteConsoleRequest->Buffer); - - /* Start writing */ - WriteConsoleRequest->NrCharactersToWrite = nNumberOfCharsToWrite; - WriteConsoleRequest->OutputHandle = hConsoleOutput; - WriteConsoleRequest->Unicode = bUnicode; - - /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsole), - sizeof(CONSOLE_WRITECONSOLE)); - - /* Check for success */ - if (NT_SUCCESS(Status)) - { - if (lpNumberOfCharsWritten != NULL) - *lpNumberOfCharsWritten = WriteConsoleRequest->NrCharactersWritten; - - bRet = TRUE; + _SEH2_TRY + { + RtlCopyMemory(WriteConsoleRequest->Buffer, + lpBuffer, + SizeBytes); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; } else { - if (lpNumberOfCharsWritten != NULL) - *lpNumberOfCharsWritten = 0; + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, SizeBytes); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } - /* Error out */ - BaseSetLastNTError(Status); - bRet = FALSE; + /* Capture the buffer to write */ + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)lpBuffer, + SizeBytes, + (PVOID*)&WriteConsoleRequest->Buffer); + WriteConsoleRequest->UsingStaticBuffer = FALSE; } - CsrFreeCaptureBuffer(CaptureBuffer); + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsole), + sizeof(*WriteConsoleRequest)); - return bRet; + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Retrieve the results */ + if (Success) + { + _SEH2_TRY + { + *lpNumberOfCharsWritten = WriteConsoleRequest->NumBytes / CharSize; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + } + else + { + BaseSetLastNTError(ApiMessage.Status); + } + + /* Return success status */ + return Success; } static BOOL -IntWriteConsoleInput(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsWritten, - BOOL bUnicode, - BOOL bAppendToEnd) +IntWriteConsoleInput(IN HANDLE hConsoleInput, + IN PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsWritten, + IN BOOLEAN bUnicode, + IN BOOLEAN bAppendToEnd) { + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_WRITEINPUT WriteInputRequest = &ApiMessage.Data.WriteInputRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - DWORD Size; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; - Size = nLength * sizeof(INPUT_RECORD); - - DPRINT("IntWriteConsoleInput: %lx %p\n", Size, lpNumberOfEventsWritten); - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - /* Capture the user buffer */ - CsrCaptureMessageBuffer(CaptureBuffer, - lpBuffer, - Size, - (PVOID*)&WriteInputRequest->InputRecord); + DPRINT("IntWriteConsoleInput: %lx %p\n", nLength, lpNumberOfEventsWritten); /* Set up the data to send to the Console Server */ - WriteInputRequest->InputHandle = hConsoleInput; - WriteInputRequest->Length = nLength; - WriteInputRequest->Unicode = bUnicode; - WriteInputRequest->AppendToEnd = bAppendToEnd; + WriteInputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + WriteInputRequest->InputHandle = hConsoleInput; + WriteInputRequest->NumRecords = nLength; + WriteInputRequest->Unicode = bUnicode; + WriteInputRequest->AppendToEnd = bAppendToEnd; + + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than five + * input records are written. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (nLength <= sizeof(WriteInputRequest->RecordStaticBuffer)/sizeof(INPUT_RECORD)) + { + WriteInputRequest->RecordBufPtr = WriteInputRequest->RecordStaticBuffer; + // CaptureBuffer = NULL; + + _SEH2_TRY + { + RtlCopyMemory(WriteInputRequest->RecordBufPtr, + lpBuffer, + nLength * sizeof(INPUT_RECORD)); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; + } + else + { + ULONG Size = nLength * sizeof(INPUT_RECORD); + + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + /* Capture the user buffer */ + CsrCaptureMessageBuffer(CaptureBuffer, + lpBuffer, + Size, + (PVOID*)&WriteInputRequest->RecordBufPtr); + } /* Call the server */ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsoleInput), - sizeof(CONSOLE_WRITEINPUT)); - DPRINT("Server returned: %x\n", ApiMessage.Status); + sizeof(*WriteInputRequest)); /* Check for success */ - if (NT_SUCCESS(ApiMessage.Status)) + Success = NT_SUCCESS(ApiMessage.Status); + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Retrieve the results */ + _SEH2_TRY { - /* Return the number of events read */ - DPRINT("Events read: %lx\n", WriteInputRequest->Length); + DPRINT("Events written: %lx\n", WriteInputRequest->NumRecords); + *lpNumberOfEventsWritten = WriteInputRequest->NumRecords; - if (lpNumberOfEventsWritten != NULL) - *lpNumberOfEventsWritten = WriteInputRequest->Length; + if (!Success) + BaseSetLastNTError(ApiMessage.Status); } - else + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - if (lpNumberOfEventsWritten != NULL) - *lpNumberOfEventsWritten = 0; - - /* Error out */ - BaseSetLastNTError(ApiMessage.Status); + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; } + _SEH2_END; - /* Release the capture buffer */ - CsrFreeCaptureBuffer(CaptureBuffer); - - /* Return TRUE or FALSE */ - return NT_SUCCESS(ApiMessage.Status); + /* Return success status */ + return Success; } static BOOL -IntWriteConsoleOutput(HANDLE hConsoleOutput, - CONST CHAR_INFO *lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpWriteRegion, - BOOL bUnicode) +IntWriteConsoleOutput(IN HANDLE hConsoleOutput, + IN CONST CHAR_INFO *lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpWriteRegion, + IN BOOLEAN bUnicode) { + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_WRITEOUTPUT WriteOutputRequest = &ApiMessage.Data.WriteOutputRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG Size; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; - if ((lpBuffer == NULL) || (lpWriteRegion == NULL)) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - /* - if (lpWriteRegion == NULL) - { - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - */ - - Size = dwBufferSize.Y * dwBufferSize.X * sizeof(CHAR_INFO); - - DPRINT("IntWriteConsoleOutput: %lx %p\n", Size, lpWriteRegion); - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return FALSE; - } - - /* Capture the user buffer */ - CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)lpBuffer, - Size, - (PVOID*)&WriteOutputRequest->CharInfo); + SHORT SizeX, SizeY; + ULONG NumCells; /* Set up the data to send to the Console Server */ - WriteOutputRequest->OutputHandle = hConsoleOutput; - WriteOutputRequest->Unicode = bUnicode; - WriteOutputRequest->BufferSize = dwBufferSize; - WriteOutputRequest->BufferCoord = dwBufferCoord; - WriteOutputRequest->WriteRegion = *lpWriteRegion; + WriteOutputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + WriteOutputRequest->OutputHandle = hConsoleOutput; + WriteOutputRequest->Unicode = bUnicode; + + /* Update lpWriteRegion */ + _SEH2_TRY + { + SizeX = min(dwBufferSize.X - dwBufferCoord.X, ConioRectWidth(lpWriteRegion)); + SizeY = min(dwBufferSize.Y - dwBufferCoord.Y, ConioRectHeight(lpWriteRegion)); + if (SizeX <= 0 || SizeY <= 0) + { + SetLastError(ERROR_INVALID_PARAMETER); + _SEH2_YIELD(return FALSE); + } + lpWriteRegion->Right = lpWriteRegion->Left + SizeX - 1; + lpWriteRegion->Bottom = lpWriteRegion->Top + SizeY - 1; + + WriteOutputRequest->WriteRegion = *lpWriteRegion; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; + + NumCells = SizeX * SizeY; + DPRINT("IntWriteConsoleOutput: (%d x %d)\n", SizeX, SizeY); + + /* + * 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 allocated. + * This behaviour is also expected in the server-side. + */ + if (NumCells <= 1) + { + WriteOutputRequest->CharInfo = &WriteOutputRequest->StaticBuffer; + // CaptureBuffer = NULL; + } + else + { + ULONG Size = NumCells * sizeof(CHAR_INFO); + + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, Size); + if (CaptureBuffer == NULL) + { + 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); + } + + /* Capture the user buffer contents */ + _SEH2_TRY + { +#if 0 + SHORT x, X; +#endif + SHORT y, Y; + + /* Copy into the buffer */ + + SizeX = WriteOutputRequest->WriteRegion.Right - + WriteOutputRequest->WriteRegion.Left + 1; + + for (y = 0, Y = WriteOutputRequest->WriteRegion.Top; Y <= WriteOutputRequest->WriteRegion.Bottom; ++y, ++Y) + { + RtlCopyMemory(WriteOutputRequest->CharInfo + y * SizeX, + lpBuffer + (y + dwBufferCoord.Y) * dwBufferSize.X + dwBufferCoord.X, + SizeX * sizeof(CHAR_INFO)); +#if 0 + for (x = 0, X = WriteOutputRequest->WriteRegion.Left; X <= WriteOutputRequest->WriteRegion.Right; ++x, ++X) + { + *(WriteOutputRequest->CharInfo + y * SizeX + x) = + *(lpBuffer + (y + dwBufferCoord.Y) * dwBufferSize.X + (x + dwBufferCoord.X)); + } +#endif + } + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; /* Call the server */ CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, CaptureBuffer, CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsoleOutput), - sizeof(CONSOLE_WRITEOUTPUT)); - DPRINT("Server returned: %x\n", ApiMessage.Status); + sizeof(*WriteOutputRequest)); /* Check for success */ - if (!NT_SUCCESS(ApiMessage.Status)) + Success = NT_SUCCESS(ApiMessage.Status); + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Retrieve the results */ + _SEH2_TRY { - /* Error out */ - BaseSetLastNTError(ApiMessage.Status); + *lpWriteRegion = WriteOutputRequest->WriteRegion; + + if (!Success) + BaseSetLastNTError(ApiMessage.Status); } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; - /* Return the read region */ - DPRINT("read region: %p\n", WriteOutputRequest->WriteRegion); - *lpWriteRegion = WriteOutputRequest->WriteRegion; - - /* Release the capture buffer */ - CsrFreeCaptureBuffer(CaptureBuffer); - - /* Return TRUE or FALSE */ - return NT_SUCCESS(ApiMessage.Status); + /* Return success status */ + return Success; } static BOOL -IntWriteConsoleOutputCode(HANDLE hConsoleOutput, - CODE_TYPE CodeType, - CONST VOID *pCode, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfCodesWritten) +IntWriteConsoleOutputCode(IN HANDLE hConsoleOutput, + IN CODE_TYPE CodeType, + IN CONST VOID *pCode, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfCodesWritten) { - NTSTATUS Status; - BOOL bRet = TRUE; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_WRITEOUTPUTCODE WriteOutputCodeRequest = &ApiMessage.Data.WriteOutputCodeRequest; - PCSR_CAPTURE_BUFFER CaptureBuffer; - ULONG CodeSize; + PCSR_CAPTURE_BUFFER CaptureBuffer = NULL; + ULONG CodeSize, SizeBytes; - /* Determine the needed size */ - switch (CodeType) + if ( (CodeType != CODE_ASCII ) && + (CodeType != CODE_UNICODE ) && + (CodeType != CODE_ATTRIBUTE) ) { - case CODE_ASCII: - CodeSize = sizeof(CHAR); - break; - - case CODE_UNICODE: - CodeSize = sizeof(WCHAR); - break; - - case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); - break; - - default: - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; - } - WriteOutputCodeRequest->BufferSize = nLength * CodeSize; - - /* Allocate a Capture Buffer */ - CaptureBuffer = CsrAllocateCaptureBuffer(1, WriteOutputCodeRequest->BufferSize); - if (CaptureBuffer == NULL) - { - DPRINT1("CsrAllocateCaptureBuffer failed!\n"); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); + SetLastError(ERROR_INVALID_PARAMETER); return FALSE; } - /* Capture the buffer to write */ - CsrCaptureMessageBuffer(CaptureBuffer, - (PVOID)pCode, - WriteOutputCodeRequest->BufferSize, - (PVOID*)&WriteOutputCodeRequest->pCode.pCode); + DPRINT("IntWriteConsoleOutputCode\n"); - /* Start writing */ - WriteOutputCodeRequest->OutputHandle = hConsoleOutput; + /* Set up the data to send to the Console Server */ + WriteOutputCodeRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + WriteOutputCodeRequest->OutputHandle = hConsoleOutput; + WriteOutputCodeRequest->Coord = dwWriteCoord; + WriteOutputCodeRequest->NumCodes = nLength; + + /* Determine the needed size */ WriteOutputCodeRequest->CodeType = CodeType; - WriteOutputCodeRequest->Coord = dwWriteCoord; - - WriteOutputCodeRequest->Length = (USHORT)nLength; - - /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - CaptureBuffer, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsoleOutputString), - sizeof(CONSOLE_WRITEOUTPUTCODE)); - - /* Check for success */ - if (NT_SUCCESS(Status)) + switch (CodeType) { - // WriteOutputCodeRequest->Coord = WriteOutputCodeRequest->EndCoord; + case CODE_ASCII: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); + break; - if (lpNumberOfCodesWritten != NULL) - // *lpNumberOfCodesWritten = WriteOutputCodeRequest->NrCharactersWritten; - *lpNumberOfCodesWritten = WriteOutputCodeRequest->Length; + case CODE_UNICODE: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); + break; - bRet = TRUE; + case CODE_ATTRIBUTE: + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); + break; + } + SizeBytes = nLength * CodeSize; + + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are written. Otherwise a new buffer is allocated. + * This behaviour is also expected in the server-side. + */ + if (SizeBytes <= sizeof(WriteOutputCodeRequest->CodeStaticBuffer)) + { + WriteOutputCodeRequest->pCode = WriteOutputCodeRequest->CodeStaticBuffer; + // CaptureBuffer = NULL; + + _SEH2_TRY + { + RtlCopyMemory(WriteOutputCodeRequest->pCode, + pCode, + SizeBytes); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + _SEH2_YIELD(return FALSE); + } + _SEH2_END; } else { - if (lpNumberOfCodesWritten != NULL) - *lpNumberOfCodesWritten = 0; + /* Allocate a Capture Buffer */ + CaptureBuffer = CsrAllocateCaptureBuffer(1, SizeBytes); + if (CaptureBuffer == NULL) + { + DPRINT1("CsrAllocateCaptureBuffer failed!\n"); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } - /* Error out */ - BaseSetLastNTError(Status); - bRet = FALSE; + /* Capture the buffer to write */ + CsrCaptureMessageBuffer(CaptureBuffer, + (PVOID)pCode, + SizeBytes, + (PVOID*)&WriteOutputCodeRequest->pCode); } - CsrFreeCaptureBuffer(CaptureBuffer); + /* Call the server */ + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + CaptureBuffer, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepWriteConsoleOutputString), + sizeof(*WriteOutputCodeRequest)); - return bRet; + /* Check for success */ + Success = NT_SUCCESS(ApiMessage.Status); + + /* Release the capture buffer if needed */ + if (CaptureBuffer) CsrFreeCaptureBuffer(CaptureBuffer); + + /* Retrieve the results */ + _SEH2_TRY + { + *lpNumberOfCodesWritten = WriteOutputCodeRequest->NumCodes; + + if (!Success) + BaseSetLastNTError(ApiMessage.Status); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + + /* Return success status */ + return Success; } static BOOL -IntFillConsoleOutputCode(HANDLE hConsoleOutput, - CODE_TYPE CodeType, - PVOID pCode, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfCodesWritten) +IntFillConsoleOutputCode(IN HANDLE hConsoleOutput, + IN CODE_TYPE CodeType, + IN CODE_ELEMENT Code, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfCodesWritten) { - NTSTATUS Status; + BOOL Success; CONSOLE_API_MESSAGE ApiMessage; PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &ApiMessage.Data.FillOutputRequest; - FillOutputRequest->OutputHandle = hConsoleOutput; - FillOutputRequest->CodeType = CodeType; + DPRINT("IntFillConsoleOutputCode\n"); - switch (CodeType) + if ( (CodeType != CODE_ASCII ) && + (CodeType != CODE_UNICODE ) && + (CodeType != CODE_ATTRIBUTE) ) { - case CODE_ASCII: - FillOutputRequest->Code.AsciiChar = *(PCHAR)pCode; - break; - - case CODE_UNICODE: - FillOutputRequest->Code.UnicodeChar = *(PWCHAR)pCode; - break; - - case CODE_ATTRIBUTE: - FillOutputRequest->Code.Attribute = *(PWORD)pCode; - break; - - default: - SetLastError(ERROR_INVALID_PARAMETER); - return FALSE; + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; } /* Set up the data to send to the Console Server */ - FillOutputRequest->Coord = dwWriteCoord; - FillOutputRequest->Length = nLength; + FillOutputRequest->ConsoleHandle = NtCurrentPeb()->ProcessParameters->ConsoleHandle; + FillOutputRequest->OutputHandle = hConsoleOutput; + FillOutputRequest->WriteCoord = dwWriteCoord; + FillOutputRequest->CodeType = CodeType; + FillOutputRequest->Code = Code; + FillOutputRequest->NumCodes = nLength; /* Call the server */ - Status = CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, - NULL, - CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFillConsoleOutput), - sizeof(CONSOLE_FILLOUTPUTCODE)); + CsrClientCallServer((PCSR_API_MESSAGE)&ApiMessage, + NULL, + CSR_CREATE_API_NUMBER(CONSRV_SERVERDLL_INDEX, ConsolepFillConsoleOutput), + sizeof(*FillOutputRequest)); /* Check for success */ - if (NT_SUCCESS(Status)) - { - if (lpNumberOfCodesWritten != NULL) - *lpNumberOfCodesWritten = FillOutputRequest->Length; - // *lpNumberOfCodesWritten = Request.Data.FillOutputRequest.NrCharactersWritten; + Success = NT_SUCCESS(ApiMessage.Status); - return TRUE; - } - else + /* Retrieve the results */ + _SEH2_TRY { - if (lpNumberOfCodesWritten != NULL) - *lpNumberOfCodesWritten = 0; + *lpNumberOfCodesWritten = FillOutputRequest->NumCodes; - BaseSetLastNTError(Status); - return FALSE; + if (!Success) + BaseSetLastNTError(ApiMessage.Status); } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + SetLastError(ERROR_INVALID_ACCESS); + Success = FALSE; + } + _SEH2_END; + + /* Return success status */ + return Success; } @@ -775,11 +1163,11 @@ IntFillConsoleOutputCode(HANDLE hConsoleOutput, */ BOOL WINAPI -ReadConsoleW(HANDLE hConsoleInput, - LPVOID lpBuffer, - DWORD nNumberOfCharsToRead, - LPDWORD lpNumberOfCharsRead, - PCONSOLE_READCONSOLE_CONTROL pInputControl) +ReadConsoleW(IN HANDLE hConsoleInput, + OUT LPVOID lpBuffer, + IN DWORD nNumberOfCharsToRead, + OUT LPDWORD lpNumberOfCharsRead, + IN PCONSOLE_READCONSOLE_CONTROL pInputControl OPTIONAL) { return IntReadConsole(hConsoleInput, lpBuffer, @@ -797,11 +1185,11 @@ ReadConsoleW(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleA(HANDLE hConsoleInput, - LPVOID lpBuffer, - DWORD nNumberOfCharsToRead, - LPDWORD lpNumberOfCharsRead, - PCONSOLE_READCONSOLE_CONTROL pInputControl) +ReadConsoleA(IN HANDLE hConsoleInput, + OUT LPVOID lpBuffer, + IN DWORD nNumberOfCharsToRead, + OUT LPDWORD lpNumberOfCharsRead, + IN PCONSOLE_READCONSOLE_CONTROL pInputControl OPTIONAL) { return IntReadConsole(hConsoleInput, lpBuffer, @@ -819,10 +1207,10 @@ ReadConsoleA(HANDLE hConsoleInput, */ BOOL WINAPI -PeekConsoleInputW(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead) +PeekConsoleInputW(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -840,10 +1228,10 @@ PeekConsoleInputW(HANDLE hConsoleInput, */ BOOL WINAPI -PeekConsoleInputA(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead) +PeekConsoleInputA(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -861,10 +1249,10 @@ PeekConsoleInputA(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleInputW(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead) +ReadConsoleInputW(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -882,10 +1270,10 @@ ReadConsoleInputW(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleInputA(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead) +ReadConsoleInputA(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -903,11 +1291,11 @@ ReadConsoleInputA(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleInputExW(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead, - WORD wFlags) +ReadConsoleInputExW(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead, + IN WORD wFlags) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -925,11 +1313,11 @@ ReadConsoleInputExW(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleInputExA(HANDLE hConsoleInput, - PINPUT_RECORD lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsRead, - WORD wFlags) +ReadConsoleInputExA(IN HANDLE hConsoleInput, + OUT PINPUT_RECORD lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsRead, + IN WORD wFlags) { return IntGetConsoleInput(hConsoleInput, lpBuffer, @@ -947,11 +1335,11 @@ ReadConsoleInputExA(HANDLE hConsoleInput, */ BOOL WINAPI -ReadConsoleOutputW(HANDLE hConsoleOutput, - PCHAR_INFO lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpReadRegion) +ReadConsoleOutputW(IN HANDLE hConsoleOutput, + OUT PCHAR_INFO lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpReadRegion) { return IntReadConsoleOutput(hConsoleOutput, lpBuffer, @@ -969,11 +1357,11 @@ ReadConsoleOutputW(HANDLE hConsoleOutput, */ BOOL WINAPI -ReadConsoleOutputA(HANDLE hConsoleOutput, - PCHAR_INFO lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpReadRegion) +ReadConsoleOutputA(IN HANDLE hConsoleOutput, + OUT PCHAR_INFO lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpReadRegion) { return IntReadConsoleOutput(hConsoleOutput, lpBuffer, @@ -991,11 +1379,11 @@ ReadConsoleOutputA(HANDLE hConsoleOutput, */ BOOL WINAPI -ReadConsoleOutputCharacterW(HANDLE hConsoleOutput, - LPWSTR lpCharacter, - DWORD nLength, - COORD dwReadCoord, - LPDWORD lpNumberOfCharsRead) +ReadConsoleOutputCharacterW(IN HANDLE hConsoleOutput, + OUT LPWSTR lpCharacter, + IN DWORD nLength, + IN COORD dwReadCoord, + OUT LPDWORD lpNumberOfCharsRead) { return IntReadConsoleOutputCode(hConsoleOutput, CODE_UNICODE, @@ -1013,11 +1401,11 @@ ReadConsoleOutputCharacterW(HANDLE hConsoleOutput, */ BOOL WINAPI -ReadConsoleOutputCharacterA(HANDLE hConsoleOutput, - LPSTR lpCharacter, - DWORD nLength, - COORD dwReadCoord, - LPDWORD lpNumberOfCharsRead) +ReadConsoleOutputCharacterA(IN HANDLE hConsoleOutput, + OUT LPSTR lpCharacter, + IN DWORD nLength, + IN COORD dwReadCoord, + OUT LPDWORD lpNumberOfCharsRead) { return IntReadConsoleOutputCode(hConsoleOutput, CODE_ASCII, @@ -1035,11 +1423,11 @@ ReadConsoleOutputCharacterA(HANDLE hConsoleOutput, */ BOOL WINAPI -ReadConsoleOutputAttribute(HANDLE hConsoleOutput, - LPWORD lpAttribute, - DWORD nLength, - COORD dwReadCoord, - LPDWORD lpNumberOfAttrsRead) +ReadConsoleOutputAttribute(IN HANDLE hConsoleOutput, + OUT LPWORD lpAttribute, + IN DWORD nLength, + IN COORD dwReadCoord, + OUT LPDWORD lpNumberOfAttrsRead) { return IntReadConsoleOutputCode(hConsoleOutput, CODE_ATTRIBUTE, @@ -1061,10 +1449,10 @@ ReadConsoleOutputAttribute(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleW(HANDLE hConsoleOutput, - CONST VOID *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCharsWritten, +WriteConsoleW(IN HANDLE hConsoleOutput, + IN CONST VOID *lpBuffer, + IN DWORD nNumberOfCharsToWrite, + OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved) { return IntWriteConsole(hConsoleOutput, @@ -1083,10 +1471,10 @@ WriteConsoleW(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleA(HANDLE hConsoleOutput, - CONST VOID *lpBuffer, - DWORD nNumberOfCharsToWrite, - LPDWORD lpNumberOfCharsWritten, +WriteConsoleA(IN HANDLE hConsoleOutput, + IN CONST VOID *lpBuffer, + IN DWORD nNumberOfCharsToWrite, + OUT LPDWORD lpNumberOfCharsWritten, LPVOID lpReserved) { return IntWriteConsole(hConsoleOutput, @@ -1105,10 +1493,10 @@ WriteConsoleA(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleInputW(HANDLE hConsoleInput, - CONST INPUT_RECORD *lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsWritten) +WriteConsoleInputW(IN HANDLE hConsoleInput, + IN CONST INPUT_RECORD *lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsWritten) { return IntWriteConsoleInput(hConsoleInput, (PINPUT_RECORD)lpBuffer, @@ -1126,10 +1514,10 @@ WriteConsoleInputW(HANDLE hConsoleInput, */ BOOL WINAPI -WriteConsoleInputA(HANDLE hConsoleInput, - CONST INPUT_RECORD *lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsWritten) +WriteConsoleInputA(IN HANDLE hConsoleInput, + IN CONST INPUT_RECORD *lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsWritten) { return IntWriteConsoleInput(hConsoleInput, (PINPUT_RECORD)lpBuffer, @@ -1147,10 +1535,10 @@ WriteConsoleInputA(HANDLE hConsoleInput, */ BOOL WINAPI -WriteConsoleInputVDMW(HANDLE hConsoleInput, - CONST INPUT_RECORD *lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsWritten) +WriteConsoleInputVDMW(IN HANDLE hConsoleInput, + IN CONST INPUT_RECORD *lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsWritten) { return IntWriteConsoleInput(hConsoleInput, (PINPUT_RECORD)lpBuffer, @@ -1168,10 +1556,10 @@ WriteConsoleInputVDMW(HANDLE hConsoleInput, */ BOOL WINAPI -WriteConsoleInputVDMA(HANDLE hConsoleInput, - CONST INPUT_RECORD *lpBuffer, - DWORD nLength, - LPDWORD lpNumberOfEventsWritten) +WriteConsoleInputVDMA(IN HANDLE hConsoleInput, + IN CONST INPUT_RECORD *lpBuffer, + IN DWORD nLength, + OUT LPDWORD lpNumberOfEventsWritten) { return IntWriteConsoleInput(hConsoleInput, (PINPUT_RECORD)lpBuffer, @@ -1189,11 +1577,11 @@ WriteConsoleInputVDMA(HANDLE hConsoleInput, */ BOOL WINAPI -WriteConsoleOutputW(HANDLE hConsoleOutput, - CONST CHAR_INFO *lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpWriteRegion) +WriteConsoleOutputW(IN HANDLE hConsoleOutput, + IN CONST CHAR_INFO *lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpWriteRegion) { return IntWriteConsoleOutput(hConsoleOutput, lpBuffer, @@ -1211,11 +1599,11 @@ WriteConsoleOutputW(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleOutputA(HANDLE hConsoleOutput, - CONST CHAR_INFO *lpBuffer, - COORD dwBufferSize, - COORD dwBufferCoord, - PSMALL_RECT lpWriteRegion) +WriteConsoleOutputA(IN HANDLE hConsoleOutput, + IN CONST CHAR_INFO *lpBuffer, + IN COORD dwBufferSize, + IN COORD dwBufferCoord, + IN OUT PSMALL_RECT lpWriteRegion) { return IntWriteConsoleOutput(hConsoleOutput, lpBuffer, @@ -1233,11 +1621,11 @@ WriteConsoleOutputA(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleOutputCharacterW(HANDLE hConsoleOutput, - LPCWSTR lpCharacter, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfCharsWritten) +WriteConsoleOutputCharacterW(IN HANDLE hConsoleOutput, + IN LPCWSTR lpCharacter, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfCharsWritten) { return IntWriteConsoleOutputCode(hConsoleOutput, CODE_UNICODE, @@ -1255,11 +1643,11 @@ WriteConsoleOutputCharacterW(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, - LPCSTR lpCharacter, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfCharsWritten) +WriteConsoleOutputCharacterA(IN HANDLE hConsoleOutput, + IN LPCSTR lpCharacter, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfCharsWritten) { return IntWriteConsoleOutputCode(hConsoleOutput, CODE_ASCII, @@ -1277,11 +1665,11 @@ WriteConsoleOutputCharacterA(HANDLE hConsoleOutput, */ BOOL WINAPI -WriteConsoleOutputAttribute(HANDLE hConsoleOutput, - CONST WORD *lpAttribute, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfAttrsWritten) +WriteConsoleOutputAttribute(IN HANDLE hConsoleOutput, + IN CONST WORD *lpAttribute, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfAttrsWritten) { return IntWriteConsoleOutputCode(hConsoleOutput, CODE_ATTRIBUTE, @@ -1299,15 +1687,17 @@ WriteConsoleOutputAttribute(HANDLE hConsoleOutput, */ BOOL WINAPI -FillConsoleOutputCharacterW(HANDLE hConsoleOutput, - WCHAR cCharacter, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfCharsWritten) +FillConsoleOutputCharacterW(IN HANDLE hConsoleOutput, + IN WCHAR cCharacter, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfCharsWritten) { + CODE_ELEMENT Code; + Code.UnicodeChar = cCharacter; return IntFillConsoleOutputCode(hConsoleOutput, CODE_UNICODE, - &cCharacter, + Code, nLength, dwWriteCoord, lpNumberOfCharsWritten); @@ -1321,15 +1711,17 @@ FillConsoleOutputCharacterW(HANDLE hConsoleOutput, */ BOOL WINAPI -FillConsoleOutputCharacterA(HANDLE hConsoleOutput, - CHAR cCharacter, - DWORD nLength, - COORD dwWriteCoord, +FillConsoleOutputCharacterA(IN HANDLE hConsoleOutput, + IN CHAR cCharacter, + IN DWORD nLength, + IN COORD dwWriteCoord, LPDWORD lpNumberOfCharsWritten) { + CODE_ELEMENT Code; + Code.AsciiChar = cCharacter; return IntFillConsoleOutputCode(hConsoleOutput, CODE_ASCII, - &cCharacter, + Code, nLength, dwWriteCoord, lpNumberOfCharsWritten); @@ -1343,15 +1735,17 @@ FillConsoleOutputCharacterA(HANDLE hConsoleOutput, */ BOOL WINAPI -FillConsoleOutputAttribute(HANDLE hConsoleOutput, - WORD wAttribute, - DWORD nLength, - COORD dwWriteCoord, - LPDWORD lpNumberOfAttrsWritten) +FillConsoleOutputAttribute(IN HANDLE hConsoleOutput, + IN WORD wAttribute, + IN DWORD nLength, + IN COORD dwWriteCoord, + OUT LPDWORD lpNumberOfAttrsWritten) { + CODE_ELEMENT Code; + Code.Attribute = wAttribute; return IntFillConsoleOutputCode(hConsoleOutput, CODE_ATTRIBUTE, - &wAttribute, + Code, nLength, dwWriteCoord, lpNumberOfAttrsWritten); diff --git a/dll/win32/kernel32/client/handle.c b/dll/win32/kernel32/client/handle.c index 5024f5fef94..3e5cbcf4554 100644 --- a/dll/win32/kernel32/client/handle.c +++ b/dll/win32/kernel32/client/handle.c @@ -16,7 +16,6 @@ /* PRIVATE FUNCTIONS **********************************************************/ HANDLE -FASTCALL TranslateStdHandle(IN HANDLE hHandle) { PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters; diff --git a/dll/win32/kernel32/include/console.h b/dll/win32/kernel32/include/console.h index 8edb3493964..1886608e88e 100644 --- a/dll/win32/kernel32/include/console.h +++ b/dll/win32/kernel32/include/console.h @@ -56,7 +56,7 @@ CloseConsoleHandle(HANDLE Handle); HANDLE WINAPI GetConsoleInputWaitHandle(VOID); -HANDLE FASTCALL +HANDLE TranslateStdHandle(HANDLE hHandle); VOID diff --git a/dll/win32/kernel32/winnls/lang/tr-TR.rc b/dll/win32/kernel32/winnls/lang/tr-TR.rc index 5df45e85745..b2cd57b017e 100644 --- a/dll/win32/kernel32/winnls/lang/tr-TR.rc +++ b/dll/win32/kernel32/winnls/lang/tr-TR.rc @@ -7,7 +7,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT STRINGTABLE BEGIN /* Names of code pages */ - 1250 "1250 (ANSI - Merkezî Avrupa)" + 1250 "1250 (ANSI - Özeklik Avrupa)" 1251 "1251 (ANSI - Kiril)" 1252 "1252 (ANSI - Latin I)" 1253 "1253 (ANSI - Yunanca)" @@ -35,7 +35,7 @@ BEGIN 862 "862 (OEM - İbrânice)" 863 "863 (OEM - Kanada Fransızcası)" 864 "864 (OEM - Arapça)" - 865 "865 (OEM - Nordik)" + 865 "865 (OEM - İskandinavca)" 866 "866 (OEM - Rusça)" 869 "869 (OEM - Çağdaş Yunanca)" @@ -96,13 +96,13 @@ BEGIN 20269 "20269 (ISO 6937 Aralıksız Vurgu)" 28591 "28591 (ISO 8859-1 Latin I)" - 28592 "28592 (ISO 8859-2 Merkezî Avrupa)" + 28592 "28592 (ISO 8859-2 Özeklik Avrupa)" 28593 "28593 (ISO 8859-3 Latin 3)" 28594 "28594 (ISO 8859-4 Baltık)" 28595 "28595 (ISO 8859-5 Kiril)" 28596 "28596 (ISO 8859-6 Arapça)" 28597 "28597 (ISO 8859-7 Yunanca)" - 28598 "28598 (ISO 8859-8 İbrânice: Basarî Sıralama)" + 28598 "28598 (ISO 8859-8 İbrânice: Görmelik Sıralama)" 28599 "28599 (ISO 8859-9 Latin 5)" 28605 "28605 (ISO 8859-15 Latin 9)" 38598 "38598 (ISO 8859-8 İbrânice: Mantıklık Sıralama)" @@ -113,13 +113,13 @@ BEGIN 20108 "20108 (IA5 Norveççe)" 1361 "1361 (Korece - Johab)" - 20000 "20000 (CNS - Tayland)" - 20001 "20001 (TCA - Tayland)" - 20002 "20002 (Eten - Tayland)" - 20003 "20003 (IBM5550 - Tayland)" - 20004 "20004 (TeleTekst - Tayland)" - 20005 "20005 (Vang - Tayland)" - 20127 "20127 (US-ASCII)" + 20000 "20000 (CNS - Tayvan)" + 20001 "20001 (TCA - Tayvan)" + 20002 "20002 (Eten - Tayvan)" + 20003 "20003 (IBM5550 - Tayvan)" + 20004 "20004 (TeleText - Tayvan)" + 20005 "20005 (Vang - Tayvan)" + 20127 "20127 (ABD-ASCII)" 20261 "20261 (T.61)" 20866 "20866 (Rusça - KOI8)" 21027 "21027 (Genişletilmiş Alfa Küçük Harf)" @@ -148,8 +148,8 @@ BEGIN 50937 "50937 (IBM EBCDIC - ABD/Kanada ve Geleneklik Çince)" 50939 "50939 (IBM EBCDIC - Japonca Latin Genişletlmiş ve Japonca)" - 50220 "50220 (ISO-2022 Japonca (yarım genişlikte olmayan Katakana ile))" - 50221 "50221 (ISO-2022 Japonca (yarım genişlikteki Katakana ile))" + 50220 "50220 (ISO-2022 Japonca (Yarım genişlikte Katakana'sız.))" + 50221 "50221 (ISO-2022 Japonca (Yarım genişlikte Katakana'lı.))" 50222 "50222 (ISO-2022 Japonca JIS X 0201-1989)" 50225 "50225 (ISO-2022 Korece)" 50227 "50227 (ISO-2022 Bayağılaştırılmış Çince)" diff --git a/dll/win32/localui/lang/ui_Tr.rc b/dll/win32/localui/lang/ui_Tr.rc index b05892444b2..23acf4feafb 100644 --- a/dll/win32/localui/lang/ui_Tr.rc +++ b/dll/win32/localui/lang/ui_Tr.rc @@ -24,10 +24,10 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT ADDPORT_DIALOG DIALOG 6, 18, 245, 47 STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "Yerli Giriş Ekleme" +CAPTION "Bir Yerli Giriş Ekle" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Eklenecek giriş adını giriniz:", -1, 7, 13, 194, 13, WS_VISIBLE + LTEXT "&Eklemek için giriş adını giriniz:", -1, 7, 13, 194, 13, WS_VISIBLE EDITTEXT ADDPORT_EDIT, 6, 28, 174, 12, WS_VISIBLE | ES_AUTOHSCROLL DEFPUSHBUTTON "Tamam", IDOK, 199, 10, 40, 14, WS_VISIBLE PUSHBUTTON "İptal", IDCANCEL, 199, 27, 40, 14, WS_VISIBLE @@ -36,11 +36,11 @@ END LPTCONFIG_DIALOG DIALOG 6, 18, 220, 47 STYLE DS_CONTEXTHELP | DS_MODALFRAME | DS_SETFONT | DS_SETFOREGROUND | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION -CAPTION "LPT Girişini Yapılandırma" +CAPTION "LPT Girişini Yapılandır" FONT 8, "MS Shell Dlg" BEGIN GROUPBOX "Süre Aşımı (Sâniye)", LPTCONFIG_GROUP, 6, 6, 150, 35, BS_GROUPBOX - LTEXT "&İletimi Yeniden Deneme:", -1, 14, 22, 90, 13, WS_VISIBLE + LTEXT "&İletimi Yeniden Dene:", -1, 14, 22, 90, 13, WS_VISIBLE EDITTEXT LPTCONFIG_EDIT, 112, 20, 32, 13, WS_VISIBLE | ES_NUMBER DEFPUSHBUTTON "Tamam", IDOK, 164, 10, 50, 14, WS_VISIBLE PUSHBUTTON "İptal", IDCANCEL, 164, 27, 50, 14, WS_VISIBLE @@ -50,7 +50,7 @@ END STRINGTABLE { IDS_LOCALPORT "Yerli Giriş" - IDS_INVALIDNAME "'%s', geçerli bir giriş adı değildir." + IDS_INVALIDNAME """%s"", geçerli bir giriş adı değil." IDS_PORTEXISTS "%s girişi önceden var." - IDS_NOTHINGTOCONFIG "Bu girişin, yapılandırmak için hiçbir seçeneği yoktur." + IDS_NOTHINGTOCONFIG "Bu girişin yapılandırmak için seçeneği yok." } diff --git a/dll/win32/msgina/lang/tr-TR.rc b/dll/win32/msgina/lang/tr-TR.rc index f030a8d71eb..d6ac16ffc4c 100644 --- a/dll/win32/msgina/lang/tr-TR.rc +++ b/dll/win32/msgina/lang/tr-TR.rc @@ -4,7 +4,7 @@ LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT IDD_STATUSWINDOW_DLG DIALOGEX 0, 0, 275, 80 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP -CAPTION "Bekleyiniz..." +CAPTION "Lütfen Bekleyiniz..." FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 @@ -18,12 +18,12 @@ FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 ICON IDI_LOCKICON, IDC_STATIC, 7, 55, 32, 32 - LTEXT "Denetim, Seçenek ve Silme düğmelerine birlikte basınız.",IDC_STATIC, 38, 60, 144, 14 + LTEXT "Başlamak için Denetim, Seçenek ve Silme düğmelerine birlikte basınız.",IDC_STATIC, 38, 60, 144, 14 END IDD_LOGGEDOUT_DLG DIALOGEX 0, 0, 275, 147 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP -CAPTION "Oturum Açma" +CAPTION "Oturum Aç" FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 @@ -31,7 +31,7 @@ BEGIN EDITTEXT IDC_USERNAME, 67, 57, 148, 14, ES_AUTOHSCROLL LTEXT "Şifre:", IDC_STATIC, 6, 78, 59, 8 EDITTEXT IDC_PASSWORD, 67, 76, 148, 14, ES_AUTOHSCROLL | ES_PASSWORD - LTEXT "Olarak Oturum Aç:", IDC_STATIC, 6, 96, 59, 8 + LTEXT "Üzerinde Oturum Aç:", IDC_STATIC, 6, 96, 59, 8 COMBOBOX IDC_LOGON_TO, 67, 95, 148, 14, CBS_DROPDOWNLIST | WS_VSCROLL PUSHBUTTON "Tamam", IDOK, 91, 122, 50, 14, BS_DEFPUSHBUTTON PUSHBUTTON "İptal", IDCANCEL, 145, 122, 50, 14 @@ -49,9 +49,9 @@ BEGIN LTEXT "", IDC_LOGONDATE, 15, 94, 245, 8 CTEXT "Ne yapmak istersiniz?", IDC_STATIC, 10, 119, 255, 8 PUSHBUTTON "Bilgisayarı Kilitle", IDC_LOCK, 10, 135, 76, 14 - PUSHBUTTON "Oturumu Kapat", IDC_LOGOFF, 100, 135, 75, 14 + PUSHBUTTON "Oturumu Kapat...", IDC_LOGOFF, 100, 135, 75, 14 PUSHBUTTON "Bilgisayarı Kapat", IDC_SHUTDOWN, 189, 135, 76, 14 - PUSHBUTTON "Şifreyi Değiştir", IDC_CHANGEPWD, 10, 154, 76, 14 + PUSHBUTTON "Şifre Değiştir", IDC_CHANGEPWD, 10, 154, 76, 14 PUSHBUTTON "Görev Yöneticisi", IDC_TASKMGR, 100, 154, 75, 14 PUSHBUTTON "İptal", IDCANCEL, 189, 154, 76, 14 END @@ -70,7 +70,7 @@ END IDD_UNLOCK_DLG DIALOGEX 0, 0, 275, 179 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP -CAPTION "Bilgisayarın Kilidini Açma" +CAPTION "Bilgisayarın Kilidini Aç" FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 @@ -87,13 +87,13 @@ END IDD_CHANGE_PASSWORD DIALOGEX 0, 0, 275, 166 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_POPUP -CAPTION "Şifre Değiştirme" +CAPTION "Şifre Değiştir" FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 LTEXT "Kullanıcı Adı:", IDC_STATIC, 7, 61, 78, 8 EDITTEXT IDC_CHANGEPWD_USERNAME, 90, 59, 127, 12, ES_AUTOHSCROLL - LTEXT "Olarak Oturum Aç:", IDC_STATIC, 7, 78, 78, 8 + LTEXT "Üzerinde Oturum Aç:", IDC_STATIC, 7, 78, 78, 8 COMBOBOX IDC_CHANGEPWD_DOMAIN, 90, 75, 127, 144, CBS_DROPDOWNLIST | CBS_SORT LTEXT "Eski Şifre:", IDC_STATIC, 7, 95, 78, 8 EDITTEXT IDC_CHANGEPWD_OLDPWD, 90, 92, 127, 12, ES_AUTOHSCROLL | ES_PASSWORD @@ -107,23 +107,23 @@ END IDD_LOGOFF_DLG DIALOGEX 0, 0, 188, 60 STYLE NOT WS_VISIBLE | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_BORDER | WS_CAPTION | WS_DLGFRAME | WS_SYSMENU | WS_POPUP -CAPTION "Oturumu Kapatma" +CAPTION "Oturumu Kapat" FONT 8, "MS Shell Dlg", 400, 0, 1 BEGIN ICON IDI_LOCKICON, -1, 7, 7, 20, 20 - LTEXT "Oturumu kapatmayı doğruluyor musunuz?", IDC_STATIC, 35, 16, 146, 8 + LTEXT "Oturumu kapatmayı istediğinizden emin misiniz?", IDC_STATIC, 35, 16, 146, 8 PUSHBUTTON "Evet", IDYES, 41, 39, 50, 14, BS_DEFPUSHBUTTON PUSHBUTTON "Hayır", IDNO, 95, 39, 50, 14 END IDD_SHUTDOWN_DLG DIALOGEX 0, 0, 275, 146 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUPWINDOW | WS_CAPTION -CAPTION "Oturumu Kapat" +CAPTION "Bilgisayarı Kapat" FONT 8, "MS Shell Dlg" BEGIN CONTROL IDI_ROSLOGO, IDC_ROSLOGO, "Static", SS_BITMAP, 0, 0, 275, 54 ICON IDI_SHELL_SHUTDOWN, IDI_SHELL_SHUTDOWN, 9, 57, 21, 20, WS_GROUP - LTEXT "&Bilgisayarınızın ne yapmasını istiyorsunuz?", IDC_STATIC, 39, 57, 167, 10 + LTEXT "&Bilgisayarın ne yapmasını istiyorsunuz?", IDC_STATIC, 39, 57, 167, 10 COMBOBOX IDC_SHUTDOWN_LIST, 39, 70, 165, 210, CBS_DROPDOWNLIST | WS_VSCROLL LTEXT "", IDC_SHUTDOWN_DESCRIPTION, 39, 93, 187, 27 DEFPUSHBUTTON "Tamam", IDOK, 143, 122, 55, 14, WS_GROUP @@ -136,7 +136,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" BEGIN EDITTEXT IDC_LEGALNOTICE_TEXT, 7, 7, 266, 165, ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP - DEFPUSHBUTTON "OK", IDOK, 115, 179, 50, 14 + DEFPUSHBUTTON "Tamam", IDOK, 115, 179, 50, 14 END STRINGTABLE @@ -147,34 +147,34 @@ BEGIN IDS_ASKFORUSER "Kullanıcı Adı: " IDS_ASKFORPASSWORD "Şifre: " IDS_FORCELOGOFF "Bu, şimdiki kullanıcının oturumunu kapatacak ve tüm kaydedilmemiş bilgiler yitirilecek. Sürdürülsün mü?" - IDS_LOCKMSG "Yalnızca %s ve bir yönetici bu bilgisayarı kilitleyebilir." + IDS_LOCKMSG "Yalnızca %s ve bir yönetici bu bilgisayarın kilidini açabilir." IDS_LOGONMSG "%s olarak oturum açtınız." IDS_LOGONDATE "Oturum Açma Zamânı: %s %s" IDS_COMPUTERLOCKED "Bilgisayar kilitlendi." - IDS_LOCKEDWRONGPASSWORD "Şifre yanlıştır. Şifrenizi yine giriniz. Şifredeki harfler doğru büyük-küçük ayrımıyla yazılmalıdır." - IDS_LOCKEDWRONGUSER "Bu bilgisayar kilitli. Bu bilgisayarın kilidini yalnızca %s\\%s veyâ bir yönetici açabilir." + IDS_LOCKEDWRONGPASSWORD "Şifre yanlış. Lütfen şifrenizi yeniden giriniz. Şifrelerdeki harfler doğru büyük-küçük ayrımı kullanılarak yazılmalıdır." + IDS_LOCKEDWRONGUSER "Bu bilgisayar kilitli. Yalnızca %s\\%s ve bir yönetici bu bilgisayarın kilidini açabilir." IDS_CHANGEPWDTITLE "Şifre Değştirme" - IDS_NONMATCHINGPASSWORDS "Yazıdığınız bu şifreler birbiriyle uyuşmuyor. Her iki metin kutusuna da aynı şifreyi yazınız." + IDS_NONMATCHINGPASSWORDS "Yazıdığınız şifreler birbiriyle uyuşmuyor. İki metin kutusuna aynı şifreyi yazınız." IDS_PASSWORDCHANGED "Şifreniz değiştirildi." - IDS_LOGONTITLE "Logon Message" - IDS_LOGONWRONGUSERORPWD "The system could not log you on. Make sure your User name and domain are correct, then type your password again. Letters in passwords must be typed using the correct case." - IDS_LOGONUSERDISABLED "Your account has been disabled. Please see your system administrator." - IDS_PASSWORDMUSTCHANGE "You are required to change your password at first logon." - IDS_PASSWORDEXPIRED "Your password has expired and must be changed." + IDS_LOGONTITLE "Oturum Açma İletisi" + IDS_LOGONWRONGUSERORPWD "Dizge oturumunuzu açamadı. Kullanıcı adınızın ve etki alanının doğru olduğundan emin olunuz, sonra şifrenizi yeniden yazınız. Şifrelerdeki harfler doğru büyük-küçük ayrımı kullanılarak yazılmalıdır." + IDS_LOGONUSERDISABLED "Hesâbınız edilginleştirildi. Lütfen dizge yöneticinizi görünüz." + IDS_PASSWORDMUSTCHANGE "İlk oturum açmada şifrenizi değiştirmeniz gerekir." + IDS_PASSWORDEXPIRED "Şifrenizin süresi doldu ve şifreniz değiştirilmelidir." END /* Shutdown Dialog Strings */ STRINGTABLE BEGIN - IDS_SHUTDOWN_LOGOFF "Log off ""%s""" - IDS_SHUTDOWN_SHUTDOWN "Shut down" - IDS_SHUTDOWN_RESTART "Restart" - IDS_SHUTDOWN_SLEEP "Sleep" - IDS_SHUTDOWN_HIBERNATE "Hibernate" + IDS_SHUTDOWN_LOGOFF """%s"" Oturumunu Kapat" + IDS_SHUTDOWN_SHUTDOWN "Bilgisayarı Kapat" + IDS_SHUTDOWN_RESTART "Yeniden Başlat" + IDS_SHUTDOWN_SLEEP "Uykuya Geçir" + IDS_SHUTDOWN_HIBERNATE "Anıkta Beklet" /* Shut down descriptions */ - IDS_SHUTDOWN_LOGOFF_DESC "Ends your current session and allows other users to log on to the system." - IDS_SHUTDOWN_SHUTDOWN_DESC "Ends your current session and shuts down the system so you can safely shut down the power." - IDS_SHUTDOWN_RESTART_DESC "Ends your current session and reboots the system." - IDS_SHUTDOWN_SLEEP_DESC "Puts the system in sleep mode." - IDS_SHUTDOWN_HIBERNATE_DESC "Saves the current session and shuts down the computer." + IDS_SHUTDOWN_LOGOFF_DESC "Şimdiki oturumunuzu sonlandırır ve başka kullanıcılara dizgede oturum açmaya olanak sağlar." + IDS_SHUTDOWN_SHUTDOWN_DESC "Şimdiki oturumunuzu sonlandırır ve dizgeyi kapatır, böylece gücü güvenli olarak kapatbilirsiniz." + IDS_SHUTDOWN_RESTART_DESC "Şimdiki oturumunuzu sonlandırır dizgeyi yeniden başlatır." + IDS_SHUTDOWN_SLEEP_DESC "Dizgeyi uyku kipine geçirir." + IDS_SHUTDOWN_HIBERNATE_DESC "Şimdiki oturumu kaydeder ve bilgisayarı kapatır." END diff --git a/dll/win32/msvfw32/lang/msvfw32_Tr.rc b/dll/win32/msvfw32/lang/msvfw32_Tr.rc index 14321d58c31..bd9761837ca 100644 --- a/dll/win32/msvfw32/lang/msvfw32_Tr.rc +++ b/dll/win32/msvfw32/lang/msvfw32_Tr.rc @@ -40,7 +40,7 @@ FONT 8, "MS Shell Dlg" CONTROL "&Her Anahtar Kare",887,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,60,66,12 EDITTEXT 888,78,60,22,12 - LTEXT "kareler",889,103,62,26,10 + LTEXT "kare",889,103,62,26,10 CONTROL "&Veri Oranı",894,"Button",BS_AUTOCHECKBOX|WS_TABSTOP,9,76,66,12 EDITTEXT 895,78,76,22,12 diff --git a/dll/win32/oledlg/lang/oledlg_Tr.rc b/dll/win32/oledlg/lang/oledlg_Tr.rc index 8f69dd681bb..cc9a4992859 100644 --- a/dll/win32/oledlg/lang/oledlg_Tr.rc +++ b/dll/win32/oledlg/lang/oledlg_Tr.rc @@ -49,8 +49,8 @@ END STRINGTABLE { - IDS_RESULTOBJDESC "Belgeye yeni bir %s nesnesi ekle." - IDS_RESULTFILEOBJDESC "Kütük içeriğini belgenize nesne olarak ekleyiniz, böylece kendisini oluşturan izlenceyi kullanarak onu etkinleştirebilirsiniz." + IDS_RESULTOBJDESC "Belgenize yeni bir %s nesnesi ekleyiniz." + IDS_RESULTFILEOBJDESC "Belgenize kütüğün içeriğini bir nesne olarak ekleyiniz, böylece onu, kendisini oluşturan izlenceyi kullanarak etkinleştirebilirsiniz." IDS_BROWSE "Göz At" IDS_NOTOLEMOD "Kütük, geçerli bir OLE parçası olarak görünmüyor. OLE denetimi kaydedilemiyor." IDS_NOTOLEMODCAPTION "Denetim Ekle" @@ -61,7 +61,7 @@ STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Husûsî Yapıştır" FONT 8, "MS Shell Dlg" BEGIN - LTEXT "&Kaynak:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP + LTEXT "Kaynak:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP CONTROL "Y&apıştır", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 6, 38, 55, 10 CONTROL "&Bağlantıyı Yapıştır", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE, @@ -77,20 +77,20 @@ BEGIN CONTROL "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44 CONTROL "S&imgeyi Değiştir...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14 CONTROL "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34 - CONTROL "<< Sonuç Metni Buraya Gelecek >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35 + CONTROL "<< Sonuç metni buraya gelir. >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35 CONTROL "So&nuç", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48 CONTROL "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8 END STRINGTABLE { - IDS_PS_PASTE_DATA "Belgeye panonun içeriğini %s olarak ekler." - IDS_PS_PASTE_OBJECT "Belgeye panonun içeriğini ekler, böylece onu %s kullanarak etkinleştirebilirsiniz." - IDS_PS_PASTE_OBJECT_AS_ICON "Belgeye panonun içeriğini ekler, böylece onu %s kullanarak etkinleştirebilirsiniz. Bu simge olarak gösterilecektir." - IDS_PS_PASTE_LINK_DATA "Belgeye panonun içeriğini %s olarak ekler. Bu bilgi, kaynak kütüğüne bağlanır, böylece bu kütüğün değişiklikleri belgeye yansıtılır." - IDS_PS_PASTE_LINK_OBJECT "Belgeye panonun içeriğinin resmini ekler. Bu resim, kaynak kütüğüne bağlanır, böylece bu kütüğün değişiklikleri belgeye yansıtılır." - IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Pano içeriğinin konumunu belirten bir kısayol ekler. Bu kısayol, kaynak kütüğüne bağlanır, böylece bu kütüğün değişiklikleri belgeye yansıtılır." - IDS_PS_NON_OLE "Belgeye panonun içeriğini ekler." + IDS_PS_PASTE_DATA "Belgenize panonun içeriğini %s olarak ekler." + IDS_PS_PASTE_OBJECT "Belgenize panonun içeriğini ekler, böylece onu %s kullanarak etkinleştirebilirsiniz." + IDS_PS_PASTE_OBJECT_AS_ICON "Belgenize panonun içeriğini ekler, böylece onu %s kullanarak etkinleştirebilirsiniz. O, bir simge olarak gösterilecektir." + IDS_PS_PASTE_LINK_DATA "Belgenize panonun içeriğini %s olarak ekler. Bilgi, kaynak kütüğüne bağlanır, böylece kütüğe yapılan değişiklikler belgenize yansıtılacaktır." + IDS_PS_PASTE_LINK_OBJECT "Belgenizine pano içeriğinden bir resim ekler. Resim, kaynak kütüğüne bağlanır, böylece kütüğe yapılan değişiklikler belgenize yansıtılacaktır." + IDS_PS_PASTE_LINK_OBJECT_AS_ICON "Pano içeriğinin konumunu belirten bir kısayol ekler. Kısayol, kaynak kütüğüne bağlanır, böylece kütüğe yapılan değişiklikler belgenize yansıtılacaktır." + IDS_PS_NON_OLE "Belgenize panonun içeriğini ekler." IDS_PS_UNKNOWN_TYPE "Bilinmeyen Tür" IDS_PS_UNKNOWN_SRC "Bilinmeyen Kaynak" IDS_PS_UNKNOWN_APP "onu oluşturan izlence" diff --git a/dll/win32/shell32/folders.cpp b/dll/win32/shell32/folders.cpp index 0dc5e78c816..1e05702870c 100644 --- a/dll/win32/shell32/folders.cpp +++ b/dll/win32/shell32/folders.cpp @@ -28,6 +28,7 @@ static HRESULT getIconLocationForFolder(LPCITEMIDLIST pidl, UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) { int icon_idx; + bool cont=TRUE; WCHAR wszPath[MAX_PATH]; WCHAR wszCLSIDValue[CHARS_IN_GUID]; static const WCHAR shellClassInfo[] = { '.', 'S', 'h', 'e', 'l', 'l', 'C', 'l', 'a', 's', 's', 'I', 'n', 'f', 'o', 0 }; @@ -36,27 +37,40 @@ static HRESULT getIconLocationForFolder(LPCITEMIDLIST pidl, UINT uFlags, static const WCHAR clsid2[] = { 'C', 'L', 'S', 'I', 'D', '2', 0 }; static const WCHAR iconIndex[] = { 'I', 'c', 'o', 'n', 'I', 'n', 'd', 'e', 'x', 0 }; - if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, iconFile, - wszPath, MAX_PATH)) + /* + Optimisation. GetCustomFolderAttribute has a critical lock on it, and isn't fast. + Test the water (i.e., see if the attribute exists) before questioning it three times + when most folders don't use it at all. + */ + WCHAR wszBigToe[3]; + if (!(uFlags & GIL_DEFAULTICON) && SHELL32_GetCustomFolderAttributes(pidl, shellClassInfo, + wszBigToe, 3)) { - WCHAR wszIconIndex[10]; - SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, iconIndex, - wszIconIndex, 10); - *piIndex = _wtoi(wszIconIndex); + if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, iconFile, + wszPath, MAX_PATH)) + { + WCHAR wszIconIndex[10]; + SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, iconIndex, + wszIconIndex, 10); + *piIndex = _wtoi(wszIconIndex); + cont=FALSE; + } + else if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, clsid, + wszCLSIDValue, CHARS_IN_GUID) && + HCR_GetIconW(wszCLSIDValue, szIconFile, NULL, cchMax, &icon_idx)) + { + *piIndex = icon_idx; + cont=FALSE; + } + else if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, clsid2, + wszCLSIDValue, CHARS_IN_GUID) && + HCR_GetIconW(wszCLSIDValue, szIconFile, NULL, cchMax, &icon_idx)) + { + *piIndex = icon_idx; + cont=FALSE; + } } - else if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, clsid, - wszCLSIDValue, CHARS_IN_GUID) && - HCR_GetIconW(wszCLSIDValue, szIconFile, NULL, cchMax, &icon_idx)) - { - *piIndex = icon_idx; - } - else if (SHELL32_GetCustomFolderAttribute(pidl, shellClassInfo, clsid2, - wszCLSIDValue, CHARS_IN_GUID) && - HCR_GetIconW(wszCLSIDValue, szIconFile, NULL, cchMax, &icon_idx)) - { - *piIndex = icon_idx; - } - else + if (cont) { static const WCHAR folder[] = { 'F', 'o', 'l', 'd', 'e', 'r', 0 }; @@ -322,6 +336,10 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) &flags))) { initIcon->SetNormalIcon(wTemp, icon_idx); + // FIXME: if/when getIconLocationForFolder does something for + // GIL_FORSHORTCUT, code below should be uncommented. and + // the following line removed. + initIcon->SetShortcutIcon(wTemp, icon_idx); } if (SUCCEEDED(getIconLocationForFolder( pidl, GIL_DEFAULTICON, wTemp, MAX_PATH, @@ -330,13 +348,13 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl) { initIcon->SetDefaultIcon(wTemp, icon_idx); } - if (SUCCEEDED(getIconLocationForFolder( - pidl, GIL_FORSHORTCUT, wTemp, MAX_PATH, - &icon_idx, - &flags))) - { - initIcon->SetShortcutIcon(wTemp, icon_idx); - } + // if (SUCCEEDED(getIconLocationForFolder( + // pidl, GIL_FORSHORTCUT, wTemp, MAX_PATH, + // &icon_idx, + // &flags))) + // { + // initIcon->SetShortcutIcon(wTemp, icon_idx); + // } if (SUCCEEDED(getIconLocationForFolder( pidl, GIL_OPENICON, wTemp, MAX_PATH, &icon_idx, diff --git a/dll/win32/shell32/iconcache.cpp b/dll/win32/shell32/iconcache.cpp index 0ba1e188830..aa3cbfba2e9 100644 --- a/dll/win32/shell32/iconcache.cpp +++ b/dll/win32/shell32/iconcache.cpp @@ -64,14 +64,14 @@ static INT CALLBACK SIC_CompareEntries( LPVOID p1, LPVOID p2, LPARAM lparam) * loaded from, their resource index and the fact if they have a shortcut * icon overlay or not. */ - if (e1->dwSourceIndex != e2->dwSourceIndex || /* first the faster one */ - (e1->dwFlags & GIL_FORSHORTCUT) != (e2->dwFlags & GIL_FORSHORTCUT)) - return 1; + /* first the faster one */ + if (e1->dwSourceIndex != e2->dwSourceIndex) + return (e1->dwSourceIndex < e2->dwSourceIndex) ? -1 : 1; - if (wcsicmp(e1->sSourceFile,e2->sSourceFile)) - return 1; - - return 0; + if ((e1->dwFlags & GIL_FORSHORTCUT) != (e2->dwFlags & GIL_FORSHORTCUT)) + return ((e1->dwFlags & GIL_FORSHORTCUT) < (e2->dwFlags & GIL_FORSHORTCUT)) ? -1 : 1; + + return wcsicmp(e1->sSourceFile,e2->sSourceFile); } /* declare SIC_LoadOverlayIcon() */ @@ -338,7 +338,8 @@ static INT SIC_IconAppend (LPCWSTR sSourceFile, INT dwSourceIndex, HICON hSmallI EnterCriticalSection(&SHELL32_SicCS); - indexDPA = DPA_InsertPtr(sic_hdpa, 0x7fff, lpsice); + indexDPA = DPA_Search (sic_hdpa, lpsice, 0, SIC_CompareEntries, 0, DPAS_SORTED|DPAS_INSERTAFTER); + indexDPA = DPA_InsertPtr(sic_hdpa, indexDPA, lpsice); if ( -1 == indexDPA ) { ret = INVALID_INDEX; @@ -468,7 +469,7 @@ INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags ) if (NULL != DPA_GetPtr (sic_hdpa, 0)) { /* search linear from position 0*/ - index = DPA_Search (sic_hdpa, &sice, 0, SIC_CompareEntries, 0, 0); + index = DPA_Search (sic_hdpa, &sice, 0, SIC_CompareEntries, 0, DPAS_SORTED); } if ( INVALID_INDEX == index ) diff --git a/dll/win32/shell32/shfldr.h b/dll/win32/shell32/shfldr.h index 81111ce4999..3374b19bff9 100644 --- a/dll/win32/shell32/shfldr.h +++ b/dll/win32/shell32/shfldr.h @@ -37,6 +37,7 @@ typedef struct { #define GET_SHGDN_RELATION(dwFlags) ((DWORD)dwFlags & (DWORD)0x000000FF) BOOL SHELL32_GetCustomFolderAttribute (LPCITEMIDLIST pidl, LPCWSTR pwszHeading, LPCWSTR pwszAttribute, LPWSTR pwszValue, DWORD cchValue); +BOOL SHELL32_GetCustomFolderAttributes (LPCITEMIDLIST pidl, LPCWSTR pwszHeading, LPWSTR pwszValue, DWORD cchValue); LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut); HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, diff --git a/dll/win32/shell32/shlfolder.cpp b/dll/win32/shell32/shlfolder.cpp index 30dab9ebc4e..bbecaea2a9d 100644 --- a/dll/win32/shell32/shlfolder.cpp +++ b/dll/win32/shell32/shlfolder.cpp @@ -81,6 +81,33 @@ BOOL SHELL32_GetCustomFolderAttribute( return FALSE; } +BOOL SHELL32_GetCustomFolderAttributes( + LPCITEMIDLIST pidl, LPCWSTR pwszHeading, + LPWSTR pwszValue, DWORD cchValue) +{ + DWORD dwAttrib = FILE_ATTRIBUTE_SYSTEM; + WCHAR wszFolderPath[MAX_PATH]; + + /* Hack around not having system attribute on non-Windows file systems */ + if (0) + dwAttrib = _ILGetFileAttributes(pidl, NULL, 0); + + if (dwAttrib & FILE_ATTRIBUTE_SYSTEM) + { + if (!SHGetPathFromIDListW(pidl, wszFolderPath)) + return FALSE; + + static const WCHAR wszDesktopIni[] = + {'d','e','s','k','t','o','p','.','i','n','i',0}; + + PathAddBackslashW(wszFolderPath); + PathAppendW(wszFolderPath, wszDesktopIni); + return GetPrivateProfileSectionW(pwszHeading, pwszValue, cchValue, wszFolderPath); + } + return FALSE; +} + + /*************************************************************************** * GetNextElement (internal function) * diff --git a/drivers/filesystems/npfs/datasup.c b/drivers/filesystems/npfs/datasup.c index bc530ec7fcf..a464936ea72 100644 --- a/drivers/filesystems/npfs/datasup.c +++ b/drivers/filesystems/npfs/datasup.c @@ -62,11 +62,13 @@ NpCompleteStalledWrites(IN PNP_DATA_QUEUE DataQueue, { if (!QuotaLeft) break; - DataQueueEntry = CONTAINING_RECORD(NextEntry, NP_DATA_QUEUE_ENTRY, Irp); + DataQueueEntry = CONTAINING_RECORD(NextEntry, + NP_DATA_QUEUE_ENTRY, + QueueEntry); Irp = DataQueueEntry->Irp; - if ((DataQueueEntry->DataEntryType == 0) && (Irp)) + if ((DataQueueEntry->DataEntryType == Buffered) && (Irp)) { DataLeft = DataQueueEntry->DataSize - ByteOffset; @@ -125,12 +127,12 @@ NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue, DataQueue->BytesInQueue -= QueueEntry->DataSize; --DataQueue->EntriesInQueue; - HasWrites = 1; + HasWrites = TRUE; if (DataQueue->QueueState != WriteEntries || DataQueue->QuotaUsed < DataQueue->Quota || !QueueEntry->QuotaInEntry) { - HasWrites = 0; + HasWrites = FALSE; } DataQueue->QuotaUsed -= QueueEntry->QuotaInEntry; @@ -138,7 +140,7 @@ NpRemoveDataQueueEntry(IN PNP_DATA_QUEUE DataQueue, if (IsListEmpty(&DataQueue->Queue)) { DataQueue->QueueState = Empty; - HasWrites = 0; + HasWrites = FALSE; } Irp = QueueEntry->Irp; @@ -181,7 +183,9 @@ NpGetNextRealDataQueueEntry(IN PNP_DATA_QUEUE DataQueue, NextEntry != &DataQueue->Queue; NextEntry = DataQueue->Queue.Flink) { - DataEntry = CONTAINING_RECORD(NextEntry, NP_DATA_QUEUE_ENTRY, QueueEntry); + DataEntry = CONTAINING_RECORD(NextEntry, + NP_DATA_QUEUE_ENTRY, + QueueEntry); Type = DataEntry->DataEntryType; if (Type == Buffered || Type == Unbuffered) break; @@ -221,29 +225,29 @@ NpCancelDataQueueIrp(IN PDEVICE_OBJECT DeviceObject, NpAcquireExclusiveVcb(); } - DataEntry = (PNP_DATA_QUEUE_ENTRY)Irp->Tail.Overlay.DriverContext[3]; + DataEntry = Irp->Tail.Overlay.DriverContext[3]; if (DataEntry) { if (DataEntry->QueueEntry.Blink == &DataQueue->Queue) { DataQueue->ByteOffset = 0; - FirstEntry = 1; + FirstEntry = TRUE; } else { - FirstEntry = 0; + FirstEntry = FALSE; } RemoveEntryList(&DataEntry->QueueEntry); ClientSecurityContext = DataEntry->ClientSecurityContext; - CompleteWrites = 1; + CompleteWrites = TRUE; if (DataQueue->QueueState != WriteEntries || DataQueue->QuotaUsed < DataQueue->Quota || !DataEntry->QuotaInEntry) { - CompleteWrites = 0; + CompleteWrites = FALSE; } DataQueue->BytesInQueue -= DataEntry->DataSize; diff --git a/drivers/filesystems/npfs/readsup.c b/drivers/filesystems/npfs/readsup.c index 5932b87a79f..914484c1d74 100644 --- a/drivers/filesystems/npfs/readsup.c +++ b/drivers/filesystems/npfs/readsup.c @@ -17,12 +17,12 @@ IO_STATUS_BLOCK NTAPI -NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, +NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, IN BOOLEAN Peek, IN BOOLEAN ReadOverflowOperation, IN PVOID Buffer, - IN ULONG BufferSize, - IN ULONG Mode, + IN ULONG BufferSize, + IN ULONG Mode, IN PNP_CCB Ccb, IN PLIST_ENTRY List) { @@ -30,14 +30,14 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, PVOID DataBuffer; ULONG DataSize, DataLength, TotalBytesCopied, RemainingSize, Offset; PIRP Irp; - IO_STATUS_BLOCK Status; + IO_STATUS_BLOCK IoStatus; BOOLEAN CompleteWrites = FALSE; PAGED_CODE(); if (ReadOverflowOperation) Peek = TRUE; RemainingSize = BufferSize; - Status.Status = STATUS_SUCCESS; + IoStatus.Status = STATUS_SUCCESS; TotalBytesCopied = 0; if (Peek) @@ -110,7 +110,7 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, { if (Mode == FILE_PIPE_MESSAGE_MODE) { - Status.Status = STATUS_BUFFER_OVERFLOW; + IoStatus.Status = STATUS_BUFFER_OVERFLOW; break; } } @@ -137,7 +137,7 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, if (Mode == FILE_PIPE_MESSAGE_MODE) { - Status.Status = STATUS_SUCCESS; + IoStatus.Status = STATUS_SUCCESS; break; } @@ -159,9 +159,9 @@ NpReadDataQueue(IN PNP_DATA_QUEUE DataQueue, } } - Status.Information = TotalBytesCopied; + IoStatus.Information = TotalBytesCopied; if (CompleteWrites) NpCompleteStalledWrites(DataQueue, List); - return Status; + return IoStatus; } /* EOF */ diff --git a/drivers/filesystems/npfs/waitsup.c b/drivers/filesystems/npfs/waitsup.c index 5519d6b52bb..bc80ebb955f 100644 --- a/drivers/filesystems/npfs/waitsup.c +++ b/drivers/filesystems/npfs/waitsup.c @@ -17,7 +17,7 @@ VOID NTAPI -NpCancelWaitQueueIrp(IN PDEVICE_OBJECT DeviceObject, +NpCancelWaitQueueIrp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { KIRQL OldIrql; @@ -53,7 +53,7 @@ NpCancelWaitQueueIrp(IN PDEVICE_OBJECT DeviceObject, Irp->IoStatus.Status = STATUS_CANCELLED; IoCompleteRequest(Irp, IO_NAMED_PIPE_INCREMENT); } - + VOID NTAPI NpTimerDispatch(IN PKDPC Dpc, @@ -243,7 +243,7 @@ NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue, WaitEntry->WaitQueue = WaitQueue; WaitEntry->Irp = Irp; - WaitBuffer = (PFILE_PIPE_WAIT_FOR_BUFFER)Irp->AssociatedIrp.SystemBuffer; + WaitBuffer = Irp->AssociatedIrp.SystemBuffer; if (WaitBuffer->TimeoutSpecified) { DueTime = WaitBuffer->Timeout; @@ -281,7 +281,6 @@ NpAddWaiter(IN PNP_WAIT_QUEUE WaitQueue, KeSetTimer(&WaitEntry->Timer, DueTime, &WaitEntry->Dpc); WaitEntry = NULL; - } KeReleaseSpinLock(&WaitQueue->WaitLock, OldIrql); diff --git a/include/ndk/mmtypes.h b/include/ndk/mmtypes.h index 25dfabccdd8..47d99be68be 100644 --- a/include/ndk/mmtypes.h +++ b/include/ndk/mmtypes.h @@ -639,6 +639,7 @@ typedef struct _SECTION_OBJECT { PVOID StartingVa; PVOID EndingVa; + PVOID Parent; PVOID LeftChild; PVOID RightChild; PSEGMENT_OBJECT Segment; diff --git a/include/reactos/libs/pseh/pseh3.h b/include/reactos/libs/pseh/pseh3.h index 8337b41522a..fee3b63fa8b 100644 --- a/include/reactos/libs/pseh/pseh3.h +++ b/include/reactos/libs/pseh/pseh3.h @@ -113,6 +113,22 @@ void * __cdecl __attribute__((error("Can only be used inside an exception filter /* This attribute allows automatic cleanup of the registered frames */ #define _SEH3$_AUTO_CLEANUP __attribute__((cleanup(_SEH3$_AutoCleanup))) +int +__attribute__((regparm(3))) +__attribute__((returns_twice)) +_SEH3$_RegisterFrameWithNonVolatiles( + volatile SEH3$_REGISTRATION_FRAME* RegistrationFrame, + const SEH3$_SCOPE_TABLE* ScopeTable, + void* AllocaFrame); + +int +__attribute__((regparm(3))) +__attribute__((returns_twice)) +_SEH3$_RegisterTryLevelWithNonVolatiles( + volatile SEH3$_REGISTRATION_FRAME* RegistrationFrame, + const SEH3$_SCOPE_TABLE* ScopeTable, + void* AllocaFrame); + /* CLANG specific definitions! */ #ifdef __clang__ @@ -122,14 +138,6 @@ void * __cdecl __attribute__((error("Can only be used inside an exception filter /* CLANG doesn't have asm goto! */ #define _SEH3$_ASM_GOTO(...) -int -__attribute__((regparm(3))) -__attribute__((returns_twice)) -_SEH3$_RegisterFrameWithNonVolatiles( - volatile SEH3$_REGISTRATION_FRAME* RegistrationFrame, - const SEH3$_SCOPE_TABLE* ScopeTable, - void* AllocaFrame); - #define _SEH3$_RegisterFrame_(_TrylevelFrame, _DataTable) \ do { \ int result = _SEH3$_RegisterFrameWithNonVolatiles(_TrylevelFrame, _DataTable, __builtin_alloca(0)); \ @@ -141,14 +149,6 @@ _SEH3$_RegisterFrameWithNonVolatiles( } \ } while(0) -int -__attribute__((regparm(3))) -__attribute__((returns_twice)) -_SEH3$_RegisterTryLevelWithNonVolatiles( - volatile SEH3$_REGISTRATION_FRAME* RegistrationFrame, - const SEH3$_SCOPE_TABLE* ScopeTable, - void* AllocaFrame); - #define _SEH3$_RegisterTryLevel_(_TrylevelFrame, _DataTable) \ do { \ int result = _SEH3$_RegisterTryLevelWithNonVolatiles(_TrylevelFrame, _DataTable, __builtin_alloca(0)); \ @@ -171,21 +171,21 @@ _SEH3$_RegisterTryLevelWithNonVolatiles( #ifdef __cplusplus #define _SEH3$_CALL_WRAPPER(_Function, _TrylevelFrame, _DataTable) \ - asm goto ("leal %0, %%eax\n" \ - "leal %1, %%edx\n" \ - "call " #_Function "WithStackLayout\n" \ + asm goto ("leal %0, %%eax\n\t" \ + "leal %1, %%edx\n\t" \ + "call " #_Function "WithStackLayout" \ : \ - : "m" (*(_TrylevelFrame)), "m" (*(_DataTable)), "c"(__builtin_alloca(0)) \ + : "m" (*(_TrylevelFrame)), "m" (*(_DataTable)), "c" (__builtin_alloca(0)), "p" (_SEH3$_RegisterFrameWithNonVolatiles) \ : "eax", "edx", "memory" \ : _SEH3$_l_BeforeTry, _SEH3$_l_HandlerTarget, _SEH3$_l_OnException, _SEH3$_l_BeforeFilterOrFinally, _SEH3$_l_FilterOrFinally) #else #define _SEH3$_CALL_WRAPPER(_Function, _TrylevelFrame, _DataTable) \ - asm goto ("leal %0, %%eax\n" \ - "leal %1, %%edx\n" \ - "call " #_Function "\n" \ + asm goto ("leal %0, %%eax\n\t" \ + "leal %1, %%edx\n\t" \ + "call " #_Function \ : \ - : "m" (*(_TrylevelFrame)), "m" (*(_DataTable)) \ + : "m" (*(_TrylevelFrame)), "m" (*(_DataTable)), "p" (_SEH3$_RegisterFrameWithNonVolatiles) \ : "eax", "edx", "ecx", "memory" \ : _SEH3$_l_BeforeTry, _SEH3$_l_HandlerTarget, _SEH3$_l_OnException, _SEH3$_l_BeforeFilterOrFinally, _SEH3$_l_FilterOrFinally) #endif @@ -227,8 +227,8 @@ _SEH3$_AutoCleanup( /* On invocation, the AllocaFrame field is loaded with the return esp value */ #define _SEH3$_NESTED_FUNC_RETURN(_Result) \ /* Restore esp and return to the caller */ \ - asm volatile ("movl %[FixedEsp], %%esp\nret\n" \ - : : "a"(_Result), [FixedEsp]"m"(_SEH3$_TrylevelFrame.AllocaFrame) : "ebx", "ecx", "edx", "esi", "edi", "flags", "memory") + asm volatile ("movl %[FixedEsp], %%esp\n\tret" \ + : : "a" (_Result), [FixedEsp] "m" (_SEH3$_TrylevelFrame.AllocaFrame) : "ebx", "ecx", "edx", "esi", "edi", "flags", "memory") /* The filter "function" */ #define _SEH3$_DEFINE_FILTER_FUNC(_Name, expression) \ diff --git a/include/reactos/subsys/csr/csr.h b/include/reactos/subsys/csr/csr.h index 00338d9769a..e778b11051e 100644 --- a/include/reactos/subsys/csr/csr.h +++ b/include/reactos/subsys/csr/csr.h @@ -36,27 +36,33 @@ ULONG NTAPI CsrAllocateMessagePointer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, IN ULONG MessageLength, - OUT PVOID *CapturedData); + OUT PVOID* CapturedData); VOID NTAPI CsrCaptureMessageBuffer(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, IN PVOID MessageBuffer OPTIONAL, IN ULONG MessageLength, - OUT PVOID *CapturedData); - -VOID -NTAPI -CsrCaptureMessageString(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, - IN LPSTR String OPTIONAL, - IN ULONG StringLength, - IN ULONG MaximumLength, - OUT PANSI_STRING CapturedString); + OUT PVOID* CapturedData); VOID NTAPI CsrFreeCaptureBuffer(IN PCSR_CAPTURE_BUFFER CaptureBuffer); +VOID +NTAPI +CsrCaptureMessageString(IN OUT PCSR_CAPTURE_BUFFER CaptureBuffer, + IN PCSTR String OPTIONAL, + IN ULONG StringLength, + IN ULONG MaximumLength, + OUT PSTRING CapturedString); + +NTSTATUS +NTAPI +CsrCaptureMessageMultiUnicodeStringsInPlace(OUT PCSR_CAPTURE_BUFFER* CaptureBuffer, + IN ULONG StringsCount, + IN PUNICODE_STRING* MessageStrings); + PLARGE_INTEGER NTAPI CsrCaptureTimeout(IN ULONG Milliseconds, diff --git a/include/reactos/subsys/win/conmsg.h b/include/reactos/subsys/win/conmsg.h index 4d117a717b6..a11d0bf64b8 100644 --- a/include/reactos/subsys/win/conmsg.h +++ b/include/reactos/subsys/win/conmsg.h @@ -164,6 +164,7 @@ typedef struct _CONSOLE_START_INFO DWORD dwHotKey; DWORD dwStartupFlags; CONSOLE_PROPERTIES; + BOOLEAN ConsoleNeeded; // Used for GUI apps only. LPTHREAD_START_ROUTINE CtrlDispatcher; LPTHREAD_START_ROUTINE ImeDispatcher; @@ -218,30 +219,40 @@ typedef struct typedef struct { + HANDLE ConsoleHandle; HANDLE OutputHandle; - BOOL Unicode; - ULONG NrCharactersToWrite; - ULONG NrCharactersWritten; + CHAR StaticBuffer[80]; + PVOID Buffer; // BufPtr + ULONG NumBytes; - ULONG BufferSize; - PVOID Buffer; + // On Windows, the client never uses this member + ULONG Reserved1; + + BOOLEAN UsingStaticBuffer; + BOOLEAN Unicode; + + // On Windows, the client never uses this member + CHAR Reserved2[6]; } CONSOLE_WRITECONSOLE, *PCONSOLE_WRITECONSOLE; typedef struct { + HANDLE ConsoleHandle; HANDLE InputHandle; - BOOL Unicode; - ULONG NrCharactersToRead; - ULONG NrCharactersRead; + USHORT ExeLength; - UNICODE_STRING ExeName; - DWORD CtrlWakeupMask; - DWORD ControlKeyState; + CHAR StaticBuffer[80]; + PVOID Buffer; // BufPtr + ULONG NumBytes; - ULONG BufferSize; - PVOID Buffer; + ULONG CaptureBufferSize; + + ULONG InitialNumBytes; + ULONG CtrlWakeupMask; + ULONG ControlKeyState; + BOOLEAN Unicode; } CONSOLE_READCONSOLE, *PCONSOLE_READCONSOLE; typedef struct @@ -271,7 +282,7 @@ typedef struct typedef struct { - ULONG Dummy; + HANDLE ConsoleHandle; } CONSOLE_FREECONSOLE, *PCONSOLE_FREECONSOLE; typedef struct @@ -319,6 +330,12 @@ typedef struct */ } CONSOLE_GETSETCURSORINFO, *PCONSOLE_GETSETCURSORINFO; +typedef struct +{ + HANDLE ConsoleHandle; + ULONG NumButtons; +} CONSOLE_GETMOUSEINFO, *PCONSOLE_GETMOUSEINFO; + typedef struct { HANDLE ConsoleHandle; @@ -370,7 +387,8 @@ typedef struct DWORD DesiredAccess; BOOL InheritHandle; DWORD ShareMode; - DWORD ScreenBufferType; /* Type of the screen buffer: CONSOLE_TEXTMODE_BUFFER or CONSOLE_GRAPHICS_BUFFER */ + /* Type of the screen buffer: CONSOLE_TEXTMODE_BUFFER or CONSOLE_GRAPHICS_BUFFER */ + DWORD ScreenBufferType; /* * This structure holds the initialization information * for graphics screen buffers. @@ -405,22 +423,11 @@ typedef struct typedef struct { HANDLE ConsoleHandle; - DWORD Length; + ULONG Length; PVOID Title; BOOLEAN Unicode; } CONSOLE_GETSETCONSOLETITLE, *PCONSOLE_GETSETCONSOLETITLE; -typedef struct -{ - HANDLE OutputHandle; - - BOOL Unicode; - COORD BufferSize; - COORD BufferCoord; - SMALL_RECT WriteRegion; - PCHAR_INFO CharInfo; -} CONSOLE_WRITEOUTPUT, *PCONSOLE_WRITEOUTPUT; - typedef struct { HANDLE ConsoleHandle; @@ -429,14 +436,14 @@ typedef struct typedef struct { - HANDLE OutputHandle; - - BOOL Unicode; + HANDLE ConsoleHandle; + HANDLE OutputHandle; SMALL_RECT ScrollRectangle; - BOOL UseClipRectangle; SMALL_RECT ClipRectangle; - COORD DestinationOrigin; - CHAR_INFO Fill; + BOOL UseClipRectangle; + COORD DestinationOrigin; + CHAR_INFO Fill; + BOOLEAN Unicode; } CONSOLE_SCROLLSCREENBUFFER, *PCONSOLE_SCROLLSCREENBUFFER; @@ -452,100 +459,99 @@ typedef enum _CODE_TYPE CODE_ATTRIBUTE = 0x03 } CODE_TYPE; -typedef struct +typedef union _CODE_ELEMENT { - HANDLE OutputHandle; - - DWORD NumCodesToRead; - COORD ReadCoord; - COORD EndCoord; - - DWORD CodesRead; - - CODE_TYPE CodeType; - union - { - PVOID pCode; - PCHAR AsciiChar; - PWCHAR UnicodeChar; - PWORD Attribute; - } pCode; // Either a pointer to a character or to an attribute. -} CONSOLE_READOUTPUTCODE, *PCONSOLE_READOUTPUTCODE; + CHAR AsciiChar; + WCHAR UnicodeChar; + WORD Attribute; +} CODE_ELEMENT; typedef struct { + HANDLE ConsoleHandle; HANDLE OutputHandle; - - ULONG BufferSize; // Seems unusued - WORD Length; - COORD Coord; - COORD EndCoord; - - ULONG NrCharactersWritten; // Seems unusued + COORD Coord; CODE_TYPE CodeType; - union - { - PVOID pCode; - PCHAR AsciiChar; - PWCHAR UnicodeChar; - PWORD Attribute; - } pCode; // Either a pointer to a character or to an attribute. -} CONSOLE_WRITEOUTPUTCODE, *PCONSOLE_WRITEOUTPUTCODE; + CHAR CodeStaticBuffer[80]; // == 40 * sizeof(CODE_ELEMENT) + PVOID pCode; // Either a pointer to a character or to an attribute. + // union + // { + // PVOID pCode; + // PCHAR AsciiChar; + // PWCHAR UnicodeChar; + // PWORD Attribute; + // } pCode; // Either a pointer to a character or to an attribute. + + ULONG NumCodes; +} CONSOLE_READOUTPUTCODE , *PCONSOLE_READOUTPUTCODE, + CONSOLE_WRITEOUTPUTCODE, *PCONSOLE_WRITEOUTPUTCODE; typedef struct { + HANDLE ConsoleHandle; HANDLE OutputHandle; + COORD WriteCoord; - CODE_TYPE CodeType; - union - { - CHAR AsciiChar; - WCHAR UnicodeChar; - WORD Attribute; - } Code; // Either a character or an attribute. + CODE_TYPE CodeType; + CODE_ELEMENT Code; // Either a character or an attribute. - COORD Coord; - ULONG Length; - - ULONG NrCharactersWritten; // FIXME: Only for chars, is it removable ? + ULONG NumCodes; } CONSOLE_FILLOUTPUTCODE, *PCONSOLE_FILLOUTPUTCODE; typedef struct { - HANDLE InputHandle; - ULONG InputsRead; - PINPUT_RECORD InputRecord; - ULONG Length; - WORD wFlags; - BOOLEAN Unicode; + HANDLE ConsoleHandle; + HANDLE InputHandle; + INPUT_RECORD RecordStaticBuffer[5]; + PINPUT_RECORD RecordBufPtr; + ULONG NumRecords; + WORD Flags; + BOOLEAN Unicode; } CONSOLE_GETINPUT, *PCONSOLE_GETINPUT; typedef struct { - HANDLE OutputHandle; - - BOOL Unicode; - COORD BufferSize; - COORD BufferCoord; - SMALL_RECT ReadRegion; - PCHAR_INFO CharInfo; -} CONSOLE_READOUTPUT, *PCONSOLE_READOUTPUT; - -typedef struct -{ - HANDLE InputHandle; - DWORD Length; - INPUT_RECORD* InputRecord; - BOOL Unicode; - BOOL AppendToEnd; + HANDLE ConsoleHandle; + HANDLE InputHandle; + INPUT_RECORD RecordStaticBuffer[5]; + PINPUT_RECORD RecordBufPtr; + ULONG NumRecords; + BOOLEAN Unicode; + BOOLEAN AppendToEnd; } CONSOLE_WRITEINPUT, *PCONSOLE_WRITEINPUT; +typedef struct +{ + HANDLE ConsoleHandle; + HANDLE OutputHandle; + + CHAR_INFO StaticBuffer; + PCHAR_INFO CharInfo; + + SMALL_RECT ReadRegion; + BOOLEAN Unicode; +} CONSOLE_READOUTPUT, *PCONSOLE_READOUTPUT; + +typedef struct +{ + HANDLE ConsoleHandle; + HANDLE OutputHandle; + + CHAR_INFO StaticBuffer; + PCHAR_INFO CharInfo; + + SMALL_RECT WriteRegion; + BOOLEAN Unicode; + + ULONG Unknown; +} CONSOLE_WRITEOUTPUT, *PCONSOLE_WRITEOUTPUT; + typedef struct { HANDLE ConsoleHandle; HANDLE InputHandle; - DWORD NumberOfEvents; + ULONG NumberOfEvents; } CONSOLE_GETNUMINPUTEVENTS, *PCONSOLE_GETNUMINPUTEVENTS; @@ -656,66 +662,85 @@ typedef struct typedef struct { - ULONG SourceLength; - ULONG TargetLength; // Also used for storing the number of bytes written. - ULONG ExeLength; - LPWSTR Source; - LPWSTR Target; - LPWSTR Exe; + HANDLE ConsoleHandle; + USHORT SourceLength; + USHORT TargetLength; // Also used for storing the number of bytes written. + USHORT ExeLength; + PVOID Source; + PVOID Target; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; } CONSOLE_ADDGETALIAS, *PCONSOLE_ADDGETALIAS; typedef struct { - DWORD ExeLength; - DWORD AliasesBufferLength; - LPWSTR ExeName; - LPWSTR AliasesBuffer; + HANDLE ConsoleHandle; + USHORT ExeLength; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; + ULONG AliasesBufferLength; + PVOID AliasesBuffer; } CONSOLE_GETALLALIASES, *PCONSOLE_GETALLALIASES; typedef struct { - DWORD Length; - DWORD ExeLength; - LPWSTR ExeName; + HANDLE ConsoleHandle; + USHORT ExeLength; + PVOID ExeName; + ULONG Length; + BOOLEAN Unicode; + BOOLEAN Unicode2; } CONSOLE_GETALLALIASESLENGTH, *PCONSOLE_GETALLALIASESLENGTH; typedef struct { - DWORD Length; - LPWSTR ExeNames; + HANDLE ConsoleHandle; + ULONG Length ; // ExeLength; // ExesLength + PVOID ExeNames; + BOOLEAN Unicode; } CONSOLE_GETALIASESEXES, *PCONSOLE_GETALIASESEXES; typedef struct { - DWORD Length; + HANDLE ConsoleHandle; + ULONG Length; + BOOLEAN Unicode; } CONSOLE_GETALIASESEXESLENGTH, *PCONSOLE_GETALIASESEXESLENGTH; typedef struct { - UNICODE_STRING ExeName; - PWCHAR History; - DWORD Length; + HANDLE ConsoleHandle; + ULONG HistoryLength; + PVOID History; + USHORT ExeLength; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; } CONSOLE_GETCOMMANDHISTORY, *PCONSOLE_GETCOMMANDHISTORY; typedef struct { - UNICODE_STRING ExeName; - DWORD Length; + HANDLE ConsoleHandle; + ULONG HistoryLength; + USHORT ExeLength; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; } CONSOLE_GETCOMMANDHISTORYLENGTH, *PCONSOLE_GETCOMMANDHISTORYLENGTH; typedef struct { - UNICODE_STRING ExeName; + HANDLE ConsoleHandle; + USHORT ExeLength; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; } CONSOLE_EXPUNGECOMMANDHISTORY, *PCONSOLE_EXPUNGECOMMANDHISTORY; -typedef struct -{ - UNICODE_STRING ExeName; - DWORD NumCommands; -} CONSOLE_SETHISTORYNUMBERCOMMANDS, *PCONSOLE_SETHISTORYNUMBERCOMMANDS; - typedef struct { UINT HistoryBufferSize; @@ -723,6 +748,22 @@ typedef struct DWORD dwFlags; } CONSOLE_GETSETHISTORYINFO, *PCONSOLE_GETSETHISTORYINFO; +typedef struct +{ + HANDLE ConsoleHandle; + ULONG NumCommands; + USHORT ExeLength; + PVOID ExeName; + BOOLEAN Unicode; + BOOLEAN Unicode2; +} CONSOLE_SETHISTORYNUMBERCOMMANDS, *PCONSOLE_SETHISTORYNUMBERCOMMANDS; + +typedef struct +{ + HANDLE ConsoleHandle; + ULONG Mode; +} CONSOLE_SETHISTORYMODE, *PCONSOLE_SETHISTORYMODE; + typedef struct @@ -753,6 +794,13 @@ typedef struct HANDLE EventHandle; } CONSOLE_SETINPUTOUTPUTCP, *PCONSOLE_SETINPUTOUTPUTCP; +typedef struct +{ + HANDLE ConsoleHandle; + CHAR LayoutBuffer[KL_NAMELENGTH * sizeof(WCHAR)]; // Can hold up to 9 wchars + BOOL Ansi; +} CONSOLE_GETKBDLAYOUTNAME, *PCONSOLE_GETKBDLAYOUTNAME; + typedef struct _CONSOLE_API_MESSAGE { PORT_MESSAGE Header; @@ -781,11 +829,12 @@ typedef struct _CONSOLE_API_MESSAGE CONSOLE_GETHANDLEINFO GetHandleInfoRequest; CONSOLE_SETHANDLEINFO SetHandleInfoRequest; - /* Cursor */ + /* Cursor & Mouse */ CONSOLE_SHOWCURSOR ShowCursorRequest; CONSOLE_SETCURSOR SetCursorRequest; CONSOLE_GETSETCURSORINFO CursorInfoRequest; CONSOLE_SETCURSORPOSITION SetCursorPositionRequest; + CONSOLE_GETMOUSEINFO GetMouseInfoRequest; /* Screen-buffer */ CONSOLE_CREATESCREENBUFFER CreateScreenBufferRequest; @@ -841,12 +890,14 @@ typedef struct _CONSOLE_API_MESSAGE CONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest; CONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest; CONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest; - CONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest; CONSOLE_GETSETHISTORYINFO HistoryInfoRequest; + CONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest; + CONSOLE_SETHISTORYMODE SetHistoryModeRequest; - /* Input and Output Code Pages */ + /* Input and Output Code Pages; keyboard */ CONSOLE_GETINPUTOUTPUTCP GetConsoleCPRequest; CONSOLE_SETINPUTOUTPUTCP SetConsoleCPRequest; + CONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest; } Data; } CONSOLE_API_MESSAGE, *PCONSOLE_API_MESSAGE; diff --git a/lib/pseh/i386/pseh3.c b/lib/pseh/i386/pseh3.c index b4856174135..9f2041528aa 100644 --- a/lib/pseh/i386/pseh3.c +++ b/lib/pseh/i386/pseh3.c @@ -82,8 +82,8 @@ _SEH3$_InvokeNestedFunctionFilter( /* Second call to get the filter result */ "mov $1, %%ecx\n\t" - "call *%[Filter]\n\t" - : "=a"(FilterResult) + "call *%[Filter]" + : "=a" (FilterResult) : [RegistrationFrame] "m" (RegistrationFrame), [Filter] "m" (Filter) : "ecx", "edx"); @@ -197,14 +197,14 @@ _SEH3$_JumpToTarget( { asm volatile ( /* Load the registers */ - "movl 20(%%ecx), %%esp\n" - "movl 24(%%ecx), %%ebp\n" + "movl 20(%%ecx), %%esp\n\t" + "movl 24(%%ecx), %%ebp\n\t" /* Stack pointer is 4 off from the call to __SEH3$_RegisterFrame */ - "addl $4, %%esp\n" + "addl $4, %%esp\n\t" /* Jump into the exception handler */ - "jmp *%[Target]\n" + "jmp *%[Target]" : : "c" (RegistrationFrame), "a" (RegistrationFrame->ScopeTable), @@ -215,14 +215,14 @@ _SEH3$_JumpToTarget( { asm volatile ( /* Load the registers */ - "movl 20(%%ecx), %%esp\n" - "movl 24(%%ecx), %%ebp\n" + "movl 20(%%ecx), %%esp\n\t" + "movl 24(%%ecx), %%ebp\n\t" /* Stack pointer is 4 off from the call to __SEH3$_RegisterFrame */ - "addl $4, %%esp\n" + "addl $4, %%esp\n\t" /* Jump into the exception handler */ - "jmp *%[Target]\n" + "jmp *%[Target]" : : "c" (RegistrationFrame), "a" (RegistrationFrame->ScopeTable), @@ -253,7 +253,7 @@ _SEH3$_except_handler( LONG FilterResult; /* Clear the direction flag. */ - asm volatile ("cld\n" : : : "memory"); + asm volatile ("cld" : : : "memory"); /* Save the exception pointers on the stack */ ExceptionPointers.ExceptionRecord = ExceptionRecord; diff --git a/ntoskrnl/CMakeLists.txt b/ntoskrnl/CMakeLists.txt index 5d3432d3980..4d4f3fe254a 100644 --- a/ntoskrnl/CMakeLists.txt +++ b/ntoskrnl/CMakeLists.txt @@ -33,11 +33,6 @@ else() set_image_base(ntoskrnl 0x80800000) endif() -# Linker bug -if(NOT MSVC AND LTCG) - add_target_link_flags(ntoskrnl "-shared") -endif() - target_link_libraries(ntoskrnl cportlib csq diff --git a/ntoskrnl/config/i386/cmhardwr.c b/ntoskrnl/config/i386/cmhardwr.c index cb8d7e8938d..5d967e1a450 100644 --- a/ntoskrnl/config/i386/cmhardwr.c +++ b/ntoskrnl/config/i386/cmhardwr.c @@ -226,6 +226,97 @@ Match: return TRUE; } +VOID +NTAPI +CmpGetIntelBrandString(OUT PCHAR CpuString) +{ + ULONG BrandId, Ebx, Signature, Dummy; + + /* Get the Brand Id */ + CPUID(0x00000001, &Signature, &Ebx, &Dummy, &Dummy); + BrandId = Ebx & 0xFF; + + switch (BrandId) + { + case 0x01: + strcpy(CpuString, "Intel(R) Celeron(R) processor"); + break; + case 0x02: + case 0x04: + strcpy(CpuString, "Intel(R) Pentium(R) III processor"); + break; + case 0x03: + if(Signature == 0x000006B1) + strcpy(CpuString, "Intel(R) Celeron(R) processor"); + else + strcpy(CpuString, "Intel(R) Pentium(R) III Xeon(R) processor"); + break; + case 0x06: + strcpy(CpuString, "Mobile Intel(R) Pentium(R) III Processor-M"); + break; + case 0x08: + if(Signature >= 0x00000F13) + strcpy(CpuString, "Intel(R) Genuine Processor"); + else + strcpy(CpuString, "Intel(R) Pentium(R) 4 processor"); + break; + case 0x09: + strcpy(CpuString, "Intel(R) Pentium(R) 4 processor"); + break; + case 0x0B: + if(Signature >= 0x00000F13) + strcpy(CpuString, "Intel(R) Xeon(R) processor"); + else + strcpy(CpuString, "Intel(R) Xeon(R) processor MP"); + break; + case 0x0C: + strcpy(CpuString, "Intel(R) Xeon(R) processor MP"); + break; + case 0x0E: + if(Signature >= 0x00000F13) + strcpy(CpuString, "Mobile Intel(R) Pentium(R) 4 processor-M"); + else + strcpy(CpuString, "Intel(R) Xeon(R) processor"); + break; + case 0x12: + strcpy(CpuString, "Intel(R) Celeron(R) M processor"); + break; + case 0x07: + case 0x0F: + case 0x13: + case 0x17: + strcpy(CpuString, "Mobile Intel(R) Celeron(R) processor"); + break; + case 0x0A: + case 0x14: + strcpy(CpuString, "Intel(R) Celeron(R) Processor"); + break; + case 0x15: + strcpy(CpuString, "Mobile Genuine Intel(R) Processor"); + break; + case 0x16: + strcpy(CpuString, "Intel(R) Pentium(R) M processor"); + break; + default: + strcpy(CpuString, "Unknown Intel processor"); + } +} + +VOID +NTAPI +CmpGetVendorString(IN PKPRCB Prcb, OUT PCHAR CpuString) +{ + /* Check if we have a Vendor String */ + if (Prcb->VendorString[0]) + { + strcpy(CpuString, Prcb->VendorString); + } + else + { + strcpy(CpuString, "Unknown x86 processor"); + } +} + NTSTATUS NTAPI CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBlock) @@ -238,7 +329,7 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc HANDLE KeyHandle, BiosHandle, SystemHandle, FpuHandle, SectionHandle; CONFIGURATION_COMPONENT_DATA ConfigData; CHAR Buffer[128]; - ULONG ExtendedId, Dummy; + ULONG VendorId, ExtendedId, Dummy; PKPRCB Prcb; USHORT IndexTable[MaximumType + 1] = {0}; ANSI_STRING TempString; @@ -424,6 +515,8 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc if (!Prcb->CpuID) { /* Uh oh, no CPUID! */ + PartialString = CpuString; + CmpGetVendorString(Prcb, PartialString); } else { @@ -449,6 +542,23 @@ CmpInitializeMachineDependentConfiguration(IN PLOADER_PARAMETER_BLOCK LoaderBloc /* Null-terminate it */ CpuString[47] = ANSI_NULL; } + else + { + CPUID(0x00000000, &Dummy, &VendorId, &Dummy, &Dummy); + PartialString = CpuString; + switch (VendorId) + { + case 'uneG': /* Intel */ + CmpGetIntelBrandString(PartialString); + break; + case 'htuA': /* AMD */ + /* FIXME */ + CmpGetVendorString(Prcb, PartialString); + break; + default: + CmpGetVendorString(Prcb, PartialString); + } + } } /* Go back to user affinity */ diff --git a/ntoskrnl/include/internal/i386/ke.h b/ntoskrnl/include/internal/i386/ke.h index d6d3906b94c..64d876d864b 100644 --- a/ntoskrnl/include/internal/i386/ke.h +++ b/ntoskrnl/include/internal/i386/ke.h @@ -687,13 +687,13 @@ KiSystemCallTrampoline(IN PVOID Handler, __asm__ __volatile__ ( - "subl %1, %%esp\n" - "movl %%esp, %%edi\n" - "movl %2, %%esi\n" - "shrl $2, %1\n" - "rep movsd\n" - "call *%3\n" - "movl %%eax, %0\n" + "subl %1, %%esp\n\t" + "movl %%esp, %%edi\n\t" + "movl %2, %%esi\n\t" + "shrl $2, %1\n\t" + "rep movsd\n\t" + "call *%3\n\t" + "movl %%eax, %0" : "=r"(Result) : "c"(StackBytes), "d"(Arguments), @@ -772,6 +772,7 @@ FORCEINLINE NTSTATUS KiConvertToGuiThread(VOID) { + NTSTATUS NTAPI PsConvertToGuiThread(VOID); NTSTATUS Result; PVOID StackFrame; @@ -799,7 +800,7 @@ KiConvertToGuiThread(VOID) "addl %%esp, %1\n\t" "movl %1, %%ebp" : "=a"(Result), "=r"(StackFrame) - : + : "p"(PsConvertToGuiThread) : "%esp", "%ecx", "%edx", "memory" ); return Result; @@ -819,22 +820,24 @@ FORCEINLINE VOID KiSwitchToBootStack(IN ULONG_PTR InitialStack) { + VOID NTAPI KiSystemStartupBootStack(VOID); + /* We have to switch to a new stack before continuing kernel initialization */ #ifdef __GNUC__ __asm__ ( - "movl %0, %%esp\n" - "subl %1, %%esp\n" - "pushl %2\n" - "jmp _KiSystemStartupBootStack@0\n" + "movl %0, %%esp\n\t" + "subl %1, %%esp\n\t" + "pushl %2\n\t" + "jmp _KiSystemStartupBootStack@0" : : "c"(InitialStack), "i"(NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH), - "i"(CR0_EM | CR0_TS | CR0_MP) + "i"(CR0_EM | CR0_TS | CR0_MP), + "p"(KiSystemStartupBootStack) : "%esp" ); #elif defined(_MSC_VER) - VOID NTAPI KiSystemStartupBootStack(VOID); __asm { mov esp, InitialStack @@ -858,7 +861,7 @@ KiIret(VOID) #if defined(__GNUC__) __asm__ __volatile__ ( - "iret\n" + "iret" ); #elif defined(_MSC_VER) __asm diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index af0d03d464d..bbf148ddc7a 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -648,6 +648,13 @@ VOID NTAPI MmShowOutOfSpaceMessagePagingFile(VOID); +NTSTATUS +NTAPI +MiReadPageFile( + _In_ PFN_NUMBER Page, + _In_ ULONG PageFileIndex, + _In_ ULONG_PTR PageFileOffset); + /* process.c ****************************************************************/ NTSTATUS diff --git a/ntoskrnl/io/iomgr/iofunc.c b/ntoskrnl/io/iomgr/iofunc.c index e2830022c5b..c7c62abb196 100644 --- a/ntoskrnl/io/iomgr/iofunc.c +++ b/ntoskrnl/io/iomgr/iofunc.c @@ -2350,6 +2350,8 @@ NtReadFile(IN HANDLE FileHandle, { /* Allocate an MDL */ Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); + if (!Mdl) + ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES); MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -3269,6 +3271,8 @@ NtWriteFile(IN HANDLE FileHandle, { /* Allocate an MDL */ Mdl = IoAllocateMdl(Buffer, Length, FALSE, TRUE, Irp); + if (!Mdl) + ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES); MmProbeAndLockPages(Mdl, PreviousMode, IoReadAccess); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h index 6e803aeb7d0..8a842e5ef08 100644 --- a/ntoskrnl/mm/ARM3/miarm.h +++ b/ntoskrnl/mm/ARM3/miarm.h @@ -2274,6 +2274,12 @@ MiLocateSubsection( IN ULONG_PTR Vpn ); +VOID +NTAPI +MiDeleteARM3Section( + PVOID ObjectBody +); + NTSTATUS NTAPI MiQueryMemorySectionName( diff --git a/ntoskrnl/mm/ARM3/pagfault.c b/ntoskrnl/mm/ARM3/pagfault.c index 0236bbf1655..df4dbebe248 100644 --- a/ntoskrnl/mm/ARM3/pagfault.c +++ b/ntoskrnl/mm/ARM3/pagfault.c @@ -808,6 +808,96 @@ MiCompleteProtoPteFault(IN BOOLEAN StoreInstruction, return STATUS_SUCCESS; } +NTSTATUS +NTAPI +MiResolvePageFileFault(_In_ BOOLEAN StoreInstruction, + _In_ PVOID FaultingAddress, + _In_ PMMPTE PointerPte, + _In_ PEPROCESS CurrentProcess, + _Inout_ KIRQL *OldIrql) +{ + ULONG Color; + PFN_NUMBER Page; + NTSTATUS Status; + MMPTE TempPte = *PointerPte; + KEVENT Event; + PMMPFN Pfn1; + ULONG PageFileIndex = TempPte.u.Soft.PageFileLow; + ULONG_PTR PageFileOffset = TempPte.u.Soft.PageFileHigh; + + /* Things we don't support yet */ + ASSERT(CurrentProcess > HYDRA_PROCESS); + ASSERT(*OldIrql != MM_NOIRQL); + + /* We must hold the PFN lock */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Some sanity checks */ + ASSERT(TempPte.u.Hard.Valid == 0); + ASSERT(TempPte.u.Soft.PageFileHigh != 0); + ASSERT(TempPte.u.Soft.PageFileHigh != MI_PTE_LOOKUP_NEEDED); + + /* Get any page, it will be overwritten */ + Color = MI_GET_NEXT_PROCESS_COLOR(CurrentProcess); + Page = MiRemoveAnyPage(Color); + + /* Initialize this PFN */ + MiInitializePfn(Page, PointerPte, StoreInstruction); + + /* Sets the PFN as being in IO operation */ + Pfn1 = MI_PFN_ELEMENT(Page); + ASSERT(Pfn1->u1.Event == NULL); + ASSERT(Pfn1->u3.e1.ReadInProgress == 0); + ASSERT(Pfn1->u3.e1.WriteInProgress == 0); + + KeInitializeEvent(&Event, NotificationEvent, FALSE); + Pfn1->u1.Event = &Event; + Pfn1->u3.e1.ReadInProgress = 1; + + /* We must write the PTE now as the PFN lock will be released while performing the IO operation */ + TempPte.u.Soft.Transition = 1; + TempPte.u.Soft.PageFileLow = 0; + TempPte.u.Soft.Prototype = 0; + TempPte.u.Trans.PageFrameNumber = Page; + + MI_WRITE_INVALID_PTE(PointerPte, TempPte); + + /* Release the PFN lock while we proceed */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, *OldIrql); + + /* Do the paging IO */ + Status = MiReadPageFile(Page, PageFileIndex, PageFileOffset); + + /* Lock the PFN database again */ + *OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Nobody should have changed that while we were not looking */ + ASSERT(Pfn1->u1.Event == &Event); + ASSERT(Pfn1->u3.e1.ReadInProgress == 1); + ASSERT(Pfn1->u3.e1.WriteInProgress == 0); + + if (!NT_SUCCESS(Status)) + { + /* Malheur! */ + ASSERT(FALSE); + Pfn1->u4.InPageError = 1; + Pfn1->u1.ReadStatus = Status; + } + + /* This is now a nice and normal PFN */ + Pfn1->u1.Event = NULL; + Pfn1->u3.e1.ReadInProgress = 0; + + /* And the PTE can finally be valid */ + MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, TempPte.u.Trans.Protection, Page); + MI_WRITE_VALID_PTE(PointerPte, TempPte); + + /* Waiters gonna wait */ + KeSetEvent(&Event, IO_NO_INCREMENT, FALSE); + + return Status; +} + NTSTATUS NTAPI MiResolveTransitionFault(IN PVOID FaultingAddress, @@ -846,8 +936,19 @@ MiResolveTransitionFault(IN PVOID FaultingAddress, /* This is from ARM3 -- Windows normally handles this here */ ASSERT(Pfn1->u4.InPageError == 0); - /* Not supported in ARM3 */ - ASSERT(Pfn1->u3.e1.ReadInProgress == 0); + /* See if we should wait before terminating the fault */ + if (Pfn1->u3.e1.ReadInProgress == 1) + { + DPRINT1("The page is currently being read!\n"); + ASSERT(Pfn1->u1.Event != NULL); + *InPageBlock = Pfn1->u1.Event; + if (PointerPte == Pfn1->PteAddress) + { + DPRINT1("And this if for this particular PTE.\n"); + /* The PTE will be made valid by the thread serving the fault */ + return STATUS_SUCCESS; // FIXME: Maybe something more descriptive + } + } /* Windows checks there's some free pages and this isn't an in-page error */ ASSERT(MmAvailablePages > 0); @@ -1325,6 +1426,30 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, /* And now release the lock and leave*/ KeReleaseQueuedSpinLock(LockQueuePfnLock, LockIrql); + if (InPageBlock != NULL) + { + /* The page is being paged in by another process */ + KeWaitForSingleObject(InPageBlock, WrPageIn, KernelMode, FALSE, NULL); + } + + ASSERT(OldIrql == KeGetCurrentIrql()); + ASSERT(OldIrql <= APC_LEVEL); + ASSERT(KeAreAllApcsDisabled() == TRUE); + return Status; + } + + /* Should we page the data back in ? */ + if (TempPte.u.Soft.PageFileHigh != 0) + { + /* Lock the PFN database */ + LockIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Resolve */ + Status = MiResolvePageFileFault(StoreInstruction, Address, PointerPte, Process, &LockIrql); + + /* And now release the lock and leave*/ + KeReleaseQueuedSpinLock(LockQueuePfnLock, LockIrql); + ASSERT(OldIrql == KeGetCurrentIrql()); ASSERT(OldIrql <= APC_LEVEL); ASSERT(KeAreAllApcsDisabled() == TRUE); @@ -1333,19 +1458,14 @@ MiDispatchFault(IN BOOLEAN StoreInstruction, // // The PTE must be invalid but not completely empty. It must also not be a - // prototype or transition PTE as those scenarii should've been handled above. + // prototype a transition or a paged-out PTE as those scenarii should've been handled above. // These are all Windows checks // ASSERT(TempPte.u.Hard.Valid == 0); ASSERT(TempPte.u.Soft.Prototype == 0); ASSERT(TempPte.u.Soft.Transition == 0); - ASSERT(TempPte.u.Long != 0); - - // - // No page file software PTEs in ARM3 yet, so this must be a - // demand zero page. This is a ReactOS check. - // ASSERT(TempPte.u.Soft.PageFileHigh == 0); + ASSERT(TempPte.u.Long != 0); // // If we got this far, the PTE can only be a demand zero PTE, which is what diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c index 12b33cec0e7..9c4d3f5bb17 100644 --- a/ntoskrnl/mm/ARM3/pfnlist.c +++ b/ntoskrnl/mm/ARM3/pfnlist.c @@ -338,10 +338,11 @@ MiUnlinkPageFromList(IN PMMPFN Pfn) /* We are not on a list anymore */ Pfn->u1.Flink = Pfn->u2.Blink = 0; - ASSERT_LIST_INVARIANT(ListHead); /* Remove one entry from the list */ ListHead->Total--; + + ASSERT_LIST_INVARIANT(ListHead); } PFN_NUMBER @@ -1234,6 +1235,9 @@ MiDecrementShareCount(IN PMMPFN Pfn1, 0); } + /* Page should at least have one reference */ + ASSERT(Pfn1->u3.e2.ReferenceCount != 0); + /* Check if the share count is now 0 */ ASSERT(Pfn1->u2.ShareCount < 0xF000000); if (!--Pfn1->u2.ShareCount) @@ -1257,7 +1261,7 @@ MiDecrementShareCount(IN PMMPFN Pfn1, TempPte.u.Soft.Prototype = 0; TempPte.u.Soft.Protection = Pfn1->OriginalPte.u.Soft.Protection; MI_WRITE_INVALID_PTE(PointerPte, TempPte); - DPRINT("Marking PTE: %p as transition (%p - %lx)\n", PointerPte, Pfn1, MiGetPfnEntryIndex(Pfn1)); + DPRINT1("Marking PTE: %p as transition (%p - %lx)\n", PointerPte, Pfn1, MiGetPfnEntryIndex(Pfn1)); } /* Put the page in transition */ @@ -1266,8 +1270,6 @@ MiDecrementShareCount(IN PMMPFN Pfn1, /* PFN lock must be held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - /* Page should at least have one reference */ - ASSERT(Pfn1->u3.e2.ReferenceCount != 0); if (Pfn1->u3.e2.ReferenceCount == 1) { /* Is there still a PFN for this page? */ diff --git a/ntoskrnl/mm/ARM3/section.c b/ntoskrnl/mm/ARM3/section.c index f8ae660db29..f3063d0c389 100644 --- a/ntoskrnl/mm/ARM3/section.c +++ b/ntoskrnl/mm/ARM3/section.c @@ -608,6 +608,8 @@ MiSegmentDelete(IN PSEGMENT Segment) SEGMENT_FLAGS SegmentFlags; PSUBSECTION Subsection; PMMPTE PointerPte, LastPte, PteForProto; + PMMPFN Pfn1; + PFN_NUMBER PageFrameIndex; MMPTE TempPte; KIRQL OldIrql; @@ -621,7 +623,7 @@ MiSegmentDelete(IN PSEGMENT Segment) /* These things are not supported yet */ ASSERT(ControlArea->DereferenceList.Flink == NULL); - ASSERT(!(ControlArea->u.Flags.Image) & !(ControlArea->u.Flags.File)); + ASSERT(!(ControlArea->u.Flags.Image) && !(ControlArea->u.Flags.File)); ASSERT(ControlArea->u.Flags.GlobalOnlyPerSession == 0); ASSERT(ControlArea->u.Flags.Rom == 0); @@ -661,7 +663,52 @@ MiSegmentDelete(IN PSEGMENT Segment) TempPte = *PointerPte; ASSERT(SegmentFlags.LargePages == 0); ASSERT(TempPte.u.Hard.Valid == 0); - ASSERT(TempPte.u.Soft.Prototype == 1); + + /* See if we should clean things up */ + if (!(ControlArea->u.Flags.Image) && !(ControlArea->u.Flags.File)) + { + /* + * This is a section backed by the pagefile. Now that it doesn't exist anymore, + * we can give everything back to the system. + */ + ASSERT(TempPte.u.Soft.Prototype == 0); + + if (TempPte.u.Soft.Transition == 1) + { + /* We can give the page back for other use */ + DPRINT1("Releasing page for transition PTE %p\n", PointerPte); + PageFrameIndex = PFN_FROM_PTE(&TempPte); + Pfn1 = MI_PFN_ELEMENT(PageFrameIndex); + + /* As this is a paged-backed section, nobody should reference it anymore (no cache or whatever) */ + ASSERT(Pfn1->u3.ReferenceCount == 0); + + /* And it should be in standby or modified list */ + ASSERT((Pfn1->u3.e1.PageLocation == ModifiedPageList) || (Pfn1->u3.e1.PageLocation == StandbyPageList)); + + /* Unlink it and put it back in free list */ + MiUnlinkPageFromList(Pfn1); + + /* Temporarily mark this as active and make it free again */ + Pfn1->u3.e1.PageLocation = ActiveAndValid; + MI_SET_PFN_DELETED(Pfn1); + + MiInsertPageInFreeList(PageFrameIndex); + } + else if (TempPte.u.Soft.PageFileHigh != 0) + { + /* Should not happen for now */ + ASSERT(FALSE); + } + } + else + { + /* unsupported for now */ + ASSERT(FALSE); + + /* File-backed section must have prototype PTEs */ + ASSERT(TempPte.u.Soft.Prototype == 1); + } /* Zero the PTE and keep going */ PointerPte->u.Long = 0; @@ -3050,6 +3097,34 @@ MmCommitSessionMappedView(IN PVOID MappedBase, return STATUS_SUCCESS; } +VOID +NTAPI +MiDeleteARM3Section(PVOID ObjectBody) +{ + PSECTION SectionObject; + PCONTROL_AREA ControlArea; + KIRQL OldIrql; + + SectionObject = (PSECTION)ObjectBody; + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + ASSERT(SectionObject->Segment); + ASSERT(SectionObject->Segment->ControlArea); + + ControlArea = SectionObject->Segment->ControlArea; + + /* Dereference */ + ControlArea->NumberOfSectionReferences--; + ControlArea->NumberOfUserReferences--; + + ASSERT(ControlArea->u.Flags.BeingDeleted == 0); + + /* Check it. It will delete it if there is no more reference to it */ + MiCheckControlArea(ControlArea, OldIrql); +} + /* SYSTEM CALLS ***************************************************************/ NTSTATUS diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c index 97d76011596..932e1d04ac2 100644 --- a/ntoskrnl/mm/ARM3/virtual.c +++ b/ntoskrnl/mm/ARM3/virtual.c @@ -423,10 +423,18 @@ MiDeletePte(IN PMMPTE PointerPte, /* Drop the reference on the page table. */ MiDecrementShareCount(MiGetPfnEntry(Pfn1->u4.PteFrame), Pfn1->u4.PteFrame); + ASSERT(Pfn1->u3.e1.PrototypePte == 0); + + /* Make the page free. For prototypes, it will be made free when deleting the section object */ if (Pfn1->u2.ShareCount == 0) { NT_ASSERT(Pfn1->u3.e2.ReferenceCount == 0); - /* Mark the page temporarily as valid, we're going to make it free soon */ + + /* And it should be in standby or modified list */ + ASSERT((Pfn1->u3.e1.PageLocation == ModifiedPageList) || (Pfn1->u3.e1.PageLocation == StandbyPageList)); + + /* Unlink it and put it back in free list */ + MiUnlinkPageFromList(Pfn1); Pfn1->u3.e1.PageLocation = ActiveAndValid; /* Bring it back into the free list */ diff --git a/ntoskrnl/mm/balance.c b/ntoskrnl/mm/balance.c index 804c674763e..3296b223ef1 100644 --- a/ntoskrnl/mm/balance.c +++ b/ntoskrnl/mm/balance.c @@ -355,6 +355,7 @@ MmRequestPageMemoryConsumer(ULONG Consumer, BOOLEAN CanWait, return(STATUS_SUCCESS); } + VOID NTAPI MiBalancerThread(PVOID Unused) { diff --git a/ntoskrnl/mm/pagefile.c b/ntoskrnl/mm/pagefile.c index f534a66e1df..a1ffb08cc22 100644 --- a/ntoskrnl/mm/pagefile.c +++ b/ntoskrnl/mm/pagefile.c @@ -48,8 +48,8 @@ typedef struct _PAGINGFILE PFILE_OBJECT FileObject; LARGE_INTEGER MaximumSize; LARGE_INTEGER CurrentSize; - ULONG FreePages; - ULONG UsedPages; + PFN_NUMBER FreePages; + PFN_NUMBER UsedPages; PULONG AllocMap; KSPIN_LOCK AllocMapLock; ULONG AllocMapSize; @@ -68,7 +68,7 @@ RETRIEVEL_DESCRIPTOR_LIST, *PRETRIEVEL_DESCRIPTOR_LIST; #define PAIRS_PER_RUN (1024) -#define MAX_PAGING_FILES (32) +#define MAX_PAGING_FILES (16) /* List of paging files, both used and free */ static PPAGINGFILE PagingFileList[MAX_PAGING_FILES]; @@ -77,7 +77,6 @@ static PPAGINGFILE PagingFileList[MAX_PAGING_FILES]; static KSPIN_LOCK PagingFileListLock; /* Number of paging files */ -static ULONG MiPagingFileCount; ULONG MmNumberOfPagingFiles; /* Number of pages that are available for swapping */ @@ -140,7 +139,7 @@ MmIsFileObjectAPagingFile(PFILE_OBJECT FileObject) ULONG i; /* Loop through all the paging files */ - for (i = 0; i < MiPagingFileCount; i++) + for (i = 0; i < MmNumberOfPagingFiles; i++) { /* Check if this is one of them */ if (PagingFileList[i]->FileObject == FileObject) return TRUE; @@ -275,34 +274,44 @@ MmWriteToSwapPage(SWAPENTRY SwapEntry, PFN_NUMBER Page) return(Status); } + NTSTATUS NTAPI MmReadFromSwapPage(SWAPENTRY SwapEntry, PFN_NUMBER Page) { - ULONG i; - ULONG_PTR offset; + return MiReadPageFile(Page, FILE_FROM_ENTRY(SwapEntry), OFFSET_FROM_ENTRY(SwapEntry)); +} + +NTSTATUS +NTAPI +MiReadPageFile( + _In_ PFN_NUMBER Page, + _In_ ULONG PageFileIndex, + _In_ ULONG_PTR PageFileOffset) +{ LARGE_INTEGER file_offset; IO_STATUS_BLOCK Iosb; NTSTATUS Status; KEVENT Event; UCHAR MdlBase[sizeof(MDL) + sizeof(ULONG)]; PMDL Mdl = (PMDL)MdlBase; + PPAGINGFILE PagingFile; - DPRINT("MmReadFromSwapPage\n"); + DPRINT("MiReadSwapFile\n"); - if (SwapEntry == 0) + if (PageFileOffset == 0) { KeBugCheck(MEMORY_MANAGEMENT); return(STATUS_UNSUCCESSFUL); } - i = FILE_FROM_ENTRY(SwapEntry); - offset = OFFSET_FROM_ENTRY(SwapEntry); + ASSERT(PageFileIndex < MAX_PAGING_FILES); - if (PagingFileList[i]->FileObject == NULL || - PagingFileList[i]->FileObject->DeviceObject == NULL) + PagingFile = PagingFileList[PageFileIndex]; + + if (PagingFile->FileObject == NULL || PagingFile->FileObject->DeviceObject == NULL) { - DPRINT1("Bad paging file 0x%.8X\n", SwapEntry); + DPRINT1("Bad paging file %u\n", PageFileIndex); KeBugCheck(MEMORY_MANAGEMENT); } @@ -310,11 +319,11 @@ MmReadFromSwapPage(SWAPENTRY SwapEntry, PFN_NUMBER Page) MmBuildMdlFromPages(Mdl, &Page); Mdl->MdlFlags |= MDL_PAGES_LOCKED; - file_offset.QuadPart = offset * PAGE_SIZE; - file_offset = MmGetOffsetPageFile(PagingFileList[i]->RetrievalPointers, file_offset); + file_offset.QuadPart = PageFileOffset * PAGE_SIZE; + file_offset = MmGetOffsetPageFile(PagingFile->RetrievalPointers, file_offset); KeInitializeEvent(&Event, NotificationEvent, FALSE); - Status = IoPageRead(PagingFileList[i]->FileObject, + Status = IoPageRead(PagingFile->FileObject, Mdl, &file_offset, &Event, @@ -348,7 +357,7 @@ MmInitPagingFile(VOID) { PagingFileList[i] = NULL; } - MiPagingFileCount = 0; + MmNumberOfPagingFiles = 0; } static ULONG @@ -498,7 +507,7 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, DPRINT("NtCreatePagingFile(FileName %wZ, InitialSize %I64d)\n", FileName, InitialSize->QuadPart); - if (MiPagingFileCount >= MAX_PAGING_FILES) + if (MmNumberOfPagingFiles >= MAX_PAGING_FILES) { return(STATUS_TOO_MANY_PAGING_FILES); } @@ -800,7 +809,7 @@ NtCreatePagingFile(IN PUNICODE_STRING FileName, } } MiFreeSwapPages = MiFreeSwapPages + PagingFile->FreePages; - MiPagingFileCount++; + MmNumberOfPagingFiles++; KeReleaseSpinLock(&PagingFileListLock, oldIrql); ZwClose(FileHandle); diff --git a/ntoskrnl/mm/section.c b/ntoskrnl/mm/section.c index e30cc2a0f86..7875c7a51cd 100644 --- a/ntoskrnl/mm/section.c +++ b/ntoskrnl/mm/section.c @@ -2624,6 +2624,13 @@ MmpDeleteSection(PVOID ObjectBody) { PROS_SECTION_OBJECT Section = (PROS_SECTION_OBJECT)ObjectBody; + /* Check if it's an ARM3, or ReactOS section */ + if (!MiIsRosSectionObject(Section)) + { + MiDeleteARM3Section(ObjectBody); + return; + } + DPRINT("MmpDeleteSection(ObjectBody %p)\n", ObjectBody); if (Section->AllocationAttributes & SEC_IMAGE) { diff --git a/ntoskrnl/ntkrnlmp/CMakeLists.txt b/ntoskrnl/ntkrnlmp/CMakeLists.txt index f162c6f07ce..f70ea2e5dd2 100644 --- a/ntoskrnl/ntkrnlmp/CMakeLists.txt +++ b/ntoskrnl/ntkrnlmp/CMakeLists.txt @@ -30,11 +30,6 @@ else() set_image_base(ntkrnlmp 0x80800000) endif() -# Linker bug -if(NOT MSVC AND LTCG) - add_target_link_flags(ntkrnlmp "-shared") -endif() - target_link_libraries(ntkrnlmp cportlib csq diff --git a/ntoskrnl/ob/oblife.c b/ntoskrnl/ob/oblife.c index 0a5324d6d99..1edc2ff0908 100644 --- a/ntoskrnl/ob/oblife.c +++ b/ntoskrnl/ob/oblife.c @@ -1145,7 +1145,7 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName, /* Set the key and free the converted name */ LocalObjectType->Key = *(PULONG)AnsiName.Buffer; - ExFreePool(AnsiName.Buffer); + RtlFreeAnsiString(&AnsiName); } else { @@ -1227,12 +1227,19 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName, InitializeListHead(&LocalObjectType->TypeList); /* Lock the object type */ - ObpEnterObjectTypeMutex(LocalObjectType); + ObpEnterObjectTypeMutex(ObpTypeObjectType); /* Get creator info and insert it into the type list */ CreatorInfo = OBJECT_HEADER_TO_CREATOR_INFO(Header); - if (CreatorInfo) InsertTailList(&ObpTypeObjectType->TypeList, - &CreatorInfo->TypeList); + if (CreatorInfo) + { + InsertTailList(&ObpTypeObjectType->TypeList, + &CreatorInfo->TypeList); + + /* CORE-8423: Avoid inserting this a second time if someone creates a + * handle to the object type (bug in Windows 2003) */ + Header->Flags &= ~OB_FLAG_CREATE_INFO; + } /* Set the index and the entry into the object type array */ LocalObjectType->Index = ObpTypeObjectType->TotalNumberOfObjects; @@ -1246,7 +1253,7 @@ ObCreateObjectType(IN PUNICODE_STRING TypeName, } /* Release the object type */ - ObpLeaveObjectTypeMutex(LocalObjectType); + ObpLeaveObjectTypeMutex(ObpTypeObjectType); /* Check if we're actually creating the directory object itself */ if (!(ObpTypeDirectoryObject) || diff --git a/subsystems/ntvdm/CMakeLists.txt b/subsystems/ntvdm/CMakeLists.txt index 2ee9f55eaad..7f480dc8f82 100644 --- a/subsystems/ntvdm/CMakeLists.txt +++ b/subsystems/ntvdm/CMakeLists.txt @@ -19,6 +19,7 @@ list(APPEND SOURCE hardware/speaker.c hardware/timer.c hardware/vga.c + hardware/mouse.c dos/dos32krnl/bios.c dos/dos32krnl/dos.c dos/dos32krnl/dosfiles.c diff --git a/subsystems/ntvdm/hardware/mouse.c b/subsystems/ntvdm/hardware/mouse.c new file mode 100644 index 00000000000..63399d90cce --- /dev/null +++ b/subsystems/ntvdm/hardware/mouse.c @@ -0,0 +1,329 @@ +/* + * COPYRIGHT: GPL - See COPYING in the top level directory + * PROJECT: ReactOS Virtual DOS Machine + * FILE: mouse.c + * PURPOSE: Mouse emulation + * PROGRAMMERS: Aleksandar Andrejevic + */ + +/* INCLUDES *******************************************************************/ + +#define NDEBUG + +#include "mouse.h" +#include "ps2.h" + +/* PRIVATE VARIABLES **********************************************************/ + +static MOUSE_MODE Mode, PreviousMode; +static COORD Position; +static ULONG WidthMm, HeightMm, WidthPixels, HeightPixels; +static ULONG SampleRate; +static ULONG Resolution; +static BOOLEAN Scaling; +static BOOLEAN Reporting; +static BYTE MouseId; +static ULONG ButtonState; +static SHORT HorzCounter; +static SHORT VertCounter; +static CHAR ScrollCounter; + +/* PRIVATE FUNCTIONS **********************************************************/ + +static VOID MouseResetConfig(VOID) +{ + /* Reset the configuration to defaults */ + SampleRate = 100; + Resolution = 4; + Scaling = FALSE; + Reporting = FALSE; +} + +static VOID MouseResetCounters(VOID) +{ + /* Reset all flags and counters */ + ButtonState = HorzCounter = VertCounter = ScrollCounter = 0; +} + +static VOID MouseReset(VOID) +{ + /* Reset everything */ + MouseResetConfig(); + MouseResetCounters(); + + /* Enter streaming mode and the reset the mouse ID */ + Mode = MOUSE_STREAMING_MODE; + MouseId = 0; + + /* Send the Basic Assurance Test success code and the device ID */ + KeyboardQueuePush(MOUSE_BAT_SUCCESS); + KeyboardQueuePush(MouseId); +} + +#if 0 +static VOID MouseGetPacket(PMOUSE_PACKET Packet) +{ + /* Clear the packet */ + ZeroMemory(Packet, sizeof(MOUSE_PACKET)); + + Packet->Flags |= MOUSE_ALWAYS_SET; + + /* Check for horizontal overflows */ + if ((HorzCounter < MOUSE_MIN) || (HorzCounter > MOUSE_MAX)) + { + if (HorzCounter > MOUSE_MAX) HorzCounter = MOUSE_MAX; + if (HorzCounter < MOUSE_MIN) HorzCounter = MOUSE_MIN; + + Packet->Flags |= MOUSE_X_OVERFLOW; + } + + /* Check for vertical overflows */ + if ((VertCounter < MOUSE_MIN) || (VertCounter > MOUSE_MAX)) + { + if (VertCounter > MOUSE_MIN) VertCounter = MOUSE_MIN; + if (VertCounter < MOUSE_MIN) VertCounter = MOUSE_MIN; + + Packet->Flags |= MOUSE_Y_OVERFLOW; + } + + /* Set the sign flags */ + if (HorzCounter & MOUSE_SIGN_BIT) Packet->Flags |= MOUSE_X_SIGN; + if (HorzCounter & MOUSE_SIGN_BIT) Packet->Flags |= MOUSE_Y_SIGN; + + /* Set the button flags */ + if (ButtonState & FROM_LEFT_1ST_BUTTON_PRESSED) Packet->Flags |= MOUSE_LEFT_BUTTON; + if (ButtonState & FROM_LEFT_2ND_BUTTON_PRESSED) Packet->Flags |= MOUSE_MIDDLE_BUTTON; + if (ButtonState & RIGHTMOST_BUTTON_PRESSED) Packet->Flags |= MOUSE_RIGHT_BUTTON; + + if (MouseId == 4) + { + if (ButtonState & FROM_LEFT_3RD_BUTTON_PRESSED) Packet->Extra |= MOUSE_4TH_BUTTON; + if (ButtonState & FROM_LEFT_4TH_BUTTON_PRESSED) Packet->Extra |= MOUSE_5TH_BUTTON; + } + + if (MouseId >= 3) + { + /* Set the scroll counter */ + Packet->Extra |= (UCHAR)ScrollCounter & 0x0F; + } + + /* Store the counters in the packet */ + Packet->HorzCounter = LOBYTE(HorzCounter); + Packet->VertCounter = LOBYTE(VertCounter); + + /* Reset the counters */ + MouseResetCounters(); +} +#endif + +/* PUBLIC FUNCTIONS ***********************************************************/ + +VOID MouseUpdatePosition(PCOORD NewPosition) +{ + /* Update the counters */ + HorzCounter += ((NewPosition->X - Position.X) * WidthMm * Resolution) / WidthPixels; + VertCounter += ((NewPosition->Y - Position.Y) * HeightMm * Resolution) / HeightPixels; + + /* Update the position */ + Position = *NewPosition; +} + +VOID MouseUpdateButtons(ULONG NewButtonState) +{ + ButtonState = NewButtonState; +} + +VOID MouseScroll(LONG Direction) +{ + ScrollCounter += Direction; +} + +COORD MouseGetPosition(VOID) +{ + return Position; +} + +VOID MouseCommand(BYTE Command) +{ + switch (Command) + { + /* Set 1:1 Scaling */ + case 0xE6: + { + Scaling = FALSE; + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Set 2:1 Scaling */ + case 0xE7: + { + Scaling = TRUE; + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Set Resolution */ + case 0xE8: + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + break; + } + + /* Read Status */ + case 0xE9: + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + break; + } + + /* Enter Streaming Mode */ + case 0xEA: + { + MouseResetCounters(); + Mode = MOUSE_STREAMING_MODE; + + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Read Packet */ + case 0xEB: + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + break; + } + + /* Return From Wrap Mode */ + case 0xEC: + { + if (Mode == MOUSE_WRAP_MODE) + { + /* Restore the previous mode */ + MouseResetCounters(); + Mode = PreviousMode; + KeyboardQueuePush(MOUSE_ACK); + } + else KeyboardQueuePush(MOUSE_ERROR); + + break; + } + + /* Enter Wrap Mode */ + case 0xEE: + { + if (Mode != MOUSE_WRAP_MODE) + { + /* Save the previous mode */ + PreviousMode = Mode; + } + + MouseResetCounters(); + Mode = MOUSE_WRAP_MODE; + + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Enter Remote Mode */ + case 0xF0: + { + MouseResetCounters(); + Mode = MOUSE_REMOTE_MODE; + + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Get Mouse ID */ + case 0xF2: + { + KeyboardQueuePush(MOUSE_ACK); + KeyboardQueuePush(MouseId); + break; + } + + /* Set Sample Rate */ + case 0xF3: + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + break; + } + + /* Enable Reporting */ + case 0xF4: + { + Reporting = TRUE; + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Disable Reporting */ + case 0xF5: + { + Reporting = FALSE; + KeyboardQueuePush(MOUSE_ACK); + break; + } + + /* Set Defaults */ + case 0xF6: + { + /* Reset the configuration and counters */ + MouseResetConfig(); + MouseResetCounters(); + break; + } + + /* Resend */ + case 0xFE: + { + // TODO: NOT IMPLEMENTED + UNIMPLEMENTED; + break; + } + + /* Reset */ + case 0xFF: + { + MouseReset(); + break; + } + + /* Unknown command */ + default: + { + KeyboardQueuePush(MOUSE_ERROR); + } + } +} + +BOOLEAN MouseInit(VOID) +{ + HWND hWnd; + HDC hDC; + + /* Get the console window */ + hWnd = GetConsoleWindow(); + if (hWnd == NULL) return FALSE; + + /* Get the console window's device context */ + hDC = GetWindowDC(hWnd); + if (hDC == NULL) return FALSE; + + /* Get the parameters */ + WidthMm = (ULONG)GetDeviceCaps(hDC, HORZSIZE); + HeightMm = (ULONG)GetDeviceCaps(hDC, VERTSIZE); + WidthPixels = (ULONG)GetDeviceCaps(hDC, HORZRES); + HeightPixels = (ULONG)GetDeviceCaps(hDC, VERTRES); + + /* Release the device context */ + ReleaseDC(hWnd, hDC); + + MouseReset(); + return TRUE; +} diff --git a/subsystems/ntvdm/hardware/mouse.h b/subsystems/ntvdm/hardware/mouse.h new file mode 100644 index 00000000000..49136dca7d0 --- /dev/null +++ b/subsystems/ntvdm/hardware/mouse.h @@ -0,0 +1,78 @@ +/* + * COPYRIGHT: GPL - See COPYING in the top level directory + * PROJECT: ReactOS Virtual DOS Machine + * FILE: mouse.h + * PURPOSE: Mouse emulation + * PROGRAMMERS: Aleksandar Andrejevic + */ + +#ifndef _MOUSE_H_ +#define _MOUSE_H_ + +/* INCLUDES *******************************************************************/ + +#include "ntvdm.h" + +/* DEFINES ********************************************************************/ + +/* Mouse packet constants */ +#define MOUSE_MIN -256 +#define MOUSE_MAX 255 +#define MOUSE_SIGN_BIT (1 << 8) + +/* Mouse packet flags */ +#define MOUSE_LEFT_BUTTON (1 << 0) +#define MOUSE_RIGHT_BUTTON (1 << 1) +#define MOUSE_MIDDLE_BUTTON (1 << 2) +#define MOUSE_ALWAYS_SET (1 << 3) +#define MOUSE_X_SIGN (1 << 4) +#define MOUSE_Y_SIGN (1 << 5) +#define MOUSE_X_OVERFLOW (1 << 6) +#define MOUSE_Y_OVERFLOW (1 << 7) + +/* Mouse packet extra flags */ +#define MOUSE_4TH_BUTTON (1 << 4) +#define MOUSE_5TH_BUTTON (1 << 5) + +/* Command responses */ +#define MOUSE_BAT_SUCCESS 0xAA +#define MOUSE_ACK 0xFA +#define MOUSE_ERROR 0xFC + +/* + * Scrolling directions + * + * It may seem odd that the directions are implemented this way, but + * this is how it's done on real hardware. It works because the two + * scroll wheels can't be used at the same time. + */ +#define MOUSE_SCROLL_UP 1 +#define MOUSE_SCROLL_DOWN -1 +#define MOUSE_SCROLL_RIGHT 2 +#define MOUSE_SCROLL_LEFT -2 + +typedef enum _MOUSE_MODE +{ + MOUSE_STREAMING_MODE, + MOUSE_REMOTE_MODE, + MOUSE_WRAP_MODE, +} MOUSE_MODE, *PMOUSE_MODE; + +typedef struct _MOUSE_PACKET +{ + BYTE Flags; + BYTE HorzCounter; + BYTE VertCounter; + BYTE Extra; +} MOUSE_PACKET, *PMOUSE_PACKET; + +/* FUNCTIONS ******************************************************************/ + +VOID MouseUpdatePosition(PCOORD NewPosition); +VOID MouseUpdateButtons(ULONG NewButtonState); +VOID MouseScroll(LONG Direction); +COORD MouseGetPosition(VOID); +VOID MouseCommand(BYTE Command); +BOOLEAN MouseInit(VOID); + +#endif // _MOUSE_H_ diff --git a/subsystems/ntvdm/hardware/ps2.c b/subsystems/ntvdm/hardware/ps2.c index c98d32e76df..d2f27bba649 100644 --- a/subsystems/ntvdm/hardware/ps2.c +++ b/subsystems/ntvdm/hardware/ps2.c @@ -14,6 +14,7 @@ #include "io.h" #include "ps2.h" #include "pic.h" +#include "mouse.h" /* PRIVATE VARIABLES **********************************************************/ @@ -28,69 +29,6 @@ static HANDLE QueueMutex = NULL; /* PRIVATE FUNCTIONS **********************************************************/ -static BOOLEAN KeyboardQueuePush(BYTE ScanCode) -{ - BOOLEAN Result = TRUE; - - WaitForSingleObject(QueueMutex, INFINITE); - - /* Check if the keyboard queue is full */ - if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) - { - Result = FALSE; - goto Done; - } - - /* Insert the value in the queue */ - KeyboardQueue[KeyboardQueueEnd] = ScanCode; - KeyboardQueueEnd++; - KeyboardQueueEnd %= KEYBOARD_BUFFER_SIZE; - - /* Since we inserted a value, it's not empty anymore */ - KeyboardQueueEmpty = FALSE; - -Done: - ReleaseMutex(QueueMutex); - return Result; -} - -static BOOLEAN KeyboardQueuePop(BYTE *ScanCode) -{ - BOOLEAN Result = TRUE; - - /* Make sure the keyboard queue is not empty (fast check) */ - if (KeyboardQueueEmpty) return FALSE; - - WaitForSingleObject(QueueMutex, INFINITE); - - /* - * Recheck whether keyboard queue is not empty (it - * may have changed after having grabbed the mutex). - */ - if (KeyboardQueueEmpty) - { - Result = FALSE; - goto Done; - } - - /* Get the scan code */ - *ScanCode = KeyboardQueue[KeyboardQueueStart]; - - /* Remove the value from the queue */ - KeyboardQueueStart++; - KeyboardQueueStart %= KEYBOARD_BUFFER_SIZE; - - /* Check if the queue is now empty */ - if (KeyboardQueueStart == KeyboardQueueEnd) - { - KeyboardQueueEmpty = TRUE; - } - -Done: - ReleaseMutex(QueueMutex); - return Result; -} - static BYTE WINAPI PS2ReadPort(ULONG Port) { if (Port == PS2_CONTROL_PORT) @@ -156,14 +94,14 @@ static VOID WINAPI PS2WritePort(ULONG Port, BYTE Data) /* Disable mouse */ case 0xA7: { - // TODO: Mouse support + // TODO: Not implemented break; } /* Enable mouse */ case 0xA8: { - // TODO: Mouse support + // TODO: Not implemented break; } @@ -268,7 +206,7 @@ static VOID WINAPI PS2WritePort(ULONG Port, BYTE Data) case 0xD4: { - // TODO: Mouse support + MouseCommand(Data); break; } } @@ -282,6 +220,69 @@ static VOID WINAPI PS2WritePort(ULONG Port, BYTE Data) /* PUBLIC FUNCTIONS ***********************************************************/ +BOOLEAN KeyboardQueuePush(BYTE ScanCode) +{ + BOOLEAN Result = TRUE; + + WaitForSingleObject(QueueMutex, INFINITE); + + /* Check if the keyboard queue is full */ + if (!KeyboardQueueEmpty && (KeyboardQueueStart == KeyboardQueueEnd)) + { + Result = FALSE; + goto Done; + } + + /* Insert the value in the queue */ + KeyboardQueue[KeyboardQueueEnd] = ScanCode; + KeyboardQueueEnd++; + KeyboardQueueEnd %= KEYBOARD_BUFFER_SIZE; + + /* Since we inserted a value, it's not empty anymore */ + KeyboardQueueEmpty = FALSE; + +Done: + ReleaseMutex(QueueMutex); + return Result; +} + +BOOLEAN KeyboardQueuePop(BYTE *ScanCode) +{ + BOOLEAN Result = TRUE; + + /* Make sure the keyboard queue is not empty (fast check) */ + if (KeyboardQueueEmpty) return FALSE; + + WaitForSingleObject(QueueMutex, INFINITE); + + /* + * Recheck whether keyboard queue is not empty (it + * may have changed after having grabbed the mutex). + */ + if (KeyboardQueueEmpty) + { + Result = FALSE; + goto Done; + } + + /* Get the scan code */ + *ScanCode = KeyboardQueue[KeyboardQueueStart]; + + /* Remove the value from the queue */ + KeyboardQueueStart++; + KeyboardQueueStart %= KEYBOARD_BUFFER_SIZE; + + /* Check if the queue is now empty */ + if (KeyboardQueueStart == KeyboardQueueEnd) + { + KeyboardQueueEmpty = TRUE; + } + +Done: + ReleaseMutex(QueueMutex); + return Result; +} + VOID PS2Dispatch(PINPUT_RECORD InputRecord) { /* Check the event type */ diff --git a/subsystems/ntvdm/hardware/ps2.h b/subsystems/ntvdm/hardware/ps2.h index 119e9bdc471..e0eca521057 100644 --- a/subsystems/ntvdm/hardware/ps2.h +++ b/subsystems/ntvdm/hardware/ps2.h @@ -24,6 +24,8 @@ /* FUNCTIONS ******************************************************************/ +BOOLEAN KeyboardQueuePush(BYTE ScanCode); +BOOLEAN KeyboardQueuePop(BYTE *ScanCode); VOID PS2Dispatch(PINPUT_RECORD InputRecord); VOID GenerateKeyboardInterrupts(VOID); diff --git a/subsystems/ntvdm/hardware/vga.c b/subsystems/ntvdm/hardware/vga.c index 4593a5d5188..a175c37faae 100644 --- a/subsystems/ntvdm/hardware/vga.c +++ b/subsystems/ntvdm/hardware/vga.c @@ -21,6 +21,12 @@ static CONST DWORD MemoryBase[] = { 0xA0000, 0xA0000, 0xB0000, 0xB8000 }; static CONST DWORD MemoryLimit[] = { 0xAFFFF, 0xAFFFF, 0xB7FFF, 0xBFFFF }; +/* + * Activate this line if you want to use the real + * RegisterConsoleVDM API of Windows/ReactOS. + */ +// #define USE_REAL_REGISTERCONSOLEVDM + #define USE_REACTOS_COLORS // #define USE_DOSBOX_COLORS @@ -288,44 +294,12 @@ static SMALL_RECT UpdateRectangle = { 0, 0, 0, 0 }; #include -typedef -BOOL -(WINAPI *pRegisterConsoleVDM) -( - BOOL IsDosVDM_flag, - HANDLE EventHandle_1, - HANDLE EventHandle_2, - HANDLE EventHandle_3, - int Unused1, - PVOID returned_val_1, - PVOID *returned_val_2, - PVOID lpUnknownBuffer, - DWORD theUnknownBufferLength, - COORD theVDMBufferSize, - PCHAR *lpVDMBuffer -); +#ifdef USE_REAL_REGISTERCONSOLEVDM -#if 0 -BOOL -WINAPI -RegisterConsoleVDM -( - BOOL IsDosVDM_flag, - HANDLE EventHandle_1, - HANDLE EventHandle_2, - HANDLE EventHandle_3, - int Unused1, - PVOID returned_val_1, - PVOID *returned_val_2, - PVOID lpUnknownBuffer, - DWORD theUnknownBufferLength, - COORD theVDMBufferSize, - PVOID *lpVDMBuffer -); +#define __RegisterConsoleVDM RegisterConsoleVDM +#define __InvalidateConsoleDIBits InvalidateConsoleDIBits -HMODULE hKernel32 = NULL; -pRegisterConsoleVDM RegisterConsoleVDM = NULL; -#endif +#else /* * This private buffer, per-console, is used by @@ -340,49 +314,49 @@ static PCHAR_INFO CharBuff = NULL; // This is a hack, which is unneeded BOOL WINAPI -__RegisterConsoleVDM(BOOL IsDosVDM_flag, - HANDLE EventHandle_1, - HANDLE EventHandle_2, - HANDLE EventHandle_3, - int Unused1, - PVOID returned_val_1, - PVOID *returned_val_2, - PVOID lpUnknownBuffer, - DWORD theUnknownBufferLength, - COORD theVDMBufferSize, - PCHAR *lpVDMBuffer) +__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, + IN COORD dwVDMBufferSize, + OUT PVOID* lpVDMBuffer) { - UNREFERENCED_PARAMETER(EventHandle_3); + UNREFERENCED_PARAMETER(hEventHandle3); UNREFERENCED_PARAMETER(Unused1); UNREFERENCED_PARAMETER(returned_val_1); UNREFERENCED_PARAMETER(returned_val_2); UNREFERENCED_PARAMETER(lpUnknownBuffer); - UNREFERENCED_PARAMETER(theUnknownBufferLength); + UNREFERENCED_PARAMETER(dwUnknownBufferLength); SetLastError(0); - DPRINT1("__RegisterConsoleVDM(%d)\n", IsDosVDM_flag); + DPRINT1("__RegisterConsoleVDM(%d)\n", dwDosVDMFlag); if (lpVDMBuffer == NULL) return FALSE; - if (IsDosVDM_flag) + if (dwDosVDMFlag != 0) { // if (EventHandle_1 == NULL || EventHandle_2 == NULL) return FALSE; if (VDMBuffer != NULL) return FALSE; - VDMBufferSize = theVDMBufferSize; + VDMBufferSize = dwVDMBufferSize; /* HACK: Cache -- to be removed in the real implementation */ CharBuff = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - theVDMBufferSize.X * theVDMBufferSize.Y - * sizeof(CHAR_INFO)); + VDMBufferSize.X * VDMBufferSize.Y + * sizeof(CHAR_INFO)); ASSERT(CharBuff); VDMBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, - theVDMBufferSize.X * theVDMBufferSize.Y - * sizeof(CHAR_CELL)); - *lpVDMBuffer = (PCHAR)VDMBuffer; + VDMBufferSize.X * VDMBufferSize.Y + * sizeof(CHAR_CELL)); + *lpVDMBuffer = VDMBuffer; return (VDMBuffer != NULL); } else @@ -432,6 +406,8 @@ __InvalidateConsoleDIBits(IN HANDLE hConsoleOutput, return InvalidateConsoleDIBits(hConsoleOutput, lpRect); } +#endif + /* PRIVATE FUNCTIONS **********************************************************/ static inline DWORD VgaGetAddressSize(VOID); @@ -458,6 +434,9 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) ULONG Length = 0; PVIDEO_HARDWARE_STATE_HEADER State; +#ifdef USE_REAL_REGISTERCONSOLEVDM + PCHAR_INFO CharBuff = NULL; +#endif SHORT i, j; DWORD AddressSize, ScanlineSize; DWORD Address = 0; @@ -492,7 +471,7 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) NULL, 0, TextResolution, - (PCHAR*)&TextFramebuffer); + (PVOID*)&TextFramebuffer); if (!Success) { DisplayMessage(L"RegisterConsoleVDM failed with error %d\n", GetLastError()); @@ -500,6 +479,14 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) return FALSE; } +#ifdef USE_REAL_REGISTERCONSOLEVDM + CharBuff = HeapAlloc(GetProcessHeap(), + HEAP_ZERO_MEMORY, + TextResolution.X * TextResolution.Y + * sizeof(CHAR_INFO)); + ASSERT(CharBuff); +#endif + /* * Resize the console */ @@ -560,6 +547,10 @@ static BOOL VgaAttachToConsoleInternal(PCOORD Resolution) Address += ScanlineSize; } +#ifdef USE_REAL_REGISTERCONSOLEVDM + if (CharBuff) HeapFree(GetProcessHeap(), 0, CharBuff); +#endif + VgaUpdateCursorPosition(); return TRUE; @@ -1950,7 +1941,7 @@ VOID VgaDetachFromConsole(BOOL ChangingMode) NULL, 0, dummySize, - (PCHAR*)&dummyPtr); + &dummyPtr); TextFramebuffer = NULL; @@ -2039,11 +2030,6 @@ VOID VgaCleanup(VOID) CloseHandle(AnotherEvent); CloseHandle(EndEvent); CloseHandle(StartEvent); - -#if 0 - RegisterConsoleVDM = NULL; - FreeLibrary(hKernel32); -#endif } /* EOF */ diff --git a/win32ss/gdi/ntgdi/cliprgn.c b/win32ss/gdi/ntgdi/cliprgn.c index 67fa4dfa9dd..326ed3744af 100644 --- a/win32ss/gdi/ntgdi/cliprgn.c +++ b/win32ss/gdi/ntgdi/cliprgn.c @@ -60,6 +60,8 @@ IntGdiExtSelectClipRgn( if (!dc->dclevel.prgnClip) dc->dclevel.prgnClip = IntSysCreateRectpRgn(0, 0, 0, 0); + dc->fs |= DC_FLAG_DIRTY_RAO; + return IntGdiCombineRgn(dc->dclevel.prgnClip, prgn, NULL, RGN_COPY); } diff --git a/win32ss/user/ntuser/clipboard.c b/win32ss/user/ntuser/clipboard.c index 2965b3aa93f..16b01f37d62 100644 --- a/win32ss/user/ntuser/clipboard.c +++ b/win32ss/user/ntuser/clipboard.c @@ -2,7 +2,7 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * PURPOSE: Clipboard routines - * FILE: subsys/win32k/ntuser/clipboard.c + * FILE: win32ss/user/ntuser/clipboard.c * PROGRAMER: Filip Navara * Pablo Borobia * Rafal Harabien @@ -622,7 +622,7 @@ UserEmptyClipboard(VOID) if (pWinStaObj->spwndClipOwner) { - TRACE("Clipboard: WM_DESTROYCLIPBOARD to %p", pWinStaObj->spwndClipOwner->head.h); + TRACE("Clipboard: WM_DESTROYCLIPBOARD to %p\n", pWinStaObj->spwndClipOwner->head.h); co_IntSendMessageNoWait(pWinStaObj->spwndClipOwner->head.h, WM_DESTROYCLIPBOARD, 0, 0); } diff --git a/win32ss/user/ntuser/cursoricon.c b/win32ss/user/ntuser/cursoricon.c index 0476291e8fa..335aa87e216 100644 --- a/win32ss/user/ntuser/cursoricon.c +++ b/win32ss/user/ntuser/cursoricon.c @@ -2,7 +2,7 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Win32k subsystem * PURPOSE: Cursor and icon functions - * FILE: subsystems/win32/win32k/ntuser/cursoricon.c + * FILE: win32ss/user/ntuser/cursoricon.c * PROGRAMER: ReactOS Team */ /* diff --git a/win32ss/user/ntuser/cursoricon_new.c b/win32ss/user/ntuser/cursoricon_new.c index 98e4300e473..40e28458ea2 100644 --- a/win32ss/user/ntuser/cursoricon_new.c +++ b/win32ss/user/ntuser/cursoricon_new.c @@ -2,7 +2,7 @@ * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Win32k subsystem * PURPOSE: Cursor and icon functions - * FILE: subsystems/win32/win32k/ntuser/cursoricon.c + * FILE: win32ss/user/ntuser/cursoricon.c * PROGRAMER: ReactOS Team */ /* @@ -298,7 +298,7 @@ IntDestroyCursor( if (!(CurIcon = UserGetCurIconObject(hCurIcon))) { - RETURN(FALSE); + return(FALSE); } ret = IntDestroyCurIconObject(CurIcon, bForce); @@ -670,7 +670,7 @@ NtUserClipCursor( prcl = &rclLocal; } - UserEnterExclusive(); + UserEnterExclusive(); /* Call the internal function */ bResult = UserClipCursor(prcl); @@ -1291,7 +1291,7 @@ UserDrawIconEx( /* We now have our destination surface */ psurfDest = psurfOffScreen; #else - pdcClipObj = pdc->rosdc.CombinedClip; + pdcClipObj = &pdc->co.ClipObj; /* Paint the brush */ EBRUSHOBJ_vInit(&eboFill, pbrush, psurfDest, 0x00FFFFFF, 0, NULL); @@ -1322,14 +1322,14 @@ UserDrawIconEx( { /* We directly draw to the DC */ TRACE("Performing on screen rendering.\n"); - pdcClipObj = pdc->rosdc.CombinedClip; + pdcClipObj = &pdc->co.ClipObj; // psurfOffScreen = NULL; } /* Now do the rendering */ - if(hbmAlpha && ((diFlags & DI_NORMAL) == DI_NORMAL)) - { - BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } }; + if(hbmAlpha && ((diFlags & DI_NORMAL) == DI_NORMAL)) + { + BLENDOBJ blendobj = { {AC_SRC_OVER, 0, 255, AC_SRC_ALPHA } }; PSURFACE psurf = NULL; psurf = SURFACE_ShareLockSurface(hbmAlpha); @@ -1354,7 +1354,7 @@ UserDrawIconEx( EXLATEOBJ_vCleanup(&exlo); SURFACE_ShareUnlockSurface(psurf); if(Ret) goto done; - ERR("NtGdiAlphaBlend failed!\n"); + ERR("NtGdiAlphaBlend failed!\n"); } NoAlpha: if (diFlags & DI_MASK) @@ -1387,7 +1387,7 @@ NoAlpha: if(diFlags & DI_IMAGE) { - if (psurfColor) + if (psurfColor) { DWORD rop4 = (diFlags & DI_MASK) ? ROP4_SRCINVERT : ROP4_SRCCOPY ; diff --git a/win32ss/user/ntuser/menu.c b/win32ss/user/ntuser/menu.c index 61f7d455898..2fed7c12d48 100644 --- a/win32ss/user/ntuser/menu.c +++ b/win32ss/user/ntuser/menu.c @@ -1143,7 +1143,6 @@ BOOL FASTCALL IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process) { PEPROCESS CurrentProcess; - PLIST_ENTRY LastHead = NULL; PMENU MenuObject; CurrentProcess = PsGetCurrentProcess(); @@ -1152,10 +1151,8 @@ IntCleanupMenus(struct _EPROCESS *Process, PPROCESSINFO Win32Process) KeAttachProcess(&Process->Pcb); } - while (Win32Process->MenuListHead.Flink != &(Win32Process->MenuListHead) && - Win32Process->MenuListHead.Flink != LastHead) + while (!IsListEmpty(&Win32Process->MenuListHead)) { - LastHead = Win32Process->MenuListHead.Flink; MenuObject = CONTAINING_RECORD(Win32Process->MenuListHead.Flink, MENU, ListEntry); TRACE("Menus are stuck on the process list!\n"); IntDestroyMenuObject(MenuObject, FALSE, TRUE); diff --git a/win32ss/user/user32/misc/stubs.c b/win32ss/user/user32/misc/stubs.c index f3e4926b32d..0f4617bc330 100644 --- a/win32ss/user/user32/misc/stubs.c +++ b/win32ss/user/user32/misc/stubs.c @@ -346,6 +346,7 @@ GetRawInputDeviceList( */ UINT WINAPI +DECLSPEC_HOTPATCH GetRegisteredRawInputDevices( PRAWINPUTDEVICE pRawInputDevices, PUINT puiNumDevices, diff --git a/win32ss/user/winsrv/consrv.cmake b/win32ss/user/winsrv/consrv.cmake index 69dbf469814..63b6f574d7b 100644 --- a/win32ss/user/winsrv/consrv.cmake +++ b/win32ss/user/winsrv/consrv.cmake @@ -18,10 +18,11 @@ list(APPEND CONSRV_SOURCE consrv/condrv/coninput.c consrv/condrv/conoutput.c consrv/condrv/console.c - consrv/condrv/dummyfrontend.c + consrv/condrv/dummyterm.c consrv/condrv/graphics.c consrv/condrv/text.c consrv/frontends/input.c + consrv/frontends/terminal.c consrv/frontends/gui/conwnd.c consrv/frontends/gui/fullscreen.c consrv/frontends/gui/guiterm.c diff --git a/win32ss/user/winsrv/consrv/alias.c b/win32ss/user/winsrv/consrv/alias.c index a20412fe326..3d7a533d5a0 100644 --- a/win32ss/user/winsrv/consrv/alias.c +++ b/win32ss/user/winsrv/consrv/alias.c @@ -18,61 +18,195 @@ typedef struct _ALIAS_ENTRY { - LPCWSTR lpSource; - LPCWSTR lpTarget; + UNICODE_STRING Source; + UNICODE_STRING Target; struct _ALIAS_ENTRY* Next; } ALIAS_ENTRY, *PALIAS_ENTRY; typedef struct _ALIAS_HEADER { - LPCWSTR lpExeName; - PALIAS_ENTRY Data; + UNICODE_STRING ExeName; + PALIAS_ENTRY Data; struct _ALIAS_HEADER* Next; } ALIAS_HEADER, *PALIAS_HEADER; + + +BOOLEAN +ConvertInputAnsiToUnicode(PCONSOLE Console, + PVOID Source, + USHORT SourceLength, + // BOOLEAN IsUnicode, + PWCHAR* Target, + PUSHORT TargetLength) +{ + ASSERT(Source && Target && TargetLength); + + /* Use the console input CP for the conversion */ + *TargetLength = MultiByteToWideChar(Console->InputCodePage, 0, + Source, SourceLength, + NULL, 0); + *Target = ConsoleAllocHeap(0, *TargetLength * sizeof(WCHAR)); + if (*Target == NULL) return FALSE; + + MultiByteToWideChar(Console->InputCodePage, 0, + Source, SourceLength, + *Target, *TargetLength); + + /* The returned Length was in number of WCHARs, convert it in bytes */ + *TargetLength *= sizeof(WCHAR); + + return TRUE; +} + +BOOLEAN +ConvertInputUnicodeToAnsi(PCONSOLE Console, + PVOID Source, + USHORT SourceLength, + // BOOLEAN IsAnsi, + PCHAR/* * */ Target, + /*P*/USHORT TargetLength) +{ + ASSERT(Source && Target && TargetLength); + + /* + * From MSDN: + * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. + * If they are the same, the function fails, and GetLastError returns + * ERROR_INVALID_PARAMETER." + */ + ASSERT((ULONG_PTR)Source != (ULONG_PTR)Target); + + /* Use the console input CP for the conversion */ + // *TargetLength = WideCharToMultiByte(Console->InputCodePage, 0, + // Source, SourceLength, + // NULL, 0, NULL, NULL); + // *Target = ConsoleAllocHeap(0, *TargetLength * sizeof(WCHAR)); + // if (*Target == NULL) return FALSE; + + WideCharToMultiByte(Console->InputCodePage, 0, + Source, SourceLength, + /* * */Target, /* * */TargetLength, + NULL, NULL); + + // /* The returned Length was in number of WCHARs, convert it in bytes */ + // *TargetLength *= sizeof(WCHAR); + + return TRUE; +} + + + + /* PRIVATE FUNCTIONS **********************************************************/ -static -PALIAS_HEADER -IntFindAliasHeader(PALIAS_HEADER RootHeader, LPCWSTR lpExeName) +static PALIAS_HEADER +IntFindAliasHeader(PCONSOLE Console, + PVOID ExeName, + USHORT ExeLength, + BOOLEAN UnicodeExe) { + UNICODE_STRING ExeNameU; + + PALIAS_HEADER RootHeader = Console->Aliases; + INT Diff; + + if (ExeName == NULL) return NULL; + + if (UnicodeExe) + { + ExeNameU.Buffer = ExeName; + /* Length is in bytes */ + ExeNameU.MaximumLength = ExeLength; + } + else + { + if (!ConvertInputAnsiToUnicode(Console, + ExeName, ExeLength, + &ExeNameU.Buffer, &ExeNameU.MaximumLength)) + { + return NULL; + } + } + ExeNameU.Length = ExeNameU.MaximumLength; + while (RootHeader) { - INT diff = _wcsicmp(RootHeader->lpExeName, lpExeName); - if (!diff) return RootHeader; - if (diff > 0) break; + Diff = RtlCompareUnicodeString(&RootHeader->ExeName, &ExeNameU, TRUE); + if (!Diff) + { + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); + return RootHeader; + } + if (Diff > 0) break; RootHeader = RootHeader->Next; } + + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); return NULL; } -PALIAS_HEADER -IntCreateAliasHeader(LPCWSTR lpExeName) +static PALIAS_HEADER +IntCreateAliasHeader(PCONSOLE Console, + PVOID ExeName, + USHORT ExeLength, + BOOLEAN UnicodeExe) { + UNICODE_STRING ExeNameU; + PALIAS_HEADER Entry; - UINT dwLength = wcslen(lpExeName) + 1; - Entry = ConsoleAllocHeap(0, sizeof(ALIAS_HEADER) + sizeof(WCHAR) * dwLength); - if (!Entry) return Entry; + if (ExeName == NULL) return NULL; + + if (UnicodeExe) + { + ExeNameU.Buffer = ExeName; + /* Length is in bytes */ + ExeNameU.MaximumLength = ExeLength; + } + else + { + if (!ConvertInputAnsiToUnicode(Console, + ExeName, ExeLength, + &ExeNameU.Buffer, &ExeNameU.MaximumLength)) + { + return NULL; + } + } + ExeNameU.Length = ExeNameU.MaximumLength; + + Entry = ConsoleAllocHeap(0, sizeof(ALIAS_HEADER) + ExeNameU.Length); + if (!Entry) + { + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); + return Entry; + } + + Entry->ExeName.Buffer = (PWSTR)(Entry + 1); + Entry->ExeName.Length = 0; + Entry->ExeName.MaximumLength = ExeNameU.Length; + RtlCopyUnicodeString(&Entry->ExeName, &ExeNameU); - Entry->lpExeName = (LPCWSTR)(Entry + 1); - wcscpy((PWCHAR)Entry->lpExeName, lpExeName); Entry->Data = NULL; Entry->Next = NULL; + + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); return Entry; } -VOID -IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader) +static VOID +IntInsertAliasHeader(PALIAS_HEADER* RootHeader, + PALIAS_HEADER NewHeader) { PALIAS_HEADER CurrentHeader; PALIAS_HEADER *LastLink = RootHeader; + INT Diff; while ((CurrentHeader = *LastLink) != NULL) { - INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName); + Diff = RtlCompareUnicodeString(&NewHeader->ExeName, &CurrentHeader->ExeName, TRUE); if (Diff < 0) break; LastLink = &CurrentHeader->Next; @@ -82,36 +216,139 @@ IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader) NewHeader->Next = CurrentHeader; } -PALIAS_ENTRY -IntGetAliasEntry(PALIAS_HEADER Header, LPCWSTR lpSrcName) +static PALIAS_ENTRY +IntGetAliasEntry(PCONSOLE Console, + PALIAS_HEADER Header, + PVOID Source, + USHORT SourceLength, + BOOLEAN Unicode) { - PALIAS_ENTRY RootHeader; + UNICODE_STRING SourceU; - if (Header == NULL) return NULL; + PALIAS_ENTRY Entry; + INT Diff; - RootHeader = Header->Data; - while (RootHeader) + if (Header == NULL || Source == NULL) return NULL; + + if (Unicode) { - INT diff; - DPRINT("IntGetAliasEntry->lpSource %S\n", RootHeader->lpSource); - diff = _wcsicmp(RootHeader->lpSource, lpSrcName); - if (!diff) return RootHeader; - if (diff > 0) break; - - RootHeader = RootHeader->Next; + SourceU.Buffer = Source; + /* Length is in bytes */ + SourceU.MaximumLength = SourceLength; } + else + { + if (!ConvertInputAnsiToUnicode(Console, + Source, SourceLength, + &SourceU.Buffer, &SourceU.MaximumLength)) + { + return NULL; + } + } + SourceU.Length = SourceU.MaximumLength; + + Entry = Header->Data; + while (Entry) + { + Diff = RtlCompareUnicodeString(&Entry->Source, &SourceU, TRUE); + if (!Diff) + { + if (!Unicode) ConsoleFreeHeap(SourceU.Buffer); + return Entry; + } + if (Diff > 0) break; + + Entry = Entry->Next; + } + + if (!Unicode) ConsoleFreeHeap(SourceU.Buffer); return NULL; } -VOID -IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry) +static PALIAS_ENTRY +IntCreateAliasEntry(PCONSOLE Console, + PVOID Source, + USHORT SourceLength, + PVOID Target, + USHORT TargetLength, + BOOLEAN Unicode) +{ + UNICODE_STRING SourceU; + UNICODE_STRING TargetU; + + PALIAS_ENTRY Entry; + + if (Unicode) + { + SourceU.Buffer = Source; + TargetU.Buffer = Target; + /* Length is in bytes */ + SourceU.MaximumLength = SourceLength; + TargetU.MaximumLength = TargetLength; + } + else + { + if (!ConvertInputAnsiToUnicode(Console, + Source, SourceLength, + &SourceU.Buffer, &SourceU.MaximumLength)) + { + return NULL; + } + + if (!ConvertInputAnsiToUnicode(Console, + Target, TargetLength, + &TargetU.Buffer, &TargetU.MaximumLength)) + { + ConsoleFreeHeap(SourceU.Buffer); + return NULL; + } + } + SourceU.Length = SourceU.MaximumLength; + TargetU.Length = TargetU.MaximumLength; + + Entry = ConsoleAllocHeap(0, sizeof(ALIAS_ENTRY) + + SourceU.Length + TargetU.Length); + if (!Entry) + { + if (!Unicode) + { + ConsoleFreeHeap(TargetU.Buffer); + ConsoleFreeHeap(SourceU.Buffer); + } + return Entry; + } + + Entry->Source.Buffer = (PWSTR)(Entry + 1); + Entry->Source.Length = 0; + Entry->Source.MaximumLength = SourceU.Length; + RtlCopyUnicodeString(&Entry->Source, &SourceU); + + Entry->Target.Buffer = (PWSTR)((ULONG_PTR)Entry->Source.Buffer + Entry->Source.MaximumLength); + Entry->Target.Length = 0; + Entry->Target.MaximumLength = TargetU.Length; + RtlCopyUnicodeString(&Entry->Target, &TargetU); + + Entry->Next = NULL; + + if (!Unicode) + { + ConsoleFreeHeap(TargetU.Buffer); + ConsoleFreeHeap(SourceU.Buffer); + } + return Entry; +} + +static VOID +IntInsertAliasEntry(PALIAS_HEADER Header, + PALIAS_ENTRY NewEntry) { PALIAS_ENTRY CurrentEntry; PALIAS_ENTRY *LastLink = &Header->Data; + INT Diff; while ((CurrentEntry = *LastLink) != NULL) { - INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource); + Diff = RtlCompareUnicodeString(&NewEntry->Source, &CurrentEntry->Source, TRUE); if (Diff < 0) break; LastLink = &CurrentEntry->Next; @@ -121,120 +358,9 @@ IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry) NewEntry->Next = CurrentEntry; } -PALIAS_ENTRY -IntCreateAliasEntry(LPCWSTR lpSource, LPCWSTR lpTarget) -{ - UINT dwSource; - UINT dwTarget; - PALIAS_ENTRY Entry; - - dwSource = wcslen(lpSource) + 1; - dwTarget = wcslen(lpTarget) + 1; - - Entry = ConsoleAllocHeap(0, sizeof(ALIAS_ENTRY) + sizeof(WCHAR) * (dwSource + dwTarget)); - if (!Entry) return Entry; - - Entry->lpSource = (LPCWSTR)(Entry + 1); - wcscpy((LPWSTR)Entry->lpSource, lpSource); - Entry->lpTarget = Entry->lpSource + dwSource; - wcscpy((LPWSTR)Entry->lpTarget, lpTarget); - Entry->Next = NULL; - - return Entry; -} - -UINT -IntGetConsoleAliasesExesLength(PALIAS_HEADER RootHeader) -{ - UINT length = 0; - - while (RootHeader) - { - length += (wcslen(RootHeader->lpExeName) + 1) * sizeof(WCHAR); - RootHeader = RootHeader->Next; - } - if (length) - length += sizeof(WCHAR); // last entry entry is terminated with 2 zero bytes - - return length; -} - -UINT -IntGetConsoleAliasesExes(PALIAS_HEADER RootHeader, LPWSTR TargetBuffer, UINT TargetBufferSize) -{ - UINT Offset = 0; - UINT Length; - - TargetBufferSize /= sizeof(WCHAR); - while (RootHeader) - { - Length = wcslen(RootHeader->lpExeName) + 1; - if (TargetBufferSize > Offset + Length) - { - wcscpy(&TargetBuffer[Offset], RootHeader->lpExeName); - Offset += Length; - } - else - { - break; - } - RootHeader = RootHeader->Next; - } - Length = min(Offset+1, TargetBufferSize); - TargetBuffer[Length] = L'\0'; - return Length * sizeof(WCHAR); -} - -UINT -IntGetAllConsoleAliasesLength(PALIAS_HEADER Header) -{ - UINT Length = 0; - PALIAS_ENTRY CurEntry = Header->Data; - - while (CurEntry) - { - Length += wcslen(CurEntry->lpSource); - Length += wcslen(CurEntry->lpTarget); - Length += 2; // zero byte and '=' - CurEntry = CurEntry->Next; - } - - if (Length) - { - return (Length+1) * sizeof(WCHAR); - } - return 0; -} - -UINT -IntGetAllConsoleAliases(PALIAS_HEADER Header, LPWSTR TargetBuffer, UINT TargetBufferLength) -{ - PALIAS_ENTRY CurEntry = Header->Data; - UINT Offset = 0; - UINT SrcLength, TargetLength; - - TargetBufferLength /= sizeof(WCHAR); - while (CurEntry) - { - SrcLength = wcslen(CurEntry->lpSource) + 1; - TargetLength = wcslen(CurEntry->lpTarget) + 1; - if (Offset + TargetLength + SrcLength >= TargetBufferLength) - break; - - wcscpy(&TargetBuffer[Offset], CurEntry->lpSource); - Offset += SrcLength; - TargetBuffer[Offset] = L'='; - wcscpy(&TargetBuffer[Offset], CurEntry->lpTarget); - Offset += TargetLength; - - CurEntry = CurEntry->Next; - } - TargetBuffer[Offset] = L'\0'; - return Offset * sizeof(WCHAR); -} - -VOID -IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry) +static VOID +IntDeleteAliasEntry(PALIAS_HEADER Header, + PALIAS_ENTRY Entry) { PALIAS_ENTRY *LastLink = &Header->Data; PALIAS_ENTRY CurEntry; @@ -251,6 +377,53 @@ IntDeleteAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY Entry) } } +static UINT +IntGetConsoleAliasesExesLength(PALIAS_HEADER RootHeader, + BOOLEAN IsUnicode) +{ + UINT Length = 0; + + while (RootHeader) + { + Length += RootHeader->ExeName.Length + sizeof(WCHAR); // NULL-termination + RootHeader = RootHeader->Next; + } + + /* + * Quick and dirty way of getting the number of bytes of the + * corresponding ANSI string from the one in UNICODE. + */ + if (!IsUnicode) + Length /= sizeof(WCHAR); + + return Length; +} + +static UINT +IntGetAllConsoleAliasesLength(PALIAS_HEADER Header, + BOOLEAN IsUnicode) +{ + UINT Length = 0; + PALIAS_ENTRY CurEntry = Header->Data; + + while (CurEntry) + { + Length += CurEntry->Source.Length; + Length += CurEntry->Target.Length; + Length += 2 * sizeof(WCHAR); // '=' and NULL-termination + CurEntry = CurEntry->Next; + } + + /* + * Quick and dirty way of getting the number of bytes of the + * corresponding ANSI string from the one in UNICODE. + */ + if (!IsUnicode) + Length /= sizeof(WCHAR); + + return Length; +} + VOID IntDeleteAllAliases(PCONSOLE Console) { @@ -274,13 +447,14 @@ IntDeleteAllAliases(PCONSOLE Console) CSR_API(SrvAddConsoleAlias) { + NTSTATUS Status; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest; PCONSOLE Console; PALIAS_HEADER Header; PALIAS_ENTRY Entry; - LPWSTR lpSource, lpTarget, lpExeName; + PVOID lpTarget; - DPRINT("SrvAddConsoleAlias entered ApiMessage %p\n", ApiMessage); + DPRINT1("SrvAddConsoleAlias entered ApiMessage %p\n", ApiMessage); if ( !CsrValidateMessageBuffer(ApiMessage, (PVOID*)&ConsoleAliasRequest->Source, @@ -291,81 +465,86 @@ CSR_API(SrvAddConsoleAlias) ConsoleAliasRequest->TargetLength, sizeof(BYTE)) || !CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ConsoleAliasRequest->Exe, + (PVOID*)&ConsoleAliasRequest->ExeName, ConsoleAliasRequest->ExeLength, sizeof(BYTE)) ) { return STATUS_INVALID_PARAMETER; } - lpSource = ConsoleAliasRequest->Source; - lpTarget = (ConsoleAliasRequest->TargetLength != 0 ? ConsoleAliasRequest->Target : NULL); - lpExeName = ConsoleAliasRequest->Exe; + lpTarget = (ConsoleAliasRequest->TargetLength != 0 ? ConsoleAliasRequest->Target : NULL); - DPRINT("SrvAddConsoleAlias lpSource %p lpExeName %p lpTarget %p\n", lpSource, lpExeName, lpTarget); + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; - if (lpExeName == NULL || lpSource == NULL) - { - return STATUS_INVALID_PARAMETER; - } + Status = STATUS_SUCCESS; - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (!NT_SUCCESS(ApiMessage->Status)) - { - return ApiMessage->Status; - } - - Header = IntFindAliasHeader(Console->Aliases, lpExeName); + Header = IntFindAliasHeader(Console, + ConsoleAliasRequest->ExeName, + ConsoleAliasRequest->ExeLength, + ConsoleAliasRequest->Unicode2); if (!Header && lpTarget != NULL) { - Header = IntCreateAliasHeader(lpExeName); + Header = IntCreateAliasHeader(Console, + ConsoleAliasRequest->ExeName, + ConsoleAliasRequest->ExeLength, + ConsoleAliasRequest->Unicode2); if (!Header) { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INSUFFICIENT_RESOURCES; + Status = STATUS_NO_MEMORY; + goto Quit; } + IntInsertAliasHeader(&Console->Aliases, Header); } if (lpTarget == NULL) // Delete the entry { - Entry = IntGetAliasEntry(Header, lpSource); - if (Entry) + Entry = IntGetAliasEntry(Console, Header, + ConsoleAliasRequest->Source, + ConsoleAliasRequest->SourceLength, + ConsoleAliasRequest->Unicode); + if (!Entry) { - IntDeleteAliasEntry(Header, Entry); - ApiMessage->Status = STATUS_SUCCESS; + Status = STATUS_UNSUCCESSFUL; + goto Quit; } - else - { - ApiMessage->Status = STATUS_INVALID_PARAMETER; - } - ConSrvReleaseConsole(Console, TRUE); - return ApiMessage->Status; + + IntDeleteAliasEntry(Header, Entry); } - - Entry = IntCreateAliasEntry(lpSource, lpTarget); - - if (!Entry) + else // Add the entry { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INSUFFICIENT_RESOURCES; + Entry = IntCreateAliasEntry(Console, + ConsoleAliasRequest->Source, + ConsoleAliasRequest->SourceLength, + ConsoleAliasRequest->Target, + ConsoleAliasRequest->TargetLength, + ConsoleAliasRequest->Unicode); + if (!Entry) + { + Status = STATUS_NO_MEMORY; + goto Quit; + } + + IntInsertAliasEntry(Header, Entry); } - IntInsertAliasEntry(Header, Entry); +Quit: ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; + return Status; } CSR_API(SrvGetConsoleAlias) { + NTSTATUS Status; PCONSOLE_ADDGETALIAS ConsoleAliasRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ConsoleAliasRequest; PCONSOLE Console; PALIAS_HEADER Header; PALIAS_ENTRY Entry; UINT Length; - LPWSTR lpSource, lpTarget, lpExeName; + PVOID lpTarget; - DPRINT("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage); + DPRINT1("SrvGetConsoleAlias entered ApiMessage %p\n", ApiMessage); if ( !CsrValidateMessageBuffer(ApiMessage, (PVOID*)&ConsoleAliasRequest->Source, @@ -376,19 +555,14 @@ CSR_API(SrvGetConsoleAlias) ConsoleAliasRequest->TargetLength, sizeof(BYTE)) || !CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ConsoleAliasRequest->Exe, + (PVOID*)&ConsoleAliasRequest->ExeName, ConsoleAliasRequest->ExeLength, sizeof(BYTE)) ) { return STATUS_INVALID_PARAMETER; } - lpSource = ConsoleAliasRequest->Source; - lpTarget = ConsoleAliasRequest->Target; - lpExeName = ConsoleAliasRequest->Exe; - - DPRINT("SrvGetConsoleAlias lpExeName %p lpSource %p TargetBuffer %p TargetLength %u\n", - lpExeName, lpSource, lpTarget, ConsoleAliasRequest->TargetLength); + lpTarget = ConsoleAliasRequest->Target; if (ConsoleAliasRequest->ExeLength == 0 || lpTarget == NULL || ConsoleAliasRequest->TargetLength == 0 || ConsoleAliasRequest->SourceLength == 0) @@ -396,46 +570,71 @@ CSR_API(SrvGetConsoleAlias) return STATUS_INVALID_PARAMETER; } - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (!NT_SUCCESS(ApiMessage->Status)) - { - return ApiMessage->Status; - } + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; - Header = IntFindAliasHeader(Console->Aliases, lpExeName); + Header = IntFindAliasHeader(Console, + ConsoleAliasRequest->ExeName, + ConsoleAliasRequest->ExeLength, + ConsoleAliasRequest->Unicode2); if (!Header) { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INVALID_PARAMETER; + Status = STATUS_UNSUCCESSFUL; + goto Quit; } - Entry = IntGetAliasEntry(Header, lpSource); + Entry = IntGetAliasEntry(Console, Header, + ConsoleAliasRequest->Source, + ConsoleAliasRequest->SourceLength, + ConsoleAliasRequest->Unicode); if (!Entry) { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INVALID_PARAMETER; + Status = STATUS_UNSUCCESSFUL; + goto Quit; } - Length = (wcslen(Entry->lpTarget) + 1) * sizeof(WCHAR); - if (Length > ConsoleAliasRequest->TargetLength) + if (ConsoleAliasRequest->Unicode) { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_BUFFER_TOO_SMALL; + Length = Entry->Target.Length + sizeof(WCHAR); + if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation. + { + Status = STATUS_BUFFER_TOO_SMALL; + goto Quit; + } + + RtlCopyMemory(lpTarget, Entry->Target.Buffer, Entry->Target.Length); + ConsoleAliasRequest->TargetLength = Length; + } + else + { + Length = (Entry->Target.Length + sizeof(WCHAR)) / sizeof(WCHAR); + if (Length > ConsoleAliasRequest->TargetLength) // FIXME: Refine computation. + { + Status = STATUS_BUFFER_TOO_SMALL; + goto Quit; + } + + ConvertInputUnicodeToAnsi(Console, + Entry->Target.Buffer, Entry->Target.Length, + lpTarget, Entry->Target.Length / sizeof(WCHAR)); + ConsoleAliasRequest->TargetLength = Length; } - wcscpy(lpTarget, Entry->lpTarget); - ConsoleAliasRequest->TargetLength = Length; +Quit: ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; + return Status; } CSR_API(SrvGetConsoleAliases) { + NTSTATUS Status; PCONSOLE_GETALLALIASES GetAllAliasesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesRequest; PCONSOLE Console; - ULONG BytesWritten; + ULONG BytesWritten = 0; PALIAS_HEADER Header; + DPRINT1("SrvGetConsoleAliases entered ApiMessage %p\n", ApiMessage); + if ( !CsrValidateMessageBuffer(ApiMessage, (PVOID)&GetAllAliasesRequest->ExeName, GetAllAliasesRequest->ExeLength, @@ -448,45 +647,97 @@ CSR_API(SrvGetConsoleAliases) return STATUS_INVALID_PARAMETER; } - if (GetAllAliasesRequest->ExeName == NULL) + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Header = IntFindAliasHeader(Console, + GetAllAliasesRequest->ExeName, + GetAllAliasesRequest->ExeLength, + GetAllAliasesRequest->Unicode2); + if (!Header) goto Quit; + + if (IntGetAllConsoleAliasesLength(Header, GetAllAliasesRequest->Unicode) > GetAllAliasesRequest->AliasesBufferLength) { - return STATUS_INVALID_PARAMETER; + Status = STATUS_BUFFER_OVERFLOW; + goto Quit; } - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (!NT_SUCCESS(ApiMessage->Status)) { - return ApiMessage->Status; + LPSTR TargetBufferA; + LPWSTR TargetBufferW; + UINT TargetBufferLength = GetAllAliasesRequest->AliasesBufferLength; + + PALIAS_ENTRY CurEntry = Header->Data; + UINT Offset = 0; + UINT SourceLength, TargetLength; + + if (GetAllAliasesRequest->Unicode) + { + TargetBufferW = GetAllAliasesRequest->AliasesBuffer; + TargetBufferLength /= sizeof(WCHAR); + } + else + { + TargetBufferA = GetAllAliasesRequest->AliasesBuffer; + } + + while (CurEntry) + { + SourceLength = CurEntry->Source.Length / sizeof(WCHAR); + TargetLength = CurEntry->Target.Length / sizeof(WCHAR); + if (Offset + TargetLength + SourceLength + 2 > TargetBufferLength) + { + Status = STATUS_BUFFER_OVERFLOW; + break; + } + + if (GetAllAliasesRequest->Unicode) + { + RtlCopyMemory(&TargetBufferW[Offset], CurEntry->Source.Buffer, SourceLength * sizeof(WCHAR)); + Offset += SourceLength; + TargetBufferW[Offset++] = L'='; + RtlCopyMemory(&TargetBufferW[Offset], CurEntry->Target.Buffer, TargetLength * sizeof(WCHAR)); + Offset += TargetLength; + TargetBufferW[Offset++] = L'\0'; + } + else + { + ConvertInputUnicodeToAnsi(Console, + CurEntry->Source.Buffer, SourceLength * sizeof(WCHAR), + &TargetBufferA[Offset], SourceLength); + Offset += SourceLength; + TargetBufferA[Offset++] = '='; + ConvertInputUnicodeToAnsi(Console, + CurEntry->Target.Buffer, TargetLength * sizeof(WCHAR), + &TargetBufferA[Offset], TargetLength); + Offset += TargetLength; + TargetBufferA[Offset++] = '\0'; + } + + CurEntry = CurEntry->Next; + } + + if (GetAllAliasesRequest->Unicode) + BytesWritten = Offset * sizeof(WCHAR); + else + BytesWritten = Offset; } - Header = IntFindAliasHeader(Console->Aliases, GetAllAliasesRequest->ExeName); - if (!Header) - { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INVALID_PARAMETER; - } - - if (IntGetAllConsoleAliasesLength(Header) > GetAllAliasesRequest->AliasesBufferLength) - { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_BUFFER_OVERFLOW; - } - - BytesWritten = IntGetAllConsoleAliases(Header, - GetAllAliasesRequest->AliasesBuffer, - GetAllAliasesRequest->AliasesBufferLength); - +Quit: GetAllAliasesRequest->AliasesBufferLength = BytesWritten; + ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; + return Status; } CSR_API(SrvGetConsoleAliasesLength) { + NTSTATUS Status; PCONSOLE_GETALLALIASESLENGTH GetAllAliasesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAllAliasesLengthRequest; PCONSOLE Console; PALIAS_HEADER Header; - UINT Length; + + DPRINT1("SrvGetConsoleAliasesLength entered ApiMessage %p\n", ApiMessage); if (!CsrValidateMessageBuffer(ApiMessage, (PVOID)&GetAllAliasesLengthRequest->ExeName, @@ -496,89 +747,132 @@ CSR_API(SrvGetConsoleAliasesLength) return STATUS_INVALID_PARAMETER; } - if (GetAllAliasesLengthRequest->ExeName == NULL) + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Header = IntFindAliasHeader(Console, + GetAllAliasesLengthRequest->ExeName, + GetAllAliasesLengthRequest->ExeLength, + GetAllAliasesLengthRequest->Unicode2); + if (Header) { - return STATUS_INVALID_PARAMETER; + GetAllAliasesLengthRequest->Length = + IntGetAllConsoleAliasesLength(Header, + GetAllAliasesLengthRequest->Unicode); + Status = STATUS_SUCCESS; + } + else + { + GetAllAliasesLengthRequest->Length = 0; } - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (!NT_SUCCESS(ApiMessage->Status)) - { - return ApiMessage->Status; - } - - Header = IntFindAliasHeader(Console->Aliases, GetAllAliasesLengthRequest->ExeName); - if (!Header) - { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INVALID_PARAMETER; - } - - Length = IntGetAllConsoleAliasesLength(Header); - GetAllAliasesLengthRequest->Length = Length; ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; + return Status; } CSR_API(SrvGetConsoleAliasExes) { + NTSTATUS Status; PCONSOLE_GETALIASESEXES GetAliasesExesRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesRequest; PCONSOLE Console; - UINT BytesWritten; - UINT ExesLength; + UINT BytesWritten = 0; - DPRINT("SrvGetConsoleAliasExes entered\n"); + DPRINT1("SrvGetConsoleAliasExes entered\n"); if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID)&GetAliasesExesRequest->ExeNames, + (PVOID*)&GetAliasesExesRequest->ExeNames, GetAliasesExesRequest->Length, sizeof(BYTE))) { return STATUS_INVALID_PARAMETER; } - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (!NT_SUCCESS(ApiMessage->Status)) + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + if (IntGetConsoleAliasesExesLength(Console->Aliases, GetAliasesExesRequest->Unicode) > GetAliasesExesRequest->Length) { - return ApiMessage->Status; + Status = STATUS_BUFFER_OVERFLOW; + goto Quit; } - ExesLength = IntGetConsoleAliasesExesLength(Console->Aliases); - - if (ExesLength > GetAliasesExesRequest->Length) { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_BUFFER_OVERFLOW; + PALIAS_HEADER RootHeader = Console->Aliases; + + LPSTR TargetBufferA; + LPWSTR TargetBufferW; + UINT TargetBufferSize = GetAliasesExesRequest->Length; + + UINT Offset = 0; + UINT Length; + + if (GetAliasesExesRequest->Unicode) + { + TargetBufferW = GetAliasesExesRequest->ExeNames; + TargetBufferSize /= sizeof(WCHAR); + } + else + { + TargetBufferA = GetAliasesExesRequest->ExeNames; + } + + while (RootHeader) + { + Length = RootHeader->ExeName.Length / sizeof(WCHAR); + if (Offset + Length + 1 > TargetBufferSize) + { + Status = STATUS_BUFFER_OVERFLOW; + break; + } + + if (GetAliasesExesRequest->Unicode) + { + RtlCopyMemory(&TargetBufferW[Offset], RootHeader->ExeName.Buffer, Length * sizeof(WCHAR)); + Offset += Length; + TargetBufferW[Offset++] = L'\0'; + } + else + { + ConvertInputUnicodeToAnsi(Console, + RootHeader->ExeName.Buffer, Length * sizeof(WCHAR), + &TargetBufferA[Offset], Length); + Offset += Length; + TargetBufferA[Offset++] = '\0'; + } + + RootHeader = RootHeader->Next; + } + + if (GetAliasesExesRequest->Unicode) + BytesWritten = Offset * sizeof(WCHAR); + else + BytesWritten = Offset; } - if (GetAliasesExesRequest->ExeNames == NULL) - { - ConSrvReleaseConsole(Console, TRUE); - return STATUS_INVALID_PARAMETER; - } - - BytesWritten = IntGetConsoleAliasesExes(Console->Aliases, - GetAliasesExesRequest->ExeNames, - GetAliasesExesRequest->Length); - +Quit: GetAliasesExesRequest->Length = BytesWritten; + ConSrvReleaseConsole(Console, TRUE); - return STATUS_SUCCESS; + return Status; } CSR_API(SrvGetConsoleAliasExesLength) { + NTSTATUS Status; PCONSOLE_GETALIASESEXESLENGTH GetAliasesExesLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetAliasesExesLengthRequest; PCONSOLE Console; - DPRINT("SrvGetConsoleAliasExesLength entered\n"); - ApiMessage->Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); - if (NT_SUCCESS(ApiMessage->Status)) - { - GetAliasesExesLengthRequest->Length = IntGetConsoleAliasesExesLength(Console->Aliases); - ConSrvReleaseConsole(Console, TRUE); - } - return ApiMessage->Status; + DPRINT1("SrvGetConsoleAliasExesLength entered ApiMessage %p\n", ApiMessage); + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + GetAliasesExesLengthRequest->Length = + IntGetConsoleAliasesExesLength(Console->Aliases, + GetAliasesExesLengthRequest->Unicode); + + ConSrvReleaseConsole(Console, TRUE); + return Status; } /* EOF */ diff --git a/win32ss/user/winsrv/consrv/condrv/coninput.c b/win32ss/user/winsrv/consrv/condrv/coninput.c index afd6a6420a9..4c883eec8e6 100644 --- a/win32ss/user/winsrv/consrv/condrv/coninput.c +++ b/win32ss/user/winsrv/consrv/condrv/coninput.c @@ -16,21 +16,19 @@ /* GLOBALS ********************************************************************/ -#define ConSrvGetInputBuffer(ProcessData, Handle, Ptr, Access, LockConsole) \ - ConSrvGetObject((ProcessData), (Handle), (PCONSOLE_IO_OBJECT*)(Ptr), NULL, \ - (Access), (LockConsole), INPUT_BUFFER) -#define ConSrvGetInputBufferAndHandleEntry(ProcessData, Handle, Ptr, Entry, Access, LockConsole) \ - ConSrvGetObject((ProcessData), (Handle), (PCONSOLE_IO_OBJECT*)(Ptr), (Entry), \ - (Access), (LockConsole), INPUT_BUFFER) -#define ConSrvReleaseInputBuffer(Buff, IsConsoleLocked) \ - ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked)) - - +/* + * From MSDN: + * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. + * If they are the same, the function fails, and GetLastError returns + * ERROR_INVALID_PARAMETER." + */ #define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \ - WideCharToMultiByte((Console)->CodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) + ASSERT((ULONG_PTR)dChar != (ULONG_PTR)sWChar); \ + WideCharToMultiByte((Console)->InputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) #define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \ - MultiByteToWideChar((Console)->CodePage, 0, (sChar), 1, (dWChar), 1) + ASSERT((ULONG_PTR)dWChar != (ULONG_PTR)sChar); \ + MultiByteToWideChar((Console)->InputCodePage, 0, (sChar), 1, (dWChar), 1) typedef struct ConsoleInput_t { @@ -41,7 +39,7 @@ typedef struct ConsoleInput_t /* PRIVATE FUNCTIONS **********************************************************/ -static VOID FASTCALL +static VOID ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent) { if (InputEvent->EventType == KEY_EVENT) @@ -54,7 +52,7 @@ ConioInputEventToAnsi(PCONSOLE Console, PINPUT_RECORD InputEvent) } } -static VOID FASTCALL +static VOID ConioInputEventToUnicode(PCONSOLE Console, PINPUT_RECORD InputEvent) { if (InputEvent->EventType == KEY_EVENT) @@ -67,78 +65,214 @@ ConioInputEventToUnicode(PCONSOLE Console, PINPUT_RECORD InputEvent) } } -NTSTATUS FASTCALL -ConioAddInputEvent(PCONSOLE Console, - PINPUT_RECORD InputEvent, - BOOLEAN AppendToEnd) -{ - ConsoleInput *ConInRec; - /* Check for pause or unpause */ - if (InputEvent->EventType == KEY_EVENT && InputEvent->Event.KeyEvent.bKeyDown) +NTSTATUS +ConDrvAddInputEvents(PCONSOLE Console, + PINPUT_RECORD InputRecords, // InputEvent + ULONG NumEventsToWrite, + PULONG NumEventsWritten, + BOOLEAN AppendToEnd) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG i = 0; + BOOLEAN SetWaitEvent = FALSE; + + if (NumEventsWritten) *NumEventsWritten = 0; + + /* + * When adding many single events, in the case of repeated mouse move or + * key down events, we try to coalesce them so that we do not saturate + * too quickly the input buffer. + */ + if (NumEventsToWrite == 1 && !IsListEmpty(&Console->InputBuffer.InputEvents)) { - WORD vk = InputEvent->Event.KeyEvent.wVirtualKeyCode; - if (!(Console->PauseFlags & PAUSED_FROM_KEYBOARD)) + PINPUT_RECORD InputRecord = InputRecords; // Only one element + PINPUT_RECORD LastInputRecord; + ConsoleInput* ConInRec; // Input + + /* Get the "next" event of the input buffer */ + if (AppendToEnd) { - DWORD cks = InputEvent->Event.KeyEvent.dwControlKeyState; - if (Console->InputBuffer.Mode & ENABLE_LINE_INPUT && - (vk == VK_PAUSE || (vk == 'S' && - (cks & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && - !(cks & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))))) - { - ConioPause(Console, PAUSED_FROM_KEYBOARD); - return STATUS_SUCCESS; - } + /* Get the tail element */ + ConInRec = CONTAINING_RECORD(Console->InputBuffer.InputEvents.Blink, + ConsoleInput, ListEntry); } else { - if ((vk < VK_SHIFT || vk > VK_CAPITAL) && vk != VK_LWIN && - vk != VK_RWIN && vk != VK_NUMLOCK && vk != VK_SCROLL) + /* Get the head element */ + ConInRec = CONTAINING_RECORD(Console->InputBuffer.InputEvents.Flink, + ConsoleInput, ListEntry); + } + LastInputRecord = &ConInRec->InputEvent; + + if (InputRecord->EventType == MOUSE_EVENT && + InputRecord->Event.MouseEvent.dwEventFlags == MOUSE_MOVED) + { + if (LastInputRecord->EventType == MOUSE_EVENT && + LastInputRecord->Event.MouseEvent.dwEventFlags == MOUSE_MOVED) { - ConioUnpause(Console, PAUSED_FROM_KEYBOARD); - return STATUS_SUCCESS; + /* Update the mouse position */ + LastInputRecord->Event.MouseEvent.dwMousePosition.X = + InputRecord->Event.MouseEvent.dwMousePosition.X; + LastInputRecord->Event.MouseEvent.dwMousePosition.Y = + InputRecord->Event.MouseEvent.dwMousePosition.Y; + + i = 1; + // return STATUS_SUCCESS; + Status = STATUS_SUCCESS; + } + } + else if (InputRecord->EventType == KEY_EVENT && + InputRecord->Event.KeyEvent.bKeyDown) + { + if (LastInputRecord->EventType == KEY_EVENT && + LastInputRecord->Event.KeyEvent.bKeyDown && + (LastInputRecord->Event.KeyEvent.wVirtualScanCode == // Same scancode + InputRecord->Event.KeyEvent.wVirtualScanCode) && + (LastInputRecord->Event.KeyEvent.uChar.UnicodeChar == // Same character + InputRecord->Event.KeyEvent.uChar.UnicodeChar) && + (LastInputRecord->Event.KeyEvent.dwControlKeyState == // Same Ctrl/Alt/Shift state + InputRecord->Event.KeyEvent.dwControlKeyState) ) + { + /* Update the repeat count */ + LastInputRecord->Event.KeyEvent.wRepeatCount += + InputRecord->Event.KeyEvent.wRepeatCount; + + i = 1; + // return STATUS_SUCCESS; + Status = STATUS_SUCCESS; } } } - /* Add event to the queue */ - ConInRec = ConsoleAllocHeap(0, sizeof(ConsoleInput)); - if (ConInRec == NULL) return STATUS_INSUFFICIENT_RESOURCES; + /* If we coalesced the only one element, we can quit */ + if (i == 1 && Status == STATUS_SUCCESS /* && NumEventsToWrite == 1 */) + goto Done; - ConInRec->InputEvent = *InputEvent; + /* + * No event coalesced, add them in the usual way. + */ if (AppendToEnd) { - /* Append the event to the end of the queue */ - InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry); + /* Go to the beginning of the list */ + // InputRecords = InputRecords; } else { - /* Append the event to the beginning of the queue */ - InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry); + /* Go to the end of the list */ + InputRecords = &InputRecords[NumEventsToWrite - 1]; } - SetEvent(Console->InputBuffer.ActiveEvent); - CsrNotifyWait(&Console->InputBuffer.ReadWaitQueue, - FALSE, - NULL, - NULL); - if (!IsListEmpty(&Console->InputBuffer.ReadWaitQueue)) + /* Set the event if the list is going to be non-empty */ + if (IsListEmpty(&Console->InputBuffer.InputEvents)) + SetWaitEvent = TRUE; + + for (i = 0; i < NumEventsToWrite && NT_SUCCESS(Status); ++i) { - CsrDereferenceWait(&Console->InputBuffer.ReadWaitQueue); + PINPUT_RECORD InputRecord; + ConsoleInput* ConInRec; + + if (AppendToEnd) + { + /* Select the event and go to the next one */ + InputRecord = InputRecords++; + } + else + { + /* Select the event and go to the previous one */ + InputRecord = InputRecords--; + } + + /* Add event to the queue */ + ConInRec = ConsoleAllocHeap(0, sizeof(ConsoleInput)); + if (ConInRec == NULL) + { + // return STATUS_INSUFFICIENT_RESOURCES; + Status = STATUS_INSUFFICIENT_RESOURCES; + continue; + } + + ConInRec->InputEvent = *InputRecord; + + if (AppendToEnd) + { + /* Append the event to the end of the queue */ + InsertTailList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry); + } + else + { + /* Append the event to the beginning of the queue */ + InsertHeadList(&Console->InputBuffer.InputEvents, &ConInRec->ListEntry); + } + + // return STATUS_SUCCESS; + Status = STATUS_SUCCESS; } - return STATUS_SUCCESS; + if (SetWaitEvent) SetEvent(Console->InputBuffer.ActiveEvent); + +Done: + if (NumEventsWritten) *NumEventsWritten = i; + + return Status; } -NTSTATUS FASTCALL + +ULONG +PreprocessInput(PCONSOLE Console, + PINPUT_RECORD InputEvent, + ULONG NumEventsToWrite); +VOID +PostprocessInput(PCONSOLE Console); + +NTSTATUS +ConioAddInputEvents(PCONSOLE Console, + PINPUT_RECORD InputRecords, // InputEvent + ULONG NumEventsToWrite, + PULONG NumEventsWritten, + BOOLEAN AppendToEnd) +{ + NTSTATUS Status = STATUS_SUCCESS; + + if (NumEventsWritten) *NumEventsWritten = 0; + + /* + * This pre-processing code MUST be IN consrv ONLY!! + */ + NumEventsToWrite = PreprocessInput(Console, InputRecords, NumEventsToWrite); + if (NumEventsToWrite == 0) return STATUS_SUCCESS; + + Status = ConDrvAddInputEvents(Console, + InputRecords, + NumEventsToWrite, + NumEventsWritten, + AppendToEnd); + + /* + * This post-processing code MUST be IN consrv ONLY!! + */ + // if (NT_SUCCESS(Status)) + if (Status == STATUS_SUCCESS) PostprocessInput(Console); + + return Status; +} + +/* Move elsewhere...*/ +NTSTATUS ConioProcessInputEvent(PCONSOLE Console, PINPUT_RECORD InputEvent) { - return ConioAddInputEvent(Console, InputEvent, TRUE); + ULONG NumEventsWritten; + return ConioAddInputEvents(Console, + InputEvent, + 1, + &NumEventsWritten, + TRUE); } -VOID FASTCALL + +VOID PurgeInputBuffer(PCONSOLE Console) { PLIST_ENTRY CurrentEntry; @@ -154,88 +288,13 @@ PurgeInputBuffer(PCONSOLE Console) CloseHandle(Console->InputBuffer.ActiveEvent); } -/* - * This function explicitely references Console->ActiveBuffer - * (and also makes use of keyboard functions...). - * It is possible that it will move into frontends... - */ -VOID NTAPI -ConDrvProcessKey(IN PCONSOLE Console, - IN BOOLEAN Down, - IN UINT VirtualKeyCode, - IN UINT VirtualScanCode, - IN WCHAR UnicodeChar, - IN ULONG ShiftState, - IN BYTE KeyStateCtrl) -{ - INPUT_RECORD er; - - /* process Ctrl-C and Ctrl-Break */ - if ( Console->InputBuffer.Mode & ENABLE_PROCESSED_INPUT && - Down && (VirtualKeyCode == VK_PAUSE || VirtualKeyCode == 'C') && - (ShiftState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) || KeyStateCtrl & 0x80) ) - { - DPRINT1("Console_Api Ctrl-C\n"); - ConDrvConsoleProcessCtrlEvent(Console, 0, CTRL_C_EVENT); - - if (Console->LineBuffer && !Console->LineComplete) - { - /* Line input is in progress; end it */ - Console->LinePos = Console->LineSize = 0; - Console->LineComplete = TRUE; - } - return; - } - - if ( (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) != 0 && - (VK_UP == VirtualKeyCode || VK_DOWN == VirtualKeyCode) ) - { - if (!Down) return; - - /* scroll up or down */ - if (VK_UP == VirtualKeyCode) - { - /* only scroll up if there is room to scroll up into */ - if (Console->ActiveBuffer->CursorPosition.Y != Console->ActiveBuffer->ScreenBufferSize.Y - 1) - { - Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + - Console->ActiveBuffer->ScreenBufferSize.Y - 1) % - Console->ActiveBuffer->ScreenBufferSize.Y; - Console->ActiveBuffer->CursorPosition.Y++; - } - } - else - { - /* only scroll down if there is room to scroll down into */ - if (Console->ActiveBuffer->CursorPosition.Y != 0) - { - Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) % - Console->ActiveBuffer->ScreenBufferSize.Y; - Console->ActiveBuffer->CursorPosition.Y--; - } - } - - ConioDrawConsole(Console); - return; - } - - er.EventType = KEY_EVENT; - er.Event.KeyEvent.bKeyDown = Down; - er.Event.KeyEvent.wRepeatCount = 1; - er.Event.KeyEvent.wVirtualKeyCode = VirtualKeyCode; - er.Event.KeyEvent.wVirtualScanCode = VirtualScanCode; - er.Event.KeyEvent.uChar.UnicodeChar = UnicodeChar; - er.Event.KeyEvent.dwControlKeyState = ShiftState; - - ConioProcessInputEvent(Console, &er); -} - /* PUBLIC DRIVER APIS *********************************************************/ NTSTATUS NTAPI ConDrvReadConsole(IN PCONSOLE Console, IN PCONSOLE_INPUT_BUFFER InputBuffer, + /**/IN PUNICODE_STRING ExeName /**/OPTIONAL/**/,/**/ IN BOOLEAN Unicode, OUT PVOID Buffer, IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl, @@ -256,8 +315,7 @@ ConDrvReadConsole(IN PCONSOLE Console, /* Validity checks */ ASSERT(Console == InputBuffer->Header.Console); - ASSERT( (Buffer != NULL && NumCharsToRead >= 0) || - (Buffer == NULL && NumCharsToRead == 0) ); + ASSERT((Buffer != NULL) || (Buffer == NULL && NumCharsToRead == 0)); /* We haven't read anything (yet) */ @@ -268,17 +326,15 @@ ConDrvReadConsole(IN PCONSOLE Console, if (Console->LineBuffer == NULL) { /* Starting a new line */ - Console->LineMaxSize = (WORD)max(256, NumCharsToRead); + Console->LineMaxSize = max(256, NumCharsToRead); Console->LineBuffer = ConsoleAllocHeap(0, Console->LineMaxSize * sizeof(WCHAR)); if (Console->LineBuffer == NULL) return STATUS_NO_MEMORY; - Console->LineComplete = FALSE; - Console->LineUpPressed = FALSE; + Console->LinePos = Console->LineSize = ReadControl->nInitialChars; + Console->LineComplete = Console->LineUpPressed = FALSE; Console->LineInsertToggle = Console->InsertMode; Console->LineWakeupMask = ReadControl->dwCtrlWakeupMask; - Console->LineSize = ReadControl->nInitialChars; - Console->LinePos = Console->LineSize; /* * Pre-filling the buffer is only allowed in the Unicode API, @@ -307,7 +363,8 @@ ConDrvReadConsole(IN PCONSOLE Console, if (Input->InputEvent.EventType == KEY_EVENT && Input->InputEvent.Event.KeyEvent.bKeyDown) { - LineInputKeyDown(Console, &Input->InputEvent.Event.KeyEvent); + LineInputKeyDown(Console, ExeName, + &Input->InputEvent.Event.KeyEvent); ReadControl->dwControlKeyState = Input->InputEvent.Event.KeyEvent.dwControlKeyState; } ConsoleFreeHeap(Input); @@ -378,6 +435,7 @@ ConDrvReadConsole(IN PCONSOLE Console, } } + // FIXME: Only set if Status == STATUS_SUCCESS ??? if (NumCharsRead) *NumCharsRead = i; return Status; @@ -402,11 +460,9 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, /* Validity checks */ ASSERT(Console == InputBuffer->Header.Console); - ASSERT( (InputRecord != NULL && NumEventsToRead >= 0) || - (InputRecord == NULL && NumEventsToRead == 0) ); + ASSERT((InputRecord != NULL) || (InputRecord == NULL && NumEventsToRead == 0)); - // Do NOT do that !! Use the existing number of events already read, if any... - // if (NumEventsRead) *NumEventsRead = 0; + if (NumEventsRead) *NumEventsRead = 0; if (IsListEmpty(&InputBuffer->InputEvents)) { @@ -419,19 +475,13 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, /* Only get input if there is any */ CurrentInput = InputBuffer->InputEvents.Flink; - if (NumEventsRead) i = *NumEventsRead; // We will read the remaining events... - + i = 0; while ((CurrentInput != &InputBuffer->InputEvents) && (i < NumEventsToRead)) { Input = CONTAINING_RECORD(CurrentInput, ConsoleInput, ListEntry); *InputRecord = Input->InputEvent; - if (!Unicode) - { - ConioInputEventToAnsi(InputBuffer->Header.Console, InputRecord); - } - ++InputRecord; ++i; CurrentInput = CurrentInput->Flink; @@ -446,6 +496,15 @@ ConDrvGetConsoleInput(IN PCONSOLE Console, if (NumEventsRead) *NumEventsRead = i; + /* Now translate everything to ANSI */ + if (!Unicode) + { + for (; i > 0; --i) + { + ConioInputEventToAnsi(InputBuffer->Header.Console, --InputRecord); + } + } + if (IsListEmpty(&InputBuffer->InputEvents)) { ResetEvent(InputBuffer->ActiveEvent); @@ -472,23 +531,26 @@ ConDrvWriteConsoleInput(IN PCONSOLE Console, /* Validity checks */ ASSERT(Console == InputBuffer->Header.Console); - ASSERT( (InputRecord != NULL && NumEventsToWrite >= 0) || - (InputRecord == NULL && NumEventsToWrite == 0) ); + ASSERT((InputRecord != NULL) || (InputRecord == NULL && NumEventsToWrite == 0)); - // Do NOT do that !! Use the existing number of events already written, if any... - // if (NumEventsWritten) *NumEventsWritten = 0; - - for (i = (NumEventsWritten ? *NumEventsWritten : 0); i < NumEventsToWrite && NT_SUCCESS(Status); ++i) + /* First translate everything to UNICODE */ + if (!Unicode) { - if (!Unicode) + for (i = 0; i < NumEventsToWrite; ++i) { - ConioInputEventToUnicode(Console, InputRecord); + ConioInputEventToUnicode(Console, &InputRecord[i]); } - - Status = ConioAddInputEvent(Console, InputRecord++, AppendToEnd); } - if (NumEventsWritten) *NumEventsWritten = i; + /* Now, add the events */ + // if (NumEventsWritten) *NumEventsWritten = 0; + // ConDrvAddInputEvents + Status = ConioAddInputEvents(Console, + InputRecord, + NumEventsToWrite, + NumEventsWritten, + AppendToEnd); + // if (NumEventsWritten) *NumEventsWritten = i; return Status; } diff --git a/win32ss/user/winsrv/consrv/condrv/conoutput.c b/win32ss/user/winsrv/consrv/condrv/conoutput.c index 6da44a814aa..42d5cbfdb36 100644 --- a/win32ss/user/winsrv/consrv/condrv/conoutput.c +++ b/win32ss/user/winsrv/consrv/condrv/conoutput.c @@ -34,6 +34,7 @@ GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer); NTSTATUS CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN OUT PCONSOLE Console, + IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN SIZE_T Size) { if (Buffer == NULL || Console == NULL) @@ -44,7 +45,7 @@ CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, /* Initialize the header with the default type */ ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console); - (*Buffer)->Vtbl = NULL; + (*Buffer)->Vtbl = Vtbl; return STATUS_SUCCESS; } @@ -74,7 +75,7 @@ CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer) } // ConDrvCreateConsoleScreenBuffer -NTSTATUS FASTCALL +NTSTATUS ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN OUT PCONSOLE Console, IN ULONG BufferType, @@ -151,7 +152,7 @@ ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer) CONSOLE_SCREEN_BUFFER_Destroy(Buffer); } -VOID FASTCALL +VOID ConioDrawConsole(PCONSOLE Console) { SMALL_RECT Region; @@ -159,7 +160,8 @@ ConioDrawConsole(PCONSOLE Console) if (ActiveBuffer) { - ConioInitRect(&Region, 0, 0, ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1); + ConioInitRect(&Region, 0, 0, + ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1); TermDrawRegion(Console, &Region); } } diff --git a/win32ss/user/winsrv/consrv/condrv/console.c b/win32ss/user/winsrv/consrv/condrv/console.c index 47c1e2aea9b..b0f7099cc6a 100644 --- a/win32ss/user/winsrv/consrv/condrv/console.c +++ b/win32ss/user/winsrv/consrv/condrv/console.c @@ -12,20 +12,18 @@ #include -#include #include #define NDEBUG #include -// FIXME: Add this prototype to winternl.h / rtlfuncs.h / ... -NTSTATUS NTAPI RtlGetLastNtStatus(VOID); - /* GLOBALS ********************************************************************/ -static ULONG ConsoleListSize; -static PCONSOLE* ConsoleList; /* The list of all the allocated consoles */ +static ULONG CurrentConsoleID = 0; + +/* Linked list of consoles */ +static LIST_ENTRY ConsoleList; static RTL_RESOURCE ListLock; #define ConDrvLockConsoleListExclusive() \ @@ -37,6 +35,47 @@ static RTL_RESOURCE ListLock; #define ConDrvUnlockConsoleList() \ RtlReleaseResource(&ListLock) + +static NTSTATUS +InsertConsole(IN PCONSOLE Console) +{ + ASSERT(Console); + + /* All went right, so add the console to the list */ + ConDrvLockConsoleListExclusive(); + + DPRINT1("Insert in the list\n"); + InsertTailList(&ConsoleList, &Console->ListEntry); + + // FIXME: Move this code to the caller function!! + /* Get a new console ID */ + _InterlockedExchange((PLONG)&Console->ConsoleID, CurrentConsoleID); + _InterlockedIncrement((PLONG)&CurrentConsoleID); + + /* Unlock the console list and return success */ + ConDrvUnlockConsoleList(); + return STATUS_SUCCESS; +} + +static NTSTATUS +RemoveConsole(IN PCONSOLE Console) +{ + // ASSERT(Console); + if (!Console) return STATUS_INVALID_PARAMETER; + + /* Remove the console from the list */ + ConDrvLockConsoleListExclusive(); + + RemoveEntryList(&Console->ListEntry); + + /* Unlock the console list and return success */ + ConDrvUnlockConsoleList(); + return STATUS_SUCCESS; +} + + +/* PRIVATE FUNCTIONS **********************************************************/ + // Adapted from reactos/lib/rtl/unicode.c, RtlCreateUnicodeString line 2180 static BOOLEAN ConsoleCreateUnicodeString(IN OUT PUNICODE_STRING UniDest, @@ -66,219 +105,21 @@ ConsoleFreeUnicodeString(IN PUNICODE_STRING UnicodeString) } } - -static NTSTATUS -InsertConsole(OUT PHANDLE Handle, - IN PCONSOLE Console) +VOID NTAPI +ConDrvPause(PCONSOLE Console) { -#define CONSOLE_HANDLES_INCREMENT 2 * 3 - - NTSTATUS Status = STATUS_SUCCESS; - ULONG i = 0; - PCONSOLE* Block; - - ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || - (ConsoleList != NULL && ConsoleListSize != 0) ); - - /* All went right, so add the console to the list */ - ConDrvLockConsoleListExclusive(); - DPRINT1("Insert in the list\n"); - - if (ConsoleList) - { - for (i = 0; i < ConsoleListSize; i++) - { - if (ConsoleList[i] == NULL) break; - } - } - - if (i >= ConsoleListSize) - { - DPRINT1("Creation of a new handles table\n"); - /* Allocate a new handles table */ - Block = ConsoleAllocHeap(HEAP_ZERO_MEMORY, - (ConsoleListSize + - CONSOLE_HANDLES_INCREMENT) * sizeof(PCONSOLE)); - if (Block == NULL) - { - Status = STATUS_UNSUCCESSFUL; - goto Quit; - } - - /* If we previously had a handles table, free it and use the new one */ - if (ConsoleList) - { - /* Copy the handles from the old table to the new one */ - RtlCopyMemory(Block, - ConsoleList, - ConsoleListSize * sizeof(PCONSOLE)); - ConsoleFreeHeap(ConsoleList); - } - ConsoleList = Block; - ConsoleListSize += CONSOLE_HANDLES_INCREMENT; - } - - ConsoleList[i] = Console; - *Handle = ULongToHandle((i << 2) | 0x3); - -Quit: - /* Unlock the console list and return status */ - ConDrvUnlockConsoleList(); - return Status; -} - -/* Unused */ -#if 0 -static NTSTATUS -RemoveConsoleByHandle(IN HANDLE Handle) -{ - NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE Console; - - BOOLEAN ValidHandle = ((HandleToULong(Handle) & 0x3) == 0x3); - ULONG Index = HandleToULong(Handle) >> 2; - - if (!ValidHandle) return STATUS_INVALID_HANDLE; - - ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || - (ConsoleList != NULL && ConsoleListSize != 0) ); - - /* Remove the console from the list */ - ConDrvLockConsoleListExclusive(); - - if (Index >= ConsoleListSize || - (Console = ConsoleList[Index]) == NULL) - { - Status = STATUS_INVALID_HANDLE; - goto Quit; - } - - ConsoleList[Index] = NULL; - -Quit: - /* Unlock the console list and return status */ - ConDrvUnlockConsoleList(); - return Status; -} -#endif - -static NTSTATUS -RemoveConsoleByPointer(IN PCONSOLE Console) -{ - ULONG i = 0; - - if (!Console) return STATUS_INVALID_PARAMETER; - - ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || - (ConsoleList != NULL && ConsoleListSize != 0) ); - - /* Remove the console from the list */ - ConDrvLockConsoleListExclusive(); - - if (ConsoleList) - { - for (i = 0; i < ConsoleListSize; i++) - { - if (ConsoleList[i] == Console) ConsoleList[i] = NULL; - } - } - - /* Unlock the console list */ - ConDrvUnlockConsoleList(); - - return STATUS_SUCCESS; -} - - -/* For resetting the frontend - defined in dummyfrontend.c */ -VOID ResetFrontEnd(IN PCONSOLE Console); - - -/* PRIVATE FUNCTIONS **********************************************************/ - -static NTSTATUS -ConDrvConsoleCtrlEventTimeout(IN ULONG CtrlEvent, - IN PCONSOLE_PROCESS_DATA ProcessData, - IN ULONG Timeout) -{ - NTSTATUS Status = STATUS_SUCCESS; - - DPRINT("ConDrvConsoleCtrlEventTimeout Parent ProcessId = %x\n", ProcessData->Process->ClientId.UniqueProcess); - - if (ProcessData->CtrlDispatcher) - { - _SEH2_TRY - { - HANDLE Thread = NULL; - - _SEH2_TRY - { - Thread = CreateRemoteThread(ProcessData->Process->ProcessHandle, NULL, 0, - ProcessData->CtrlDispatcher, - UlongToPtr(CtrlEvent), 0, NULL); - if (NULL == Thread) - { - Status = RtlGetLastNtStatus(); - DPRINT1("Failed thread creation, Status = 0x%08lx\n", Status); - } - else - { - DPRINT("ProcessData->CtrlDispatcher remote thread creation succeeded, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process); - WaitForSingleObject(Thread, Timeout); - } - } - _SEH2_FINALLY - { - CloseHandle(Thread); - } - _SEH2_END; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - DPRINT1("ConDrvConsoleCtrlEventTimeout - Caught an exception, Status = 0x%08lx\n", Status); - } - _SEH2_END; - } - - return Status; -} - -NTSTATUS -ConDrvConsoleCtrlEvent(IN ULONG CtrlEvent, - IN PCONSOLE_PROCESS_DATA ProcessData) -{ - return ConDrvConsoleCtrlEventTimeout(CtrlEvent, ProcessData, 0); -} - -VOID FASTCALL -ConioPause(PCONSOLE Console, UINT Flags) -{ - Console->PauseFlags |= Flags; if (!Console->UnpauseEvent) Console->UnpauseEvent = CreateEvent(NULL, TRUE, FALSE, NULL); } -VOID FASTCALL -ConioUnpause(PCONSOLE Console, UINT Flags) +VOID NTAPI +ConDrvUnpause(PCONSOLE Console) { - Console->PauseFlags &= ~Flags; - - // if ((Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION)) == 0) - if (Console->PauseFlags == 0 && Console->UnpauseEvent) + if (Console->UnpauseEvent) { SetEvent(Console->UnpauseEvent); CloseHandle(Console->UnpauseEvent); Console->UnpauseEvent = NULL; - - CsrNotifyWait(&Console->WriteWaitQueue, - TRUE, - NULL, - NULL); - if (!IsListEmpty(&Console->WriteWaitQueue)) - { - CsrDereferenceWait(&Console->WriteWaitQueue); - } } } @@ -326,103 +167,6 @@ ConDrvValidateConsoleUnsafe(IN PCONSOLE Console, return TRUE; } -BOOLEAN NTAPI -ConDrvValidateConsole(OUT PCONSOLE* Console, - IN HANDLE ConsoleHandle, - IN CONSOLE_STATE ExpectedState, - IN BOOLEAN LockConsole) -{ - BOOLEAN RetVal = FALSE; - PCONSOLE ValidatedConsole; - - BOOLEAN ValidHandle = ((HandleToULong(ConsoleHandle) & 0x3) == 0x3); - ULONG Index = HandleToULong(ConsoleHandle) >> 2; - - if (!ValidHandle) return FALSE; - - if (!Console) return FALSE; - *Console = NULL; - - /* - * Forbid creation or deletion of consoles when - * checking for the existence of a console. - */ - ConDrvLockConsoleListShared(); - - if (Index >= ConsoleListSize || - (ValidatedConsole = ConsoleList[Index]) == NULL) - { - /* Unlock the console list */ - ConDrvUnlockConsoleList(); - - return FALSE; - } - - ValidatedConsole = ConsoleList[Index]; - - /* Unlock the console list and return */ - ConDrvUnlockConsoleList(); - - RetVal = ConDrvValidateConsoleUnsafe(ValidatedConsole, - ExpectedState, - LockConsole); - if (RetVal) *Console = ValidatedConsole; - - return RetVal; -} - -NTSTATUS NTAPI -ConDrvGetConsole(OUT PCONSOLE* Console, - IN HANDLE ConsoleHandle, - IN BOOLEAN LockConsole) -{ - NTSTATUS Status = STATUS_INVALID_HANDLE; - PCONSOLE GrabConsole; - - if (Console == NULL) return STATUS_INVALID_PARAMETER; - *Console = NULL; - - if (ConDrvValidateConsole(&GrabConsole, - ConsoleHandle, - CONSOLE_RUNNING, - LockConsole)) - { - InterlockedIncrement(&GrabConsole->ReferenceCount); - *Console = GrabConsole; - Status = STATUS_SUCCESS; - } - - return Status; -} - -VOID NTAPI -ConDrvReleaseConsole(IN PCONSOLE Console, - IN BOOLEAN WasConsoleLocked) -{ - LONG RefCount = 0; - - if (!Console) return; - // if (Console->ReferenceCount == 0) return; // This shouldn't happen - ASSERT(Console->ReferenceCount > 0); - - /* The console must be locked */ - // ASSERT(Console_locked); - - /* - * Decrement the reference count. Save the new value too, - * because Console->ReferenceCount might be modified after - * the console gets unlocked but before we check whether we - * can destroy it. - */ - RefCount = _InterlockedDecrement(&Console->ReferenceCount); - - /* Unlock the console if needed */ - if (WasConsoleLocked) LeaveCriticalSection(&Console->Lock); - - /* Delete the console if needed */ - if (RefCount <= 0) ConDrvDeleteConsole(Console); -} - /* CONSOLE INITIALIZATION FUNCTIONS *******************************************/ @@ -432,93 +176,44 @@ ConDrvInitConsoleSupport(VOID) DPRINT("CONSRV: ConDrvInitConsoleSupport()\n"); /* Initialize the console list and its lock */ - ConsoleListSize = 0; - ConsoleList = NULL; + InitializeListHead(&ConsoleList); RtlInitializeResource(&ListLock); /* Should call LoadKeyboardLayout */ } +/* For resetting the terminal - defined in dummyterm.c */ +VOID ResetTerminal(IN PCONSOLE Console); + NTSTATUS NTAPI -ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, - OUT PCONSOLE* NewConsole, - IN PCONSOLE_INFO ConsoleInfo, - IN ULONG ConsoleLeaderProcessId) +ConDrvInitConsole(OUT PCONSOLE* NewConsole, + IN PCONSOLE_INFO ConsoleInfo) { NTSTATUS Status; SECURITY_ATTRIBUTES SecurityAttributes; // CONSOLE_INFO CapturedConsoleInfo; TEXTMODE_BUFFER_INFO ScreenBufferInfo; - HANDLE ConsoleHandle; PCONSOLE Console; PCONSOLE_SCREEN_BUFFER NewBuffer; - // WCHAR DefaultTitle[128]; +#if 0 + WCHAR DefaultTitle[128]; +#endif - if (NewConsoleHandle == NULL || NewConsole == NULL || ConsoleInfo == NULL) + if (NewConsole == NULL || ConsoleInfo == NULL) return STATUS_INVALID_PARAMETER; - *NewConsoleHandle = NULL; *NewConsole = NULL; /* - * Allocate a console structure + * Allocate a new console */ - Console = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(CONSOLE)); + Console = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(*Console)); if (NULL == Console) { DPRINT1("Not enough memory for console creation.\n"); return STATUS_NO_MEMORY; } - /* - * Load the console settings - */ - - /* 1. Load the default settings */ - // ConSrvGetDefaultSettings(ConsoleInfo, ProcessId); - - // /* 2. Get the title of the console (initialize ConsoleInfo.ConsoleTitle) */ - // Length = min(wcslen(ConsoleStartInfo->ConsoleTitle), - // sizeof(ConsoleInfo.ConsoleTitle) / sizeof(ConsoleInfo.ConsoleTitle[0]) - 1); - // wcsncpy(ConsoleInfo.ConsoleTitle, ConsoleStartInfo->ConsoleTitle, Length); - // ConsoleInfo.ConsoleTitle[Length] = L'\0'; - - /* - * 4. Load the remaining console settings via the registry. - */ -#if 0 - if ((ConsoleStartInfo->dwStartupFlags & STARTF_TITLEISLINKNAME) == 0) - { - /* - * Either we weren't created by an app launched via a shell-link, - * or we failed to load shell-link console properties. - * Therefore, load the console infos for the application from the registry. - */ - ConSrvReadUserSettings(ConsoleInfo, ProcessId); - - /* - * Now, update them with the properties the user might gave to us - * via the STARTUPINFO structure before calling CreateProcess - * (and which was transmitted via the ConsoleStartInfo structure). - * We therefore overwrite the values read in the registry. - */ - if (ConsoleStartInfo->dwStartupFlags & STARTF_USEFILLATTRIBUTE) - { - ConsoleInfo->ScreenAttrib = (USHORT)ConsoleStartInfo->FillAttribute; - } - if (ConsoleStartInfo->dwStartupFlags & STARTF_USECOUNTCHARS) - { - ConsoleInfo->ScreenBufferSize = ConsoleStartInfo->ScreenBufferSize; - } - if (ConsoleStartInfo->dwStartupFlags & STARTF_USESIZE) - { - // ConsoleInfo->ConsoleSize = ConsoleStartInfo->ConsoleWindowSize; - ConsoleInfo->ConsoleSize.X = (SHORT)ConsoleStartInfo->ConsoleWindowSize.cx; - ConsoleInfo->ConsoleSize.Y = (SHORT)ConsoleStartInfo->ConsoleWindowSize.cy; - } - } -#endif - /* * Fix the screen buffer size if needed. The rule is: * ScreenBufferSize >= ConsoleSize @@ -534,16 +229,13 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, Console->State = CONSOLE_INITIALIZING; Console->ReferenceCount = 0; InitializeCriticalSection(&Console->Lock); - InitializeListHead(&Console->ProcessList); - Console->NotifiedLastCloseProcess = NULL; - Console->NotifyLastClose = FALSE; - /* Initialize the frontend interface */ - ResetFrontEnd(Console); + /* 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 front-ends if needed. + Console->FixedSize = FALSE; // Value by default; is reseted by the terminals if needed. /* * Initialize the input buffer @@ -563,20 +255,18 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, Console->InputBuffer.InputBufferSize = 0; // FIXME! InitializeListHead(&Console->InputBuffer.InputEvents); - InitializeListHead(&Console->InputBuffer.ReadWaitQueue); Console->InputBuffer.Mode = ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_MOUSE_INPUT; - Console->QuickEdit = ConsoleInfo->QuickEdit; Console->InsertMode = ConsoleInfo->InsertMode; Console->LineBuffer = NULL; - Console->LineMaxSize = Console->LineSize = Console->LinePos = 0; + Console->LinePos = Console->LineMaxSize = Console->LineSize = 0; Console->LineComplete = Console->LineUpPressed = FALSE; Console->LineInsertToggle = Console->InsertMode; // LineWakeupMask /* Set-up the code page */ - Console->CodePage = Console->OutputCodePage = ConsoleInfo->CodePage; + Console->InputCodePage = Console->OutputCodePage = ConsoleInfo->CodePage; /* Initialize a new text-mode screen buffer with default settings */ ScreenBufferInfo.ScreenBufferSize = ConsoleInfo->ScreenBufferSize; @@ -600,44 +290,34 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, } /* Make the new screen buffer active */ Console->ActiveBuffer = NewBuffer; - InitializeListHead(&Console->WriteWaitQueue); - Console->PauseFlags = 0; Console->UnpauseEvent = NULL; - /* - * Initialize the alias and history buffers - */ - Console->Aliases = NULL; - InitializeListHead(&Console->HistoryBuffers); - Console->HistoryBufferSize = ConsoleInfo->HistoryBufferSize; - Console->NumberOfHistoryBuffers = ConsoleInfo->NumberOfHistoryBuffers; - Console->HistoryNoDup = ConsoleInfo->HistoryNoDup; - /* Initialize the console title */ ConsoleCreateUnicodeString(&Console->OriginalTitle, ConsoleInfo->ConsoleTitle); - // if (ConsoleInfo.ConsoleTitle[0] == L'\0') - // { - // if (LoadStringW(ConSrvDllInstance, IDS_CONSOLE_TITLE, DefaultTitle, sizeof(DefaultTitle) / sizeof(DefaultTitle[0]))) - // { - // ConsoleCreateUnicodeString(&Console->Title, DefaultTitle); - // } - // else - // { - // ConsoleCreateUnicodeString(&Console->Title, L"ReactOS Console"); - // } - // } - // else - // { +#if 0 + if (ConsoleInfo.ConsoleTitle[0] == L'\0') + { + if (LoadStringW(ConSrvDllInstance, IDS_CONSOLE_TITLE, DefaultTitle, sizeof(DefaultTitle) / sizeof(DefaultTitle[0]))) + { + ConsoleCreateUnicodeString(&Console->Title, DefaultTitle); + } + else + { + ConsoleCreateUnicodeString(&Console->Title, L"ReactOS Console"); + } + } + else + { +#endif ConsoleCreateUnicodeString(&Console->Title, ConsoleInfo->ConsoleTitle); - // } - - /* Lock the console until its initialization is finished */ - // EnterCriticalSection(&Console->Lock); +#if 0 + } +#endif DPRINT("Console initialized\n"); /* All went right, so add the console to the list */ - Status = InsertConsole(&ConsoleHandle, Console); + Status = InsertConsole(Console); if (!NT_SUCCESS(Status)) { /* Fail */ @@ -649,73 +329,69 @@ ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, DPRINT("Change state\n"); Console->State = CONSOLE_RUNNING; - /* Unlock the console */ - // LeaveCriticalSection(&Console->Lock); - /* Return the newly created console to the caller and a success code too */ - *NewConsoleHandle = ConsoleHandle; - *NewConsole = Console; + *NewConsole = Console; return STATUS_SUCCESS; } NTSTATUS NTAPI -ConDrvRegisterFrontEnd(IN PCONSOLE Console, - IN PFRONTEND FrontEnd) +ConDrvRegisterTerminal(IN PCONSOLE Console, + IN PTERMINAL Terminal) { NTSTATUS Status; - if (Console == NULL || FrontEnd == NULL) + if (Console == NULL || Terminal == NULL) return STATUS_INVALID_PARAMETER; /* FIXME: Lock the console before ?? */ /* - * Attach the frontend to the console. Use now the TermIFace of the console, - * and not the user-defined temporary FrontEnd pointer. + * Attach the terminal to the console. Use now the TermIFace of the console, + * and not the user-defined temporary Terminal pointer. */ - Console->TermIFace = *FrontEnd; + Console->TermIFace = *Terminal; Console->TermIFace.Console = Console; - /* Initialize the frontend AFTER having attached it to the console */ - DPRINT("Finish initialization of frontend\n"); - Status = Console->TermIFace.Vtbl->InitFrontEnd(&Console->TermIFace, Console); + /* Initialize the terminal AFTER having attached it to the console */ + DPRINT("Finish initialization of terminal\n"); + Status = Console->TermIFace.Vtbl->InitTerminal(&Console->TermIFace, Console); if (!NT_SUCCESS(Status)) { - DPRINT1("FrontEnd initialization failed, Status = 0x%08lx\n", Status); + DPRINT1("Terminal initialization failed, Status = 0x%08lx\n", Status); - /* We failed, detach the frontend from the console */ - FrontEnd->Console = NULL; // For the caller - ResetFrontEnd(Console); + /* We failed, detach the terminal from the console */ + Terminal->Console = NULL; // For the caller + ResetTerminal(Console); return Status; } /* Copy buffer contents to screen */ - // FrontEnd.Draw(); + // Terminal.Draw(); // ConioDrawConsole(Console); DPRINT("Console drawn\n"); - DPRINT("Terminal FrontEnd initialization done\n"); + DPRINT("Terminal initialization done\n"); return STATUS_SUCCESS; } NTSTATUS NTAPI -ConDrvDeregisterFrontEnd(IN PCONSOLE Console) +ConDrvDeregisterTerminal(IN PCONSOLE Console) { if (Console == NULL) return STATUS_INVALID_PARAMETER; /* FIXME: Lock the console before ?? */ - /* Deinitialize the frontend BEFORE detaching it from the console */ - Console->TermIFace.Vtbl->DeinitFrontEnd(&Console->TermIFace/*, Console*/); + /* Deinitialize the terminal BEFORE detaching it from the console */ + Console->TermIFace.Vtbl->DeinitTerminal(&Console->TermIFace/*, Console*/); /* - * Detach the frontend from the console: - * reinitialize the frontend interface. + * Detach the terminal from the console: + * reinitialize the terminal interface. */ - ResetFrontEnd(Console); + ResetTerminal(Console); - DPRINT("Terminal FrontEnd unregistered\n"); + DPRINT("Terminal unregistered\n"); return STATUS_SUCCESS; } @@ -752,7 +428,7 @@ ConDrvDeleteConsole(IN PCONSOLE Console) /* * Allow other threads to finish their job: basically, unlock * all other calls to EnterCriticalSection(&Console->Lock); by - * ConDrvValidateConsole(Unsafe) functions so that they just see + * ConDrvValidateConsoleUnsafe functions so that they just see * that we are not in CONSOLE_RUNNING state anymore, or unlock * other concurrent calls to ConDrvDeleteConsole so that they * can see that we are in fact already deleting the console. @@ -764,7 +440,7 @@ ConDrvDeleteConsole(IN PCONSOLE Console) /* Cleanup the UI-oriented part */ DPRINT("Deregister console\n"); - ConDrvDeregisterFrontEnd(Console); + ConDrvDeregisterTerminal(Console); DPRINT("Console deregistered\n"); /*** @@ -788,16 +464,13 @@ ConDrvDeleteConsole(IN PCONSOLE Console) Console->ReferenceCount = 0; /* Remove the console from the list */ - RemoveConsoleByPointer(Console); + RemoveConsole(Console); /* Discard all entries in the input event queue */ PurgeInputBuffer(Console); - if (Console->LineBuffer) ConsoleFreeHeap(Console->LineBuffer); - IntDeleteAllAliases(Console); - HistoryDeleteBuffers(Console); - + /* Delete the last screen buffer */ ConioDeleteScreenBuffer(Console->ActiveBuffer); Console->ActiveBuffer = NULL; if (!IsListEmpty(&Console->BufferList)) @@ -983,7 +656,7 @@ ConDrvGetConsoleTitle(IN PCONSOLE Console, if (*BufLength >= sizeof(CHAR)) { Length = min(*BufLength - sizeof(CHAR), Console->Title.Length / sizeof(WCHAR)); - Length = WideCharToMultiByte(Console->CodePage, 0, + Length = WideCharToMultiByte(Console->InputCodePage, 0, Console->Title.Buffer, Length, TitleBuffer, Length, NULL, NULL); @@ -1019,7 +692,7 @@ ConDrvSetConsoleTitle(IN PCONSOLE Console, else { /* Use the console input CP for the conversion */ - Length = MultiByteToWideChar(Console->CodePage, 0, + Length = MultiByteToWideChar(Console->InputCodePage, 0, TitleBuffer, BufLength, NULL, 0); /* The returned Length was in number of wchars, convert it in bytes */ @@ -1044,7 +717,7 @@ ConDrvSetConsoleTitle(IN PCONSOLE Console, } else { - MultiByteToWideChar(Console->CodePage, 0, + MultiByteToWideChar(Console->InputCodePage, 0, TitleBuffer, BufLength, Console->Title.Buffer, Console->Title.Length / sizeof(WCHAR)); @@ -1065,7 +738,7 @@ ConDrvGetConsoleCP(IN PCONSOLE Console, if (Console == NULL || CodePage == NULL) return STATUS_INVALID_PARAMETER; - *CodePage = (OutputCP ? Console->OutputCodePage : Console->CodePage); + *CodePage = (OutputCP ? Console->OutputCodePage : Console->InputCodePage); return STATUS_SUCCESS; } @@ -1081,86 +754,9 @@ ConDrvSetConsoleCP(IN PCONSOLE Console, if (OutputCP) Console->OutputCodePage = CodePage; else - Console->CodePage = CodePage; + Console->InputCodePage = CodePage; return STATUS_SUCCESS; } -PCONSOLE_PROCESS_DATA NTAPI -ConDrvGetConsoleLeaderProcess(IN PCONSOLE Console) -{ - if (Console == NULL) return NULL; - - return CONTAINING_RECORD(Console->ProcessList.Blink, - CONSOLE_PROCESS_DATA, - ConsoleLink); -} - -NTSTATUS NTAPI -ConDrvGetConsoleProcessList(IN PCONSOLE Console, - IN OUT PULONG ProcessIdsList, - IN ULONG MaxIdListItems, - OUT PULONG ProcessIdsTotal) -{ - PCONSOLE_PROCESS_DATA current; - PLIST_ENTRY current_entry; - - if (Console == NULL || ProcessIdsList == NULL || ProcessIdsTotal == NULL) - return STATUS_INVALID_PARAMETER; - - *ProcessIdsTotal = 0; - - for (current_entry = Console->ProcessList.Flink; - current_entry != &Console->ProcessList; - current_entry = current_entry->Flink) - { - current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink); - if (++(*ProcessIdsTotal) <= MaxIdListItems) - { - *ProcessIdsList++ = HandleToUlong(current->Process->ClientId.UniqueProcess); - } - } - - return STATUS_SUCCESS; -} - -// ConDrvGenerateConsoleCtrlEvent -NTSTATUS NTAPI -ConDrvConsoleProcessCtrlEvent(IN PCONSOLE Console, - IN ULONG ProcessGroupId, - IN ULONG CtrlEvent) -{ - NTSTATUS Status = STATUS_SUCCESS; - PLIST_ENTRY current_entry; - PCONSOLE_PROCESS_DATA current; - - /* If the console is already being destroyed, just return */ - if (!ConDrvValidateConsoleState(Console, CONSOLE_RUNNING)) - return STATUS_UNSUCCESSFUL; - - /* - * Loop through the process list, from the most recent process - * (the active one) to the oldest one (the first created, i.e. - * the console leader process), and for each, send an event - * (new processes are inserted at the head of the console process list). - */ - current_entry = Console->ProcessList.Flink; - while (current_entry != &Console->ProcessList) - { - current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink); - current_entry = current_entry->Flink; - - /* - * Only processes belonging to the same process group are signaled. - * If the process group ID is zero, then all the processes are signaled. - */ - if (ProcessGroupId == 0 || current->Process->ProcessGroupId == ProcessGroupId) - { - Status = ConDrvConsoleCtrlEvent(CtrlEvent, current); - } - } - - return Status; -} - /* EOF */ diff --git a/win32ss/user/winsrv/consrv/condrv/dummyfrontend.c b/win32ss/user/winsrv/consrv/condrv/dummyfrontend.c deleted file mode 100644 index c96cfe579ff..00000000000 --- a/win32ss/user/winsrv/consrv/condrv/dummyfrontend.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS Console Server DLL - * FILE: win32ss/user/winsrv/consrv/condrv/dummyfrontend.c - * PURPOSE: Dummy Terminal Front-End used when no frontend - * is attached to the specified console. - * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) - */ - -/* INCLUDES *******************************************************************/ - -#include - -/* DUMMY FRONTEND INTERFACE ***************************************************/ - -static NTSTATUS NTAPI -DummyInitFrontEnd(IN OUT PFRONTEND This, - IN PCONSOLE Console) -{ - /* Load some settings ?? */ - return STATUS_SUCCESS; -} - -static VOID NTAPI -DummyDeinitFrontEnd(IN OUT PFRONTEND This) -{ - /* Free some settings ?? */ -} - -static VOID NTAPI -DummyDrawRegion(IN OUT PFRONTEND This, - SMALL_RECT* Region) -{ -} - -static VOID NTAPI -DummyWriteStream(IN OUT PFRONTEND This, - SMALL_RECT* Region, - SHORT CursorStartX, - SHORT CursorStartY, - UINT ScrolledLines, - PWCHAR Buffer, - UINT Length) -{ -} - -static BOOL NTAPI -DummySetCursorInfo(IN OUT PFRONTEND This, - PCONSOLE_SCREEN_BUFFER Buff) -{ - return TRUE; -} - -static BOOL NTAPI -DummySetScreenInfo(IN OUT PFRONTEND This, - PCONSOLE_SCREEN_BUFFER Buff, - SHORT OldCursorX, - SHORT OldCursorY) -{ - return TRUE; -} - -static VOID NTAPI -DummyResizeTerminal(IN OUT PFRONTEND This) -{ -} - -static VOID NTAPI -DummySetActiveScreenBuffer(IN OUT PFRONTEND This) -{ -} - -static VOID NTAPI -DummyReleaseScreenBuffer(IN OUT PFRONTEND This, - IN PCONSOLE_SCREEN_BUFFER ScreenBuffer) -{ -} - -static BOOL NTAPI -DummyProcessKeyCallback(IN OUT PFRONTEND This, - MSG* msg, - BYTE KeyStateMenu, - DWORD ShiftState, - UINT VirtualKeyCode, - BOOL Down) -{ - return FALSE; -} - -static VOID NTAPI -DummyRefreshInternalInfo(IN OUT PFRONTEND This) -{ -} - -static VOID NTAPI -DummyChangeTitle(IN OUT PFRONTEND This) -{ -} - -static BOOL NTAPI -DummyChangeIcon(IN OUT PFRONTEND This, - HICON IconHandle) -{ - return TRUE; -} - -static HWND NTAPI -DummyGetConsoleWindowHandle(IN OUT PFRONTEND This) -{ - return NULL; -} - -static VOID NTAPI -DummyGetLargestConsoleWindowSize(IN OUT PFRONTEND This, - PCOORD pSize) -{ -} - -static BOOL NTAPI -DummyGetSelectionInfo(IN OUT PFRONTEND This, - PCONSOLE_SELECTION_INFO pSelectionInfo) -{ - return TRUE; -} - -static BOOL NTAPI -DummySetPalette(IN OUT PFRONTEND This, - HPALETTE PaletteHandle, - UINT PaletteUsage) -{ - return TRUE; -} - -static ULONG NTAPI -DummyGetDisplayMode(IN OUT PFRONTEND This) -{ - return 0; -} - -static BOOL NTAPI -DummySetDisplayMode(IN OUT PFRONTEND This, - ULONG NewMode) -{ - return TRUE; -} - -static INT NTAPI -DummyShowMouseCursor(IN OUT PFRONTEND This, - BOOL Show) -{ - return 0; -} - -static BOOL NTAPI -DummySetMouseCursor(IN OUT PFRONTEND This, - HCURSOR CursorHandle) -{ - return TRUE; -} - -static HMENU NTAPI -DummyMenuControl(IN OUT PFRONTEND This, - UINT CmdIdLow, - UINT CmdIdHigh) -{ - return NULL; -} - -static BOOL NTAPI -DummySetMenuClose(IN OUT PFRONTEND This, - BOOL Enable) -{ - return TRUE; -} - -static FRONTEND_VTBL DummyVtbl = -{ - DummyInitFrontEnd, - DummyDeinitFrontEnd, - DummyDrawRegion, - DummyWriteStream, - DummySetCursorInfo, - DummySetScreenInfo, - DummyResizeTerminal, - DummySetActiveScreenBuffer, - DummyReleaseScreenBuffer, - DummyProcessKeyCallback, - DummyRefreshInternalInfo, - DummyChangeTitle, - DummyChangeIcon, - DummyGetConsoleWindowHandle, - DummyGetLargestConsoleWindowSize, - DummyGetSelectionInfo, - DummySetPalette, - DummyGetDisplayMode, - DummySetDisplayMode, - DummyShowMouseCursor, - DummySetMouseCursor, - DummyMenuControl, - DummySetMenuClose, -}; - -VOID -ResetFrontEnd(IN PCONSOLE Console) -{ - if (!Console) return; - - /* Reinitialize the frontend interface */ - RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); - Console->TermIFace.Vtbl = &DummyVtbl; -} - -/* EOF */ diff --git a/win32ss/user/winsrv/consrv/condrv/dummyterm.c b/win32ss/user/winsrv/consrv/condrv/dummyterm.c new file mode 100644 index 00000000000..3b38329cfcd --- /dev/null +++ b/win32ss/user/winsrv/consrv/condrv/dummyterm.c @@ -0,0 +1,140 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Console Server DLL + * FILE: condrv/dummyterm.c + * PURPOSE: Dummy Terminal used when no terminal + * is attached to the specified console. + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + +/* INCLUDES *******************************************************************/ + +#include + +/* DUMMY TERMINAL INTERFACE ***************************************************/ + +static NTSTATUS NTAPI +DummyInitTerminal(IN OUT PTERMINAL This, + IN PCONSOLE Console) +{ + return STATUS_SUCCESS; +} + +static VOID NTAPI +DummyDeinitTerminal(IN OUT PTERMINAL This) +{ +} + +static VOID NTAPI +DummyDrawRegion(IN OUT PTERMINAL This, + SMALL_RECT* Region) +{ +} + +static VOID NTAPI +DummyWriteStream(IN OUT PTERMINAL This, + SMALL_RECT* Region, + SHORT CursorStartX, + SHORT CursorStartY, + UINT ScrolledLines, + PWCHAR Buffer, + UINT Length) +{ +} + +static BOOL NTAPI +DummySetCursorInfo(IN OUT PTERMINAL This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer) +{ + return TRUE; +} + +static BOOL NTAPI +DummySetScreenInfo(IN OUT PTERMINAL This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer, + SHORT OldCursorX, + SHORT OldCursorY) +{ + return TRUE; +} + +static VOID NTAPI +DummyResizeTerminal(IN OUT PTERMINAL This) +{ +} + +static VOID NTAPI +DummySetActiveScreenBuffer(IN OUT PTERMINAL This) +{ +} + +static VOID NTAPI +DummyReleaseScreenBuffer(IN OUT PTERMINAL This, + IN PCONSOLE_SCREEN_BUFFER ScreenBuffer) +{ +} + +static VOID NTAPI +DummyChangeTitle(IN OUT PTERMINAL This) +{ +} + +static VOID NTAPI +DummyGetLargestConsoleWindowSize(IN OUT PTERMINAL This, + PCOORD pSize) +{ +} + +/* +static BOOL NTAPI +DummyGetSelectionInfo(IN OUT PTERMINAL This, + PCONSOLE_SELECTION_INFO pSelectionInfo) +{ + return TRUE; +} +*/ + +static BOOL NTAPI +DummySetPalette(IN OUT PTERMINAL This, + HPALETTE PaletteHandle, + UINT PaletteUsage) +{ + return TRUE; +} + +static INT NTAPI +DummyShowMouseCursor(IN OUT PTERMINAL This, + BOOL Show) +{ + return 0; +} + +static TERMINAL_VTBL DummyVtbl = +{ + DummyInitTerminal, + DummyDeinitTerminal, + DummyDrawRegion, + DummyWriteStream, + DummySetCursorInfo, + DummySetScreenInfo, + DummyResizeTerminal, + DummySetActiveScreenBuffer, + DummyReleaseScreenBuffer, + DummyChangeTitle, + DummyGetLargestConsoleWindowSize, + // DummyGetSelectionInfo, + DummySetPalette, + DummyShowMouseCursor, +}; + +VOID +ResetTerminal(IN PCONSOLE Console) +{ + if (!Console) return; + + /* Reinitialize the terminal interface */ + RtlZeroMemory(&Console->TermIFace, sizeof(Console->TermIFace)); + Console->TermIFace.Vtbl = &DummyVtbl; +} + +/* EOF */ diff --git a/win32ss/user/winsrv/consrv/condrv/graphics.c b/win32ss/user/winsrv/consrv/condrv/graphics.c index 3d2805b558f..fbb1491ba65 100644 --- a/win32ss/user/winsrv/consrv/condrv/graphics.c +++ b/win32ss/user/winsrv/consrv/condrv/graphics.c @@ -34,6 +34,7 @@ static CONSOLE_SCREEN_BUFFER_VTBL GraphicsVtbl = NTSTATUS CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN OUT PCONSOLE Console, + IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN SIZE_T Size); VOID CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer); @@ -58,10 +59,10 @@ GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer, Console, + &GraphicsVtbl, sizeof(GRAPHICS_SCREEN_BUFFER)); if (!NT_SUCCESS(Status)) return Status; NewBuffer->Header.Type = GRAPHICS_BUFFER; - NewBuffer->Vtbl = &GraphicsVtbl; /* * Remember the handle to the process so that we can close or unmap diff --git a/win32ss/user/winsrv/consrv/condrv/text.c b/win32ss/user/winsrv/consrv/condrv/text.c index d44c9b39786..96e30035931 100644 --- a/win32ss/user/winsrv/consrv/condrv/text.c +++ b/win32ss/user/winsrv/consrv/condrv/text.c @@ -33,13 +33,14 @@ static CONSOLE_SCREEN_BUFFER_VTBL TextVtbl = }; -static VOID FASTCALL +static VOID ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff); NTSTATUS CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN OUT PCONSOLE Console, + IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN SIZE_T Size); VOID CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer); @@ -60,10 +61,10 @@ TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer, Console, + &TextVtbl, sizeof(TEXTMODE_SCREEN_BUFFER)); if (!NT_SUCCESS(Status)) return Status; NewBuffer->Header.Type = TEXTMODE_BUFFER; - NewBuffer->Vtbl = &TextVtbl; NewBuffer->Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, TextModeInfo->ScreenBufferSize.X * @@ -126,7 +127,7 @@ ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y) return &Buff->Buffer[((Y + Buff->VirtualY) % Buff->ScreenBufferSize.Y) * Buff->ScreenBufferSize.X + X]; } -static VOID FASTCALL +static VOID ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff) { PCHAR_INFO Ptr = ConioCoordToPointer(Buff, 0, Buff->CursorPosition.Y); @@ -140,66 +141,7 @@ ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff) } } -static __inline BOOLEAN -ConioGetIntersection(OUT PSMALL_RECT Intersection, - IN PSMALL_RECT Rect1, - IN PSMALL_RECT Rect2) -{ - if ( ConioIsRectEmpty(Rect1) || - ConioIsRectEmpty(Rect2) || - (Rect1->Top > Rect2->Bottom) || - (Rect1->Left > Rect2->Right) || - (Rect1->Bottom < Rect2->Top) || - (Rect1->Right < Rect2->Left) ) - { - /* The rectangles do not intersect */ - ConioInitRect(Intersection, 0, -1, 0, -1); - return FALSE; - } - - ConioInitRect(Intersection, - max(Rect1->Top , Rect2->Top ), - max(Rect1->Left , Rect2->Left ), - min(Rect1->Bottom, Rect2->Bottom), - min(Rect1->Right , Rect2->Right )); - - return TRUE; -} - -static __inline BOOLEAN -ConioGetUnion(OUT PSMALL_RECT Union, - IN PSMALL_RECT Rect1, - IN PSMALL_RECT Rect2) -{ - if (ConioIsRectEmpty(Rect1)) - { - if (ConioIsRectEmpty(Rect2)) - { - ConioInitRect(Union, 0, -1, 0, -1); - return FALSE; - } - else - { - *Union = *Rect2; - } - } - else if (ConioIsRectEmpty(Rect2)) - { - *Union = *Rect1; - } - else - { - ConioInitRect(Union, - min(Rect1->Top , Rect2->Top ), - min(Rect1->Left , Rect2->Left ), - max(Rect1->Bottom, Rect2->Bottom), - max(Rect1->Right , Rect2->Right )); - } - - return TRUE; -} - -static VOID FASTCALL +static VOID ConioComputeUpdateRect(IN PTEXTMODE_SCREEN_BUFFER Buff, IN OUT PSMALL_RECT UpdateRect, IN PCOORD Start, @@ -233,7 +175,7 @@ ConioComputeUpdateRect(IN PTEXTMODE_SCREEN_BUFFER Buff, * Move from one rectangle to another. We must be careful about the order that * this is done, to avoid overwriting parts of the source before they are moved. */ -static VOID FASTCALL +static VOID ConioMoveRegion(PTEXTMODE_SCREEN_BUFFER ScreenBuffer, PSMALL_RECT SrcRegion, PSMALL_RECT DstRegion, @@ -293,16 +235,6 @@ ConioMoveRegion(PTEXTMODE_SCREEN_BUFFER ScreenBuffer, } } -DWORD FASTCALL -ConioEffectiveCursorSize(PCONSOLE Console, DWORD Scale) -{ - DWORD Size = (Console->ActiveBuffer->CursorInfo.dwSize * Scale + 99) / 100; - /* If line input in progress, perhaps adjust for insert toggle */ - if (Console->LineBuffer && !Console->LineComplete && (Console->InsertMode ? !Console->LineInsertToggle : Console->LineInsertToggle)) - return (Size * 2 <= Scale) ? (Size * 2) : (Size / 2); - return Size; -} - NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, @@ -422,7 +354,7 @@ ConioResizeBuffer(PCONSOLE Console, return STATUS_SUCCESS; } -static VOID FASTCALL +static VOID ConioNextLine(PTEXTMODE_SCREEN_BUFFER Buff, PSMALL_RECT UpdateRect, PUINT ScrolledLines) { /* If we hit bottom, slide the viewable screen */ @@ -669,21 +601,15 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, OUT PCHAR_INFO CharInfo/*Buffer*/, - IN PCOORD BufferSize, - IN PCOORD BufferCoord, IN OUT PSMALL_RECT ReadRegion) { + SHORT X, Y; + SMALL_RECT ScreenBuffer; PCHAR_INFO CurCharInfo; - SHORT SizeX, SizeY; SMALL_RECT CapturedReadRegion; - SMALL_RECT ScreenRect; - DWORD i; PCHAR_INFO Ptr; - LONG X, Y; - UINT CodePage; - if (Console == NULL || Buffer == NULL || CharInfo == NULL || - BufferSize == NULL || BufferCoord == NULL || ReadRegion == NULL) + if (Console == NULL || Buffer == NULL || CharInfo == NULL || ReadRegion == NULL) { return STATUS_INVALID_PARAMETER; } @@ -693,26 +619,24 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console, CapturedReadRegion = *ReadRegion; - /* FIXME: Is this correct? */ - CodePage = Console->OutputCodePage; - - SizeX = min(BufferSize->X - BufferCoord->X, ConioRectWidth(&CapturedReadRegion)); - SizeY = min(BufferSize->Y - BufferCoord->Y, ConioRectHeight(&CapturedReadRegion)); - CapturedReadRegion.Right = CapturedReadRegion.Left + SizeX; - CapturedReadRegion.Bottom = CapturedReadRegion.Top + SizeY; - - ConioInitRect(&ScreenRect, 0, 0, Buffer->ScreenBufferSize.Y, Buffer->ScreenBufferSize.X); - if (!ConioGetIntersection(&CapturedReadRegion, &ScreenRect, &CapturedReadRegion)) + /* Make sure ReadRegion is inside the screen buffer */ + ConioInitRect(&ScreenBuffer, 0, 0, + Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); + if (!ConioGetIntersection(&CapturedReadRegion, &ScreenBuffer, &CapturedReadRegion)) { + /* + * It is okay to have a ReadRegion completely outside + * the screen buffer. No data is read then. + */ return STATUS_SUCCESS; } - for (i = 0, Y = CapturedReadRegion.Top; Y < CapturedReadRegion.Bottom; ++i, ++Y) - { - CurCharInfo = CharInfo + (i * BufferSize->X); + CurCharInfo = CharInfo; + for (Y = CapturedReadRegion.Top; Y <= CapturedReadRegion.Bottom; ++Y) + { Ptr = ConioCoordToPointer(Buffer, CapturedReadRegion.Left, Y); - for (X = CapturedReadRegion.Left; X < CapturedReadRegion.Right; ++X) + for (X = CapturedReadRegion.Left; X <= CapturedReadRegion.Right; ++X) { if (Unicode) { @@ -721,7 +645,7 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console, else { // ConsoleUnicodeCharToAnsiChar(Console, &CurCharInfo->Char.AsciiChar, &Ptr->Char.UnicodeChar); - WideCharToMultiByte(CodePage, 0, &Ptr->Char.UnicodeChar, 1, + WideCharToMultiByte(Console->OutputCodePage, 0, &Ptr->Char.UnicodeChar, 1, &CurCharInfo->Char.AsciiChar, 1, NULL, NULL); } CurCharInfo->Attributes = Ptr->Attributes; @@ -730,10 +654,7 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console, } } - ReadRegion->Left = CapturedReadRegion.Left; - ReadRegion->Top = CapturedReadRegion.Top ; - ReadRegion->Right = CapturedReadRegion.Left + SizeX - 1; - ReadRegion->Bottom = CapturedReadRegion.Top + SizeY - 1; + *ReadRegion = CapturedReadRegion; return STATUS_SUCCESS; } @@ -743,18 +664,15 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, IN PCHAR_INFO CharInfo/*Buffer*/, - IN PCOORD BufferSize, - IN PCOORD BufferCoord, IN OUT PSMALL_RECT WriteRegion) { - SHORT i, X, Y, SizeX, SizeY; + SHORT X, Y; SMALL_RECT ScreenBuffer; PCHAR_INFO CurCharInfo; SMALL_RECT CapturedWriteRegion; PCHAR_INFO Ptr; - if (Console == NULL || Buffer == NULL || CharInfo == NULL || - BufferSize == NULL || BufferCoord == NULL || WriteRegion == NULL) + if (Console == NULL || Buffer == NULL || CharInfo == NULL || WriteRegion == NULL) { return STATUS_INVALID_PARAMETER; } @@ -764,13 +682,9 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, CapturedWriteRegion = *WriteRegion; - SizeX = min(BufferSize->X - BufferCoord->X, ConioRectWidth(&CapturedWriteRegion)); - SizeY = min(BufferSize->Y - BufferCoord->Y, ConioRectHeight(&CapturedWriteRegion)); - CapturedWriteRegion.Right = CapturedWriteRegion.Left + SizeX - 1; - CapturedWriteRegion.Bottom = CapturedWriteRegion.Top + SizeY - 1; - /* Make sure WriteRegion is inside the screen buffer */ - ConioInitRect(&ScreenBuffer, 0, 0, Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); + ConioInitRect(&ScreenBuffer, 0, 0, + Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); if (!ConioGetIntersection(&CapturedWriteRegion, &ScreenBuffer, &CapturedWriteRegion)) { /* @@ -780,12 +694,12 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, return STATUS_SUCCESS; } - for (i = 0, Y = CapturedWriteRegion.Top; Y <= CapturedWriteRegion.Bottom; i++, Y++) - { - CurCharInfo = CharInfo + (i + BufferCoord->Y) * BufferSize->X + BufferCoord->X; + CurCharInfo = CharInfo; + for (Y = CapturedWriteRegion.Top; Y <= CapturedWriteRegion.Bottom; ++Y) + { Ptr = ConioCoordToPointer(Buffer, CapturedWriteRegion.Left, Y); - for (X = CapturedWriteRegion.Left; X <= CapturedWriteRegion.Right; X++) + for (X = CapturedWriteRegion.Left; X <= CapturedWriteRegion.Right; ++X) { if (Unicode) { @@ -803,10 +717,7 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, TermDrawRegion(Console, &CapturedWriteRegion); - WriteRegion->Left = CapturedWriteRegion.Left; - WriteRegion->Top = CapturedWriteRegion.Top ; - WriteRegion->Right = CapturedWriteRegion.Left + SizeX - 1; - WriteRegion->Bottom = CapturedWriteRegion.Top + SizeY - 1; + *WriteRegion = CapturedWriteRegion; return STATUS_SUCCESS; } @@ -829,14 +740,10 @@ ConDrvWriteConsole(IN PCONSOLE Console, /* Validity checks */ ASSERT(Console == ScreenBuffer->Header.Console); - ASSERT( (StringBuffer != NULL && NumCharsToWrite >= 0) || - (StringBuffer == NULL && NumCharsToWrite == 0) ); + ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCharsToWrite == 0)); - // if (Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION)) - if (Console->PauseFlags && Console->UnpauseEvent != NULL) - { - return STATUS_PENDING; - } + /* Stop here if the console is paused */ + if (Console->UnpauseEvent != NULL) return STATUS_PENDING; if (Unicode) { @@ -892,8 +799,8 @@ ConDrvReadConsoleOutputString(IN PCONSOLE Console, OUT PVOID StringBuffer, IN ULONG NumCodesToRead, IN PCOORD ReadCoord, - OUT PCOORD EndCoord, - OUT PULONG CodesRead) + // OUT PCOORD EndCoord, + OUT PULONG NumCodesRead OPTIONAL) { SHORT Xpos, Ypos; PVOID ReadBuffer; @@ -901,29 +808,29 @@ ConDrvReadConsoleOutputString(IN PCONSOLE Console, ULONG CodeSize; PCHAR_INFO Ptr; - if (Console == NULL || Buffer == NULL || - ReadCoord == NULL || EndCoord == NULL || CodesRead == NULL) + if (Console == NULL || Buffer == NULL || ReadCoord == NULL /* || EndCoord == NULL */) { return STATUS_INVALID_PARAMETER; } /* Validity checks */ ASSERT(Console == Buffer->Header.Console); - ASSERT( (StringBuffer != NULL && NumCodesToRead >= 0) || - (StringBuffer == NULL && NumCodesToRead == 0) ); + ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCodesToRead == 0)); + + if (NumCodesRead) *NumCodesRead = 0; switch (CodeType) { case CODE_ASCII: - CodeSize = sizeof(CHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); break; case CODE_UNICODE: - CodeSize = sizeof(WCHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); break; case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); break; default: @@ -984,25 +891,11 @@ ConDrvReadConsoleOutputString(IN PCONSOLE Console, } } - // switch (CodeType) - // { - // case CODE_UNICODE: - // *(PWCHAR)ReadBuffer = 0; - // break; + // EndCoord->X = Xpos; + // EndCoord->Y = (Ypos - Buffer->VirtualY + Buffer->ScreenBufferSize.Y) % Buffer->ScreenBufferSize.Y; - // case CODE_ASCII: - // *(PCHAR)ReadBuffer = 0; - // break; - - // case CODE_ATTRIBUTE: - // *(PWORD)ReadBuffer = 0; - // break; - // } - - EndCoord->X = Xpos; - EndCoord->Y = (Ypos - Buffer->VirtualY + Buffer->ScreenBufferSize.Y) % Buffer->ScreenBufferSize.Y; - - *CodesRead = (ULONG)((ULONG_PTR)ReadBuffer - (ULONG_PTR)StringBuffer) / CodeSize; + if (NumCodesRead) + *NumCodesRead = (ULONG)((ULONG_PTR)ReadBuffer - (ULONG_PTR)StringBuffer) / CodeSize; // <= NumCodesToRead return STATUS_SUCCESS; @@ -1014,9 +907,9 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console, IN CODE_TYPE CodeType, IN PVOID StringBuffer, IN ULONG NumCodesToWrite, - IN PCOORD WriteCoord /*, - OUT PCOORD EndCoord, - OUT PULONG CodesWritten */) + IN PCOORD WriteCoord, + // OUT PCOORD EndCoord, + OUT PULONG NumCodesWritten OPTIONAL) { NTSTATUS Status = STATUS_SUCCESS; PVOID WriteBuffer = NULL; @@ -1025,29 +918,29 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console, ULONG CodeSize; PCHAR_INFO Ptr; - if (Console == NULL || Buffer == NULL || - WriteCoord == NULL /* || EndCoord == NULL || CodesWritten == NULL */) + if (Console == NULL || Buffer == NULL || WriteCoord == NULL /* || EndCoord == NULL */) { return STATUS_INVALID_PARAMETER; } /* Validity checks */ ASSERT(Console == Buffer->Header.Console); - ASSERT( (StringBuffer != NULL && NumCodesToWrite >= 0) || - (StringBuffer == NULL && NumCodesToWrite == 0) ); + ASSERT((StringBuffer != NULL) || (StringBuffer == NULL && NumCodesToWrite == 0)); + + if (NumCodesWritten) *NumCodesWritten = 0; switch (CodeType) { case CODE_ASCII: - CodeSize = sizeof(CHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); break; case CODE_UNICODE: - CodeSize = sizeof(WCHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); break; case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); break; default: @@ -1073,6 +966,12 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console, { Status = STATUS_NO_MEMORY; } + + // FIXME: Quick fix: fix the CodeType and CodeSize since the + // ASCII string was converted into UNICODE. + // A proper fix needs to be written. + CodeType = CODE_UNICODE; + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); } else { @@ -1132,7 +1031,7 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console, Cleanup: if (tmpString) RtlFreeHeap(RtlGetProcessHeap(), 0, tmpString); - // CodesWritten = Written; + if (NumCodesWritten) *NumCodesWritten = NumCodesToWrite; // Written; return Status; } @@ -1140,16 +1039,15 @@ NTSTATUS NTAPI ConDrvFillConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN CODE_TYPE CodeType, - IN PVOID Code, + IN CODE_ELEMENT Code, IN ULONG NumCodesToWrite, - IN PCOORD WriteCoord /*, - OUT PULONG CodesWritten */) + IN PCOORD WriteCoord, + OUT PULONG NumCodesWritten OPTIONAL) { DWORD X, Y, Length; // , Written = 0; PCHAR_INFO Ptr; - if (Console == NULL || Buffer == NULL || Code == NULL || - WriteCoord == NULL /* || CodesWritten == NULL */) + if (Console == NULL || Buffer == NULL || WriteCoord == NULL) { return STATUS_INVALID_PARAMETER; } @@ -1157,29 +1055,15 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console, /* Validity check */ ASSERT(Console == Buffer->Header.Console); -#if 0 - switch (CodeType) - { - case CODE_ASCII: - /* On-place conversion from the ASCII char to the UNICODE char */ - ConsoleAnsiCharToUnicodeChar(Console, &Code->UnicodeChar, &Code->AsciiChar); - /* Fall through */ - case CODE_UNICODE: - Code = &Code->UnicodeChar; - break; + if (NumCodesWritten) *NumCodesWritten = 0; - case CODE_ATTRIBUTE: - Code = &Code->Attribute; - break; - } -#else if (CodeType == CODE_ASCII) { - /* On-place conversion from the ASCII char to the UNICODE char */ - // FIXME: What if Code points to an invalid memory zone ?? - ConsoleAnsiCharToUnicodeChar(Console, (PWCHAR)Code, (PCHAR)Code); + /* Conversion from the ASCII char to the UNICODE char */ + CODE_ELEMENT tmp; + ConsoleAnsiCharToUnicodeChar(Console, &tmp.UnicodeChar, &Code.AsciiChar); + Code = tmp; } -#endif X = WriteCoord->X; Y = (WriteCoord->Y + Buffer->VirtualY) % Buffer->ScreenBufferSize.Y; @@ -1196,11 +1080,11 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console, { case CODE_ASCII: case CODE_UNICODE: - Ptr->Char.UnicodeChar = *(PWCHAR)Code; + Ptr->Char.UnicodeChar = Code.UnicodeChar; break; case CODE_ATTRIBUTE: - Ptr->Attributes = *(PWORD)Code; + Ptr->Attributes = Code.Attribute; break; } // ++Ptr; @@ -1224,7 +1108,7 @@ ConDrvFillConsoleOutput(IN PCONSOLE Console, TermDrawRegion(Console, &UpdateRect); } - // CodesWritten = Written; // NumCodesToWrite; + if (NumCodesWritten) *NumCodesWritten = NumCodesToWrite; // Written; return STATUS_SUCCESS; } @@ -1323,7 +1207,8 @@ ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console, CapturedDestinationOrigin = *DestinationOrigin; /* Make sure the source rectangle is inside the screen buffer */ - ConioInitRect(&ScreenBuffer, 0, 0, Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); + ConioInitRect(&ScreenBuffer, 0, 0, + Buffer->ScreenBufferSize.Y - 1, Buffer->ScreenBufferSize.X - 1); if (!ConioGetIntersection(&SrcRegion, &ScreenBuffer, ScrollRectangle)) { return STATUS_SUCCESS; @@ -1359,7 +1244,11 @@ ConDrvScrollConsoleScreenBuffer(IN PCONSOLE Console, CapturedDestinationOrigin.X + ConioRectWidth(&SrcRegion ) - 1); if (!Unicode) - ConsoleAnsiCharToUnicodeChar(Console, &FillChar.Char.UnicodeChar, &FillChar.Char.AsciiChar); + { + WCHAR tmp; + ConsoleAnsiCharToUnicodeChar(Console, &tmp, &FillChar.Char.AsciiChar); + FillChar.Char.UnicodeChar = tmp; + } ConioMoveRegion(Buffer, &SrcRegion, &DstRegion, &CapturedClipRectangle, FillChar); diff --git a/win32ss/user/winsrv/consrv/coninput.c b/win32ss/user/winsrv/consrv/coninput.c index 97e1ee560dc..738e819c93f 100644 --- a/win32ss/user/winsrv/consrv/coninput.c +++ b/win32ss/user/winsrv/consrv/coninput.c @@ -36,6 +36,88 @@ typedef struct _GET_INPUT_INFO /* PRIVATE FUNCTIONS **********************************************************/ +/* + * This pre-processing code MUST be IN consrv ONLY + */ +/* static */ ULONG +PreprocessInput(PCONSOLE Console, + PINPUT_RECORD InputEvent, + ULONG NumEventsToWrite) +{ + ULONG NumEvents; + + /* + * Loop each event, and for each, check for pause or unpause + * and perform adequate behaviour. + */ + for (NumEvents = NumEventsToWrite; NumEvents > 0; --NumEvents) + { + /* Check for pause or unpause */ + if (InputEvent->EventType == KEY_EVENT && InputEvent->Event.KeyEvent.bKeyDown) + { + WORD vk = InputEvent->Event.KeyEvent.wVirtualKeyCode; + if (!(Console->PauseFlags & PAUSED_FROM_KEYBOARD)) + { + DWORD cks = InputEvent->Event.KeyEvent.dwControlKeyState; + if (Console->InputBuffer.Mode & ENABLE_LINE_INPUT && + (vk == VK_PAUSE || + (vk == 'S' && (cks & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && + !(cks & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))))) + { + ConioPause(Console, PAUSED_FROM_KEYBOARD); + + /* Skip the event */ + RtlMoveMemory(InputEvent, + InputEvent + 1, + (NumEvents - 1) * sizeof(INPUT_RECORD)); + --NumEventsToWrite; + continue; + } + } + else + { + if ((vk < VK_SHIFT || vk > VK_CAPITAL) && vk != VK_LWIN && + vk != VK_RWIN && vk != VK_NUMLOCK && vk != VK_SCROLL) + { + ConioUnpause(Console, PAUSED_FROM_KEYBOARD); + + /* Skip the event */ + RtlMoveMemory(InputEvent, + InputEvent + 1, + (NumEvents - 1) * sizeof(INPUT_RECORD)); + --NumEventsToWrite; + continue; + } + } + } + + /* Go to the next event */ + ++InputEvent; + } + + return NumEventsToWrite; +} + +/* + * This post-processing code MUST be IN consrv ONLY + */ +/* static */ VOID +PostprocessInput(PCONSOLE Console) +{ + CsrNotifyWait(&Console->ReadWaitQueue, + FALSE, + NULL, + NULL); + if (!IsListEmpty(&Console->ReadWaitQueue)) + { + CsrDereferenceWait(&Console->ReadWaitQueue); + } +} + + + + + static NTSTATUS WaitBeforeReading(IN PGET_INPUT_INFO InputInfo, IN PCSR_API_MESSAGE ApiMessage, @@ -51,7 +133,7 @@ WaitBeforeReading(IN PGET_INPUT_INFO InputInfo, RtlMoveMemory(CapturedInputInfo, InputInfo, sizeof(GET_INPUT_INFO)); - if (!CsrCreateWait(&InputInfo->InputBuffer->ReadWaitQueue, + if (!CsrCreateWait(&InputInfo->InputBuffer->Header.Console->ReadWaitQueue, WaitFunction, InputInfo->CallingThread, ApiMessage, @@ -133,6 +215,7 @@ Quit: NTSTATUS NTAPI ConDrvReadConsole(IN PCONSOLE Console, IN PCONSOLE_INPUT_BUFFER InputBuffer, + /**/IN PUNICODE_STRING ExeName /**/OPTIONAL/**/,/**/ IN BOOLEAN Unicode, OUT PVOID Buffer, IN OUT PCONSOLE_READCONSOLE_CONTROL ReadControl, @@ -148,20 +231,64 @@ ReadChars(IN PGET_INPUT_INFO InputInfo, PCONSOLE_INPUT_BUFFER InputBuffer = InputInfo->InputBuffer; CONSOLE_READCONSOLE_CONTROL ReadControl; + UNICODE_STRING ExeName; + + PVOID Buffer; + ULONG NrCharactersRead = 0; + ULONG CharSize = (ReadConsoleRequest->Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + + /* Compute the executable name, if needed */ + if (ReadConsoleRequest->InitialNumBytes == 0 && + ReadConsoleRequest->ExeLength <= sizeof(ReadConsoleRequest->StaticBuffer)) + { + ExeName.Length = ExeName.MaximumLength = ReadConsoleRequest->ExeLength; + ExeName.Buffer = (PWCHAR)ReadConsoleRequest->StaticBuffer; + } + else + { + ExeName.Length = ExeName.MaximumLength = 0; + ExeName.Buffer = NULL; + } + + /* Build the ReadControl structure */ ReadControl.nLength = sizeof(CONSOLE_READCONSOLE_CONTROL); - ReadControl.nInitialChars = ReadConsoleRequest->NrCharactersRead; + ReadControl.nInitialChars = ReadConsoleRequest->InitialNumBytes / CharSize; ReadControl.dwCtrlWakeupMask = ReadConsoleRequest->CtrlWakeupMask; ReadControl.dwControlKeyState = ReadConsoleRequest->ControlKeyState; + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are read. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (ReadConsoleRequest->CaptureBufferSize <= sizeof(ReadConsoleRequest->StaticBuffer)) + { + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // ReadConsoleRequest->Buffer = ReadConsoleRequest->StaticBuffer; + Buffer = ReadConsoleRequest->StaticBuffer; + } + else + { + Buffer = ReadConsoleRequest->Buffer; + } + + DPRINT1("Calling ConDrvReadConsole(%wZ)\n", &ExeName); Status = ConDrvReadConsole(InputBuffer->Header.Console, InputBuffer, + &ExeName, ReadConsoleRequest->Unicode, - ReadConsoleRequest->Buffer, + Buffer, &ReadControl, - ReadConsoleRequest->NrCharactersToRead, - &ReadConsoleRequest->NrCharactersRead); + ReadConsoleRequest->NumBytes / CharSize, // NrCharactersToRead + &NrCharactersRead); + DPRINT1("ConDrvReadConsole returned (%d ; Status = 0x%08x)\n", + NrCharactersRead, Status); - ReadConsoleRequest->ControlKeyState = ReadControl.dwControlKeyState; + // ReadConsoleRequest->ControlKeyState = ReadControl.dwControlKeyState; if (Status == STATUS_PENDING) { @@ -173,7 +300,13 @@ ReadChars(IN PGET_INPUT_INFO InputInfo, } else { - /* We read all what we wanted, we return the error code we were given */ + /* + * We read all what we wanted. Set the number of bytes read and + * return the error code we were given. + */ + ReadConsoleRequest->NumBytes = NrCharactersRead * CharSize; + ReadConsoleRequest->ControlKeyState = ReadControl.dwControlKeyState; + return Status; // return STATUS_SUCCESS; } @@ -260,17 +393,39 @@ ReadInputBuffer(IN PGET_INPUT_INFO InputInfo, NTSTATUS Status; PCONSOLE_GETINPUT GetInputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetInputRequest; PCONSOLE_INPUT_BUFFER InputBuffer = InputInfo->InputBuffer; + ULONG NumEventsRead; - // GetInputRequest->InputsRead = 0; + PINPUT_RECORD InputRecord; + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than five + * input records are read. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (GetInputRequest->NumRecords <= sizeof(GetInputRequest->RecordStaticBuffer)/sizeof(INPUT_RECORD)) + { + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // GetInputRequest->RecordBufPtr = GetInputRequest->RecordStaticBuffer; + InputRecord = GetInputRequest->RecordStaticBuffer; + } + else + { + InputRecord = GetInputRequest->RecordBufPtr; + } + + NumEventsRead = 0; Status = ConDrvGetConsoleInput(InputBuffer->Header.Console, InputBuffer, - (GetInputRequest->wFlags & CONSOLE_READ_KEEPEVENT) != 0, - (GetInputRequest->wFlags & CONSOLE_READ_CONTINUE ) == 0, + (GetInputRequest->Flags & CONSOLE_READ_KEEPEVENT) != 0, + (GetInputRequest->Flags & CONSOLE_READ_CONTINUE ) == 0, GetInputRequest->Unicode, - GetInputRequest->InputRecord, - GetInputRequest->Length, - &GetInputRequest->InputsRead); + InputRecord, + GetInputRequest->NumRecords, + &NumEventsRead); if (Status == STATUS_PENDING) { @@ -282,7 +437,12 @@ ReadInputBuffer(IN PGET_INPUT_INFO InputInfo, } else { - /* We read all what we wanted, we return the error code we were given */ + /* + * We read all what we wanted. Set the number of events read and + * return the error code we were given. + */ + GetInputRequest->NumRecords = NumEventsRead; + return Status; // return STATUS_SUCCESS; } @@ -302,15 +462,32 @@ CSR_API(SrvReadConsole) DPRINT("SrvReadConsole\n"); - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ReadConsoleRequest->Buffer, - ReadConsoleRequest->BufferSize, - sizeof(BYTE))) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are read. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (ReadConsoleRequest->CaptureBufferSize <= sizeof(ReadConsoleRequest->StaticBuffer)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // ReadConsoleRequest->Buffer = ReadConsoleRequest->StaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&ReadConsoleRequest->Buffer, + ReadConsoleRequest->CaptureBufferSize, + sizeof(BYTE))) + { + return STATUS_INVALID_PARAMETER; + } } - if (ReadConsoleRequest->NrCharactersRead > ReadConsoleRequest->NrCharactersToRead) + if (ReadConsoleRequest->InitialNumBytes > ReadConsoleRequest->NumBytes) { return STATUS_INVALID_PARAMETER; } @@ -318,9 +495,6 @@ CSR_API(SrvReadConsole) Status = ConSrvGetInputBufferAndHandleEntry(ProcessData, ReadConsoleRequest->InputHandle, &InputBuffer, &HandleEntry, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; - // This member is set by the caller (IntReadConsole in kernel32) - // ReadConsoleRequest->NrCharactersRead = 0; - InputInfo.CallingThread = CsrGetClientThread(); InputInfo.HandleEntry = HandleEntry; InputInfo.InputBuffer = InputBuffer; @@ -345,22 +519,37 @@ CSR_API(SrvGetConsoleInput) DPRINT("SrvGetConsoleInput\n"); - if (GetInputRequest->wFlags & ~(CONSOLE_READ_KEEPEVENT | CONSOLE_READ_CONTINUE)) + if (GetInputRequest->Flags & ~(CONSOLE_READ_KEEPEVENT | CONSOLE_READ_CONTINUE)) return STATUS_INVALID_PARAMETER; - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&GetInputRequest->InputRecord, - GetInputRequest->Length, - sizeof(INPUT_RECORD))) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than five + * input records are read. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (GetInputRequest->NumRecords <= sizeof(GetInputRequest->RecordStaticBuffer)/sizeof(INPUT_RECORD)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // GetInputRequest->RecordBufPtr = GetInputRequest->RecordStaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&GetInputRequest->RecordBufPtr, + GetInputRequest->NumRecords, + sizeof(INPUT_RECORD))) + { + return STATUS_INVALID_PARAMETER; + } } Status = ConSrvGetInputBufferAndHandleEntry(ProcessData, GetInputRequest->InputHandle, &InputBuffer, &HandleEntry, GENERIC_READ, TRUE); if (!NT_SUCCESS(Status)) return Status; - GetInputRequest->InputsRead = 0; - InputInfo.CallingThread = CsrGetClientThread(); InputInfo.HandleEntry = HandleEntry; InputInfo.InputBuffer = InputBuffer; @@ -389,30 +578,56 @@ CSR_API(SrvWriteConsoleInput) PCONSOLE_INPUT_BUFFER InputBuffer; ULONG NumEventsWritten; + PINPUT_RECORD InputRecord; + DPRINT("SrvWriteConsoleInput\n"); - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&WriteInputRequest->InputRecord, - WriteInputRequest->Length, - sizeof(INPUT_RECORD))) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than five + * input records are written. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (WriteInputRequest->NumRecords <= sizeof(WriteInputRequest->RecordStaticBuffer)/sizeof(INPUT_RECORD)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // WriteInputRequest->RecordBufPtr = WriteInputRequest->RecordStaticBuffer; + InputRecord = WriteInputRequest->RecordStaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&WriteInputRequest->RecordBufPtr, + WriteInputRequest->NumRecords, + sizeof(INPUT_RECORD))) + { + return STATUS_INVALID_PARAMETER; + } + + InputRecord = WriteInputRequest->RecordBufPtr; } Status = ConSrvGetInputBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), WriteInputRequest->InputHandle, &InputBuffer, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; + if (!NT_SUCCESS(Status)) + { + WriteInputRequest->NumRecords = 0; + return Status; + } NumEventsWritten = 0; Status = ConDrvWriteConsoleInput(InputBuffer->Header.Console, InputBuffer, WriteInputRequest->Unicode, WriteInputRequest->AppendToEnd, - WriteInputRequest->InputRecord, - WriteInputRequest->Length, + InputRecord, + WriteInputRequest->NumRecords, &NumEventsWritten); - WriteInputRequest->Length = NumEventsWritten; + WriteInputRequest->NumRecords = NumEventsWritten; ConSrvReleaseInputBuffer(InputBuffer, TRUE); return Status; diff --git a/win32ss/user/winsrv/consrv/coninput.h b/win32ss/user/winsrv/consrv/coninput.h index 8d37087a556..7ab46946777 100644 --- a/win32ss/user/winsrv/consrv/coninput.h +++ b/win32ss/user/winsrv/consrv/coninput.h @@ -9,13 +9,4 @@ #pragma once -VOID FASTCALL PurgeInputBuffer(PCONSOLE Console); - -VOID NTAPI -ConDrvProcessKey(IN PCONSOLE Console, - IN BOOLEAN Down, - IN UINT VirtualKeyCode, - IN UINT VirtualScanCode, - IN WCHAR UnicodeChar, - IN ULONG ShiftState, - IN BYTE KeyStateCtrl); +VOID PurgeInputBuffer(PCONSOLE Console); diff --git a/win32ss/user/winsrv/consrv/conoutput.c b/win32ss/user/winsrv/consrv/conoutput.c index f5dac648a2c..833b3cdbb79 100644 --- a/win32ss/user/winsrv/consrv/conoutput.c +++ b/win32ss/user/winsrv/consrv/conoutput.c @@ -373,17 +373,45 @@ DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage, PCONSOLE_WRITECONSOLE WriteConsoleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteConsoleRequest; PTEXTMODE_SCREEN_BUFFER ScreenBuffer; + PVOID Buffer; + ULONG NrCharactersWritten = 0; + ULONG CharSize = (WriteConsoleRequest->Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(ClientThread->Process), WriteConsoleRequest->OutputHandle, &ScreenBuffer, GENERIC_WRITE, FALSE); if (!NT_SUCCESS(Status)) return Status; + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are written. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (WriteConsoleRequest->UsingStaticBuffer && + WriteConsoleRequest->NumBytes <= sizeof(WriteConsoleRequest->StaticBuffer)) + { + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // WriteConsoleRequest->Buffer = WriteConsoleRequest->StaticBuffer; + Buffer = WriteConsoleRequest->StaticBuffer; + } + else + { + Buffer = WriteConsoleRequest->Buffer; + } + + DPRINT("Calling ConDrvWriteConsole\n"); Status = ConDrvWriteConsole(ScreenBuffer->Header.Console, ScreenBuffer, WriteConsoleRequest->Unicode, - WriteConsoleRequest->Buffer, - WriteConsoleRequest->NrCharactersToWrite, - &WriteConsoleRequest->NrCharactersWritten); + Buffer, + WriteConsoleRequest->NumBytes / CharSize, // NrCharactersToWrite + &NrCharactersWritten); + DPRINT("ConDrvWriteConsole returned (%d ; Status = 0x%08x)\n", + NrCharactersWritten, Status); if (Status == STATUS_PENDING) { @@ -404,6 +432,11 @@ DoWriteConsole(IN PCSR_API_MESSAGE ApiMessage, /* Wait until we un-pause the console */ // Status = STATUS_PENDING; } + else + { + /* We read all what we wanted. Set the number of bytes written. */ + WriteConsoleRequest->NumBytes = NrCharactersWritten * CharSize; + } Quit: ConSrvReleaseScreenBuffer(ScreenBuffer, FALSE); @@ -418,8 +451,6 @@ ConDrvReadConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, OUT PCHAR_INFO CharInfo/*Buffer*/, - IN PCOORD BufferSize, - IN PCOORD BufferCoord, IN OUT PSMALL_RECT ReadRegion); CSR_API(SrvReadConsoleOutput) { @@ -427,14 +458,40 @@ CSR_API(SrvReadConsoleOutput) PCONSOLE_READOUTPUT ReadOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ReadOutputRequest; PTEXTMODE_SCREEN_BUFFER Buffer; + ULONG NumCells; + PCHAR_INFO CharInfo; + DPRINT("SrvReadConsoleOutput\n"); - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ReadOutputRequest->CharInfo, - ReadOutputRequest->BufferSize.X * ReadOutputRequest->BufferSize.Y, - sizeof(CHAR_INFO))) + /* + * 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) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // ReadOutputRequest->CharInfo = &ReadOutputRequest->StaticBuffer; + CharInfo = &ReadOutputRequest->StaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&ReadOutputRequest->CharInfo, + NumCells, + sizeof(CHAR_INFO))) + { + return STATUS_INVALID_PARAMETER; + } + + CharInfo = ReadOutputRequest->CharInfo; } Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), @@ -445,9 +502,7 @@ CSR_API(SrvReadConsoleOutput) Status = ConDrvReadConsoleOutput(Buffer->Header.Console, Buffer, ReadOutputRequest->Unicode, - ReadOutputRequest->CharInfo, - &ReadOutputRequest->BufferSize, - &ReadOutputRequest->BufferCoord, + CharInfo, &ReadOutputRequest->ReadRegion); ConSrvReleaseScreenBuffer(Buffer, TRUE); @@ -459,8 +514,6 @@ ConDrvWriteConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN BOOLEAN Unicode, IN PCHAR_INFO CharInfo/*Buffer*/, - IN PCOORD BufferSize, - IN PCOORD BufferCoord, IN OUT PSMALL_RECT WriteRegion); CSR_API(SrvWriteConsoleOutput) { @@ -468,14 +521,40 @@ CSR_API(SrvWriteConsoleOutput) PCONSOLE_WRITEOUTPUT WriteOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.WriteOutputRequest; PTEXTMODE_SCREEN_BUFFER Buffer; + ULONG NumCells; + PCHAR_INFO CharInfo; + DPRINT("SrvWriteConsoleOutput\n"); - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&WriteOutputRequest->CharInfo, - WriteOutputRequest->BufferSize.X * WriteOutputRequest->BufferSize.Y, - sizeof(CHAR_INFO))) + /* + * 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) { - return STATUS_INVALID_PARAMETER; + /* + * 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), @@ -486,9 +565,7 @@ CSR_API(SrvWriteConsoleOutput) Status = ConDrvWriteConsoleOutput(Buffer->Header.Console, Buffer, WriteOutputRequest->Unicode, - WriteOutputRequest->CharInfo, - &WriteOutputRequest->BufferSize, - &WriteOutputRequest->BufferCoord, + CharInfo, &WriteOutputRequest->WriteRegion); ConSrvReleaseScreenBuffer(Buffer, TRUE); @@ -502,12 +579,30 @@ CSR_API(SrvWriteConsole) DPRINT("SrvWriteConsole\n"); - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID)&WriteConsoleRequest->Buffer, - WriteConsoleRequest->BufferSize, - sizeof(BYTE))) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are written. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (WriteConsoleRequest->UsingStaticBuffer && + WriteConsoleRequest->NumBytes <= sizeof(WriteConsoleRequest->StaticBuffer)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // WriteConsoleRequest->Buffer = WriteConsoleRequest->StaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID)&WriteConsoleRequest->Buffer, + WriteConsoleRequest->NumBytes, + sizeof(BYTE))) + { + return STATUS_INVALID_PARAMETER; + } } Status = DoWriteConsole(ApiMessage, CsrGetClientThread(), TRUE); @@ -524,8 +619,8 @@ ConDrvReadConsoleOutputString(IN PCONSOLE Console, OUT PVOID StringBuffer, IN ULONG NumCodesToRead, IN PCOORD ReadCoord, - OUT PCOORD EndCoord, - OUT PULONG CodesRead); + // OUT PCOORD EndCoord, + OUT PULONG NumCodesRead OPTIONAL); CSR_API(SrvReadConsoleOutputString) { NTSTATUS Status; @@ -533,47 +628,73 @@ CSR_API(SrvReadConsoleOutputString) PTEXTMODE_SCREEN_BUFFER Buffer; ULONG CodeSize; + PVOID pCode; + DPRINT("SrvReadConsoleOutputString\n"); switch (ReadOutputCodeRequest->CodeType) { case CODE_ASCII: - CodeSize = sizeof(CHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); break; case CODE_UNICODE: - CodeSize = sizeof(WCHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); break; case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); break; default: return STATUS_INVALID_PARAMETER; } - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ReadOutputCodeRequest->pCode.pCode, - ReadOutputCodeRequest->NumCodesToRead, - CodeSize)) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are read. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (ReadOutputCodeRequest->NumCodes * CodeSize <= sizeof(ReadOutputCodeRequest->CodeStaticBuffer)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // ReadOutputCodeRequest->pCode = ReadOutputCodeRequest->CodeStaticBuffer; + pCode = ReadOutputCodeRequest->CodeStaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&ReadOutputCodeRequest->pCode, + ReadOutputCodeRequest->NumCodes, + CodeSize)) + { + return STATUS_INVALID_PARAMETER; + } + + pCode = ReadOutputCodeRequest->pCode; } Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), ReadOutputCodeRequest->OutputHandle, &Buffer, GENERIC_READ, TRUE); - if (!NT_SUCCESS(Status)) return Status; + if (!NT_SUCCESS(Status)) + { + ReadOutputCodeRequest->NumCodes = 0; + return Status; + } Status = ConDrvReadConsoleOutputString(Buffer->Header.Console, Buffer, ReadOutputCodeRequest->CodeType, - ReadOutputCodeRequest->pCode.pCode, - ReadOutputCodeRequest->NumCodesToRead, - &ReadOutputCodeRequest->ReadCoord, - &ReadOutputCodeRequest->EndCoord, - &ReadOutputCodeRequest->CodesRead); + pCode, + ReadOutputCodeRequest->NumCodes, + &ReadOutputCodeRequest->Coord, + // &ReadOutputCodeRequest->EndCoord, + &ReadOutputCodeRequest->NumCodes); ConSrvReleaseScreenBuffer(Buffer, TRUE); return Status; @@ -585,9 +706,9 @@ ConDrvWriteConsoleOutputString(IN PCONSOLE Console, IN CODE_TYPE CodeType, IN PVOID StringBuffer, IN ULONG NumCodesToWrite, - IN PCOORD WriteCoord /*, - OUT PCOORD EndCoord, - OUT PULONG CodesWritten */); + IN PCOORD WriteCoord, + // OUT PCOORD EndCoord, + OUT PULONG NumCodesWritten OPTIONAL); CSR_API(SrvWriteConsoleOutputString) { NTSTATUS Status; @@ -595,49 +716,73 @@ CSR_API(SrvWriteConsoleOutputString) PTEXTMODE_SCREEN_BUFFER Buffer; ULONG CodeSize; + PVOID pCode; + DPRINT("SrvWriteConsoleOutputString\n"); switch (WriteOutputCodeRequest->CodeType) { case CODE_ASCII: - CodeSize = sizeof(CHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, AsciiChar); break; case CODE_UNICODE: - CodeSize = sizeof(WCHAR); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, UnicodeChar); break; case CODE_ATTRIBUTE: - CodeSize = sizeof(WORD); + CodeSize = RTL_FIELD_SIZE(CODE_ELEMENT, Attribute); break; default: return STATUS_INVALID_PARAMETER; } - if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&WriteOutputCodeRequest->pCode.pCode, - WriteOutputCodeRequest->Length, - CodeSize)) + /* + * For optimization purposes, Windows (and hence ReactOS, too, for + * compatibility reasons) uses a static buffer if no more than eighty + * bytes are written. Otherwise a new buffer is used. + * The client-side expects that we know this behaviour. + */ + if (WriteOutputCodeRequest->NumCodes * CodeSize <= sizeof(WriteOutputCodeRequest->CodeStaticBuffer)) { - return STATUS_INVALID_PARAMETER; + /* + * Adjust the internal pointer, because its old value points to + * the static buffer in the original ApiMessage structure. + */ + // WriteOutputCodeRequest->pCode = WriteOutputCodeRequest->CodeStaticBuffer; + pCode = WriteOutputCodeRequest->CodeStaticBuffer; + } + else + { + if (!CsrValidateMessageBuffer(ApiMessage, + (PVOID*)&WriteOutputCodeRequest->pCode, + WriteOutputCodeRequest->NumCodes, + CodeSize)) + { + return STATUS_INVALID_PARAMETER; + } + + pCode = WriteOutputCodeRequest->pCode; } Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), WriteOutputCodeRequest->OutputHandle, &Buffer, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; + if (!NT_SUCCESS(Status)) + { + WriteOutputCodeRequest->NumCodes = 0; + return Status; + } Status = ConDrvWriteConsoleOutputString(Buffer->Header.Console, Buffer, WriteOutputCodeRequest->CodeType, - WriteOutputCodeRequest->pCode.pCode, - WriteOutputCodeRequest->Length, // NumCodesToWrite, - &WriteOutputCodeRequest->Coord /*, // WriteCoord, - &WriteOutputCodeRequest->EndCoord, - &WriteOutputCodeRequest->NrCharactersWritten */); - - // WriteOutputCodeRequest->NrCharactersWritten = Written; + pCode, + WriteOutputCodeRequest->NumCodes, + &WriteOutputCodeRequest->Coord, + // &WriteOutputCodeRequest->EndCoord, + &WriteOutputCodeRequest->NumCodes); ConSrvReleaseScreenBuffer(Buffer, TRUE); return Status; @@ -647,16 +792,16 @@ NTSTATUS NTAPI ConDrvFillConsoleOutput(IN PCONSOLE Console, IN PTEXTMODE_SCREEN_BUFFER Buffer, IN CODE_TYPE CodeType, - IN PVOID Code, + IN CODE_ELEMENT Code, IN ULONG NumCodesToWrite, - IN PCOORD WriteCoord /*, - OUT PULONG CodesWritten */); + IN PCOORD WriteCoord, + OUT PULONG NumCodesWritten OPTIONAL); CSR_API(SrvFillConsoleOutput) { NTSTATUS Status; PCONSOLE_FILLOUTPUTCODE FillOutputRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.FillOutputRequest; PTEXTMODE_SCREEN_BUFFER Buffer; - USHORT CodeType = FillOutputRequest->CodeType; + CODE_TYPE CodeType = FillOutputRequest->CodeType; DPRINT("SrvFillConsoleOutput\n"); @@ -670,17 +815,19 @@ CSR_API(SrvFillConsoleOutput) Status = ConSrvGetTextModeBuffer(ConsoleGetPerProcessData(CsrGetClientThread()->Process), FillOutputRequest->OutputHandle, &Buffer, GENERIC_WRITE, TRUE); - if (!NT_SUCCESS(Status)) return Status; + if (!NT_SUCCESS(Status)) + { + FillOutputRequest->NumCodes = 0; + return Status; + } Status = ConDrvFillConsoleOutput(Buffer->Header.Console, Buffer, CodeType, - &FillOutputRequest->Code, - FillOutputRequest->Length, // NumCodesToWrite, - &FillOutputRequest->Coord /*, // WriteCoord, - &FillOutputRequest->NrCharactersWritten */); - - // FillOutputRequest->NrCharactersWritten = Written; + FillOutputRequest->Code, + FillOutputRequest->NumCodes, + &FillOutputRequest->WriteCoord, + &FillOutputRequest->NumCodes); ConSrvReleaseScreenBuffer(Buffer, TRUE); return Status; diff --git a/win32ss/user/winsrv/consrv/conoutput.h b/win32ss/user/winsrv/consrv/conoutput.h index 29da4c4c699..802b8c4742d 100644 --- a/win32ss/user/winsrv/consrv/conoutput.h +++ b/win32ss/user/winsrv/consrv/conoutput.h @@ -33,12 +33,12 @@ #define ConSrvReleaseScreenBuffer(Buff, IsConsoleLocked) \ ConSrvReleaseObject(&(Buff)->Header, (IsConsoleLocked)) -NTSTATUS FASTCALL ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer, +NTSTATUS ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer, IN OUT PCONSOLE Console, IN ULONG BufferType, IN PVOID ScreenBufferInfo); VOID NTAPI ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); -// VOID FASTCALL ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); +// VOID ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer); PCONSOLE_SCREEN_BUFFER ConDrvGetActiveScreenBuffer(IN PCONSOLE Console); diff --git a/win32ss/user/winsrv/consrv/console.c b/win32ss/user/winsrv/consrv/console.c index 441e07d74de..fb0ddf7bd14 100644 --- a/win32ss/user/winsrv/consrv/console.c +++ b/win32ss/user/winsrv/consrv/console.c @@ -14,102 +14,217 @@ #include +#include #include "procinit.h" -#ifdef TUITERM_COMPILE -#include "frontends/tui/tuiterm.h" -#endif - #define NDEBUG #include +// FIXME: Add this prototype to winternl.h / rtlfuncs.h / ... +NTSTATUS NTAPI RtlGetLastNtStatus(VOID); + /* GLOBALS ********************************************************************/ -/***************/ -#ifdef TUITERM_COMPILE -NTSTATUS NTAPI -TuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, - IN OUT PCONSOLE_INFO ConsoleInfo, - IN OUT PVOID ExtraConsoleInfo, - IN ULONG ProcessId); -NTSTATUS NTAPI -TuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd); +static ULONG ConsoleListSize; +static PCONSOLE* ConsoleList; /* The list of the ConSrv consoles */ +static RTL_RESOURCE ListLock; + +#define ConSrvLockConsoleListExclusive() \ + RtlAcquireResourceExclusive(&ListLock, TRUE) + +#define ConSrvLockConsoleListShared() \ + RtlAcquireResourceShared(&ListLock, TRUE) + +#define ConSrvUnlockConsoleList() \ + RtlReleaseResource(&ListLock) + + +static NTSTATUS +InsertConsole(OUT PHANDLE Handle, + IN PCONSOLE Console) +{ +#define CONSOLE_HANDLES_INCREMENT 2 * 3 + + NTSTATUS Status = STATUS_SUCCESS; + ULONG i = 0; + PCONSOLE* Block; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* All went right, so add the console to the list */ + ConSrvLockConsoleListExclusive(); + DPRINT1("Insert in the list\n"); + + if (ConsoleList) + { + for (i = 0; i < ConsoleListSize; i++) + { + if (ConsoleList[i] == NULL) break; + } + } + + if (i >= ConsoleListSize) + { + DPRINT1("Creation of a new handles table\n"); + /* Allocate a new handles table */ + Block = ConsoleAllocHeap(HEAP_ZERO_MEMORY, + (ConsoleListSize + + CONSOLE_HANDLES_INCREMENT) * sizeof(PCONSOLE)); + if (Block == NULL) + { + Status = STATUS_UNSUCCESSFUL; + goto Quit; + } + + /* If we previously had a handles table, free it and use the new one */ + if (ConsoleList) + { + /* Copy the handles from the old table to the new one */ + RtlCopyMemory(Block, + ConsoleList, + ConsoleListSize * sizeof(PCONSOLE)); + ConsoleFreeHeap(ConsoleList); + } + ConsoleList = Block; + ConsoleListSize += CONSOLE_HANDLES_INCREMENT; + } + + ConsoleList[i] = Console; + *Handle = ULongToHandle((i << 2) | 0x3); + +Quit: + /* Unlock the console list and return status */ + ConSrvUnlockConsoleList(); + return Status; +} + +/* Unused */ +#if 0 +static NTSTATUS +RemoveConsoleByHandle(IN HANDLE Handle) +{ + NTSTATUS Status = STATUS_SUCCESS; + PCONSOLE Console; + + BOOLEAN ValidHandle = ((HandleToULong(Handle) & 0x3) == 0x3); + ULONG Index = HandleToULong(Handle) >> 2; + + if (!ValidHandle) return STATUS_INVALID_HANDLE; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* Remove the console from the list */ + ConSrvLockConsoleListExclusive(); + + if (Index >= ConsoleListSize || + (Console = ConsoleList[Index]) == NULL) + { + Status = STATUS_INVALID_HANDLE; + goto Quit; + } + + ConsoleList[Index] = NULL; + +Quit: + /* Unlock the console list and return status */ + ConSrvUnlockConsoleList(); + return Status; +} #endif -NTSTATUS NTAPI -GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, - IN OUT PCONSOLE_INFO ConsoleInfo, - IN OUT PVOID ExtraConsoleInfo, - IN ULONG ProcessId); -NTSTATUS NTAPI -GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd); -/***************/ - -typedef -NTSTATUS (NTAPI *FRONTEND_LOAD)(IN OUT PFRONTEND FrontEnd, - IN OUT PCONSOLE_INFO ConsoleInfo, - IN OUT PVOID ExtraConsoleInfo, - IN ULONG ProcessId); - -typedef -NTSTATUS (NTAPI *FRONTEND_UNLOAD)(IN OUT PFRONTEND FrontEnd); - -/* - * If we are not in GUI-mode, start the text-mode terminal emulator. - * If we fail, try to start the GUI-mode terminal emulator. - * - * Try to open the GUI-mode terminal emulator. Two cases are possible: - * - We are in GUI-mode, therefore GuiMode == TRUE, the previous test-case - * failed and we start GUI-mode terminal emulator. - * - We are in text-mode, therefore GuiMode == FALSE, the previous test-case - * succeeded BUT we failed at starting text-mode terminal emulator. - * Then GuiMode was switched to TRUE in order to try to open the GUI-mode - * terminal emulator (Win32k will automatically switch to graphical mode, - * therefore no additional code is needed). - */ - -/* - * NOTE: Each entry of the table should be retrieved when loading a front-end - * (examples of the CSR servers which register some data for CSRSS). - */ -struct +static NTSTATUS +RemoveConsoleByPointer(IN PCONSOLE Console) { - CHAR FrontEndName[80]; - FRONTEND_LOAD FrontEndLoad; - FRONTEND_UNLOAD FrontEndUnload; -} FrontEndLoadingMethods[] = -{ -#ifdef TUITERM_COMPILE - {"TUI", TuiLoadFrontEnd, TuiUnloadFrontEnd}, -#endif - {"GUI", GuiLoadFrontEnd, GuiUnloadFrontEnd}, + ULONG i = 0; -// {"Not found", 0, NULL} -}; + if (!Console) return STATUS_INVALID_PARAMETER; + + ASSERT( (ConsoleList == NULL && ConsoleListSize == 0) || + (ConsoleList != NULL && ConsoleListSize != 0) ); + + /* Remove the console from the list */ + ConSrvLockConsoleListExclusive(); + + if (ConsoleList) + { + for (i = 0; i < ConsoleListSize; i++) + { + if (ConsoleList[i] == Console) ConsoleList[i] = NULL; + } + } + + /* Unlock the console list */ + ConSrvUnlockConsoleList(); + + return STATUS_SUCCESS; +} + +BOOLEAN NTAPI +ConSrvValidateConsole(OUT PCONSOLE* Console, + IN HANDLE ConsoleHandle, + IN CONSOLE_STATE ExpectedState, + IN BOOLEAN LockConsole) +{ + BOOLEAN RetVal = FALSE; + PCONSOLE ValidatedConsole; + + BOOLEAN ValidHandle = ((HandleToULong(ConsoleHandle) & 0x3) == 0x3); + ULONG Index = HandleToULong(ConsoleHandle) >> 2; + + if (!ValidHandle) return FALSE; + + if (!Console) return FALSE; + *Console = NULL; + + /* + * Forbid creation or deletion of consoles when + * checking for the existence of a console. + */ + ConSrvLockConsoleListShared(); + + if (Index >= ConsoleListSize || + (ValidatedConsole = ConsoleList[Index]) == NULL) + { + /* Unlock the console list */ + ConSrvUnlockConsoleList(); + + return FALSE; + } + + ValidatedConsole = ConsoleList[Index]; + + /* Unlock the console list and return */ + ConSrvUnlockConsoleList(); + + RetVal = ConDrvValidateConsoleUnsafe(ValidatedConsole, + ExpectedState, + LockConsole); + if (RetVal) *Console = ValidatedConsole; + + return RetVal; +} /* PRIVATE FUNCTIONS **********************************************************/ -#if 0000 -VOID FASTCALL +VOID ConioPause(PCONSOLE Console, UINT Flags) { Console->PauseFlags |= Flags; - if (!Console->UnpauseEvent) - Console->UnpauseEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + ConDrvPause(Console); } -VOID FASTCALL +VOID ConioUnpause(PCONSOLE Console, UINT Flags) { Console->PauseFlags &= ~Flags; // if ((Console->PauseFlags & (PAUSED_FROM_KEYBOARD | PAUSED_FROM_SCROLLBAR | PAUSED_FROM_SELECTION)) == 0) - if (Console->PauseFlags == 0 && Console->UnpauseEvent) + if (Console->PauseFlags == 0) { - SetEvent(Console->UnpauseEvent); - CloseHandle(Console->UnpauseEvent); - Console->UnpauseEvent = NULL; + ConDrvUnpause(Console); CsrNotifyWait(&Console->WriteWaitQueue, TRUE, @@ -121,38 +236,87 @@ ConioUnpause(PCONSOLE Console, UINT Flags) } } } -#endif - -NTSTATUS FASTCALL -ConSrvGetConsole(PCONSOLE_PROCESS_DATA ProcessData, - PCONSOLE* Console, - BOOL LockConsole) +NTSTATUS +ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData, + OUT PCONSOLE* Console, + IN BOOLEAN LockConsole) { - NTSTATUS Status = STATUS_SUCCESS; - PCONSOLE ProcessConsole; + NTSTATUS Status = STATUS_INVALID_HANDLE; + PCONSOLE GrabConsole; + // if (Console == NULL) return STATUS_INVALID_PARAMETER; ASSERT(Console); *Console = NULL; // RtlEnterCriticalSection(&ProcessData->HandleTableLock); - Status = ConDrvGetConsole(&ProcessConsole, ProcessData->ConsoleHandle, LockConsole); - if (NT_SUCCESS(Status)) *Console = ProcessConsole; + if (ConSrvValidateConsole(&GrabConsole, + ProcessData->ConsoleHandle, + CONSOLE_RUNNING, + LockConsole)) + { + InterlockedIncrement(&GrabConsole->ReferenceCount); + *Console = GrabConsole; + Status = STATUS_SUCCESS; + } // RtlLeaveCriticalSection(&ProcessData->HandleTableLock); return Status; } -VOID FASTCALL -ConSrvReleaseConsole(PCONSOLE Console, - BOOL WasConsoleLocked) +VOID +ConSrvReleaseConsole(IN PCONSOLE Console, + IN BOOLEAN WasConsoleLocked) { - /* Just call the driver */ - ConDrvReleaseConsole(Console, WasConsoleLocked); + LONG RefCount = 0; + + if (!Console) return; + // if (Console->ReferenceCount == 0) return; // This shouldn't happen + ASSERT(Console->ReferenceCount > 0); + + /* The console must be locked */ + // ASSERT(Console_locked); + + /* + * Decrement the reference count. Save the new value too, + * because Console->ReferenceCount might be modified after + * the console gets unlocked but before we check whether we + * can destroy it. + */ + RefCount = _InterlockedDecrement(&Console->ReferenceCount); + + /* Unlock the console if needed */ + if (WasConsoleLocked) LeaveCriticalSection(&Console->Lock); + + /* Delete the console if needed */ + if (RefCount <= 0) ConSrvDeleteConsole(Console); } +/* CONSOLE INITIALIZATION FUNCTIONS *******************************************/ + +VOID NTAPI +ConSrvInitConsoleSupport(VOID) +{ + DPRINT("CONSRV: ConSrvInitConsoleSupport()\n"); + + /* Initialize the console list and its lock */ + ConsoleListSize = 0; + ConsoleList = NULL; + RtlInitializeResource(&ListLock); + + /* Should call LoadKeyboardLayout */ +} + +NTSTATUS NTAPI +ConSrvInitTerminal(IN OUT PTERMINAL Terminal, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId); +NTSTATUS NTAPI +ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal); + NTSTATUS NTAPI ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, OUT PCONSOLE* NewConsole, @@ -164,8 +328,8 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, PCONSOLE Console; CONSOLE_INFO ConsoleInfo; SIZE_T Length = 0; - ULONG i = 0; - FRONTEND FrontEnd; + + TERMINAL Terminal; /* The ConSrv terminal for this console */ if (NewConsole == NULL || ConsoleStartInfo == NULL) return STATUS_INVALID_PARAMETER; @@ -185,39 +349,18 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, wcsncpy(ConsoleInfo.ConsoleTitle, ConsoleStartInfo->ConsoleTitle, Length); ConsoleInfo.ConsoleTitle[Length] = L'\0'; - - /* - * Choose an adequate terminal front-end to load, and load it - */ - Status = STATUS_SUCCESS; - for (i = 0; i < sizeof(FrontEndLoadingMethods) / sizeof(FrontEndLoadingMethods[0]); ++i) - { - DPRINT("CONSRV: Trying to load %s terminal emulator...\n", FrontEndLoadingMethods[i].FrontEndName); - Status = FrontEndLoadingMethods[i].FrontEndLoad(&FrontEnd, - &ConsoleInfo, - ConsoleStartInfo, - ConsoleLeaderProcessId); - if (NT_SUCCESS(Status)) - { - DPRINT("CONSRV: %s terminal emulator loaded successfully\n", FrontEndLoadingMethods[i].FrontEndName); - break; - } - else - { - DPRINT1("CONSRV: Loading %s terminal emulator failed, Status = 0x%08lx , continuing...\n", FrontEndLoadingMethods[i].FrontEndName, Status); - } - } - + /* 3. Initialize the ConSrv terminal */ + Status = ConSrvInitTerminal(&Terminal, + &ConsoleInfo, + ConsoleStartInfo, + ConsoleLeaderProcessId); if (!NT_SUCCESS(Status)) { - DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status); + DPRINT1("CONSRV: Failed to initialize a terminal, Status = 0x%08lx\n", Status); return Status; } + DPRINT("CONSRV: Terminal initialized\n"); - DPRINT("CONSRV: Frontend initialized\n"); - - -/******************************************************************************/ /* * 4. Load the remaining console settings via the registry. */ @@ -252,31 +395,53 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, /* Set-up the code page */ ConsoleInfo.CodePage = GetOEMCP(); -/******************************************************************************/ - Status = ConDrvInitConsole(&ConsoleHandle, - &Console, - &ConsoleInfo, - ConsoleLeaderProcessId); + /* Initialize a new console via the driver */ + Status = ConDrvInitConsole(&Console, &ConsoleInfo); if (!NT_SUCCESS(Status)) { DPRINT1("Creating a new console failed, Status = 0x%08lx\n", Status); - FrontEndLoadingMethods[i].FrontEndUnload(&FrontEnd); + ConSrvDeinitTerminal(&Terminal); return Status; } ASSERT(Console); DPRINT("Console initialized\n"); - Status = ConDrvRegisterFrontEnd(Console, &FrontEnd); + /*** Register ConSrv features ***/ + + /* Initialize process support */ + InitializeListHead(&Console->ProcessList); + Console->NotifiedLastCloseProcess = NULL; + Console->NotifyLastClose = FALSE; + + /* Initialize pausing support */ + Console->PauseFlags = 0; + InitializeListHead(&Console->ReadWaitQueue); + InitializeListHead(&Console->WriteWaitQueue); + + /* Initialize the alias and history buffers */ + Console->Aliases = NULL; + InitializeListHead(&Console->HistoryBuffers); + Console->HistoryBufferSize = ConsoleInfo.HistoryBufferSize; + Console->NumberOfHistoryBuffers = ConsoleInfo.NumberOfHistoryBuffers; + Console->HistoryNoDup = ConsoleInfo.HistoryNoDup; + + Console->QuickEdit = ConsoleInfo.QuickEdit; + + /* Attach the ConSrv terminal to the console */ + Status = ConDrvRegisterTerminal(Console, &Terminal); if (!NT_SUCCESS(Status)) { - DPRINT1("Failed to register frontend to the given console, Status = 0x%08lx\n", Status); + DPRINT1("Failed to register terminal to the given console, Status = 0x%08lx\n", Status); ConDrvDeleteConsole(Console); - FrontEndLoadingMethods[i].FrontEndUnload(&FrontEnd); + ConSrvDeinitTerminal(&Terminal); return Status; } - DPRINT("FrontEnd registered\n"); + DPRINT("Terminal registered\n"); + + /* All went right, so add the console to the list */ + Status = InsertConsole(&ConsoleHandle, Console); /* Return the newly created console to the caller and a success code too */ *NewConsoleHandle = ConsoleHandle; @@ -289,11 +454,160 @@ ConSrvDeleteConsole(PCONSOLE Console) { DPRINT("ConSrvDeleteConsole\n"); - /* Just call the driver. ConSrvDeregisterFrontEnd is called on-demand. */ + // FIXME: Send a terminate message to all the processes owning this console + + /* Remove the console from the list */ + RemoveConsoleByPointer(Console); + + /* Clean aliases and history */ + IntDeleteAllAliases(Console); + HistoryDeleteBuffers(Console); + + /* Now, call the driver. ConDrvDeregisterTerminal is called on-demand. */ ConDrvDeleteConsole(Console); } + + + + +static NTSTATUS +ConSrvConsoleCtrlEventTimeout(IN ULONG CtrlEvent, + IN PCONSOLE_PROCESS_DATA ProcessData, + IN ULONG Timeout) +{ + NTSTATUS Status = STATUS_SUCCESS; + + DPRINT("ConSrvConsoleCtrlEventTimeout Parent ProcessId = %x\n", ProcessData->Process->ClientId.UniqueProcess); + + if (ProcessData->CtrlDispatcher) + { + _SEH2_TRY + { + HANDLE Thread = NULL; + + _SEH2_TRY + { + Thread = CreateRemoteThread(ProcessData->Process->ProcessHandle, NULL, 0, + ProcessData->CtrlDispatcher, + UlongToPtr(CtrlEvent), 0, NULL); + if (NULL == Thread) + { + Status = RtlGetLastNtStatus(); + DPRINT1("Failed thread creation, Status = 0x%08lx\n", Status); + } + else + { + DPRINT("ProcessData->CtrlDispatcher remote thread creation succeeded, ProcessId = %x, Process = 0x%p\n", ProcessData->Process->ClientId.UniqueProcess, ProcessData->Process); + WaitForSingleObject(Thread, Timeout); + } + } + _SEH2_FINALLY + { + CloseHandle(Thread); + } + _SEH2_END; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + DPRINT1("ConSrvConsoleCtrlEventTimeout - Caught an exception, Status = 0x%08lx\n", Status); + } + _SEH2_END; + } + + return Status; +} + +NTSTATUS +ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, + IN PCONSOLE_PROCESS_DATA ProcessData) +{ + return ConSrvConsoleCtrlEventTimeout(CtrlEvent, ProcessData, 0); +} + +PCONSOLE_PROCESS_DATA NTAPI +ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console) +{ + if (Console == NULL) return NULL; + + return CONTAINING_RECORD(Console->ProcessList.Blink, + CONSOLE_PROCESS_DATA, + ConsoleLink); +} + +NTSTATUS NTAPI +ConSrvGetConsoleProcessList(IN PCONSOLE Console, + IN OUT PULONG ProcessIdsList, + IN ULONG MaxIdListItems, + OUT PULONG ProcessIdsTotal) +{ + PCONSOLE_PROCESS_DATA current; + PLIST_ENTRY current_entry; + + if (Console == NULL || ProcessIdsList == NULL || ProcessIdsTotal == NULL) + return STATUS_INVALID_PARAMETER; + + *ProcessIdsTotal = 0; + + for (current_entry = Console->ProcessList.Flink; + current_entry != &Console->ProcessList; + current_entry = current_entry->Flink) + { + current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink); + if (++(*ProcessIdsTotal) <= MaxIdListItems) + { + *ProcessIdsList++ = HandleToUlong(current->Process->ClientId.UniqueProcess); + } + } + + return STATUS_SUCCESS; +} + +// ConSrvGenerateConsoleCtrlEvent +NTSTATUS NTAPI +ConSrvConsoleProcessCtrlEvent(IN PCONSOLE Console, + IN ULONG ProcessGroupId, + IN ULONG CtrlEvent) +{ + NTSTATUS Status = STATUS_SUCCESS; + PLIST_ENTRY current_entry; + PCONSOLE_PROCESS_DATA current; + + /* If the console is already being destroyed, just return */ + if (!ConDrvValidateConsoleState(Console, CONSOLE_RUNNING)) + return STATUS_UNSUCCESSFUL; + + /* + * Loop through the process list, from the most recent process + * (the active one) to the oldest one (the first created, i.e. + * the console leader process), and for each, send an event + * (new processes are inserted at the head of the console process list). + */ + current_entry = Console->ProcessList.Flink; + while (current_entry != &Console->ProcessList) + { + current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink); + current_entry = current_entry->Flink; + + /* + * Only processes belonging to the same process group are signaled. + * If the process group ID is zero, then all the processes are signaled. + */ + if (ProcessGroupId == 0 || current->Process->ProcessGroupId == ProcessGroupId) + { + Status = ConSrvConsoleCtrlEvent(CtrlEvent, current); + } + } + + return Status; +} + + + + + /* PUBLIC SERVER APIS *********************************************************/ CSR_API(SrvAllocConsole) @@ -331,7 +645,7 @@ CSR_API(SrvAllocConsole) /* Return the console handle and the input wait handle to the caller */ AllocConsoleRequest->ConsoleHandle = ProcessData->ConsoleHandle; - AllocConsoleRequest->InputWaitHandle = ProcessData->ConsoleEvent; + AllocConsoleRequest->InputWaitHandle = ProcessData->InputWaitHandle; /* Set the Property-Dialog and Control-Dispatcher handlers */ ProcessData->PropDispatcher = AllocConsoleRequest->PropDispatcher; @@ -408,7 +722,7 @@ CSR_API(SrvAttachConsole) /* Return the console handle and the input wait handle to the caller */ AttachConsoleRequest->ConsoleHandle = TargetProcessData->ConsoleHandle; - AttachConsoleRequest->InputWaitHandle = TargetProcessData->ConsoleEvent; + AttachConsoleRequest->InputWaitHandle = TargetProcessData->InputWaitHandle; /* Set the Property-Dialog and Control-Dispatcher handlers */ TargetProcessData->PropDispatcher = AttachConsoleRequest->PropDispatcher; @@ -591,11 +905,6 @@ CSR_API(SrvSetConsoleCP) return Status; } -NTSTATUS NTAPI -ConDrvGetConsoleProcessList(IN PCONSOLE Console, - IN OUT PULONG ProcessIdsList, - IN ULONG MaxIdListItems, - OUT PULONG ProcessIdsTotal); CSR_API(SrvGetConsoleProcessList) { NTSTATUS Status; @@ -613,7 +922,7 @@ CSR_API(SrvGetConsoleProcessList) Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; - Status = ConDrvGetConsoleProcessList(Console, + Status = ConSrvGetConsoleProcessList(Console, GetProcessListRequest->ProcessIdsList, GetProcessListRequest->ProcessCount, &GetProcessListRequest->ProcessCount); @@ -631,7 +940,7 @@ CSR_API(SrvGenerateConsoleCtrlEvent) Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); if (!NT_SUCCESS(Status)) return Status; - Status = ConDrvConsoleProcessCtrlEvent(Console, + Status = ConSrvConsoleProcessCtrlEvent(Console, GenerateCtrlEventRequest->ProcessGroupId, GenerateCtrlEventRequest->CtrlEvent); @@ -668,8 +977,18 @@ CSR_API(SrvConsoleNotifyLastClose) CSR_API(SrvGetConsoleMouseInfo) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PCONSOLE_GETMOUSEINFO GetMouseInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetMouseInfoRequest; + PCONSOLE Console; + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + /* Just retrieve the number of buttons of the mouse attached to this console */ + GetMouseInfoRequest->NumButtons = GetSystemMetrics(SM_CMOUSEBUTTONS); + + ConSrvReleaseConsole(Console, TRUE); + return STATUS_SUCCESS; } CSR_API(SrvSetConsoleKeyShortcuts) @@ -680,8 +999,21 @@ CSR_API(SrvSetConsoleKeyShortcuts) CSR_API(SrvGetConsoleKeyboardLayoutName) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PCONSOLE_GETKBDLAYOUTNAME GetKbdLayoutNameRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetKbdLayoutNameRequest; + PCONSOLE Console; + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + /* Retrieve the keyboard layout name of the system */ + if (GetKbdLayoutNameRequest->Ansi) + GetKeyboardLayoutNameA((PCHAR)GetKbdLayoutNameRequest->LayoutBuffer); + else + GetKeyboardLayoutNameW((PWCHAR)GetKbdLayoutNameRequest->LayoutBuffer); + + ConSrvReleaseConsole(Console, TRUE); + return STATUS_SUCCESS; } CSR_API(SrvGetConsoleCharType) diff --git a/win32ss/user/winsrv/consrv/console.h b/win32ss/user/winsrv/consrv/console.h index d797920a5a5..a63754e4cbd 100644 --- a/win32ss/user/winsrv/consrv/console.h +++ b/win32ss/user/winsrv/consrv/console.h @@ -8,8 +8,8 @@ #pragma once -// FIXME: Fix compilation -struct _CONSOLE; +VOID NTAPI +ConSrvInitConsoleSupport(VOID); NTSTATUS NTAPI ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, @@ -18,8 +18,17 @@ ConSrvInitConsole(OUT PHANDLE NewConsoleHandle, IN ULONG ConsoleLeaderProcessId); VOID NTAPI ConSrvDeleteConsole(struct _CONSOLE* /* PCONSOLE */ Console); -NTSTATUS FASTCALL ConSrvGetConsole(PCONSOLE_PROCESS_DATA ProcessData, - struct _CONSOLE** /* PCONSOLE* */ Console, - BOOL LockConsole); -VOID FASTCALL ConSrvReleaseConsole(struct _CONSOLE* /* PCONSOLE */ Console, - BOOL WasConsoleLocked); +NTSTATUS +ConSrvGetConsole(IN PCONSOLE_PROCESS_DATA ProcessData, + OUT struct _CONSOLE** /* PCONSOLE* */ Console, + IN BOOLEAN LockConsole); +VOID +ConSrvReleaseConsole(IN struct _CONSOLE* /* PCONSOLE */ Console, + IN BOOLEAN WasConsoleLocked); + + +BOOLEAN NTAPI +ConSrvValidateConsole(OUT struct _CONSOLE** /* PCONSOLE* */ Console, + IN HANDLE ConsoleHandle, + IN CONSOLE_STATE ExpectedState, + IN BOOLEAN LockConsole); diff --git a/win32ss/user/winsrv/consrv/consrv.h b/win32ss/user/winsrv/consrv/consrv.h index b30e00994f0..57a0acfb792 100644 --- a/win32ss/user/winsrv/consrv/consrv.h +++ b/win32ss/user/winsrv/consrv/consrv.h @@ -51,12 +51,12 @@ typedef struct _CONSOLE_PROCESS_DATA { LIST_ENTRY ConsoleLink; PCSR_PROCESS Process; // Process owning this structure. - HANDLE ConsoleEvent; + HANDLE InputWaitHandle; HANDLE ConsoleHandle; HANDLE ParentConsoleHandle; - BOOL ConsoleApp; // TRUE if it is a CUI app, FALSE otherwise. + BOOLEAN ConsoleApp; // TRUE if it is a CUI app, FALSE otherwise. RTL_CRITICAL_SECTION HandleTableLock; ULONG HandleTableSize; diff --git a/win32ss/user/winsrv/consrv/frontendctl.c b/win32ss/user/winsrv/consrv/frontendctl.c index a4cf977b07e..e8545ecc3ab 100644 --- a/win32ss/user/winsrv/consrv/frontendctl.c +++ b/win32ss/user/winsrv/consrv/frontendctl.c @@ -30,7 +30,7 @@ * with NT's, but values are not. */ #if 0 -static NTSTATUS FASTCALL +static NTSTATUS SetConsoleHardwareState(PCONSOLE Console, ULONG ConsoleHwState) { DPRINT1("Console Hardware State: %d\n", ConsoleHwState); diff --git a/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c b/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c index 5e04d1e3d7b..fc229215fe4 100644 --- a/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c +++ b/win32ss/user/winsrv/consrv/frontends/gui/conwnd.c @@ -48,7 +48,7 @@ SetConWndConsoleLeaderCID(IN PGUI_CONSOLE_DATA GuiData) PCONSOLE_PROCESS_DATA ProcessData; CLIENT_ID ConsoleLeaderCID; - ProcessData = ConDrvGetConsoleLeaderProcess(GuiData->Console); + ProcessData = ConSrvGetConsoleLeaderProcess(GuiData->Console); ConsoleLeaderCID = ProcessData->Process->ClientId; SetWindowLongPtrW(GuiData->hWindow, GWLP_CONSOLE_LEADER_PID, (LONG_PTR)(ConsoleLeaderCID.UniqueProcess)); @@ -506,8 +506,8 @@ OnNcCreate(HWND hWnd, LPCREATESTRUCTW Create) GuiData->hWindow = hWnd; - GuiData->Font = CreateFontW(LOWORD(GuiData->GuiInfo.FontSize), - 0, // HIWORD(GuiData->GuiInfo.FontSize), + GuiData->Font = CreateFontW(GuiData->GuiInfo.FontSize.X, + 0, // GuiData->GuiInfo.FontSize.Y, 0, TA_BASELINE, GuiData->GuiInfo.FontWeight, @@ -610,7 +610,6 @@ GuiConsoleSwitchFullScreen(PGUI_CONSOLE_DATA GuiData); static VOID OnActivate(PGUI_CONSOLE_DATA GuiData, WPARAM wParam) { - PCONSOLE Console = GuiData->Console; WORD ActivationState = LOWORD(wParam); DPRINT1("WM_ACTIVATE - ActivationState = %d\n"); @@ -637,12 +636,11 @@ OnActivate(PGUI_CONSOLE_DATA GuiData, WPARAM wParam) } /* - * When we are in QuickEdit mode, ignore the next mouse signal - * when we are going to be enabled again via the mouse, in order - * to prevent e.g. an erroneous right-click from the user which - * would have as an effect to paste some unwanted text... + * Ignore the next mouse signal when we are going to be enabled again via + * the mouse, in order to prevent, e.g. when we are in Edit mode, erroneous + * mouse actions from the user that could spoil text selection or copy/pastes. */ - if (Console->QuickEdit && (ActivationState == WA_CLICKACTIVE)) + if (ActivationState == WA_CLICKACTIVE) GuiData->IgnoreNextMouseSignal = TRUE; } @@ -947,12 +945,10 @@ GuiPaintGraphicsBuffer(PGRAPHICS_SCREEN_BUFFER Buffer, static VOID OnPaint(PGUI_CONSOLE_DATA GuiData) { - PCONSOLE_SCREEN_BUFFER ActiveBuffer; + PCONSOLE_SCREEN_BUFFER ActiveBuffer = GuiData->ActiveBuffer; PAINTSTRUCT ps; RECT rcPaint; - ActiveBuffer = GuiData->ActiveBuffer; - BeginPaint(GuiData->hWindow, &ps); if (ps.hdc != NULL && ps.rcPaint.left < ps.rcPaint.right && @@ -1325,7 +1321,7 @@ OnClose(PGUI_CONSOLE_DATA GuiData) * We shouldn't wait here, though, since the console lock is entered. * A copy of the thread list probably needs to be made. */ - ConDrvConsoleProcessCtrlEvent(Console, 0, CTRL_CLOSE_EVENT); + ConSrvConsoleProcessCtrlEvent(Console, 0, CTRL_CLOSE_EVENT); LeaveCriticalSection(&Console->Lock); return FALSE; @@ -1386,15 +1382,18 @@ OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) BOOL Err = FALSE; PCONSOLE 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 + // with the mouse, or not. + if (GuiData->IgnoreNextMouseSignal) { if (msg != WM_LBUTTONDOWN && msg != WM_MBUTTONDOWN && - msg != WM_RBUTTONDOWN && - msg != WM_MOUSEMOVE) + msg != WM_RBUTTONDOWN) { /* - * If this mouse signal is not a button-down action or a move, + * If this mouse signal is not a button-down action * then it is the last signal being ignored. */ GuiData->IgnoreNextMouseSignal = FALSE; @@ -1402,7 +1401,7 @@ OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) else { /* - * This mouse signal is a button-down action or a move. + * This mouse signal is a button-down action. * Ignore it and perform default action. */ Err = TRUE; @@ -1610,6 +1609,20 @@ OnMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM lParam) break; } + /* + * HACK FOR CORE-8394: Ignore the next mouse move signal + * just after mouse down click actions. + */ + switch (msg) + { + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + GuiData->IgnoreNextMouseSignal = TRUE; + default: + break; + } + if (!Err) { if (wKeyState & MK_LBUTTON) @@ -1832,7 +1845,6 @@ OnMove(PGUI_CONSOLE_DATA GuiData) // HACK: This functionality is standard for general scrollbars. Don't add it by hand. VOID -FASTCALL GuiConsoleHandleScrollbarMenu(VOID) { HMENU hMenu; @@ -2071,7 +2083,7 @@ ConWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) /* Detect Alt-Esc/Space/Tab presses defer to DefWindowProc */ if ( (HIWORD(lParam) & KF_ALTDOWN) && (wParam == VK_ESCAPE || wParam == VK_SPACE || wParam == VK_TAB)) { - return DefWindowProcW(hWnd, msg, wParam, lParam); + return DefWindowProcW(hWnd, msg, wParam, lParam); } OnKey(GuiData, msg, wParam, lParam); @@ -2309,6 +2321,19 @@ ConWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) break; } + /* + * Undocumented message sent by Windows' console.dll for applying console info. + * See http://www.catch22.net/sites/default/source/files/setconsoleinfo.c + * and http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf + * for more information. + */ + case WM_SETCONSOLEINFO: + { + DPRINT1("WM_SETCONSOLEINFO message\n"); + GuiApplyWindowsConsoleSettings(GuiData, (HANDLE)wParam); + break; + } + case PM_CONSOLE_BEEP: DPRINT1("Beep !!\n"); Beep(800, 200); diff --git a/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c b/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c index 457a6c496c6..3220152419a 100644 --- a/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c +++ b/win32ss/user/winsrv/consrv/frontends/gui/guisettings.c @@ -98,7 +98,8 @@ GuiConsoleReadUserSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, } else if (!wcscmp(szValueName, L"FontSize")) { - TermInfo->FontSize = Value; + TermInfo->FontSize.X = LOWORD(Value); + TermInfo->FontSize.Y = HIWORD(Value); RetVal = TRUE; } else if (!wcscmp(szValueName, L"FontWeight")) @@ -159,7 +160,10 @@ 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); - SetConsoleSetting(L"FontSize", REG_DWORD, sizeof(DWORD), &TermInfo->FontSize, 0); + + Storage = MAKELONG(TermInfo->FontSize.X, TermInfo->FontSize.Y); + SetConsoleSetting(L"FontSize", REG_DWORD, sizeof(DWORD), &Storage, 0); + SetConsoleSetting(L"FontWeight", REG_DWORD, sizeof(DWORD), &TermInfo->FontWeight, FW_DONTCARE); Storage = TermInfo->FullScreen; @@ -200,7 +204,8 @@ GuiConsoleGetDefaultSettings(IN OUT PGUI_CONSOLE_INFO TermInfo, wcsncpy(TermInfo->FaceName, L"VGA", LF_FACESIZE); // HACK: !! // TermInfo->FaceName[0] = L'\0'; TermInfo->FontFamily = FF_DONTCARE; - TermInfo->FontSize = 0; + TermInfo->FontSize.X = 0; + TermInfo->FontSize.Y = 0; TermInfo->FontWeight = FW_DONTCARE; TermInfo->UseRasterFonts = TRUE; @@ -357,7 +362,7 @@ GuiConsoleShowConsoleProperties(PGUI_CONSOLE_DATA GuiData, NtUnmapViewOfSection(NtCurrentProcess(), pSharedInfo); /* Get the console leader process, our client */ - ProcessData = ConDrvGetConsoleLeaderProcess(Console); + ProcessData = ConSrvGetConsoleLeaderProcess(Console); /* Duplicate the section handle for the client */ Status = NtDuplicateObject(NtCurrentProcess(), @@ -433,7 +438,7 @@ GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; /* Get the console leader process, our client */ - ProcessData = ConDrvGetConsoleLeaderProcess(Console); + ProcessData = ConSrvGetConsoleLeaderProcess(Console); /* Duplicate the section handle for ourselves */ Status = NtDuplicateObject(ProcessData->Process->ProcessHandle, @@ -457,7 +462,7 @@ GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, &ViewSize, ViewUnmap, 0, - PAGE_READONLY); + PAGE_READWRITE); if (!NT_SUCCESS(Status)) { DPRINT1("Error when mapping view of file, Status = %lu\n", Status); @@ -544,4 +549,180 @@ Quit: return; } +/* + * Function for dealing with the undocumented message and structure used by + * Windows' console.dll for setting console info. + * See http://www.catch22.net/sites/default/source/files/setconsoleinfo.c + * and http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf + * for more information. + */ +VOID +GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, + HANDLE hClientSection) +{ + NTSTATUS Status = STATUS_SUCCESS; + PCONSOLE Console = GuiData->Console; + PCONSOLE_PROCESS_DATA ProcessData; + HANDLE hSection = NULL; + ULONG ViewSize = 0; + PCONSOLE_STATE_INFO pConInfo = NULL; + CONSOLE_INFO ConInfo; + GUI_CONSOLE_INFO GuiInfo; + SIZE_T Length; + + if (!ConDrvValidateConsoleUnsafe(Console, CONSOLE_RUNNING, TRUE)) return; + + /* Get the console leader process, our client */ + ProcessData = ConSrvGetConsoleLeaderProcess(Console); + + /* Duplicate the section handle for ourselves */ + Status = NtDuplicateObject(ProcessData->Process->ProcessHandle, + hClientSection, + NtCurrentProcess(), + &hSection, + 0, 0, DUPLICATE_SAME_ACCESS); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Error when mapping client handle, Status = %lu\n", Status); + goto Quit; + } + + /* Get a view of the shared section */ + Status = NtMapViewOfSection(hSection, + NtCurrentProcess(), + (PVOID*)&pConInfo, + 0, + 0, + NULL, + &ViewSize, + ViewUnmap, + 0, + PAGE_READWRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Error when mapping view of file, Status = %lu\n", Status); + goto Quit; + } + + _SEH2_TRY + { + /* Check that the section is well-sized */ + if ( (ViewSize < sizeof(CONSOLE_STATE_INFO)) || + (pConInfo->cbSize != sizeof(CONSOLE_STATE_INFO)) ) + { + DPRINT1("Error: section bad-sized: sizeof(Section) < sizeof(CONSOLE_STATE_INFO)\n"); + Status = STATUS_INVALID_VIEW_SIZE; + _SEH2_YIELD(goto Quit); + } + + // TODO: Check that GuiData->hWindow == pConInfo->hConsoleWindow + + /* Retrieve terminal informations */ + + // Console information + ConInfo.HistoryBufferSize = pConInfo->HistoryBufferSize; + ConInfo.NumberOfHistoryBuffers = pConInfo->NumberOfHistoryBuffers; + ConInfo.HistoryNoDup = !!pConInfo->HistoryNoDup; + ConInfo.QuickEdit = !!pConInfo->QuickEdit; + ConInfo.InsertMode = !!pConInfo->InsertMode; + ConInfo.ScreenBufferSize = pConInfo->ScreenBufferSize; + ConInfo.ConsoleSize = pConInfo->WindowSize; + ConInfo.CursorSize = pConInfo->CursorSize; + ConInfo.ScreenAttrib = pConInfo->ScreenColors; + ConInfo.PopupAttrib = pConInfo->PopupColors; + memcpy(&ConInfo.Colors, pConInfo->ColorTable, sizeof(ConInfo.Colors)); + ConInfo.CodePage = pConInfo->CodePage; + /**ConInfo.ConsoleTitle[MAX_PATH + 1] = pConInfo->ConsoleTitle; // FIXME: memcpy**/ +#if 0 + /* Title of the console, original one corresponding to the one set by the console leader */ + Length = min(sizeof(pConInfo->ConsoleTitle) / sizeof(pConInfo->ConsoleTitle[0]) - 1, + Console->OriginalTitle.Length / sizeof(WCHAR)); + wcsncpy(pSharedInfo->ci.ConsoleTitle, Console->OriginalTitle.Buffer, Length); +#endif + // ULONG ConInfo.InputBufferSize = pConInfo-> + // BOOLEAN ConInfo.CursorBlinkOn = pConInfo-> + // BOOLEAN ConInfo.ForceCursorOff = pConInfo-> + + + // Terminal information + Length = min(wcslen(pConInfo->FaceName) + 1, LF_FACESIZE); // wcsnlen + wcsncpy(GuiInfo.FaceName, pConInfo->FaceName, LF_FACESIZE); + GuiInfo.FaceName[Length] = L'\0'; + + GuiInfo.FontFamily = pConInfo->FontFamily; + GuiInfo.FontSize = pConInfo->FontSize; + GuiInfo.FontWeight = pConInfo->FontWeight; + GuiInfo.FullScreen = !!pConInfo->FullScreen; + GuiInfo.AutoPosition = !!pConInfo->AutoPosition; + GuiInfo.WindowOrigin = pConInfo->WindowPosition; + // BOOL GuiInfo.UseRasterFonts = pConInfo-> + // WORD GuiInfo.ShowWindow = pConInfo-> + + + + /* + * If we don't set the default parameters, + * apply them, otherwise just save them. + */ +#if 0 + if (pConInfo->ShowDefaultParams == FALSE) +#endif + { + /* Set the console informations */ + ConSrvApplyUserSettings(Console, &ConInfo); + + /* Set the terminal informations */ + + // memcpy(&GuiData->GuiInfo, &GuiInfo, sizeof(GUI_CONSOLE_INFO)); + + /* Move the window to the user's values */ + GuiData->GuiInfo.AutoPosition = GuiInfo.AutoPosition; + GuiData->GuiInfo.WindowOrigin = GuiInfo.WindowOrigin; + GuiConsoleMoveWindow(GuiData); + + InvalidateRect(GuiData->hWindow, NULL, TRUE); + + /* + * Apply full-screen mode. + */ + if (GuiInfo.FullScreen != GuiData->GuiInfo.FullScreen) + { + SwitchFullScreen(GuiData, GuiInfo.FullScreen); + } + } + +#if 0 + /* + * Save settings if needed + */ + // FIXME: Do it in the console properties applet ?? + if (SaveSettings) + { + DWORD ProcessId = HandleToUlong(ProcessData->Process->ClientId.UniqueProcess); + ConSrvWriteUserSettings(&ConInfo, ProcessId); + GuiConsoleWriteUserSettings(&GuiInfo, ConInfo.ConsoleTitle, ProcessId); + } +#endif + + Status = STATUS_SUCCESS; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + DPRINT1("GuiApplyUserSettings - Caught an exception, Status = %08X\n", Status); + } + _SEH2_END; + +Quit: + /* Finally, close the section and return */ + if (hSection) + { + NtUnmapViewOfSection(NtCurrentProcess(), pConInfo); + NtClose(hSection); + } + + LeaveCriticalSection(&Console->Lock); + return; +} + /* EOF */ diff --git a/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h b/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h index 6681425205f..ff8a91265d8 100644 --- a/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h +++ b/win32ss/user/winsrv/consrv/frontends/gui/guisettings.h @@ -14,7 +14,16 @@ #ifndef WM_APP #define WM_APP 0x8000 #endif -#define PM_APPLY_CONSOLE_INFO (WM_APP + 100) +/* Message sent by ReactOS' console.dll for applying console info */ +#define PM_APPLY_CONSOLE_INFO (WM_APP + 100) + +/* + * Undocumented message sent by Windows' console.dll for applying console info. + * See http://www.catch22.net/sites/default/source/files/setconsoleinfo.c + * and http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf + * for more information. + */ +#define WM_SETCONSOLEINFO (WM_USER + 201) /* STRUCTURES *****************************************************************/ @@ -22,9 +31,9 @@ typedef struct _GUI_CONSOLE_INFO { // FONTSIGNATURE FontSignature; WCHAR FaceName[LF_FACESIZE]; - UINT FontFamily; - DWORD FontSize; - DWORD FontWeight; + ULONG FontFamily; + COORD FontSize; + ULONG FontWeight; BOOL UseRasterFonts; BOOL FullScreen; /* Whether the console is displayed in full-screen or windowed mode */ @@ -35,6 +44,46 @@ typedef struct _GUI_CONSOLE_INFO POINT WindowOrigin; } GUI_CONSOLE_INFO, *PGUI_CONSOLE_INFO; +/* + * Undocumented structure used by Windows' console.dll for setting console info. + * See http://www.catch22.net/sites/default/source/files/setconsoleinfo.c + * and http://www.scn.rain.com/~neighorn/PDF/MSBugPaper.pdf + * for more information. + */ +#pragma pack(push, 1) +typedef struct _CONSOLE_STATE_INFO +{ + ULONG cbSize; + COORD ScreenBufferSize; + COORD WindowSize; + POINT WindowPosition; // WindowPosX and Y + + COORD FontSize; + ULONG FontFamily; + ULONG FontWeight; + WCHAR FaceName[LF_FACESIZE]; + + ULONG CursorSize; + BOOL FullScreen; + BOOL QuickEdit; + BOOL AutoPosition; + BOOL InsertMode; + + USHORT ScreenColors; // ScreenAttributes + USHORT PopupColors; // PopupAttributes + BOOL HistoryNoDup; + ULONG HistoryBufferSize; + ULONG NumberOfHistoryBuffers; + + COLORREF ColorTable[16]; + + ULONG CodePage; + HWND HWnd; + + WCHAR ConsoleTitle[256]; +} CONSOLE_STATE_INFO, *PCONSOLE_STATE_INFO; +#pragma pack(pop) + #ifndef CONSOLE_H__ // If we aren't included by console.dll #include "conwnd.h" @@ -59,6 +108,9 @@ VOID GuiApplyUserSettings(PGUI_CONSOLE_DATA GuiData, HANDLE hClientSection, BOOL SaveSettings); +VOID +GuiApplyWindowsConsoleSettings(PGUI_CONSOLE_DATA GuiData, + HANDLE hClientSection); #endif diff --git a/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c b/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c index 9479917c4ea..6fb343a324d 100644 --- a/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c +++ b/win32ss/user/winsrv/consrv/frontends/gui/guiterm.c @@ -433,7 +433,7 @@ GuiInitFrontEnd(IN OUT PFRONTEND This, DPRINT1("CONSRV: Failed to create GUI_CONSOLE_DATA\n"); return STATUS_UNSUCCESSFUL; } - ///// /* HACK */ Console->TermIFace.Data = (PVOID)GuiData; /* HACK */ + ///// /* HACK */ Console->FrontEndIFace.Data = (PVOID)GuiData; /* HACK */ GuiData->Console = Console; GuiData->ActiveBuffer = Console->ActiveBuffer; GuiData->hWindow = NULL; @@ -802,25 +802,6 @@ GuiReleaseScreenBuffer(IN OUT PFRONTEND This, } } -static BOOL NTAPI -GuiProcessKeyCallback(IN OUT PFRONTEND This, - MSG* msg, - BYTE KeyStateMenu, - DWORD ShiftState, - UINT VirtualKeyCode, - BOOL Down) -{ - if ((ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED) || KeyStateMenu & 0x80) && - (VirtualKeyCode == VK_ESCAPE || VirtualKeyCode == VK_TAB || VirtualKeyCode == VK_SPACE)) - { - DPRINT1("GuiProcessKeyCallback\n"); - //DefWindowProcW(msg->hwnd, msg->message, msg->wParam, msg->lParam); - //return TRUE; - } - - return FALSE; -} - static BOOL NTAPI GuiSetMouseCursor(IN OUT PFRONTEND This, HCURSOR CursorHandle); @@ -1105,7 +1086,6 @@ static FRONTEND_VTBL GuiVtbl = GuiResizeTerminal, GuiSetActiveScreenBuffer, GuiReleaseScreenBuffer, - GuiProcessKeyCallback, GuiRefreshInternalInfo, GuiChangeTitle, GuiChangeIcon, diff --git a/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h b/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h index 67d7871728d..b70efa96a6f 100644 --- a/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h +++ b/win32ss/user/winsrv/consrv/frontends/gui/guiterm.h @@ -14,7 +14,7 @@ #include "guisettings.h" #include "conwnd.h" -NTSTATUS FASTCALL GuiInitConsole(PCONSOLE Console, +NTSTATUS GuiInitConsole(PCONSOLE Console, /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, PCONSOLE_INFO ConsoleInfo, DWORD ProcessId, diff --git a/win32ss/user/winsrv/consrv/frontends/input.c b/win32ss/user/winsrv/consrv/frontends/input.c index 17b7ff39cab..2fb6f3b8071 100644 --- a/win32ss/user/winsrv/consrv/frontends/input.c +++ b/win32ss/user/winsrv/consrv/frontends/input.c @@ -20,7 +20,78 @@ /* PRIVATE FUNCTIONS **********************************************************/ -static DWORD FASTCALL +static VOID +ConDrvProcessKey(IN PCONSOLE Console, + IN BOOLEAN Down, + IN UINT VirtualKeyCode, + IN UINT VirtualScanCode, + IN WCHAR UnicodeChar, + IN ULONG ShiftState, + IN BYTE KeyStateCtrl) +{ + INPUT_RECORD er; + + /* process Ctrl-C and Ctrl-Break */ + if ( Console->InputBuffer.Mode & ENABLE_PROCESSED_INPUT && + Down && (VirtualKeyCode == VK_PAUSE || VirtualKeyCode == 'C') && + (ShiftState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED) || KeyStateCtrl & 0x80) ) + { + DPRINT1("Console_Api Ctrl-C\n"); + ConSrvConsoleProcessCtrlEvent(Console, 0, CTRL_C_EVENT); + + if (Console->LineBuffer && !Console->LineComplete) + { + /* Line input is in progress; end it */ + Console->LinePos = Console->LineSize = 0; + Console->LineComplete = TRUE; + } + return; + } + + if ( (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) != 0 && + (VK_UP == VirtualKeyCode || VK_DOWN == VirtualKeyCode) ) + { + if (!Down) return; + + /* scroll up or down */ + if (VK_UP == VirtualKeyCode) + { + /* only scroll up if there is room to scroll up into */ + if (Console->ActiveBuffer->CursorPosition.Y != Console->ActiveBuffer->ScreenBufferSize.Y - 1) + { + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + + Console->ActiveBuffer->ScreenBufferSize.Y - 1) % + Console->ActiveBuffer->ScreenBufferSize.Y; + Console->ActiveBuffer->CursorPosition.Y++; + } + } + else + { + /* only scroll down if there is room to scroll down into */ + if (Console->ActiveBuffer->CursorPosition.Y != 0) + { + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) % + Console->ActiveBuffer->ScreenBufferSize.Y; + Console->ActiveBuffer->CursorPosition.Y--; + } + } + + ConioDrawConsole(Console); + return; + } + + er.EventType = KEY_EVENT; + er.Event.KeyEvent.bKeyDown = Down; + er.Event.KeyEvent.wRepeatCount = 1; + er.Event.KeyEvent.wVirtualKeyCode = VirtualKeyCode; + er.Event.KeyEvent.wVirtualScanCode = VirtualScanCode; + er.Event.KeyEvent.uChar.UnicodeChar = UnicodeChar; + er.Event.KeyEvent.dwControlKeyState = ShiftState; + + ConioProcessInputEvent(Console, &er); +} + +static DWORD ConioGetShiftState(PBYTE KeyState, LPARAM lParam) { DWORD ssOut = 0; @@ -104,16 +175,6 @@ ConioProcessKey(PCONSOLE Console, MSG* msg) UnicodeChar = (1 == RetChars ? Chars[0] : 0); } - if (TermProcessKeyCallback(Console, - msg, - KeyState[VK_MENU], - ShiftState, - VirtualKeyCode, - Down)) - { - return; - } - Fake = UnicodeChar && (msg->message != WM_CHAR && msg->message != WM_SYSCHAR && msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP); @@ -143,4 +204,14 @@ ConioProcessKey(PCONSOLE Console, MSG* msg) KeyState[VK_CONTROL]); } +DWORD +ConioEffectiveCursorSize(PCONSOLE Console, DWORD Scale) +{ + DWORD Size = (Console->ActiveBuffer->CursorInfo.dwSize * Scale + 99) / 100; + /* If line input in progress, perhaps adjust for insert toggle */ + if (Console->LineBuffer && !Console->LineComplete && (Console->InsertMode ? !Console->LineInsertToggle : Console->LineInsertToggle)) + return (Size * 2 <= Scale) ? (Size * 2) : (Size / 2); + return Size; +} + /* EOF */ diff --git a/win32ss/user/winsrv/consrv/frontends/terminal.c b/win32ss/user/winsrv/consrv/frontends/terminal.c new file mode 100644 index 00000000000..b2ba1a95885 --- /dev/null +++ b/win32ss/user/winsrv/consrv/frontends/terminal.c @@ -0,0 +1,363 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Console Server DLL + * FILE: frontends/terminal.c + * PURPOSE: ConSrv terminal. + * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + +/* INCLUDES *******************************************************************/ + +#include + +// #include "frontends/gui/guiterm.h" +#ifdef TUITERM_COMPILE +#include "frontends/tui/tuiterm.h" +#endif + +#define NDEBUG +#include + +/* CONSRV TERMINAL FRONTENDS INTERFACE ****************************************/ + +/***************/ +#ifdef TUITERM_COMPILE +NTSTATUS NTAPI +TuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId); +NTSTATUS NTAPI +TuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd); +#endif + +NTSTATUS NTAPI +GuiLoadFrontEnd(IN OUT PFRONTEND FrontEnd, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId); +NTSTATUS NTAPI +GuiUnloadFrontEnd(IN OUT PFRONTEND FrontEnd); +/***************/ + +typedef +NTSTATUS (NTAPI *FRONTEND_LOAD)(IN OUT PFRONTEND FrontEnd, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId); + +typedef +NTSTATUS (NTAPI *FRONTEND_UNLOAD)(IN OUT PFRONTEND FrontEnd); + +/* + * If we are not in GUI-mode, start the text-mode terminal emulator. + * If we fail, try to start the GUI-mode terminal emulator. + * + * Try to open the GUI-mode terminal emulator. Two cases are possible: + * - We are in GUI-mode, therefore GuiMode == TRUE, the previous test-case + * failed and we start GUI-mode terminal emulator. + * - We are in text-mode, therefore GuiMode == FALSE, the previous test-case + * succeeded BUT we failed at starting text-mode terminal emulator. + * Then GuiMode was switched to TRUE in order to try to open the GUI-mode + * terminal emulator (Win32k will automatically switch to graphical mode, + * therefore no additional code is needed). + */ + +/* + * NOTE: Each entry of the table should be retrieved when loading a front-end + * (examples of the CSR servers which register some data for CSRSS). + */ +struct +{ + CHAR FrontEndName[80]; + FRONTEND_LOAD FrontEndLoad; + FRONTEND_UNLOAD FrontEndUnload; +} FrontEndLoadingMethods[] = +{ +#ifdef TUITERM_COMPILE + {"TUI", TuiLoadFrontEnd, TuiUnloadFrontEnd}, +#endif + {"GUI", GuiLoadFrontEnd, GuiUnloadFrontEnd}, + +// {"Not found", 0, NULL} +}; + +static NTSTATUS +ConSrvLoadFrontEnd(IN OUT PFRONTEND FrontEnd, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId) +{ + NTSTATUS Status = STATUS_SUCCESS; + ULONG i; + + /* + * Choose an adequate terminal front-end to load, and load it + */ + for (i = 0; i < sizeof(FrontEndLoadingMethods) / sizeof(FrontEndLoadingMethods[0]); ++i) + { + DPRINT("CONSRV: Trying to load %s frontend...\n", + FrontEndLoadingMethods[i].FrontEndName); + Status = FrontEndLoadingMethods[i].FrontEndLoad(FrontEnd, + ConsoleInfo, + ExtraConsoleInfo, + ProcessId); + if (NT_SUCCESS(Status)) + { + /* Save the unload callback */ + FrontEnd->UnloadFrontEnd = FrontEndLoadingMethods[i].FrontEndUnload; + + DPRINT("CONSRV: %s frontend loaded successfully\n", + FrontEndLoadingMethods[i].FrontEndName); + break; + } + else + { + DPRINT1("CONSRV: Loading %s frontend failed, Status = 0x%08lx , continuing...\n", + FrontEndLoadingMethods[i].FrontEndName, Status); + } + } + + return Status; +} + +static NTSTATUS +ConSrvUnloadFrontEnd(IN PFRONTEND FrontEnd) +{ + if (FrontEnd == NULL) return STATUS_INVALID_PARAMETER; + // return FrontEnd->Vtbl->UnloadFrontEnd(FrontEnd); + return FrontEnd->UnloadFrontEnd(FrontEnd); +} + +// See after... +static TERMINAL_VTBL ConSrvTermVtbl; + +NTSTATUS NTAPI +ConSrvInitTerminal(IN OUT PTERMINAL Terminal, + IN OUT PCONSOLE_INFO ConsoleInfo, + IN OUT PVOID ExtraConsoleInfo, + IN ULONG ProcessId) +{ + NTSTATUS Status; + PFRONTEND FrontEnd; + + /* Load a suitable frontend for the ConSrv terminal */ + FrontEnd = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(*FrontEnd)); + if (!FrontEnd) return STATUS_NO_MEMORY; + + Status = ConSrvLoadFrontEnd(FrontEnd, + ConsoleInfo, + ExtraConsoleInfo, + ProcessId); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CONSRV: Failed to initialize a frontend, Status = 0x%08lx\n", Status); + ConsoleFreeHeap(FrontEnd); + return Status; + } + DPRINT("CONSRV: Frontend initialized\n"); + + /* Initialize the ConSrv terminal */ + Terminal->Vtbl = &ConSrvTermVtbl; + // Terminal->Console will be initialized by ConDrvRegisterTerminal + Terminal->Data = FrontEnd; /* We store the frontend pointer in the terminal private data */ + + return STATUS_SUCCESS; +} + +NTSTATUS NTAPI +ConSrvDeinitTerminal(IN OUT PTERMINAL Terminal) +{ + NTSTATUS Status = STATUS_SUCCESS; + PFRONTEND FrontEnd = Terminal->Data; + + /* Reset the ConSrv terminal */ + Terminal->Data = NULL; + Terminal->Vtbl = NULL; + + /* Unload the frontend */ + if (FrontEnd != NULL) + { + Status = ConSrvUnloadFrontEnd(FrontEnd); + ConsoleFreeHeap(FrontEnd); + } + + return Status; +} + + +/* CONSRV TERMINAL INTERFACE **************************************************/ + +static NTSTATUS NTAPI +ConSrvTermInitTerminal(IN OUT PTERMINAL This, + IN PCONSOLE Console) +{ + NTSTATUS Status; + PFRONTEND FrontEnd = This->Data; + + /* Initialize the console pointer for our frontend */ + FrontEnd->Console = Console; + + /** HACK HACK!! Copy FrontEnd into the console!! **/ + DPRINT1("Using FrontEndIFace HACK(1), should be removed after proper implementation!\n"); + Console->FrontEndIFace = *FrontEnd; + + Status = FrontEnd->Vtbl->InitFrontEnd(FrontEnd, FrontEnd->Console); + + /** HACK HACK!! Be sure FrontEndIFace is correctly updated in the console!! **/ + DPRINT1("Using FrontEndIFace HACK(2), should be removed after proper implementation!\n"); + Console->FrontEndIFace = *FrontEnd; + + return Status; +} + +static VOID NTAPI +ConSrvTermDeinitTerminal(IN OUT PTERMINAL This) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->DeinitFrontEnd(FrontEnd); +} + +static VOID NTAPI +ConSrvTermDrawRegion(IN OUT PTERMINAL This, + SMALL_RECT* Region) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->DrawRegion(FrontEnd, Region); +} + +static VOID NTAPI +ConSrvTermWriteStream(IN OUT PTERMINAL This, + SMALL_RECT* Region, + SHORT CursorStartX, + SHORT CursorStartY, + UINT ScrolledLines, + PWCHAR Buffer, + UINT Length) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->WriteStream(FrontEnd, + Region, + CursorStartX, + CursorStartY, + ScrolledLines, + Buffer, + Length); +} + +static BOOL NTAPI +ConSrvTermSetCursorInfo(IN OUT PTERMINAL This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer) +{ + PFRONTEND FrontEnd = This->Data; + return FrontEnd->Vtbl->SetCursorInfo(FrontEnd, ScreenBuffer); +} + +static BOOL NTAPI +ConSrvTermSetScreenInfo(IN OUT PTERMINAL This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer, + SHORT OldCursorX, + SHORT OldCursorY) +{ + PFRONTEND FrontEnd = This->Data; + return FrontEnd->Vtbl->SetScreenInfo(FrontEnd, + ScreenBuffer, + OldCursorX, + OldCursorY); +} + +static VOID NTAPI +ConSrvTermResizeTerminal(IN OUT PTERMINAL This) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->ResizeTerminal(FrontEnd); +} + +static VOID NTAPI +ConSrvTermSetActiveScreenBuffer(IN OUT PTERMINAL This) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->SetActiveScreenBuffer(FrontEnd); +} + +static VOID NTAPI +ConSrvTermReleaseScreenBuffer(IN OUT PTERMINAL This, + IN PCONSOLE_SCREEN_BUFFER ScreenBuffer) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->ReleaseScreenBuffer(FrontEnd, ScreenBuffer); +} + +static VOID NTAPI +ConSrvTermChangeTitle(IN OUT PTERMINAL This) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->ChangeTitle(FrontEnd); +} + +static VOID NTAPI +ConSrvTermGetLargestConsoleWindowSize(IN OUT PTERMINAL This, + PCOORD pSize) +{ + PFRONTEND FrontEnd = This->Data; + FrontEnd->Vtbl->GetLargestConsoleWindowSize(FrontEnd, pSize); +} + +/* +static BOOL NTAPI +ConSrvTermGetSelectionInfo(IN OUT PTERMINAL This, + PCONSOLE_SELECTION_INFO pSelectionInfo) +{ + PFRONTEND FrontEnd = This->Data; + return FrontEnd->Vtbl->GetSelectionInfo(FrontEnd, pSelectionInfo); +} +*/ + +static BOOL NTAPI +ConSrvTermSetPalette(IN OUT PTERMINAL This, + HPALETTE PaletteHandle, + UINT PaletteUsage) +{ + PFRONTEND FrontEnd = This->Data; + return FrontEnd->Vtbl->SetPalette(FrontEnd, PaletteHandle, PaletteUsage); +} + +static INT NTAPI +ConSrvTermShowMouseCursor(IN OUT PTERMINAL This, + BOOL Show) +{ + PFRONTEND FrontEnd = This->Data; + return FrontEnd->Vtbl->ShowMouseCursor(FrontEnd, Show); +} + +static TERMINAL_VTBL ConSrvTermVtbl = +{ + ConSrvTermInitTerminal, + ConSrvTermDeinitTerminal, + ConSrvTermDrawRegion, + ConSrvTermWriteStream, + ConSrvTermSetCursorInfo, + ConSrvTermSetScreenInfo, + ConSrvTermResizeTerminal, + ConSrvTermSetActiveScreenBuffer, + ConSrvTermReleaseScreenBuffer, + ConSrvTermChangeTitle, + ConSrvTermGetLargestConsoleWindowSize, + // ConSrvTermGetSelectionInfo, + ConSrvTermSetPalette, + ConSrvTermShowMouseCursor, +}; + +#if 0 +VOID +ResetFrontEnd(IN PCONSOLE Console) +{ + if (!Console) return; + + /* Reinitialize the frontend interface */ + RtlZeroMemory(&Console->FrontEndIFace, sizeof(Console->FrontEndIFace)); + Console->FrontEndIFace.Vtbl = &ConSrvTermVtbl; +} +#endif + +/* EOF */ diff --git a/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c b/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c index 51fbd842506..1231148afb5 100644 --- a/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c +++ b/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.c @@ -24,13 +24,6 @@ /* GLOBALS ********************************************************************/ -#define GetNextConsole(Console) \ - CONTAINING_RECORD(Console->Entry.Flink, TUI_CONSOLE_DATA, Entry) - -#define GetPrevConsole(Console) \ - CONTAINING_RECORD(Console->Entry.Blink, TUI_CONSOLE_DATA, Entry) - - /* TUI Console Window Class name */ #define TUI_CONSOLE_WINDOW_CLASS L"TuiConsoleWindowClass" @@ -46,6 +39,13 @@ typedef struct _TUI_CONSOLE_DATA // TUI_CONSOLE_INFO TuiInfo; /* TUI terminal settings */ } TUI_CONSOLE_DATA, *PTUI_CONSOLE_DATA; +#define GetNextConsole(Console) \ + CONTAINING_RECORD(Console->Entry.Flink, TUI_CONSOLE_DATA, Entry) + +#define GetPrevConsole(Console) \ + CONTAINING_RECORD(Console->Entry.Blink, TUI_CONSOLE_DATA, Entry) + + /* List of the maintained virtual consoles and its lock */ static LIST_ENTRY VirtConsList; static PTUI_CONSOLE_DATA ActiveConsole; /* The active console on screen */ @@ -164,7 +164,7 @@ done: /**\ \******************************************************************************/ -static BOOL FASTCALL +static BOOL TuiSwapConsole(INT Next) { static PTUI_CONSOLE_DATA SwapConsole = NULL; /* Console we are thinking about swapping with */ @@ -231,7 +231,7 @@ TuiSwapConsole(INT Next) } } -static VOID FASTCALL +static VOID TuiCopyRect(PCHAR Dest, PTEXTMODE_SCREEN_BUFFER Buff, SMALL_RECT* Region) { UINT SrcDelta, DestDelta; @@ -276,6 +276,21 @@ TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) case WM_KEYUP: case WM_SYSKEYUP: { +#if 0 + if ((HIWORD(lParam) & KF_ALTDOWN) && wParam == VK_TAB) + { + // if ((HIWORD(lParam) & (KF_UP | KF_REPEAT)) != KF_REPEAT) + TuiSwapConsole(ShiftState & SHIFT_PRESSED ? -1 : 1); + + break; + } + else if (wParam == VK_MENU /* && !Down */) + { + TuiSwapConsole(0); + break; + } +#endif + if (ConDrvValidateConsoleUnsafe(ActiveConsole->Console, CONSOLE_RUNNING, TRUE)) { MSG Message; @@ -459,7 +474,7 @@ TuiInitFrontEnd(IN OUT PFRONTEND This, // return STATUS_INVALID_PARAMETER; // /* Initialize the console */ - // Console->TermIFace.Vtbl = &TuiVtbl; + // Console->FrontEndIFace.Vtbl = &TuiVtbl; TuiData = ConsoleAllocHeap(HEAP_ZERO_MEMORY, sizeof(TUI_CONSOLE_DATA)); if (!TuiData) @@ -467,7 +482,7 @@ TuiInitFrontEnd(IN OUT PFRONTEND This, DPRINT1("CONSRV: Failed to create TUI_CONSOLE_DATA\n"); return STATUS_UNSUCCESSFUL; } - // Console->TermIFace.Data = (PVOID)TuiData; + // Console->FrontEndIFace.Data = (PVOID)TuiData; TuiData->Console = Console; TuiData->hWindow = NULL; @@ -525,7 +540,7 @@ static VOID NTAPI TuiDeinitFrontEnd(IN OUT PFRONTEND This) { // PCONSOLE Console = This->Console; - PTUI_CONSOLE_DATA TuiData = This->Data; // Console->TermIFace.Data; + PTUI_CONSOLE_DATA TuiData = This->Data; // Console->FrontEndIFace.Data; /* Close the notification window */ DestroyWindow(TuiData->hWindow); @@ -556,7 +571,7 @@ TuiDeinitFrontEnd(IN OUT PFRONTEND This) /* Switch to the next console */ if (NULL != ActiveConsole) ConioDrawConsole(ActiveConsole->Console); - // Console->TermIFace.Data = NULL; + // Console->FrontEndIFace.Data = NULL; This->Data = NULL; DeleteCriticalSection(&TuiData->Lock); ConsoleFreeHeap(TuiData); @@ -688,32 +703,6 @@ TuiResizeTerminal(IN OUT PFRONTEND This) { } -static BOOL NTAPI -TuiProcessKeyCallback(IN OUT PFRONTEND This, - MSG* msg, - BYTE KeyStateMenu, - DWORD ShiftState, - UINT VirtualKeyCode, - BOOL Down) -{ - if (0 != (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) && - VK_TAB == VirtualKeyCode) - { - if (Down) - { - TuiSwapConsole(ShiftState & SHIFT_PRESSED ? -1 : 1); - } - - return TRUE; - } - else if (VK_MENU == VirtualKeyCode && !Down) - { - return TuiSwapConsole(0); - } - - return FALSE; -} - static VOID NTAPI TuiRefreshInternalInfo(IN OUT PFRONTEND This) { @@ -814,7 +803,6 @@ static FRONTEND_VTBL TuiVtbl = TuiSetCursorInfo, TuiSetScreenInfo, TuiResizeTerminal, - TuiProcessKeyCallback, TuiRefreshInternalInfo, TuiChangeTitle, TuiChangeIcon, diff --git a/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h b/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h index 8abbcb9810b..2a176dc6cfe 100644 --- a/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h +++ b/win32ss/user/winsrv/consrv/frontends/tui/tuiterm.h @@ -11,7 +11,7 @@ #pragma once -NTSTATUS FASTCALL TuiInitConsole(PCONSOLE Console, +NTSTATUS TuiInitConsole(PCONSOLE Console, /*IN*/ PCONSOLE_START_INFO ConsoleStartInfo, PCONSOLE_INFO ConsoleInfo, DWORD ProcessId); diff --git a/win32ss/user/winsrv/consrv/handle.c b/win32ss/user/winsrv/consrv/handle.c index 98b7ff0c0db..721f3375558 100644 --- a/win32ss/user/winsrv/consrv/handle.c +++ b/win32ss/user/winsrv/consrv/handle.c @@ -72,7 +72,8 @@ ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) */ if (Object->Type == INPUT_BUFFER) { - PCONSOLE_INPUT_BUFFER InputBuffer = (PCONSOLE_INPUT_BUFFER)Object; + // PCONSOLE_INPUT_BUFFER InputBuffer = (PCONSOLE_INPUT_BUFFER)Object; + PCONSOLE Console = Object->Console; /* * Wake up all the writing waiters related to this handle for this @@ -83,13 +84,13 @@ ConSrvCloseHandleEntry(PCONSOLE_IO_HANDLE Entry) * whether or not they are related to this handle and if so, they * return. */ - CsrNotifyWait(&InputBuffer->ReadWaitQueue, + CsrNotifyWait(&Console->ReadWaitQueue, TRUE, NULL, (PVOID)Entry); - if (!IsListEmpty(&InputBuffer->ReadWaitQueue)) + if (!IsListEmpty(&Console->ReadWaitQueue)) { - CsrDereferenceWait(&InputBuffer->ReadWaitQueue); + CsrDereferenceWait(&Console->ReadWaitQueue); } } @@ -290,7 +291,6 @@ ConSrvFreeHandlesTable(PCONSOLE_PROCESS_DATA ProcessData) } VOID -FASTCALL ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, IN CONSOLE_IO_OBJECT_TYPE Type, IN PCONSOLE Console) @@ -306,7 +306,6 @@ ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, } NTSTATUS -FASTCALL ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, PHANDLE Handle, PCONSOLE_IO_OBJECT Object, @@ -372,7 +371,6 @@ ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, } NTSTATUS -FASTCALL ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, HANDLE Handle) { @@ -399,7 +397,6 @@ ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, } NTSTATUS -FASTCALL ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, HANDLE Handle, PCONSOLE_IO_OBJECT* Object, @@ -443,7 +440,7 @@ ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - // Status = ConDrvGetConsole(&ObjectConsole, ProcessData->ConsoleHandle, LockConsole); + // Status = ConSrvGetConsole(ProcessData, &ObjectConsole, LockConsole); // if (NT_SUCCESS(Status)) if (ConDrvValidateConsoleUnsafe(ObjectEntry->Console, CONSOLE_RUNNING, LockConsole)) { @@ -464,7 +461,6 @@ ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, } VOID -FASTCALL ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, BOOL IsConsoleLocked) { @@ -472,7 +468,6 @@ ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, } NTSTATUS -FASTCALL ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, PHANDLE pInputHandle, PHANDLE pOutputHandle, @@ -527,7 +522,7 @@ ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, Status = NtDuplicateObject(NtCurrentProcess(), Console->InputBuffer.ActiveEvent, ProcessData->Process->ProcessHandle, - &ProcessData->ConsoleEvent, + &ProcessData->InputWaitHandle, EVENT_ALL_ACCESS, 0, 0); if (!NT_SUCCESS(Status)) { @@ -551,7 +546,6 @@ ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, } NTSTATUS -FASTCALL ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, HANDLE ConsoleHandle, BOOL CreateNewHandlesTable, @@ -563,7 +557,7 @@ ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, PCONSOLE Console; /* Validate and lock the console */ - if (!ConDrvValidateConsole(&Console, + if (!ConSrvValidateConsole(&Console, ConsoleHandle, CONSOLE_RUNNING, TRUE)) { @@ -606,7 +600,7 @@ ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, Status = NtDuplicateObject(NtCurrentProcess(), Console->InputBuffer.ActiveEvent, ProcessData->Process->ProcessHandle, - &ProcessData->ConsoleEvent, + &ProcessData->InputWaitHandle, EVENT_ALL_ACCESS, 0, 0); if (!NT_SUCCESS(Status)) { @@ -634,7 +628,6 @@ Quit: } VOID -FASTCALL ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData) { PCONSOLE Console; @@ -644,12 +637,12 @@ ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData) // RtlEnterCriticalSection(&ProcessData->HandleTableLock); /* Validate and lock the console */ - if (ConDrvValidateConsole(&Console, + if (ConSrvValidateConsole(&Console, ProcessData->ConsoleHandle, CONSOLE_RUNNING, TRUE)) { /* Retrieve the console leader process */ - PCONSOLE_PROCESS_DATA ConsoleLeaderProcess = ConDrvGetConsoleLeaderProcess(Console); + PCONSOLE_PROCESS_DATA ConsoleLeaderProcess = ConSrvGetConsoleLeaderProcess(Console); DPRINT("ConSrvRemoveConsole - Locking OK\n"); @@ -684,7 +677,7 @@ ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData) * and then send the last close notification. */ Console->NotifyLastClose = FALSE; - ConDrvConsoleCtrlEvent(CTRL_LAST_CLOSE_EVENT, Console->NotifiedLastCloseProcess); + ConSrvConsoleCtrlEvent(CTRL_LAST_CLOSE_EVENT, Console->NotifiedLastCloseProcess); /* Only now, reset the pointer */ Console->NotifiedLastCloseProcess = NULL; @@ -696,9 +689,9 @@ ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData) /* Release the console */ DPRINT("ConSrvRemoveConsole - Decrement Console->ReferenceCount = %lu\n", Console->ReferenceCount); - ConDrvReleaseConsole(Console, TRUE); - //CloseHandle(ProcessData->ConsoleEvent); - //ProcessData->ConsoleEvent = NULL; + ConSrvReleaseConsole(Console, TRUE); + //CloseHandle(ProcessData->InputWaitHandle); + //ProcessData->InputWaitHandle = NULL; } // RtlLeaveCriticalSection(&ProcessData->HandleTableLock); diff --git a/win32ss/user/winsrv/consrv/handle.h b/win32ss/user/winsrv/consrv/handle.h index c10948f92f5..2e75f884a4b 100644 --- a/win32ss/user/winsrv/consrv/handle.h +++ b/win32ss/user/winsrv/consrv/handle.h @@ -10,23 +10,23 @@ #pragma once -VOID FASTCALL ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, +VOID ConSrvInitObject(IN OUT PCONSOLE_IO_OBJECT Object, IN CONSOLE_IO_OBJECT_TYPE Type, IN PCONSOLE Console); -NTSTATUS FASTCALL ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, +NTSTATUS ConSrvInsertObject(PCONSOLE_PROCESS_DATA ProcessData, PHANDLE Handle, PCONSOLE_IO_OBJECT Object, DWORD Access, BOOL Inheritable, DWORD ShareMode); -NTSTATUS FASTCALL ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, +NTSTATUS ConSrvRemoveObject(PCONSOLE_PROCESS_DATA ProcessData, HANDLE Handle); -NTSTATUS FASTCALL ConSrvGetObject(PCONSOLE_PROCESS_DATA ProcessData, +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 FASTCALL ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, +VOID ConSrvReleaseObject(PCONSOLE_IO_OBJECT Object, BOOL IsConsoleLocked); diff --git a/win32ss/user/winsrv/consrv/include/conio.h b/win32ss/user/winsrv/consrv/include/conio.h index 26b460cc63f..90defe0ea42 100644 --- a/win32ss/user/winsrv/consrv/include/conio.h +++ b/win32ss/user/winsrv/consrv/include/conio.h @@ -1,7 +1,7 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS Console Server DLL - * FILE: win32ss/user/winsrv/consrv/include/conio.h + * FILE: consrv/include/conio.h * PURPOSE: Public Console I/O Interface * PROGRAMMERS: G van Geldorp * Jeffrey Morlan @@ -10,6 +10,8 @@ #pragma once +#include "rect.h" + #define CSR_DEFAULT_CURSOR_SIZE 25 /* Default attributes */ @@ -64,8 +66,6 @@ struct _CONSOLE_SCREEN_BUFFER LIST_ENTRY ListEntry; /* Entry in console's list of buffers */ - // PVOID Data; /* Private data for the frontend to use */ - COORD ScreenBufferSize; /* Size of this screen buffer. (Rows, Columns) for text-mode and (Width, Height) for graphics-mode */ COORD ViewSize; /* Associated "view" (i.e. console) size */ @@ -90,6 +90,8 @@ struct _CONSOLE_SCREEN_BUFFER // WORD ScreenDefaultAttrib; /* Default screen char attribute */ // WORD PopupDefaultAttrib; /* Default popup char attribute */ USHORT Mode; /* Output buffer modes */ + + // PVOID Data; /* Private data for the frontend to use */ }; @@ -125,8 +127,8 @@ typedef struct _TEXTMODE_BUFFER_INFO COORD ScreenBufferSize; USHORT ScreenAttrib; USHORT PopupAttrib; - BOOLEAN IsCursorVisible; ULONG CursorSize; + BOOLEAN IsCursorVisible; } TEXTMODE_BUFFER_INFO, *PTEXTMODE_BUFFER_INFO; typedef struct _TEXTMODE_SCREEN_BUFFER @@ -158,6 +160,7 @@ typedef struct _GRAPHICS_SCREEN_BUFFER ULONG BitMapUsage; /* See the uUsage parameter of GetDIBits */ HANDLE hSection; /* Handle to the memory shared section for the bitmap buffer */ PVOID BitMap; /* Our bitmap buffer */ + PVOID ClientBitMap; /* A copy of the client view of our bitmap buffer */ HANDLE Mutex; /* Our mutex, used to synchronize read / writes to the bitmap buffer */ HANDLE ClientMutex; /* A copy of the client handle to our mutex */ @@ -173,97 +176,75 @@ typedef struct _CONSOLE_INPUT_BUFFER ULONG InputBufferSize; /* Size of this input buffer */ LIST_ENTRY InputEvents; /* List head for input event queue */ HANDLE ActiveEvent; /* Event set when an input event is added in its queue */ - LIST_ENTRY ReadWaitQueue; /* List head for the queue of read wait blocks */ USHORT Mode; /* Input buffer modes */ } CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER; -typedef struct _FRONTEND FRONTEND, *PFRONTEND; +typedef struct _TERMINAL TERMINAL, *PTERMINAL; /* HACK: */ typedef struct _CONSOLE_INFO *PCONSOLE_INFO; -typedef struct _FRONTEND_VTBL +typedef struct _TERMINAL_VTBL { /* * Internal interface (functions called by the console server only) */ - NTSTATUS (NTAPI *InitFrontEnd)(IN OUT PFRONTEND This, + NTSTATUS (NTAPI *InitTerminal)(IN OUT PTERMINAL This, IN struct _CONSOLE* Console); - VOID (NTAPI *DeinitFrontEnd)(IN OUT PFRONTEND This); + VOID (NTAPI *DeinitTerminal)(IN OUT PTERMINAL This); /* Interface used for both text-mode and graphics screen buffers */ - VOID (NTAPI *DrawRegion)(IN OUT PFRONTEND This, + VOID (NTAPI *DrawRegion)(IN OUT PTERMINAL This, SMALL_RECT* Region); /* Interface used only for text-mode screen buffers */ - VOID (NTAPI *WriteStream)(IN OUT PFRONTEND This, - SMALL_RECT* Block, + VOID (NTAPI *WriteStream)(IN OUT PTERMINAL This, + SMALL_RECT* Region, SHORT CursorStartX, SHORT CursorStartY, UINT ScrolledLines, PWCHAR Buffer, UINT Length); - BOOL (NTAPI *SetCursorInfo)(IN OUT PFRONTEND This, + BOOL (NTAPI *SetCursorInfo)(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer); - BOOL (NTAPI *SetScreenInfo)(IN OUT PFRONTEND This, + BOOL (NTAPI *SetScreenInfo)(IN OUT PTERMINAL This, PCONSOLE_SCREEN_BUFFER ScreenBuffer, SHORT OldCursorX, SHORT OldCursorY); - VOID (NTAPI *ResizeTerminal)(IN OUT PFRONTEND This); - VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PFRONTEND This); - VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PFRONTEND This, + VOID (NTAPI *ResizeTerminal)(IN OUT PTERMINAL This); + VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PTERMINAL This); + VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PTERMINAL This, IN PCONSOLE_SCREEN_BUFFER ScreenBuffer); - BOOL (NTAPI *ProcessKeyCallback)(IN OUT PFRONTEND This, - MSG* msg, - BYTE KeyStateMenu, - DWORD ShiftState, - UINT VirtualKeyCode, - BOOL Down); - VOID (NTAPI *RefreshInternalInfo)(IN OUT PFRONTEND This); /* * External interface (functions corresponding to the Console API) */ - VOID (NTAPI *ChangeTitle)(IN OUT PFRONTEND This); - BOOL (NTAPI *ChangeIcon)(IN OUT PFRONTEND This, - HICON IconHandle); - HWND (NTAPI *GetConsoleWindowHandle)(IN OUT PFRONTEND This); - VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PFRONTEND This, + VOID (NTAPI *ChangeTitle)(IN OUT PTERMINAL This); + VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PTERMINAL This, PCOORD pSize); - BOOL (NTAPI *GetSelectionInfo)(IN OUT PFRONTEND This, - PCONSOLE_SELECTION_INFO pSelectionInfo); - BOOL (NTAPI *SetPalette)(IN OUT PFRONTEND This, + // BOOL (NTAPI *GetSelectionInfo)(IN OUT PTERMINAL This, + // PCONSOLE_SELECTION_INFO pSelectionInfo); + BOOL (NTAPI *SetPalette)(IN OUT PTERMINAL This, HPALETTE PaletteHandle, UINT PaletteUsage); - ULONG (NTAPI *GetDisplayMode)(IN OUT PFRONTEND This); - BOOL (NTAPI *SetDisplayMode)(IN OUT PFRONTEND This, - ULONG NewMode); - INT (NTAPI *ShowMouseCursor)(IN OUT PFRONTEND This, + INT (NTAPI *ShowMouseCursor)(IN OUT PTERMINAL This, BOOL Show); - BOOL (NTAPI *SetMouseCursor)(IN OUT PFRONTEND This, - HCURSOR CursorHandle); - HMENU (NTAPI *MenuControl)(IN OUT PFRONTEND This, - UINT CmdIdLow, - UINT CmdIdHigh); - BOOL (NTAPI *SetMenuClose)(IN OUT PFRONTEND This, - BOOL Enable); #if 0 // Possible future front-end interface - BOOL (NTAPI *GetFrontEndProperty)(IN OUT PFRONTEND This, + BOOL (NTAPI *GetTerminalProperty)(IN OUT PTERMINAL This, ULONG Flag, PVOID Info, ULONG Size); - BOOL (NTAPI *SetFrontEndProperty)(IN OUT PFRONTEND This, + BOOL (NTAPI *SetTerminalProperty)(IN OUT PTERMINAL This, ULONG Flag, PVOID Info /*, ULONG Size */); #endif -} FRONTEND_VTBL, *PFRONTEND_VTBL; +} TERMINAL_VTBL, *PTERMINAL_VTBL; -struct _FRONTEND +struct _TERMINAL { - PFRONTEND_VTBL Vtbl; /* Virtual table */ + PTERMINAL_VTBL Vtbl; /* Virtual table */ struct _CONSOLE* Console; /* Console to which the frontend is attached to */ PVOID Data; /* Private data */ - PVOID OldData; /* Reserved */ }; /* @@ -277,112 +258,109 @@ typedef enum _CONSOLE_STATE CONSOLE_IN_DESTRUCTION /* Console in destruction */ } CONSOLE_STATE, *PCONSOLE_STATE; +// HACK!! +struct _CONSOLE; +struct _WINSRV_CONSOLE; +/* HACK: */ typedef struct _CONSOLE *PCONSOLE; +#include "conio_winsrv.h" + typedef struct _CONSOLE { +/******************************* Console Set-up *******************************/ 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; + + /**/WINSRV_CONSOLE;/**/ // HACK HACK!! + CONSOLE_STATE State; /* State of the console */ + TERMINAL TermIFace; /* Frontend-specific interface */ - LIST_ENTRY ProcessList; /* List of processes owning the console. The first one is the so-called "Console Leader Process" */ - PCONSOLE_PROCESS_DATA NotifiedLastCloseProcess; /* Pointer to the unique process that needs to be notified when the console leader process is killed */ - BOOLEAN NotifyLastClose; /* TRUE if the console should send a control event when the console leader process is killed */ - - FRONTEND TermIFace; /* Frontend-specific interface */ + ULONG ConsoleID; /* The ID of the console */ + LIST_ENTRY ListEntry; /* Entry in the list of consoles */ /**************************** Input buffer and data ***************************/ CONSOLE_INPUT_BUFFER InputBuffer; /* Input buffer of the console */ + UINT InputCodePage; - /** Put those things in TEXTMODE_SCREEN_BUFFER ?? **/ - PWCHAR LineBuffer; /* Current line being input, in line buffered mode */ - WORD LineMaxSize; /* Maximum size of line in characters (including CR+LF) */ - WORD LineSize; /* Current size of line */ - WORD LinePos; /* Current position within line */ + /** Put those things in CONSOLE_INPUT_BUFFER ?? **/ + 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 */ + ULONG LinePos; /* Current position within line */ BOOLEAN LineComplete; /* User pressed enter, ready to send back to client */ BOOLEAN LineUpPressed; BOOLEAN LineInsertToggle; /* Replace character over cursor instead of inserting */ - ULONG LineWakeupMask; /* Bitmap of which control characters will end line input */ - /***************************************************/ + ULONG LineWakeupMask; /* Bitmap of which control characters will end line input */ + /*************************************************/ - BOOLEAN QuickEdit; BOOLEAN InsertMode; - UINT CodePage; /******************************* Screen buffers *******************************/ LIST_ENTRY BufferList; /* List of all screen buffers for this console */ PCONSOLE_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ - BYTE PauseFlags; - HANDLE UnpauseEvent; - LIST_ENTRY WriteWaitQueue; /* List head for the queue of write wait blocks */ UINT OutputCodePage; -/**************************** Aliases and Histories ***************************/ - struct _ALIAS_HEADER *Aliases; - LIST_ENTRY HistoryBuffers; - ULONG HistoryBufferSize; /* Size for newly created history buffers */ - ULONG NumberOfHistoryBuffers; /* Maximum number of history buffers allowed */ - BOOLEAN HistoryNoDup; /* Remove old duplicate history entries */ - /****************************** 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 */ + HANDLE UnpauseEvent; /* When != NULL, event for pausing the 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; +} CONSOLE; // , *PCONSOLE; -/* PauseFlags values (internal only) */ -#define PAUSED_FROM_KEYBOARD 0x1 -#define PAUSED_FROM_SCROLLBAR 0x2 -#define PAUSED_FROM_SELECTION 0x4 +// #include "conio_winsrv.h" /* console.c */ -VOID FASTCALL ConioPause(PCONSOLE Console, UINT Flags); -VOID FASTCALL ConioUnpause(PCONSOLE Console, UINT Flags); +VOID NTAPI +ConDrvPause(PCONSOLE Console); +VOID NTAPI +ConDrvUnpause(PCONSOLE Console); PCONSOLE_PROCESS_DATA NTAPI -ConDrvGetConsoleLeaderProcess(IN PCONSOLE Console); +ConSrvGetConsoleLeaderProcess(IN PCONSOLE Console); NTSTATUS -ConDrvConsoleCtrlEvent(IN ULONG CtrlEvent, +ConSrvConsoleCtrlEvent(IN ULONG CtrlEvent, IN PCONSOLE_PROCESS_DATA ProcessData); NTSTATUS NTAPI -ConDrvConsoleProcessCtrlEvent(IN PCONSOLE Console, +ConSrvConsoleProcessCtrlEvent(IN PCONSOLE Console, IN ULONG ProcessGroupId, IN ULONG CtrlEvent); /* coninput.c */ VOID NTAPI ConioProcessKey(PCONSOLE Console, MSG* msg); -NTSTATUS FASTCALL ConioAddInputEvent(PCONSOLE Console, - PINPUT_RECORD InputEvent, - BOOLEAN AppendToEnd); -NTSTATUS FASTCALL ConioProcessInputEvent(PCONSOLE Console, - PINPUT_RECORD InputEvent); +NTSTATUS +ConioAddInputEvents(PCONSOLE Console, + PINPUT_RECORD InputRecords, + ULONG NumEventsToWrite, + PULONG NumEventsWritten, + BOOLEAN AppendToEnd); +NTSTATUS +ConioProcessInputEvent(PCONSOLE Console, + PINPUT_RECORD InputEvent); /* conoutput.c */ -#define ConioInitRect(Rect, top, left, bottom, right) \ -do { \ - ((Rect)->Top) = top; \ - ((Rect)->Left) = left; \ - ((Rect)->Bottom) = bottom; \ - ((Rect)->Right) = right; \ -} while (0) -#define ConioIsRectEmpty(Rect) \ - (((Rect)->Left > (Rect)->Right) || ((Rect)->Top > (Rect)->Bottom)) -#define ConioRectHeight(Rect) \ - (((Rect)->Top) > ((Rect)->Bottom) ? 0 : ((Rect)->Bottom) - ((Rect)->Top) + 1) -#define ConioRectWidth(Rect) \ - (((Rect)->Left) > ((Rect)->Right) ? 0 : ((Rect)->Right) - ((Rect)->Left) + 1) +/* + * From MSDN: + * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. + * If they are the same, the function fails, and GetLastError returns + * ERROR_INVALID_PARAMETER." + */ #define ConsoleUnicodeCharToAnsiChar(Console, dChar, sWChar) \ + ASSERT((ULONG_PTR)dChar != (ULONG_PTR)sWChar); \ WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) #define ConsoleAnsiCharToUnicodeChar(Console, dWChar, sChar) \ + ASSERT((ULONG_PTR)dWChar != (ULONG_PTR)sChar); \ MultiByteToWideChar((Console)->OutputCodePage, 0, (sChar), 1, (dWChar), 1) PCHAR_INFO ConioCoordToPointer(PTEXTMODE_SCREEN_BUFFER Buff, ULONG X, ULONG Y); -VOID FASTCALL ConioDrawConsole(PCONSOLE Console); +VOID ConioDrawConsole(PCONSOLE Console); NTSTATUS ConioResizeBuffer(PCONSOLE Console, PTEXTMODE_SCREEN_BUFFER ScreenBuffer, COORD Size); @@ -391,7 +369,7 @@ NTSTATUS ConioWriteConsole(PCONSOLE Console, PWCHAR Buffer, DWORD Length, BOOL Attrib); -DWORD FASTCALL ConioEffectiveCursorSize(PCONSOLE Console, +DWORD ConioEffectiveCursorSize(PCONSOLE Console, DWORD Scale); /* EOF */ diff --git a/win32ss/user/winsrv/consrv/include/conio_winsrv.h b/win32ss/user/winsrv/consrv/include/conio_winsrv.h new file mode 100644 index 00000000000..aba4715a2b8 --- /dev/null +++ b/win32ss/user/winsrv/consrv/include/conio_winsrv.h @@ -0,0 +1,185 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Console Server DLL + * FILE: consrv/include/conio_winsrv.h + * PURPOSE: Public Console I/O Interface + * PROGRAMMERS: G van Geldorp + * Jeffrey Morlan + * Hermes Belusca-Maito (hermes.belusca@sfr.fr) + */ + +#pragma once + +#include "rect.h" + +#define CSR_DEFAULT_CURSOR_SIZE 25 + +typedef struct _FRONTEND FRONTEND, *PFRONTEND; +/* HACK: */ typedef struct _CONSOLE_INFO *PCONSOLE_INFO; +typedef struct _FRONTEND_VTBL +{ + // NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); + + /* + * Internal interface (functions called by the console server only) + */ + NTSTATUS (NTAPI *InitFrontEnd)(IN OUT PFRONTEND This, + IN struct _CONSOLE* Console); + VOID (NTAPI *DeinitFrontEnd)(IN OUT PFRONTEND This); + + /* Interface used for both text-mode and graphics screen buffers */ + VOID (NTAPI *DrawRegion)(IN OUT PFRONTEND This, + SMALL_RECT* Region); + /* Interface used only for text-mode screen buffers */ + VOID (NTAPI *WriteStream)(IN OUT PFRONTEND This, + SMALL_RECT* Region, + SHORT CursorStartX, + SHORT CursorStartY, + UINT ScrolledLines, + PWCHAR Buffer, + UINT Length); + BOOL (NTAPI *SetCursorInfo)(IN OUT PFRONTEND This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer); + BOOL (NTAPI *SetScreenInfo)(IN OUT PFRONTEND This, + PCONSOLE_SCREEN_BUFFER ScreenBuffer, + SHORT OldCursorX, + SHORT OldCursorY); + VOID (NTAPI *ResizeTerminal)(IN OUT PFRONTEND This); + VOID (NTAPI *SetActiveScreenBuffer)(IN OUT PFRONTEND This); + VOID (NTAPI *ReleaseScreenBuffer)(IN OUT PFRONTEND This, + IN PCONSOLE_SCREEN_BUFFER ScreenBuffer); + VOID (NTAPI *RefreshInternalInfo)(IN OUT PFRONTEND This); + + /* + * External interface (functions corresponding to the Console API) + */ + VOID (NTAPI *ChangeTitle)(IN OUT PFRONTEND This); + BOOL (NTAPI *ChangeIcon)(IN OUT PFRONTEND This, + HICON IconHandle); + HWND (NTAPI *GetConsoleWindowHandle)(IN OUT PFRONTEND This); + VOID (NTAPI *GetLargestConsoleWindowSize)(IN OUT PFRONTEND This, + PCOORD pSize); + BOOL (NTAPI *GetSelectionInfo)(IN OUT PFRONTEND This, + PCONSOLE_SELECTION_INFO pSelectionInfo); + BOOL (NTAPI *SetPalette)(IN OUT PFRONTEND This, + HPALETTE PaletteHandle, + UINT PaletteUsage); + ULONG (NTAPI *GetDisplayMode)(IN OUT PFRONTEND This); + BOOL (NTAPI *SetDisplayMode)(IN OUT PFRONTEND This, + ULONG NewMode); + INT (NTAPI *ShowMouseCursor)(IN OUT PFRONTEND This, + BOOL Show); + BOOL (NTAPI *SetMouseCursor)(IN OUT PFRONTEND This, + HCURSOR CursorHandle); + HMENU (NTAPI *MenuControl)(IN OUT PFRONTEND This, + UINT CmdIdLow, + UINT CmdIdHigh); + BOOL (NTAPI *SetMenuClose)(IN OUT PFRONTEND This, + BOOL Enable); +} FRONTEND_VTBL, *PFRONTEND_VTBL; + +struct _FRONTEND +{ + PFRONTEND_VTBL Vtbl; /* Virtual table */ + NTSTATUS (NTAPI *UnloadFrontEnd)(IN OUT PFRONTEND This); + + struct _CONSOLE* Console; /* Console to which the frontend is attached to */ + PVOID Data; /* Private data */ + PVOID OldData; /* Reserved */ +}; + +/* PauseFlags values (internal only) */ +#define PAUSED_FROM_KEYBOARD 0x1 +#define PAUSED_FROM_SCROLLBAR 0x2 +#define PAUSED_FROM_SELECTION 0x4 + +typedef struct _WINSRV_CONSOLE +{ +/******************************* Console Set-up *******************************/ + /* This **MUST** be FIRST!! */ + // 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; + // CONSOLE_STATE State; /* State of the console */ + + FRONTEND FrontEndIFace; /* Frontend-specific interface */ + +/******************************* Process support ******************************/ + LIST_ENTRY ProcessList; /* List of processes owning the console. The first one is the so-called "Console Leader Process" */ + PCONSOLE_PROCESS_DATA NotifiedLastCloseProcess; /* Pointer to the unique process that needs to be notified when the console leader process is killed */ + BOOLEAN NotifyLastClose; /* TRUE if the console should send a control event when the console leader process is killed */ + + BOOLEAN QuickEdit; + +/******************************* Pausing support ******************************/ + BYTE PauseFlags; + LIST_ENTRY ReadWaitQueue; /* List head for the queue of unique input buffer read wait blocks */ + LIST_ENTRY WriteWaitQueue; /* List head for the queue of current screen-buffer write wait blocks */ + +/**************************** Aliases and Histories ***************************/ + struct _ALIAS_HEADER *Aliases; + LIST_ENTRY HistoryBuffers; + ULONG HistoryBufferSize; /* Size for newly created history buffers */ + ULONG NumberOfHistoryBuffers; /* Maximum number of history buffers allowed */ + BOOLEAN HistoryNoDup; /* Remove old duplicate history entries */ + +} WINSRV_CONSOLE, *PWINSRV_CONSOLE; + +/* console.c */ +VOID ConioPause(PCONSOLE Console, UINT Flags); +VOID ConioUnpause(PCONSOLE Console, UINT Flags); + +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); +DWORD ConioEffectiveCursorSize(PCONSOLE Console, + DWORD Scale); + +NTSTATUS +ConioAddInputEvents(PCONSOLE Console, + PINPUT_RECORD InputRecords, + ULONG NumEventsToWrite, + PULONG NumEventsWritten, + BOOLEAN AppendToEnd); +NTSTATUS +ConioProcessInputEvent(PCONSOLE Console, + PINPUT_RECORD InputEvent); + +/* conoutput.c */ + +/* + * From MSDN: + * "The lpMultiByteStr and lpWideCharStr pointers must not be the same. + * If they are the same, the function fails, and GetLastError returns + * ERROR_INVALID_PARAMETER." + */ +#define ConsoleUnicodeCharToAnsiChar(Console, dChar, sWChar) \ + ASSERT((ULONG_PTR)dChar != (ULONG_PTR)sWChar); \ + WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) + +#define ConsoleAnsiCharToUnicodeChar(Console, dWChar, sChar) \ + ASSERT((ULONG_PTR)dWChar != (ULONG_PTR)sChar); \ + 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, + PTEXTMODE_SCREEN_BUFFER ScreenBuffer, + COORD Size); +NTSTATUS ConioWriteConsole(PCONSOLE Console, + PTEXTMODE_SCREEN_BUFFER Buff, + PWCHAR Buffer, + DWORD Length, + BOOL Attrib); + +/* EOF */ diff --git a/win32ss/user/winsrv/consrv/include/console.h b/win32ss/user/winsrv/consrv/include/console.h index 4214e071e18..120663224da 100644 --- a/win32ss/user/winsrv/consrv/include/console.h +++ b/win32ss/user/winsrv/consrv/include/console.h @@ -12,15 +12,13 @@ VOID NTAPI ConDrvInitConsoleSupport(VOID); NTSTATUS NTAPI -ConDrvInitConsole(OUT PHANDLE NewConsoleHandle, - OUT PCONSOLE* NewConsole, - IN PCONSOLE_INFO ConsoleInfo, - IN ULONG ConsoleLeaderProcessId); +ConDrvInitConsole(OUT PCONSOLE* NewConsole, + IN PCONSOLE_INFO ConsoleInfo); NTSTATUS NTAPI -ConDrvRegisterFrontEnd(IN PCONSOLE Console, - IN PFRONTEND FrontEnd); +ConDrvRegisterTerminal(IN PCONSOLE Console, + IN PTERMINAL Terminal); NTSTATUS NTAPI -ConDrvDeregisterFrontEnd(IN PCONSOLE Console); +ConDrvDeregisterTerminal(IN PCONSOLE Console); VOID NTAPI ConDrvDeleteConsole(IN PCONSOLE Console); @@ -35,20 +33,4 @@ ConDrvValidateConsoleUnsafe(IN PCONSOLE Console, IN CONSOLE_STATE ExpectedState, IN BOOLEAN LockConsole); -BOOLEAN NTAPI -ConDrvValidateConsole(OUT PCONSOLE* Console, - IN HANDLE ConsoleHandle, - IN CONSOLE_STATE ExpectedState, - IN BOOLEAN LockConsole); - - - -NTSTATUS NTAPI -ConDrvGetConsole(OUT PCONSOLE* Console, - IN HANDLE ConsoleHandle, - IN BOOLEAN LockConsole); -VOID NTAPI -ConDrvReleaseConsole(IN PCONSOLE Console, - IN BOOLEAN WasConsoleLocked); - /* EOF */ diff --git a/win32ss/user/winsrv/consrv/include/rect.h b/win32ss/user/winsrv/consrv/include/rect.h new file mode 100644 index 00000000000..8a78d90265c --- /dev/null +++ b/win32ss/user/winsrv/consrv/include/rect.h @@ -0,0 +1,85 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS Console Server DLL + * FILE: consrv/include/rect.h + * PURPOSE: Rectangle helper functions + * PROGRAMMERS: G van Geldorp + * Jeffrey Morlan + */ + +#pragma once + +#define ConioInitRect(Rect, top, left, bottom, right) \ +do { \ + ((Rect)->Top) = top; \ + ((Rect)->Left) = left; \ + ((Rect)->Bottom) = bottom; \ + ((Rect)->Right) = right; \ +} while (0) +#define ConioIsRectEmpty(Rect) \ + (((Rect)->Left > (Rect)->Right) || ((Rect)->Top > (Rect)->Bottom)) + +#define ConioRectHeight(Rect) \ + (((Rect)->Top) > ((Rect)->Bottom) ? 0 : ((Rect)->Bottom) - ((Rect)->Top) + 1) +#define ConioRectWidth(Rect) \ + (((Rect)->Left) > ((Rect)->Right) ? 0 : ((Rect)->Right) - ((Rect)->Left) + 1) + + +static __inline BOOLEAN +ConioGetIntersection(OUT PSMALL_RECT Intersection, + IN PSMALL_RECT Rect1, + IN PSMALL_RECT Rect2) +{ + if ( ConioIsRectEmpty(Rect1) || + ConioIsRectEmpty(Rect2) || + (Rect1->Top > Rect2->Bottom) || + (Rect1->Left > Rect2->Right) || + (Rect1->Bottom < Rect2->Top) || + (Rect1->Right < Rect2->Left) ) + { + /* The rectangles do not intersect */ + ConioInitRect(Intersection, 0, -1, 0, -1); + return FALSE; + } + + ConioInitRect(Intersection, + max(Rect1->Top , Rect2->Top ), + max(Rect1->Left , Rect2->Left ), + min(Rect1->Bottom, Rect2->Bottom), + min(Rect1->Right , Rect2->Right )); + + return TRUE; +} + +static __inline BOOLEAN +ConioGetUnion(OUT PSMALL_RECT Union, + IN PSMALL_RECT Rect1, + IN PSMALL_RECT Rect2) +{ + if (ConioIsRectEmpty(Rect1)) + { + if (ConioIsRectEmpty(Rect2)) + { + ConioInitRect(Union, 0, -1, 0, -1); + return FALSE; + } + else + { + *Union = *Rect2; + } + } + else if (ConioIsRectEmpty(Rect2)) + { + *Union = *Rect1; + } + else + { + ConioInitRect(Union, + min(Rect1->Top , Rect2->Top ), + min(Rect1->Left , Rect2->Left ), + max(Rect1->Bottom, Rect2->Bottom), + max(Rect1->Right , Rect2->Right )); + } + + return TRUE; +} diff --git a/win32ss/user/winsrv/consrv/include/settings.h b/win32ss/user/winsrv/consrv/include/settings.h index f538460685b..be00e502073 100644 --- a/win32ss/user/winsrv/consrv/include/settings.h +++ b/win32ss/user/winsrv/consrv/include/settings.h @@ -11,6 +11,8 @@ /* STRUCTURES *****************************************************************/ +#pragma pack(push, 1) + /* * Structure used to hold terminal-specific information */ @@ -69,6 +71,8 @@ typedef struct _CONSOLE_PROPS TERMINAL_INFO TerminalInfo; /* Frontend-specific parameters */ } CONSOLE_PROPS, *PCONSOLE_PROPS; +#pragma pack(pop) + /* FUNCTIONS ******************************************************************/ #ifndef CONSOLE_H__ // If we aren't included by console.dll diff --git a/win32ss/user/winsrv/consrv/include/term.h b/win32ss/user/winsrv/consrv/include/term.h index b8cc5523e2f..037f6e8c314 100644 --- a/win32ss/user/winsrv/consrv/include/term.h +++ b/win32ss/user/winsrv/consrv/include/term.h @@ -12,8 +12,8 @@ #define TermDrawRegion(Console, Region) \ (Console)->TermIFace.Vtbl->DrawRegion(&(Console)->TermIFace, (Region)) -#define TermWriteStream(Console, Block, CurStartX, CurStartY, ScrolledLines, Buffer, Length) \ - (Console)->TermIFace.Vtbl->WriteStream(&(Console)->TermIFace, (Block), (CurStartX), (CurStartY), \ +#define TermWriteStream(Console, Region, CurStartX, CurStartY, ScrolledLines, Buffer, Length) \ + (Console)->TermIFace.Vtbl->WriteStream(&(Console)->TermIFace, (Region), (CurStartX), (CurStartY), \ (ScrolledLines), (Buffer), (Length)) #define TermSetCursorInfo(Console, ScreenBuffer) \ (Console)->TermIFace.Vtbl->SetCursorInfo(&(Console)->TermIFace, (ScreenBuffer)) @@ -25,34 +25,32 @@ (Console)->TermIFace.Vtbl->SetActiveScreenBuffer(&(Console)->TermIFace) #define TermReleaseScreenBuffer(Console, ScreenBuffer) \ (Console)->TermIFace.Vtbl->ReleaseScreenBuffer(&(Console)->TermIFace, (ScreenBuffer)) -#define TermProcessKeyCallback(Console, Msg, KeyStateMenu, ShiftState, VirtualKeyCode, Down) \ - (Console)->TermIFace.Vtbl->ProcessKeyCallback(&(Console)->TermIFace, (Msg), (KeyStateMenu), (ShiftState), (VirtualKeyCode), (Down)) #define TermRefreshInternalInfo(Console) \ - (Console)->TermIFace.Vtbl->RefreshInternalInfo(&(Console)->TermIFace) + (Console)->FrontEndIFace.Vtbl->RefreshInternalInfo(&(Console)->FrontEndIFace) #define TermChangeTitle(Console) \ (Console)->TermIFace.Vtbl->ChangeTitle(&(Console)->TermIFace) #define TermChangeIcon(Console, IconHandle) \ - (Console)->TermIFace.Vtbl->ChangeIcon(&(Console)->TermIFace, (IconHandle)) + (Console)->FrontEndIFace.Vtbl->ChangeIcon(&(Console)->FrontEndIFace, (IconHandle)) #define TermGetConsoleWindowHandle(Console) \ - (Console)->TermIFace.Vtbl->GetConsoleWindowHandle(&(Console)->TermIFace) + (Console)->FrontEndIFace.Vtbl->GetConsoleWindowHandle(&(Console)->FrontEndIFace) #define TermGetLargestConsoleWindowSize(Console, pSize) \ (Console)->TermIFace.Vtbl->GetLargestConsoleWindowSize(&(Console)->TermIFace, (pSize)) #define TermGetSelectionInfo(Console, pSelectionInfo) \ - (Console)->TermIFace.Vtbl->GetSelectionInfo(&(Console)->TermIFace, (pSelectionInfo)) + (Console)->FrontEndIFace.Vtbl->GetSelectionInfo(&(Console)->FrontEndIFace, (pSelectionInfo)) #define TermSetPalette(Console, PaletteHandle, PaletteUsage) \ (Console)->TermIFace.Vtbl->SetPalette(&(Console)->TermIFace, (PaletteHandle), (PaletteUsage)) #define TermGetDisplayMode(Console) \ - (Console)->TermIFace.Vtbl->GetDisplayMode(&(Console)->TermIFace) + (Console)->FrontEndIFace.Vtbl->GetDisplayMode(&(Console)->FrontEndIFace) #define TermSetDisplayMode(Console, NewMode) \ - (Console)->TermIFace.Vtbl->SetDisplayMode(&(Console)->TermIFace, (NewMode)) + (Console)->FrontEndIFace.Vtbl->SetDisplayMode(&(Console)->FrontEndIFace, (NewMode)) #define TermShowMouseCursor(Console, Show) \ (Console)->TermIFace.Vtbl->ShowMouseCursor(&(Console)->TermIFace, (Show)) #define TermSetMouseCursor(Console, CursorHandle) \ - (Console)->TermIFace.Vtbl->SetMouseCursor(&(Console)->TermIFace, (CursorHandle)) + (Console)->FrontEndIFace.Vtbl->SetMouseCursor(&(Console)->FrontEndIFace, (CursorHandle)) #define TermMenuControl(Console, CmdIdLow, CmdIdHigh) \ - (Console)->TermIFace.Vtbl->MenuControl(&(Console)->TermIFace, (CmdIdLow), (CmdIdHigh)) + (Console)->FrontEndIFace.Vtbl->MenuControl(&(Console)->FrontEndIFace, (CmdIdLow), (CmdIdHigh)) #define TermSetMenuClose(Console, Enable) \ - (Console)->TermIFace.Vtbl->SetMenuClose(&(Console)->TermIFace, (Enable)) + (Console)->FrontEndIFace.Vtbl->SetMenuClose(&(Console)->FrontEndIFace, (Enable)) /* EOF */ diff --git a/win32ss/user/winsrv/consrv/init.c b/win32ss/user/winsrv/consrv/init.c index c669c52d46a..3f50c6b1ba9 100644 --- a/win32ss/user/winsrv/consrv/init.c +++ b/win32ss/user/winsrv/consrv/init.c @@ -353,7 +353,7 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess, /* Initialize the new (target) process */ RtlZeroMemory(TargetProcessData, sizeof(*TargetProcessData)); TargetProcessData->Process = TargetProcess; - TargetProcessData->ConsoleEvent = NULL; + TargetProcessData->InputWaitHandle = NULL; TargetProcessData->ConsoleHandle = TargetProcessData->ParentConsoleHandle = NULL; TargetProcessData->ConsoleApp = ((TargetProcess->Flags & CsrProcessIsConsoleApp) ? TRUE : FALSE); @@ -383,7 +383,7 @@ ConSrvNewProcess(PCSR_PROCESS SourceProcess, PCONSOLE SourceConsole; /* Validate and lock the parent's console */ - if (ConDrvValidateConsole(&SourceConsole, + if (ConSrvValidateConsole(&SourceConsole, SourceProcessData->ConsoleHandle, CONSOLE_RUNNING, TRUE)) { @@ -484,7 +484,7 @@ ConSrvConnect(IN PCSR_PROCESS CsrProcess, /* Return the console handle and the input wait handle to the caller */ ConnectInfo->ConsoleHandle = ProcessData->ConsoleHandle; - ConnectInfo->InputWaitHandle = ProcessData->ConsoleEvent; + ConnectInfo->InputWaitHandle = ProcessData->InputWaitHandle; /* Set the Property-Dialog and Control-Dispatcher handlers */ ProcessData->PropDispatcher = ConnectInfo->ConsoleStartInfo.PropDispatcher; @@ -529,6 +529,7 @@ CSR_SERVER_DLL_INIT(ConServerDllInitialization) */ ConDrvInitConsoleSupport(); + ConSrvInitConsoleSupport(); /* Setup the DLL Object */ LoadedServerDll->ApiBase = CONSRV_FIRST_API_NUMBER; diff --git a/win32ss/user/winsrv/consrv/lineinput.c b/win32ss/user/winsrv/consrv/lineinput.c index a9ffc8dd191..c3ae65e6edb 100644 --- a/win32ss/user/winsrv/consrv/lineinput.c +++ b/win32ss/user/winsrv/consrv/lineinput.c @@ -4,8 +4,6 @@ * FILE: win32ss/user/winsrv/consrv/lineinput.c * PURPOSE: Console line input functions * PROGRAMMERS: Jeffrey Morlan - * - * NOTE: It's something frontend-related... (--> read my mind... ;) ) */ /* INCLUDES *******************************************************************/ @@ -21,30 +19,45 @@ typedef struct _HISTORY_BUFFER UINT Position; UINT MaxEntries; UINT NumEntries; - PUNICODE_STRING Entries; UNICODE_STRING ExeName; + PUNICODE_STRING Entries; } HISTORY_BUFFER, *PHISTORY_BUFFER; +BOOLEAN +ConvertInputAnsiToUnicode(PCONSOLE Console, + PVOID Source, + USHORT SourceLength, + // BOOLEAN IsUnicode, + PWCHAR* Target, + PUSHORT TargetLength); +BOOLEAN +ConvertInputUnicodeToAnsi(PCONSOLE Console, + PVOID Source, + USHORT SourceLength, + // BOOLEAN IsAnsi, + PCHAR/* * */ Target, + /*P*/USHORT TargetLength); + + /* PRIVATE FUNCTIONS **********************************************************/ static PHISTORY_BUFFER -HistoryCurrentBuffer(PCONSOLE Console) +HistoryCurrentBuffer(PCONSOLE Console, + PUNICODE_STRING ExeName) { - /* TODO: use actual EXE name sent from process that called ReadConsole */ - UNICODE_STRING ExeName = { 14, 14, L"cmd.exe" }; PLIST_ENTRY Entry = Console->HistoryBuffers.Flink; PHISTORY_BUFFER Hist; for (; Entry != &Console->HistoryBuffers; Entry = Entry->Flink) { Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry); - if (RtlEqualUnicodeString(&ExeName, &Hist->ExeName, FALSE)) + if (RtlEqualUnicodeString(ExeName, &Hist->ExeName, FALSE)) return Hist; } /* Couldn't find the buffer, create a new one */ - Hist = ConsoleAllocHeap(0, sizeof(HISTORY_BUFFER) + ExeName.Length); + Hist = ConsoleAllocHeap(0, sizeof(HISTORY_BUFFER) + ExeName->Length); if (!Hist) return NULL; Hist->MaxEntries = Console->HistoryBufferSize; Hist->NumEntries = 0; @@ -54,18 +67,19 @@ HistoryCurrentBuffer(PCONSOLE Console) ConsoleFreeHeap(Hist); return NULL; } - Hist->ExeName.Length = Hist->ExeName.MaximumLength = ExeName.Length; + Hist->ExeName.Length = Hist->ExeName.MaximumLength = ExeName->Length; Hist->ExeName.Buffer = (PWCHAR)(Hist + 1); - memcpy(Hist->ExeName.Buffer, ExeName.Buffer, ExeName.Length); + memcpy(Hist->ExeName.Buffer, ExeName->Buffer, ExeName->Length); InsertHeadList(&Console->HistoryBuffers, &Hist->ListEntry); return Hist; } static VOID -HistoryAddEntry(PCONSOLE Console) +HistoryAddEntry(PCONSOLE Console, + PUNICODE_STRING ExeName) { UNICODE_STRING NewEntry; - PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console); + PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console, ExeName); INT i; if (!Hist) return; @@ -113,9 +127,11 @@ HistoryAddEntry(PCONSOLE Console) } static VOID -HistoryGetCurrentEntry(PCONSOLE Console, PUNICODE_STRING Entry) +HistoryGetCurrentEntry(PCONSOLE Console, + PUNICODE_STRING ExeName, + PUNICODE_STRING Entry) { - PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console); + PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console, ExeName); if (!Hist || Hist->NumEntries == 0) Entry->Length = 0; @@ -124,17 +140,51 @@ HistoryGetCurrentEntry(PCONSOLE Console, PUNICODE_STRING Entry) } static PHISTORY_BUFFER -HistoryFindBuffer(PCONSOLE Console, PUNICODE_STRING ExeName) +HistoryFindBuffer(PCONSOLE Console, + PVOID ExeName, + USHORT ExeLength, + BOOLEAN UnicodeExe) { - PLIST_ENTRY Entry = Console->HistoryBuffers.Flink; + UNICODE_STRING ExeNameU; + + PLIST_ENTRY Entry; + PHISTORY_BUFFER Hist = NULL; + + if (ExeName == NULL) return NULL; + + if (UnicodeExe) + { + ExeNameU.Buffer = ExeName; + /* Length is in bytes */ + ExeNameU.MaximumLength = ExeLength; + } + else + { + if (!ConvertInputAnsiToUnicode(Console, + ExeName, ExeLength, + &ExeNameU.Buffer, &ExeNameU.MaximumLength)) + { + return NULL; + } + } + ExeNameU.Length = ExeNameU.MaximumLength; + + Entry = Console->HistoryBuffers.Flink; while (Entry != &Console->HistoryBuffers) { + Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry); + /* For the history APIs, the caller is allowed to give only part of the name */ - PHISTORY_BUFFER Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry); - if (RtlPrefixUnicodeString(ExeName, &Hist->ExeName, TRUE)) + if (RtlPrefixUnicodeString(&ExeNameU, &Hist->ExeName, TRUE)) + { + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); return Hist; + } + Entry = Entry->Flink; } + + if (!UnicodeExe) ConsoleFreeHeap(ExeNameU.Buffer); return NULL; } @@ -151,7 +201,7 @@ HistoryDeleteBuffer(PHISTORY_BUFFER Hist) ConsoleFreeHeap(Hist); } -VOID FASTCALL +VOID HistoryDeleteBuffers(PCONSOLE Console) { PLIST_ENTRY CurrentEntry; @@ -190,7 +240,7 @@ LineInputSetPos(PCONSOLE Console, UINT Pos) } static VOID -LineInputEdit(PCONSOLE Console, UINT NumToDelete, UINT NumToInsert, WCHAR *Insertion) +LineInputEdit(PCONSOLE Console, UINT NumToDelete, UINT NumToInsert, PWCHAR Insertion) { PTEXTMODE_SCREEN_BUFFER ActiveBuffer; UINT Pos = Console->LinePos; @@ -227,9 +277,11 @@ LineInputEdit(PCONSOLE Console, UINT NumToDelete, UINT NumToInsert, WCHAR *Inser } static VOID -LineInputRecallHistory(PCONSOLE Console, INT Offset) +LineInputRecallHistory(PCONSOLE Console, + PUNICODE_STRING ExeName, + INT Offset) { - PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console); + PHISTORY_BUFFER Hist = HistoryCurrentBuffer(Console, ExeName); UINT Position = 0; if (!Hist || Hist->NumEntries == 0) return; @@ -244,8 +296,10 @@ LineInputRecallHistory(PCONSOLE Console, INT Offset) Hist->Entries[Hist->Position].Buffer); } -VOID FASTCALL -LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) +VOID +LineInputKeyDown(PCONSOLE Console, + PUNICODE_STRING ExeName, + KEY_EVENT_RECORD *KeyEvent) { UINT Pos = Console->LinePos; PHISTORY_BUFFER Hist; @@ -298,7 +352,7 @@ LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) else { /* Recall one character (but don't overwrite current line) */ - HistoryGetCurrentEntry(Console, &Entry); + HistoryGetCurrentEntry(Console, ExeName, &Entry); if (Pos < Console->LineSize) LineInputSetPos(Console, Pos + 1); else if (Pos * sizeof(WCHAR) < Entry.Length) @@ -317,26 +371,26 @@ LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) return; case VK_PRIOR: /* Recall first history entry */ - LineInputRecallHistory(Console, -((WORD)-1)); + LineInputRecallHistory(Console, ExeName, -((WORD)-1)); return; case VK_NEXT: /* Recall last history entry */ - LineInputRecallHistory(Console, +((WORD)-1)); + LineInputRecallHistory(Console, ExeName, +((WORD)-1)); return; case VK_UP: case VK_F5: /* Recall previous history entry. On first time, actually recall the * current (usually last) entry; on subsequent times go back. */ - LineInputRecallHistory(Console, Console->LineUpPressed ? -1 : 0); + LineInputRecallHistory(Console, ExeName, Console->LineUpPressed ? -1 : 0); Console->LineUpPressed = TRUE; return; case VK_DOWN: /* Recall next history entry */ - LineInputRecallHistory(Console, +1); + LineInputRecallHistory(Console, ExeName, +1); return; case VK_F3: /* Recall remainder of current history entry */ - HistoryGetCurrentEntry(Console, &Entry); + HistoryGetCurrentEntry(Console, ExeName, &Entry); if (Pos * sizeof(WCHAR) < Entry.Length) { UINT InsertSize = (Entry.Length / sizeof(WCHAR) - Pos); @@ -350,11 +404,11 @@ LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) break; case VK_F7: if (KeyEvent->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) - HistoryDeleteBuffer(HistoryCurrentBuffer(Console)); + HistoryDeleteBuffer(HistoryCurrentBuffer(Console, ExeName)); return; case VK_F8: /* Search for history entries starting with input. */ - Hist = HistoryCurrentBuffer(Console); + Hist = HistoryCurrentBuffer(Console, ExeName); if (!Hist || Hist->NumEntries == 0) return; /* Like Up/F5, on first time start from current (usually last) entry, @@ -398,7 +452,7 @@ LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) } else if (KeyEvent->uChar.UnicodeChar == L'\r') { - HistoryAddEntry(Console); + HistoryAddEntry(Console, ExeName); /* TODO: Expand aliases */ @@ -455,163 +509,216 @@ LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent) CSR_API(SrvGetConsoleCommandHistory) { - PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryRequest; - PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); - PCONSOLE Console; NTSTATUS Status; + PCONSOLE_GETCOMMANDHISTORY GetCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryRequest; + PCONSOLE Console; + ULONG BytesWritten = 0; PHISTORY_BUFFER Hist; - PBYTE Buffer = (PBYTE)GetCommandHistoryRequest->History; - ULONG BufferSize = GetCommandHistoryRequest->Length; - UINT i; + + DPRINT1("SrvGetConsoleCommandHistory entered\n"); if ( !CsrValidateMessageBuffer(ApiMessage, (PVOID*)&GetCommandHistoryRequest->History, - GetCommandHistoryRequest->Length, + GetCommandHistoryRequest->HistoryLength, sizeof(BYTE)) || !CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&GetCommandHistoryRequest->ExeName.Buffer, - GetCommandHistoryRequest->ExeName.Length, + (PVOID*)&GetCommandHistoryRequest->ExeName, + GetCommandHistoryRequest->ExeLength, sizeof(BYTE)) ) { return STATUS_INVALID_PARAMETER; } - Status = ConSrvGetConsole(ProcessData, &Console, TRUE); - if (NT_SUCCESS(Status)) + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Hist = HistoryFindBuffer(Console, + GetCommandHistoryRequest->ExeName, + GetCommandHistoryRequest->ExeLength, + GetCommandHistoryRequest->Unicode2); + if (Hist) { - Hist = HistoryFindBuffer(Console, &GetCommandHistoryRequest->ExeName); - if (Hist) + UINT i; + + LPSTR TargetBufferA; + LPWSTR TargetBufferW; + ULONG BufferSize = GetCommandHistoryRequest->HistoryLength; + + UINT Offset = 0; + UINT SourceLength; + + if (GetCommandHistoryRequest->Unicode) { - for (i = 0; i < Hist->NumEntries; i++) + TargetBufferW = GetCommandHistoryRequest->History; + BufferSize /= sizeof(WCHAR); + } + else + { + TargetBufferA = GetCommandHistoryRequest->History; + } + + for (i = 0; i < Hist->NumEntries; i++) + { + SourceLength = Hist->Entries[i].Length / sizeof(WCHAR); + if (Offset + SourceLength + 1 > BufferSize) { - if (BufferSize < (Hist->Entries[i].Length + sizeof(WCHAR))) - { - Status = STATUS_BUFFER_OVERFLOW; - break; - } - memcpy(Buffer, Hist->Entries[i].Buffer, Hist->Entries[i].Length); - Buffer += Hist->Entries[i].Length; - *(PWCHAR)Buffer = L'\0'; - Buffer += sizeof(WCHAR); + Status = STATUS_BUFFER_OVERFLOW; + break; + } + + if (GetCommandHistoryRequest->Unicode) + { + RtlCopyMemory(&TargetBufferW[Offset], Hist->Entries[i].Buffer, SourceLength * sizeof(WCHAR)); + Offset += SourceLength; + TargetBufferW[Offset++] = L'\0'; + } + else + { + ConvertInputUnicodeToAnsi(Console, + Hist->Entries[i].Buffer, SourceLength * sizeof(WCHAR), + &TargetBufferA[Offset], SourceLength); + Offset += SourceLength; + TargetBufferA[Offset++] = '\0'; } } - GetCommandHistoryRequest->Length = Buffer - (PBYTE)GetCommandHistoryRequest->History; - ConSrvReleaseConsole(Console, TRUE); + + if (GetCommandHistoryRequest->Unicode) + BytesWritten = Offset * sizeof(WCHAR); + else + BytesWritten = Offset; } + + // GetCommandHistoryRequest->HistoryLength = TargetBuffer - (PBYTE)GetCommandHistoryRequest->History; + GetCommandHistoryRequest->HistoryLength = BytesWritten; + + ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvGetConsoleCommandHistoryLength) { - PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLengthRequest; - PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); - PCONSOLE Console; NTSTATUS Status; + PCONSOLE_GETCOMMANDHISTORYLENGTH GetCommandHistoryLengthRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLengthRequest; + PCONSOLE Console; PHISTORY_BUFFER Hist; ULONG Length = 0; UINT i; if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&GetCommandHistoryLengthRequest->ExeName.Buffer, - GetCommandHistoryLengthRequest->ExeName.Length, + (PVOID*)&GetCommandHistoryLengthRequest->ExeName, + GetCommandHistoryLengthRequest->ExeLength, sizeof(BYTE))) { return STATUS_INVALID_PARAMETER; } - Status = ConSrvGetConsole(ProcessData, &Console, TRUE); - if (NT_SUCCESS(Status)) + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Hist = HistoryFindBuffer(Console, + GetCommandHistoryLengthRequest->ExeName, + GetCommandHistoryLengthRequest->ExeLength, + GetCommandHistoryLengthRequest->Unicode2); + if (Hist) { - Hist = HistoryFindBuffer(Console, &GetCommandHistoryLengthRequest->ExeName); - if (Hist) - { - for (i = 0; i < Hist->NumEntries; i++) - Length += Hist->Entries[i].Length + sizeof(WCHAR); - } - GetCommandHistoryLengthRequest->Length = Length; - ConSrvReleaseConsole(Console, TRUE); + for (i = 0; i < Hist->NumEntries; i++) + Length += Hist->Entries[i].Length + sizeof(WCHAR); // Each entry is returned NULL-terminated } + /* + * Quick and dirty way of getting the number of bytes of the + * corresponding ANSI string from the one in UNICODE. + */ + if (!GetCommandHistoryLengthRequest->Unicode) + Length /= sizeof(WCHAR); + + GetCommandHistoryLengthRequest->HistoryLength = Length; + + ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvExpungeConsoleCommandHistory) { + NTSTATUS Status; PCONSOLE_EXPUNGECOMMANDHISTORY ExpungeCommandHistoryRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistoryRequest; - PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); PCONSOLE Console; PHISTORY_BUFFER Hist; - NTSTATUS Status; if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&ExpungeCommandHistoryRequest->ExeName.Buffer, - ExpungeCommandHistoryRequest->ExeName.Length, + (PVOID*)&ExpungeCommandHistoryRequest->ExeName, + ExpungeCommandHistoryRequest->ExeLength, sizeof(BYTE))) { return STATUS_INVALID_PARAMETER; } - Status = ConSrvGetConsole(ProcessData, &Console, TRUE); - if (NT_SUCCESS(Status)) - { - Hist = HistoryFindBuffer(Console, &ExpungeCommandHistoryRequest->ExeName); - HistoryDeleteBuffer(Hist); - ConSrvReleaseConsole(Console, TRUE); - } + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + Hist = HistoryFindBuffer(Console, + ExpungeCommandHistoryRequest->ExeName, + ExpungeCommandHistoryRequest->ExeLength, + ExpungeCommandHistoryRequest->Unicode2); + HistoryDeleteBuffer(Hist); + + ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvSetConsoleNumberOfCommands) { + NTSTATUS Status; PCONSOLE_SETHISTORYNUMBERCOMMANDS SetHistoryNumberCommandsRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommandsRequest; - PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process); PCONSOLE Console; PHISTORY_BUFFER Hist; - NTSTATUS Status; - UINT MaxEntries = SetHistoryNumberCommandsRequest->NumCommands; - PUNICODE_STRING OldEntryList, NewEntryList; if (!CsrValidateMessageBuffer(ApiMessage, - (PVOID*)&SetHistoryNumberCommandsRequest->ExeName.Buffer, - SetHistoryNumberCommandsRequest->ExeName.Length, + (PVOID*)&SetHistoryNumberCommandsRequest->ExeName, + SetHistoryNumberCommandsRequest->ExeLength, sizeof(BYTE))) { return STATUS_INVALID_PARAMETER; } - Status = ConSrvGetConsole(ProcessData, &Console, TRUE); - if (NT_SUCCESS(Status)) - { - Hist = HistoryFindBuffer(Console, &SetHistoryNumberCommandsRequest->ExeName); - if (Hist) - { - OldEntryList = Hist->Entries; - NewEntryList = ConsoleAllocHeap(0, MaxEntries * sizeof(UNICODE_STRING)); - if (!NewEntryList) - { - Status = STATUS_NO_MEMORY; - } - else - { - /* If necessary, shrink by removing oldest entries */ - for (; Hist->NumEntries > MaxEntries; Hist->NumEntries--) - { - RtlFreeUnicodeString(Hist->Entries++); - Hist->Position += (Hist->Position == 0); - } + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; - Hist->MaxEntries = MaxEntries; - Hist->Entries = memcpy(NewEntryList, Hist->Entries, - Hist->NumEntries * sizeof(UNICODE_STRING)); - ConsoleFreeHeap(OldEntryList); - } + Hist = HistoryFindBuffer(Console, + SetHistoryNumberCommandsRequest->ExeName, + SetHistoryNumberCommandsRequest->ExeLength, + SetHistoryNumberCommandsRequest->Unicode2); + if (Hist) + { + UINT MaxEntries = SetHistoryNumberCommandsRequest->NumCommands; + PUNICODE_STRING OldEntryList = Hist->Entries; + PUNICODE_STRING NewEntryList = ConsoleAllocHeap(0, MaxEntries * sizeof(UNICODE_STRING)); + if (!NewEntryList) + { + Status = STATUS_NO_MEMORY; + } + else + { + /* If necessary, shrink by removing oldest entries */ + for (; Hist->NumEntries > MaxEntries; Hist->NumEntries--) + { + RtlFreeUnicodeString(Hist->Entries++); + Hist->Position += (Hist->Position == 0); + } + + Hist->MaxEntries = MaxEntries; + Hist->Entries = memcpy(NewEntryList, Hist->Entries, + Hist->NumEntries * sizeof(UNICODE_STRING)); + ConsoleFreeHeap(OldEntryList); } - ConSrvReleaseConsole(Console, TRUE); } + + ConSrvReleaseConsole(Console, TRUE); return Status; } CSR_API(SrvGetConsoleHistory) { +#if 0 // Vista+ PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest; PCONSOLE Console; NTSTATUS Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); @@ -623,10 +730,15 @@ CSR_API(SrvGetConsoleHistory) ConSrvReleaseConsole(Console, TRUE); } return Status; +#else + DPRINT1("%s not yet implemented\n", __FUNCTION__); + return STATUS_NOT_IMPLEMENTED; +#endif } CSR_API(SrvSetConsoleHistory) { +#if 0 // Vista+ PCONSOLE_GETSETHISTORYINFO HistoryInfoRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.HistoryInfoRequest; PCONSOLE Console; NTSTATUS Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); @@ -638,12 +750,29 @@ CSR_API(SrvSetConsoleHistory) ConSrvReleaseConsole(Console, TRUE); } return Status; +#else + DPRINT1("%s not yet implemented\n", __FUNCTION__); + return STATUS_NOT_IMPLEMENTED; +#endif } CSR_API(SrvSetConsoleCommandHistoryMode) { - DPRINT1("%s not yet implemented\n", __FUNCTION__); - return STATUS_NOT_IMPLEMENTED; + NTSTATUS Status; + PCONSOLE_SETHISTORYMODE SetHistoryModeRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryModeRequest; + PCONSOLE Console; + + DPRINT1("SrvSetConsoleCommandHistoryMode(Mode = %d) is not yet implemented\n", + SetHistoryModeRequest->Mode); + + Status = ConSrvGetConsole(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console, TRUE); + if (!NT_SUCCESS(Status)) return Status; + + /* This API is not yet implemented */ + Status = STATUS_NOT_IMPLEMENTED; + + ConSrvReleaseConsole(Console, TRUE); + return Status; } /* EOF */ diff --git a/win32ss/user/winsrv/consrv/lineinput.h b/win32ss/user/winsrv/consrv/lineinput.h index b2531418d4f..afb6d25f216 100644 --- a/win32ss/user/winsrv/consrv/lineinput.h +++ b/win32ss/user/winsrv/consrv/lineinput.h @@ -8,5 +8,9 @@ #pragma once -VOID FASTCALL HistoryDeleteBuffers(PCONSOLE Console); -VOID FASTCALL LineInputKeyDown(PCONSOLE Console, KEY_EVENT_RECORD *KeyEvent); +VOID HistoryDeleteBuffers(PCONSOLE Console); + +VOID +LineInputKeyDown(PCONSOLE Console, + PUNICODE_STRING ExeName, + KEY_EVENT_RECORD *KeyEvent); diff --git a/win32ss/user/winsrv/consrv/procinit.h b/win32ss/user/winsrv/consrv/procinit.h index ec36c8ca038..9c7186667dd 100644 --- a/win32ss/user/winsrv/consrv/procinit.h +++ b/win32ss/user/winsrv/consrv/procinit.h @@ -8,15 +8,15 @@ #pragma once -NTSTATUS FASTCALL ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, +NTSTATUS ConSrvAllocateConsole(PCONSOLE_PROCESS_DATA ProcessData, PHANDLE pInputHandle, PHANDLE pOutputHandle, PHANDLE pErrorHandle, PCONSOLE_START_INFO ConsoleStartInfo); -NTSTATUS FASTCALL ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, +NTSTATUS ConSrvInheritConsole(PCONSOLE_PROCESS_DATA ProcessData, HANDLE ConsoleHandle, BOOL CreateNewHandlesTable, PHANDLE pInputHandle, PHANDLE pOutputHandle, PHANDLE pErrorHandle); -VOID FASTCALL ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData); +VOID ConSrvRemoveConsole(PCONSOLE_PROCESS_DATA ProcessData);